UNPKG

react-native-xenon

Version:

A powerful in-app debugging tool for React Native.

172 lines (171 loc) 7.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useNetworkInterceptor; var _react = require("react"); var _useImmer = require("use-immer"); var _constants = require("../core/constants"); var _interceptors = require("../interceptors"); var _types = require("../types"); var _utils = require("../core/utils"); const initRequests = new Map(); const xhrInterceptor = new _interceptors.XHRInterceptor(); const fetchInterceptor = new _interceptors.FetchInterceptor(); const webSocketInterceptor = new _interceptors.WebSocketInterceptor(); function useNetworkInterceptor({ autoEnabled }) { const [isInterceptorEnabled, setIsInterceptorEnabled] = (0, _react.useState)(autoEnabled); const [networkRequests, setNetworkRequests] = (0, _useImmer.useImmer)(initRequests); const isEnabled = () => xhrInterceptor.isInterceptorEnabled && fetchInterceptor.isInterceptorEnabled && webSocketInterceptor.isInterceptorEnabled; const clearAllNetworkRequests = () => { setNetworkRequests(initRequests); }; const enableHttpInterceptions = (0, _react.useCallback)(() => { const openCallback = (id, type, method, url) => { if (!id) return; setNetworkRequests(draft => { draft.set(id, { type, method, url }); }); }; const requestHeaderCallback = (id, header, value) => { if (!id) return; setNetworkRequests(draft => { if (!draft.get(id)) return draft; const requestHeaderNewLine = draft.get(id).requestHeadersString?.length ? 'leading' : null; const currentHeaderLine = (0, _utils.keyValueToString)(header, value, requestHeaderNewLine); const fetchRequestHeaderLineRegex = RegExp((0, _utils.keyValueToString)(_constants.NETWORK_REQUEST_HEADER, _types.NetworkType.Fetch, requestHeaderNewLine), 'gi'); const isFetchInXHR = draft.get(id).type === _types.NetworkType.XHR && !!currentHeaderLine.match(fetchRequestHeaderLineRegex); if (isFetchInXHR) { draft.delete(id); } else { draft.get(id).requestHeadersString ??= ''; draft.get(id).requestHeadersString += currentHeaderLine; draft.get(id).requestHeaders ??= {}; draft.get(id).requestHeaders[header] = value; } }); }; const sendCallback = (id, data) => { if (!id) return; setNetworkRequests(draft => { if (!draft.get(id)) return draft; draft.get(id).body = data; }); }; const headerReceivedCallback = (id, responseContentType, responseSize, responseHeaders) => { if (!id) return; setNetworkRequests(draft => { if (!draft.get(id)) return draft; draft.get(id).responseContentType = responseContentType; draft.get(id).responseSize = responseSize; draft.get(id).responseHeaders = responseHeaders; }); }; const responseCallback = (id, status, timeout, duration, response, responseURL, responseType) => { if (!id) return; setNetworkRequests(draft => { if (!draft.get(id)) return draft; draft.get(id).status = status; draft.get(id).timeout = timeout; draft.get(id).duration = duration; draft.get(id).response = response; if (responseURL) draft.get(id).url = responseURL; draft.get(id).responseType = responseType; }); }; xhrInterceptor.set('open', openCallback).set('requestHeader', requestHeaderCallback).set('send', sendCallback).set('headerReceived', headerReceivedCallback).set('response', responseCallback).enableInterception(); fetchInterceptor.set('open', openCallback).set('requestHeader', requestHeaderCallback).set('send', sendCallback).set('headerReceived', headerReceivedCallback).set('response', responseCallback).enableInterception(); }, [setNetworkRequests]); const enableWebSocketInterception = (0, _react.useCallback)(() => { const connectCallback = (url, protocols, options, socketId) => { if (typeof socketId !== 'number') return; setNetworkRequests(draft => { draft.set(`${socketId}`, { url, type: _types.NetworkType.WS, protocols, options }); }); }; const sendCallback = (data, socketId) => { if (typeof socketId !== 'number') return; setNetworkRequests(draft => { if (!draft.get(`${socketId}`)) return draft; draft.get(`${socketId}`).messages ??= ''; draft.get(`${socketId}`).messages += (0, _utils.keyValueToString)('SENT', data, draft.get(`${socketId}`).messages?.length ? 'leading' : null); }); }; const closeCallback = (code, reason, socketId) => { if (typeof socketId !== 'number') return; setNetworkRequests(draft => { if (!draft.get(`${socketId}`)) return draft; draft.get(`${socketId}`).status = code; draft.get(`${socketId}`).closeReason = reason; }); }; const onOpenCallback = (socketId, duration) => { if (typeof socketId !== 'number') return; setNetworkRequests(draft => { if (!draft.get(`${socketId}`)) return draft; draft.get(`${socketId}`).duration = duration; }); }; const onMessageCallback = (socketId, message) => { if (typeof socketId !== 'number') return; setNetworkRequests(draft => { if (!draft.get(`${socketId}`)) return draft; draft.get(`${socketId}`).messages ??= ''; draft.get(`${socketId}`).messages += (0, _utils.keyValueToString)('RECEIVED', message, draft.get(`${socketId}`).messages?.length ? 'leading' : null); }); }; const onErrorCallback = (socketId, data) => { if (typeof socketId !== 'number') return; setNetworkRequests(draft => { if (!draft.get(`${socketId}`)) return draft; draft.get(`${socketId}`).serverError = data; }); }; const onCloseCallback = (socketId, data) => { if (typeof socketId !== 'number') return; setNetworkRequests(draft => { if (!draft.get(`${socketId}`)) return draft; draft.get(`${socketId}`).serverClose = data; }); }; webSocketInterceptor.set('connect', connectCallback).set('send', sendCallback).set('close', closeCallback).set('onOpen', onOpenCallback).set('onMessage', onMessageCallback).set('onError', onErrorCallback).set('onClose', onCloseCallback).enableInterception(); }, [setNetworkRequests]); const enableInterception = (0, _react.useCallback)(() => { if (isEnabled()) return; enableHttpInterceptions(); enableWebSocketInterception(); setIsInterceptorEnabled(true); }, [enableHttpInterceptions, enableWebSocketInterception]); const disableInterception = (0, _react.useCallback)(() => { if (!isEnabled()) return; xhrInterceptor.disableInterception(); fetchInterceptor.disableInterception(); webSocketInterceptor.disableInterception(); setIsInterceptorEnabled(false); }, []); (0, _react.useEffect)(() => { if (autoEnabled) { enableInterception(); return disableInterception; } }, [autoEnabled, disableInterception, enableInterception]); return { isInterceptorEnabled, enableInterception, disableInterception, clearAllNetworkRequests, networkRequests }; } //# sourceMappingURL=useNetworkInterceptor.js.map