@wutiange/log-listener-plugin 1.3.0-alpha.0 → 1.3.0-alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +2 -2
  3. package/dist/server.d.ts +10 -0
  4. package/dist/server.js +45 -0
  5. package/dist/server.js.map +1 -0
  6. package/dist/src/HTTPInterceptor.d.ts +48 -0
  7. package/dist/src/HTTPInterceptor.js +202 -0
  8. package/dist/src/HTTPInterceptor.js.map +1 -0
  9. package/dist/src/logPlugin.d.ts +19 -20
  10. package/dist/src/logPlugin.js +108 -122
  11. package/dist/src/logPlugin.js.map +1 -1
  12. package/package.json +47 -47
  13. package/src/HTTPInterceptor.ts +319 -0
  14. package/src/__tests__/console.test.ts +25 -25
  15. package/src/common.ts +4 -4
  16. package/src/logPlugin.ts +238 -229
  17. package/src/server.ts +66 -66
  18. package/src/utils.ts +47 -47
  19. package/dist/packages/network-logger/Logger.d.ts +0 -28
  20. package/dist/packages/network-logger/Logger.js +0 -192
  21. package/dist/packages/network-logger/Logger.js.map +0 -1
  22. package/dist/packages/network-logger/NetworkRequestInfo.d.ts +0 -36
  23. package/dist/packages/network-logger/NetworkRequestInfo.js +0 -129
  24. package/dist/packages/network-logger/NetworkRequestInfo.js.map +0 -1
  25. package/dist/packages/network-logger/constant.d.ts +0 -2
  26. package/dist/packages/network-logger/constant.js +0 -6
  27. package/dist/packages/network-logger/constant.js.map +0 -1
  28. package/dist/packages/network-logger/types.d.ts +0 -14
  29. package/dist/packages/network-logger/types.js +0 -3
  30. package/dist/packages/network-logger/types.js.map +0 -1
  31. package/dist/packages/network-logger/utils/debounce.d.ts +0 -2
  32. package/dist/packages/network-logger/utils/debounce.js +0 -20
  33. package/dist/packages/network-logger/utils/debounce.js.map +0 -1
  34. package/dist/packages/network-logger/utils/extractHost.d.ts +0 -2
  35. package/dist/packages/network-logger/utils/extractHost.js +0 -9
  36. package/dist/packages/network-logger/utils/extractHost.js.map +0 -1
  37. package/dist/packages/network-logger/utils/fromEntries.d.ts +0 -2
  38. package/dist/packages/network-logger/utils/fromEntries.js +0 -8
  39. package/dist/packages/network-logger/utils/fromEntries.js.map +0 -1
  40. package/dist/packages/network-logger/utils/logger.d.ts +0 -1
  41. package/dist/packages/network-logger/utils/logger.js +0 -6
  42. package/dist/packages/network-logger/utils/logger.js.map +0 -1
  43. package/dist/src/CompatibilityManager.d.ts +0 -27
  44. package/dist/src/CompatibilityManager.js +0 -74
  45. package/dist/src/CompatibilityManager.js.map +0 -1
  46. package/dist/src/console.d.ts +0 -1
  47. package/dist/src/console.js +0 -20
  48. package/dist/src/console.js.map +0 -1
  49. package/dist/src/fetch.d.ts +0 -1
  50. package/dist/src/fetch.js +0 -48
  51. package/dist/src/fetch.js.map +0 -1
  52. package/dist/src/index.d.ts +0 -2
  53. package/dist/src/index.js +0 -8
  54. package/dist/src/index.js.map +0 -1
  55. package/packages/network-logger/Logger.ts +0 -274
  56. package/packages/network-logger/NetworkRequestInfo.ts +0 -133
  57. package/packages/network-logger/constant.ts +0 -3
  58. package/packages/network-logger/types.ts +0 -36
  59. package/packages/network-logger/utils/debounce.ts +0 -21
  60. package/packages/network-logger/utils/extractHost.ts +0 -7
  61. package/packages/network-logger/utils/fromEntries.ts +0 -7
  62. package/packages/network-logger/utils/logger.ts +0 -2
  63. package/src/CompatibilityManager.ts +0 -64
