react-native-xenon
Version:
A powerful in-app debugging tool for React Native.
172 lines (171 loc) • 7.34 kB
JavaScript
;
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