@wutiange/log-listener-plugin 1.3.0-alpha.0 → 1.3.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/README.md +2 -2
- package/dist/server.d.ts +10 -0
- package/dist/server.js +45 -0
- package/dist/server.js.map +1 -0
- package/dist/src/HTTPInterceptor.d.ts +48 -0
- package/dist/src/HTTPInterceptor.js +202 -0
- package/dist/src/HTTPInterceptor.js.map +1 -0
- package/dist/src/logPlugin.d.ts +19 -20
- package/dist/src/logPlugin.js +108 -122
- package/dist/src/logPlugin.js.map +1 -1
- package/package.json +47 -47
- package/src/HTTPInterceptor.ts +319 -0
- package/src/__tests__/console.test.ts +25 -25
- package/src/common.ts +4 -4
- package/src/logPlugin.ts +238 -229
- package/src/server.ts +66 -66
- package/src/utils.ts +47 -47
- package/dist/packages/network-logger/Logger.d.ts +0 -28
- package/dist/packages/network-logger/Logger.js +0 -192
- package/dist/packages/network-logger/Logger.js.map +0 -1
- package/dist/packages/network-logger/NetworkRequestInfo.d.ts +0 -36
- package/dist/packages/network-logger/NetworkRequestInfo.js +0 -129
- package/dist/packages/network-logger/NetworkRequestInfo.js.map +0 -1
- package/dist/packages/network-logger/constant.d.ts +0 -2
- package/dist/packages/network-logger/constant.js +0 -6
- package/dist/packages/network-logger/constant.js.map +0 -1
- package/dist/packages/network-logger/types.d.ts +0 -14
- package/dist/packages/network-logger/types.js +0 -3
- package/dist/packages/network-logger/types.js.map +0 -1
- package/dist/packages/network-logger/utils/debounce.d.ts +0 -2
- package/dist/packages/network-logger/utils/debounce.js +0 -20
- package/dist/packages/network-logger/utils/debounce.js.map +0 -1
- package/dist/packages/network-logger/utils/extractHost.d.ts +0 -2
- package/dist/packages/network-logger/utils/extractHost.js +0 -9
- package/dist/packages/network-logger/utils/extractHost.js.map +0 -1
- package/dist/packages/network-logger/utils/fromEntries.d.ts +0 -2
- package/dist/packages/network-logger/utils/fromEntries.js +0 -8
- package/dist/packages/network-logger/utils/fromEntries.js.map +0 -1
- package/dist/packages/network-logger/utils/logger.d.ts +0 -1
- package/dist/packages/network-logger/utils/logger.js +0 -6
- package/dist/packages/network-logger/utils/logger.js.map +0 -1
- package/dist/src/CompatibilityManager.d.ts +0 -27
- package/dist/src/CompatibilityManager.js +0 -74
- package/dist/src/CompatibilityManager.js.map +0 -1
- package/dist/src/console.d.ts +0 -1
- package/dist/src/console.js +0 -20
- package/dist/src/console.js.map +0 -1
- package/dist/src/fetch.d.ts +0 -1
- package/dist/src/fetch.js +0 -48
- package/dist/src/fetch.js.map +0 -1
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.js +0 -8
- package/dist/src/index.js.map +0 -1
- package/packages/network-logger/Logger.ts +0 -274
- package/packages/network-logger/NetworkRequestInfo.ts +0 -133
- package/packages/network-logger/constant.ts +0 -3
- package/packages/network-logger/types.ts +0 -36
- package/packages/network-logger/utils/debounce.ts +0 -21
- package/packages/network-logger/utils/extractHost.ts +0 -7
- package/packages/network-logger/utils/fromEntries.ts +0 -7
- package/packages/network-logger/utils/logger.ts +0 -2
- 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"}
|
package/dist/src/console.d.ts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
export {};
|
package/dist/src/console.js
DELETED
@@ -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
|
package/dist/src/console.js.map
DELETED
@@ -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"}
|
package/dist/src/fetch.d.ts
DELETED
@@ -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
|
package/dist/src/fetch.js.map
DELETED
@@ -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"}
|
package/dist/src/index.d.ts
DELETED
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
|
package/dist/src/index.js.map
DELETED
@@ -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,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;
|