@@ -1,74 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- class CompatibilityManager {
13
- static interceptionToNetwork(data) {
14
- return __awaiter(this, void 0, void 0, function* () {
15
- const tempWillSendArr = [];
16
- if (Object.keys(CompatibilityManager.requestInfoObj).length === 0) {
17
- CompatibilityManager.requestInfoObj = data.reduce((e, c) => {
18
- if (c.endTime) {
19
- return e;
20
- }
21
- return Object.assign(Object.assign({}, e), { [c.id]: c });
22
- }, {});
23
- tempWillSendArr.concat(data);
24
- }
25
- else {
26
- data.forEach(e => {
27
- const tempObj = CompatibilityManager.requestInfoObj;
28
- if (!(e.id in tempObj)) {
29
- tempWillSendArr.push(e);
30
- if (!e.endTime) {
31
- CompatibilityManager.requestInfoObj[e.id] = e;
32
- }
33
- return;
34
- }
35
- if (e.id in tempObj && e.endTime) {
36
- tempWillSendArr.push(e);
37
- delete CompatibilityManager.requestInfoObj[e.id];
38
- return;
39
- }
40
- });
41
- }
42
- return CompatibilityManager.asyncSwapSendArr(tempWillSendArr);
43
- });
44
- }
45
- static asyncSwapSendArr(data) {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- const asyncTempArr = yield Promise.all(data.map((e) => __awaiter(this, void 0, void 0, function* () {
48
- if (e.endTime) {
49
- return {
50
- headers: e.responseHeaders,
51
- body: yield e.getResponseBody(),
52
- requestId: e.id,
53
- statusCode: e.status,
54
- endTime: e.endTime,
55
- };
56
- }
57
- else {
58
- return {
59
- url: e.url,
60
- id: e.id,
61
- method: e.method,
62
- headers: e.requestHeaders,
63
- body: e.getRequestBody(),
64
- createTime: e.startTime,
65
- };
66
- }
67
- })));
68
- return asyncTempArr;
69
- });
70
- }
71
- }
72
- CompatibilityManager.requestInfoObj = {};
73
- exports.default = CompatibilityManager;
74
- //# sourceMappingURL=CompatibilityManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CompatibilityManager.js","sourceRoot":"","sources":["../../src/CompatibilityManager.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,MAAM,oBAAoB;IAExB,MAAM,CAAO,qBAAqB,CAAC,IAA0B;;YAC3D,MAAM,eAAe,GAAyB,EAAE,CAAA;YAChD,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClE,oBAAoB,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACzD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACd,OAAO,CAAC,CAAA;oBACV,CAAC;oBACD,uCAAW,CAAC,KAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAC;gBAC1B,CAAC,EAAE,EAAE,CAAC,CAAA;gBACN,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACf,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,CAAA;oBACnD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC;wBACvB,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;wBACvB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;4BACf,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;wBAC/C,CAAC;wBACD,OAAM;oBACR,CAAC;oBACD,IAAI,CAAC,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACjC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;wBACvB,OAAO,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;wBAChD,OAAM;oBACR,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;YAGD,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;QAC/D,CAAC;KAAA;IAEO,MAAM,CAAO,gBAAgB,CAAC,IAA0B;;YAC9D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAO,CAAC,EAAE,EAAE;gBAC1D,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO;wBACL,OAAO,EAAE,CAAC,CAAC,eAAe;wBAC1B,IAAI,EAAE,MAAM,CAAC,CAAC,eAAe,EAAE;wBAC/B,SAAS,EAAE,CAAC,CAAC,EAAE;wBACf,UAAU,EAAE,CAAC,CAAC,MAAM;wBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;qBACnB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO;wBACL,GAAG,EAAE,CAAC,CAAC,GAAG;wBACV,EAAE,EAAE,CAAC,CAAC,EAAE;wBACR,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,OAAO,EAAE,CAAC,CAAC,cAAc;wBACzB,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE;wBACxB,UAAU,EAAE,CAAC,CAAC,SAAS;qBACxB,CAAC;gBACJ,CAAC;YACH,CAAC,CAAA,CAAC,CAAC,CAAC;YAEJ,OAAO,YAAY,CAAC;QACtB,CAAC;KAAA;;AAxDc,mCAAc,GAAuC,EAAE,CAAA;AA4DxE,kBAAe,oBAAoB,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const index_1 = __importDefault(require("./index"));
7
- const common = require('./common');
8
- console.log = (...data) => {
9
- index_1.default.log(...data);
10
- common.log(...data);
11
- };
12
- console.warn = (...data) => {
13
- index_1.default.warn(...data);
14
- common.warn(...data);
15
- };
16
- console.error = (...data) => {
17
- index_1.default.error(...data);
18
- common.error(...data);
19
- };
20
- //# sourceMappingURL=console.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/console.ts"],"names":[],"mappings":";;;;;AAKA,oDAA6B;AAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACnC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;IAC/B,eAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;IAChC,eAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;IACjC,eAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACtB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
package/dist/src/fetch.js DELETED
@@ -1,48 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const index_1 = __importDefault(require("./index"));
16
- const utils_1 = require("./utils");
17
- const common = require('./common');
18
- global.fetch = (input, init) => __awaiter(void 0, void 0, void 0, function* () {
19
- const uniqueId = (Date.now() + Math.random()).toString(16);
20
- index_1.default.uniqueReq(uniqueId, input, init);
21
- let isFetchFinished = false;
22
- let isTimeout = false;
23
- const timeout = index_1.default.getTimeout();
24
- if (timeout !== null) {
25
- (0, utils_1.sleep)(timeout).then(() => {
26
- if (!isFetchFinished) {
27
- isTimeout = true;
28
- index_1.default.resTimeout(uniqueId);
29
- }
30
- });
31
- }
32
- try {
33
- const response = yield common.tempFetch(input, init);
34
- isFetchFinished = true;
35
- if (response instanceof Response && !isTimeout) {
36
- index_1.default.uniqueRes(uniqueId, response.clone());
37
- }
38
- return response;
39
- }
40
- catch (error) {
41
- isFetchFinished = true;
42
- if (!isTimeout) {
43
- index_1.default.resResponseError(uniqueId);
44
- }
45
- throw new Error(error);
46
- }
47
- });
48
- //# sourceMappingURL=fetch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/fetch.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAIA,oDAA6B;AAC7B,mCAA8B;AAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEnC,MAAM,CAAC,KAAK,GAAG,CAAO,KAAwB,EAAE,IAAkB,EAAE,EAAE;IACpE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3D,eAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,OAAO,GAAG,eAAM,CAAC,UAAU,EAAE,CAAA;IACnC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,IAAA,aAAK,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC;gBACjB,eAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrD,eAAe,GAAG,IAAI,CAAC;QACvB,IAAI,QAAQ,YAAY,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/C,eAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,eAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACH,CAAC,CAAA,CAAC"}
@@ -1,2 +0,0 @@
1
- import logPlugin from './logPlugin';
2
- export default logPlugin;
package/dist/src/index.js DELETED
@@ -1,8 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const logPlugin_1 = __importDefault(require("./logPlugin"));
7
- exports.default = logPlugin_1.default;
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAEpC,kBAAe,mBAAS,CAAC"}
@@ -1,274 +0,0 @@
1
- // @ts-ignore
2
- import XHRInterceptor from 'react-native/Libraries/Network/XHRInterceptor';
3
- import NetworkRequestInfo from './NetworkRequestInfo';
4
- import type {Headers, RequestMethod, StartNetworkLoggingOptions} from './types';
5
- import {LOGGER_REFRESH_RATE, LOGGER_MAX_REQUESTS} from './constant';
6
- import extractHost from './utils/extractHost';
7
- import {warn} from './utils/logger';
8
- import debounce from './utils/debounce';
9
-
10
- let nextXHRId = 0;
11
-
12
- type XHR = {
13
- _index: number;
14
- responseHeaders?: Headers;
15
- };
16
-
17
-
18
- export default class Logger {
19
- private requests: NetworkRequestInfo[] = [];
20
- private xhrIdMap: Map<number, () => number> = new Map();
21
- private maxRequests: number = LOGGER_MAX_REQUESTS;
22
- private refreshRate: number = LOGGER_REFRESH_RATE;
23
- private latestRequestUpdatedAt: number = 0;
24
- private ignoredHosts: Set<string> | undefined;
25
- private ignoredUrls: Set<string> | undefined;
26
- private ignoredPatterns: RegExp[] | undefined;
27
- public enabled = false;
28
- public paused = false;
29
-
30
- callback = (_: NetworkRequestInfo[]): void => null;
31
-
32
- setCallback = (callback: any) => {
33
- this.callback = callback;
34
- };
35
-
36
- debouncedCallback = debounce(() => {
37
- if (
38
- !this.latestRequestUpdatedAt ||
39
- this.requests.some(r => r.updatedAt > this.latestRequestUpdatedAt)
40
- ) {
41
- this.latestRequestUpdatedAt = Date.now();
42
- // prevent mutation of requests for all subscribers
43
- this.callback([...this.requests]);
44
- }
45
- }, this.refreshRate);
46
-
47
- private getRequest = (xhrIndex?: number) => {
48
- if (xhrIndex === undefined) {
49
- return undefined;
50
- }
51
- if (!this.xhrIdMap.has(xhrIndex)) {
52
- return undefined;
53
- }
54
- const index = this.xhrIdMap.get(xhrIndex)!();
55
- return this.requests[index];
56
- };
57
-
58
- private updateRequest = (
59
- index: number,
60
- update: Partial<NetworkRequestInfo>,
61
- ) => {
62
- const networkInfo = this.getRequest(index);
63
- if (!networkInfo) {
64
- return;
65
- }
66
- networkInfo.update(update);
67
- };
68
-
69
- private openCallback = (method: RequestMethod, url: string, xhr: XHR) => {
70
- if (this.paused) {
71
- return;
72
- }
73
-
74
- if (this.ignoredHosts) {
75
- const host = extractHost(url);
76
- if (host && this.ignoredHosts.has(host)) {
77
- return;
78
- }
79
- }
80
-
81
- if (this.ignoredUrls && this.ignoredUrls.has(url)) {
82
- return;
83
- }
84
-
85
- if (this.ignoredPatterns) {
86
- if (
87
- this.ignoredPatterns.some(pattern => pattern.test(`${method} ${url}`))
88
- ) {
89
- return;
90
- }
91
- }
92
-
93
- xhr._index = nextXHRId++;
94
- this.xhrIdMap.set(xhr._index, () => {
95
- return this.requests.findIndex(r => r.id === `${xhr._index}`);
96
- });
97
-
98
- const newRequest = new NetworkRequestInfo(
99
- `${xhr._index}`,
100
- 'XMLHttpRequest',
101
- method,
102
- url,
103
- );
104
-
105
- if (this.requests.length >= this.maxRequests) {
106
- this.requests.pop();
107
- }
108
-
109
- this.requests.unshift(newRequest);
110
- };
111
-
112
- private requestHeadersCallback = (
113
- header: string,
114
- value: string,
115
- xhr: XHR,
116
- ) => {
117
- const networkInfo = this.getRequest(xhr._index);
118
- if (!networkInfo) {
119
- return;
120
- }
121
- networkInfo.requestHeaders[header] = value;
122
- };
123
-
124
- private headerReceivedCallback = (
125
- responseContentType: string,
126
- responseSize: number,
127
- responseHeaders: Headers,
128
- xhr: XHR,
129
- ) => {
130
- this.updateRequest(xhr._index, {
131
- responseContentType,
132
- responseSize,
133
- responseHeaders: xhr.responseHeaders,
134
- });
135
- };
136
-
137
- private sendCallback = (data: string, xhr: XHR) => {
138
- this.updateRequest(xhr._index, {
139
- startTime: Date.now(),
140
- dataSent: data,
141
- });
142
- this.debouncedCallback();
143
- };
144
-
145
- private responseCallback = (
146
- status: number,
147
- timeout: number,
148
- response: string,
149
- responseURL: string,
150
- responseType: string,
151
- xhr: XHR,
152
- ) => {
153
- this.updateRequest(xhr._index, {
154
- endTime: Date.now(),
155
- status,
156
- timeout,
157
- response,
158
- responseURL,
159
- responseType,
160
- });
161
- this.debouncedCallback();
162
- };
163
-
164
- enableXHRInterception = (options?: StartNetworkLoggingOptions) => {
165
- if (
166
- this.enabled ||
167
- (XHRInterceptor.isInterceptorEnabled() && !options?.forceEnable)
168
- ) {
169
- if (!this.enabled) {
170
- warn(
171
- 'network interceptor has not been enabled as another interceptor is already running (e.g. another debugging program). Use option `forceEnable: true` to override this behaviour.',
172
- );
173
- }
174
- return;
175
- }
176
-
177
- if (options?.maxRequests !== undefined) {
178
- if (typeof options.maxRequests !== 'number' || options.maxRequests < 1) {
179
- warn(
180
- 'maxRequests must be a number greater than 0. The logger has not been started.',
181
- );
182
- return;
183
- }
184
- this.maxRequests = options.maxRequests;
185
- }
186
-
187
- if (options?.ignoredHosts) {
188
- if (
189
- !Array.isArray(options.ignoredHosts) ||
190
- typeof options.ignoredHosts[0] !== 'string'
191
- ) {
192
- warn(
193
- 'ignoredHosts must be an array of strings. The logger has not been started.',
194
- );
195
- return;
196
- }
197
- this.ignoredHosts = new Set(options.ignoredHosts);
198
- }
199
-
200
- if (options?.refreshRate) {
201
- if (typeof options.refreshRate !== 'number' || options.refreshRate < 1) {
202
- warn(
203
- 'refreshRate must be a number greater than 0. The logger has not been started.',
204
- );
205
- return;
206
- }
207
- this.refreshRate = options.refreshRate;
208
- }
209
-
210
- if (options?.ignoredPatterns) {
211
- this.ignoredPatterns = options.ignoredPatterns;
212
- }
213
-
214
- if (options?.ignoredUrls) {
215
- if (
216
- !Array.isArray(options.ignoredUrls) ||
217
- typeof options.ignoredUrls[0] !== 'string'
218
- ) {
219
- warn(
220
- 'ignoredUrls must be an array of strings. The logger has not been started.',
221
- );
222
- return;
223
- }
224
- this.ignoredUrls = new Set(options.ignoredUrls);
225
- }
226
-
227
- XHRInterceptor.setOpenCallback(this.openCallback);
228
- XHRInterceptor.setRequestHeaderCallback(this.requestHeadersCallback);
229
- XHRInterceptor.setHeaderReceivedCallback(this.headerReceivedCallback);
230
- XHRInterceptor.setSendCallback(this.sendCallback);
231
- XHRInterceptor.setResponseCallback(this.responseCallback);
232
-
233
- XHRInterceptor.enableInterception();
234
- this.enabled = true;
235
- };
236
-
237
- getRequests = () => {
238
- return this.requests;
239
- };
240
-
241
- clearRequests = () => {
242
- this.requests = [];
243
- this.latestRequestUpdatedAt = 0;
244
- this.debouncedCallback();
245
- };
246
-
247
- disableXHRInterception = () => {
248
- if (!this.enabled) {
249
- return;
250
- }
251
-
252
- this.clearRequests();
253
-
254
- nextXHRId = 0;
255
- this.enabled = false;
256
- this.paused = false;
257
- this.xhrIdMap.clear();
258
- this.maxRequests = LOGGER_MAX_REQUESTS;
259
- this.refreshRate = LOGGER_REFRESH_RATE;
260
- this.ignoredHosts = undefined;
261
- this.ignoredUrls = undefined;
262
- this.ignoredPatterns = undefined;
263
-
264
- const noop = (): void => null;
265
- // manually reset callbacks even if the XHRInterceptor lib does it for us with 'disableInterception'
266
- XHRInterceptor.setOpenCallback(noop);
267
- XHRInterceptor.setRequestHeaderCallback(noop);
268
- XHRInterceptor.setHeaderReceivedCallback(noop);
269
- XHRInterceptor.setSendCallback(noop);
270
- XHRInterceptor.setResponseCallback(noop);
271
-
272
- XHRInterceptor.disableInterception();
273
- };
274
- }
@@ -1,133 +0,0 @@
1
- // @ts-ignore
2
- import BlobFileReader from 'react-native/Libraries/Blob/FileReader';
3
- import type {Headers, NetworkRequestInfoRow, RequestMethod} from './types';
4
- import fromEntries from './utils/fromEntries';
5
-
6
- export default class NetworkRequestInfo {
7
- id = '';
8
- type = '';
9
- url = '';
10
- method: RequestMethod;
11
- status: number = -1;
12
- dataSent = '';
13
- responseContentType = '';
14
- responseSize = 0;
15
- requestHeaders: Headers = {};
16
- responseHeaders: Headers = {};
17
- response = '';
18
- responseURL = '';
19
- responseType = '';
20
- timeout = 0;
21
- closeReason = '';
22
- messages = '';
23
- serverClose: any = undefined;
24
- serverError: any = undefined;
25
- startTime: number = 0;
26
- endTime: number = 0;
27
- gqlOperation?: string;
28
- updatedAt: number = 0;
29
-
30
- constructor(id: string, type: string, method: RequestMethod, url: string) {
31
- this.id = id;
32
- this.type = type;
33
- this.method = method;
34
- this.url = url;
35
- this.updatedAt = Date.now();
36
- }
37
-
38
- get duration() {
39
- return this.endTime - this.startTime;
40
- }
41
-
42
- get curlRequest() {
43
- let headersPart =
44
- this.requestHeaders &&
45
- Object.entries(this.requestHeaders)
46
- .map(([key, value]) => `'${key}: ${this.escapeQuotes(value)}'`)
47
- .join(' -H ');
48
- headersPart = headersPart ? `-H ${headersPart}` : '';
49
-
50
- const body = this.dataSent && this.escapeQuotes(this.dataSent);
51
-
52
- const methodPart =
53
- this.method !== 'GET' ? `-X${this.method.toUpperCase()}` : '';
54
- const bodyPart = body ? `-d '${body}'` : '';
55
-
56
- const parts = ['curl', methodPart, headersPart, bodyPart, `'${this.url}'`];
57
-
58
- return parts.filter(Boolean).join(' ');
59
- }
60
-
61
- update(values: Partial<NetworkRequestInfo>) {
62
- Object.assign(this, values);
63
- if (values.dataSent) {
64
- const data = this.parseData(values.dataSent);
65
- this.gqlOperation = data?.operationName;
66
- }
67
- this.updatedAt = Date.now();
68
- }
69
-
70
- private escapeQuotes(value: string) {
71
- return value.replace?.(/'/g, "\\'");
72
- }
73
-
74
- private parseData(data: any) {
75
- try {
76
- if (data?._parts?.length) {
77
- return fromEntries(data?._parts);
78
- }
79
- return JSON.parse(data);
80
- } catch (e) {
81
- return {data};
82
- }
83
- }
84
-
85
- private stringifyFormat(data: any) {
86
- return JSON.stringify(this.parseData(data), null, 2);
87
- }
88
-
89
- public toRow(): NetworkRequestInfoRow {
90
- return {
91
- url: this.url,
92
- gqlOperation: this.gqlOperation,
93
- id: this.id,
94
- method: this.method,
95
- status: this.status,
96
- duration: this.duration,
97
- startTime: this.startTime,
98
- };
99
- }
100
-
101
- getRequestBody(replaceEscaped = false) {
102
- const body = this.stringifyFormat(this.dataSent);
103
-
104
- if (replaceEscaped) {
105
- return body.replace(/\\n/g, '\n').replace(/\\"/g, '"');
106
- }
107
-
108
- return body;
109
- }
110
-
111
- private async parseResponseBlob() {
112
- const blobReader = new BlobFileReader();
113
- blobReader.readAsText(this.response);
114
-
115
- return await new Promise<string>((resolve, reject) => {
116
- const handleError = () => reject(blobReader.error);
117
-
118
- blobReader.addEventListener('load', () => {
119
- resolve(blobReader.result);
120
- });
121
- blobReader.addEventListener('error', handleError);
122
- blobReader.addEventListener('abort', handleError);
123
- });
124
- }
125
-
126
- async getResponseBody() {
127
- const body = await (this.responseType !== 'blob'
128
- ? this.response
129
- : this.parseResponseBlob());
130
-
131
- return this.stringifyFormat(body);
132
- }
133
- }
@@ -1,3 +0,0 @@
1
- // StartNetworkLoggingOptions
2
- export const LOGGER_MAX_REQUESTS: number = 500;
3
- export const LOGGER_REFRESH_RATE: number = 50;
@@ -1,36 +0,0 @@
1
- import NetworkRequestInfo from './NetworkRequestInfo';
2
-
3
- export type Headers = {[header: string]: string};
4
- export type RequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
5
- export type StartNetworkLoggingOptions = {
6
- /**
7
- * Max number of requests to keep before overwriting
8
- * @default 500
9
- */
10
- maxRequests?: number;
11
- /** List of hosts to ignore, e.g. `services.test.com` */
12
- ignoredHosts?: string[];
13
- /** List of urls to ignore, e.g. `https://services.test.com/test` */
14
- ignoredUrls?: string[];
15
- /**
16
- * List of url patterns to ignore, e.g. `/^GET https://test.com\/pages\/.*$/`
17
- *
18
- * Url to match with is in the format: `${method} ${url}`, e.g. `GET https://test.com/pages/123`
19
- */
20
- ignoredPatterns?: RegExp[];
21
- /**
22
- * Force the network logger to start even if another program is using the network interceptor
23
- * e.g. a dev/debuging program
24
- */
25
- forceEnable?: boolean;
26
- /**
27
- * Refresh rate of the logger in milliseconds
28
- * @default 50
29
- */
30
- refreshRate?: number;
31
- };
32
-
33
- export type NetworkRequestInfoRow = Pick<
34
- NetworkRequestInfo,
35
- 'url' | 'gqlOperation' | 'id' | 'method' | 'status' | 'duration' | 'startTime'
36
- >;
@@ -1,21 +0,0 @@
1
- // https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_debounce
2
- function debounce(func: Function, wait: number, immediate: boolean = false) {
3
- let timeout: ReturnType<typeof setTimeout> | undefined;
4
- return function () {
5
- const args = arguments;
6
- clearTimeout(timeout);
7
- // @ts-ignore
8
- if (immediate && !timeout) {
9
- func.apply(this, args);
10
- }
11
- timeout = setTimeout(function () {
12
- timeout = undefined;
13
- // @ts-ignore
14
- if (!immediate) {
15
- func.apply(this, args);
16
- }
17
- }, wait);
18
- };
19
- }
20
-
21
- export default debounce;
@@ -1,7 +0,0 @@
1
- const extractHost = (url: string) => {
2
- const host = url.split('//')[1]?.split(':')[0]?.split('/')[0] || undefined;
3
-
4
- return host;
5
- };
6
-
7
- export default extractHost;
@@ -1,7 +0,0 @@
1
- const fromEntries = (arr: any[]) =>
2
- arr.reduce((acc, [k, v]) => {
3
- acc[k] = v;
4
- return acc;
5
- }, {});
6
-
7
- export default fromEntries;
@@ -1,2 +0,0 @@
1
- export const warn = (message: string) =>
2
- console.warn(`react-native-network-logger: ${message}`);