@openreplay/tracker 14.0.7 → 14.0.8
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/CHANGELOG.md +5 -0
- package/bun.lockb +0 -0
- package/cjs/app/index.js +5 -1
- package/cjs/index.js +1 -1
- package/cjs/modules/network.js +4 -2
- package/lib/app/index.js +5 -1
- package/lib/common/tsconfig.tsbuildinfo +1 -1
- package/lib/index.js +1 -1
- package/lib/modules/network.js +4 -2
- package/package.json +2 -1
- package/tsconfig-base.json +2 -2
- package/cjs/modules/Network/beaconProxy.d.ts +0 -16
- package/cjs/modules/Network/beaconProxy.js +0 -87
- package/cjs/modules/Network/fetchProxy.d.ts +0 -34
- package/cjs/modules/Network/fetchProxy.js +0 -309
- package/cjs/modules/Network/index.d.ts +0 -3
- package/cjs/modules/Network/index.js +0 -28
- package/cjs/modules/Network/networkMessage.d.ts +0 -49
- package/cjs/modules/Network/networkMessage.js +0 -87
- package/cjs/modules/Network/types.d.ts +0 -13
- package/cjs/modules/Network/types.js +0 -3
- package/cjs/modules/Network/utils.d.ts +0 -11
- package/cjs/modules/Network/utils.js +0 -216
- package/cjs/modules/Network/xhrProxy.d.ts +0 -39
- package/cjs/modules/Network/xhrProxy.js +0 -249
- package/lib/modules/Network/beaconProxy.d.ts +0 -16
- package/lib/modules/Network/beaconProxy.js +0 -79
- package/lib/modules/Network/fetchProxy.d.ts +0 -34
- package/lib/modules/Network/fetchProxy.js +0 -280
- package/lib/modules/Network/index.d.ts +0 -3
- package/lib/modules/Network/index.js +0 -22
- package/lib/modules/Network/networkMessage.d.ts +0 -49
- package/lib/modules/Network/networkMessage.js +0 -83
- package/lib/modules/Network/types.d.ts +0 -13
- package/lib/modules/Network/types.js +0 -2
- package/lib/modules/Network/utils.d.ts +0 -11
- package/lib/modules/Network/utils.js +0 -204
- package/lib/modules/Network/xhrProxy.d.ts +0 -39
- package/lib/modules/Network/xhrProxy.js +0 -221
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.FetchProxyHandler = exports.ResponseProxyHandler = void 0;
|
|
27
|
-
/**
|
|
28
|
-
* I took inspiration in few stack exchange posts
|
|
29
|
-
* and Tencent vConsole library (MIT)
|
|
30
|
-
* by wrapping the XMLHttpRequest object in a Proxy
|
|
31
|
-
* we can intercept the network requests
|
|
32
|
-
* in not-so-hacky way
|
|
33
|
-
* */
|
|
34
|
-
const networkMessage_js_1 = __importStar(require("./networkMessage.js"));
|
|
35
|
-
const utils_js_1 = require("./utils.js");
|
|
36
|
-
class ResponseProxyHandler {
|
|
37
|
-
constructor(resp, item) {
|
|
38
|
-
this.resp = resp;
|
|
39
|
-
this.item = item;
|
|
40
|
-
this.mockReader();
|
|
41
|
-
}
|
|
42
|
-
set(target, key, value) {
|
|
43
|
-
return Reflect.set(target, key, value);
|
|
44
|
-
}
|
|
45
|
-
get(target, key) {
|
|
46
|
-
const value = Reflect.get(target, key);
|
|
47
|
-
switch (key) {
|
|
48
|
-
case 'arrayBuffer':
|
|
49
|
-
case 'blob':
|
|
50
|
-
case 'formData':
|
|
51
|
-
case 'json':
|
|
52
|
-
case 'text':
|
|
53
|
-
return () => {
|
|
54
|
-
this.item.responseType = key.toLowerCase();
|
|
55
|
-
// @ts-ignore
|
|
56
|
-
return value.apply(target).then((resp) => {
|
|
57
|
-
this.item.response = (0, utils_js_1.getStringResponseByType)(this.item.responseType, resp);
|
|
58
|
-
return resp;
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
if (typeof value === 'function') {
|
|
63
|
-
return value.bind(target);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
return value;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
mockReader() {
|
|
70
|
-
let readerReceivedValue;
|
|
71
|
-
if (!this.resp.body) {
|
|
72
|
-
// some browsers do not return `body` in some cases, like `OPTIONS` method
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (typeof this.resp.body.getReader !== 'function') {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const _getReader = this.resp.body.getReader;
|
|
79
|
-
// @ts-ignore
|
|
80
|
-
this.resp.body.getReader = () => {
|
|
81
|
-
const reader = _getReader.apply(this.resp.body);
|
|
82
|
-
// when readyState is already 4,
|
|
83
|
-
// it's not a chunked stream, or it had already been read.
|
|
84
|
-
// so should not update status.
|
|
85
|
-
if (this.item.readyState === networkMessage_js_1.RequestState.DONE) {
|
|
86
|
-
return reader;
|
|
87
|
-
}
|
|
88
|
-
const _read = reader.read;
|
|
89
|
-
const _cancel = reader.cancel;
|
|
90
|
-
this.item.responseType = 'arraybuffer';
|
|
91
|
-
// @ts-ignore
|
|
92
|
-
reader.read = () => {
|
|
93
|
-
return _read.apply(reader).then((result) => {
|
|
94
|
-
if (!readerReceivedValue) {
|
|
95
|
-
// @ts-ignore
|
|
96
|
-
readerReceivedValue = new Uint8Array(result.value);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
100
|
-
const newValue = new Uint8Array(readerReceivedValue.length + result.value.length);
|
|
101
|
-
newValue.set(readerReceivedValue);
|
|
102
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
103
|
-
newValue.set(result.value, readerReceivedValue.length);
|
|
104
|
-
readerReceivedValue = newValue;
|
|
105
|
-
}
|
|
106
|
-
this.item.endTime = performance.now();
|
|
107
|
-
this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
|
|
108
|
-
this.item.readyState = result.done ? 4 : 3;
|
|
109
|
-
this.item.statusText = result.done ? String(this.item.status) : 'Loading';
|
|
110
|
-
this.item.responseSize = readerReceivedValue.length;
|
|
111
|
-
this.item.responseSizeText = (0, utils_js_1.formatByteSize)(this.item.responseSize);
|
|
112
|
-
if (result.done) {
|
|
113
|
-
this.item.response = (0, utils_js_1.getStringResponseByType)(this.item.responseType, readerReceivedValue);
|
|
114
|
-
}
|
|
115
|
-
return result;
|
|
116
|
-
});
|
|
117
|
-
};
|
|
118
|
-
reader.cancel = (...args) => {
|
|
119
|
-
this.item.cancelState = 2;
|
|
120
|
-
this.item.statusText = 'Cancel';
|
|
121
|
-
this.item.endTime = performance.now();
|
|
122
|
-
this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
|
|
123
|
-
this.item.response = (0, utils_js_1.getStringResponseByType)(this.item.responseType, readerReceivedValue);
|
|
124
|
-
return _cancel.apply(reader, args);
|
|
125
|
-
};
|
|
126
|
-
return reader;
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
exports.ResponseProxyHandler = ResponseProxyHandler;
|
|
131
|
-
class FetchProxyHandler {
|
|
132
|
-
constructor(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher) {
|
|
133
|
-
this.ignoredHeaders = ignoredHeaders;
|
|
134
|
-
this.setSessionTokenHeader = setSessionTokenHeader;
|
|
135
|
-
this.sanitize = sanitize;
|
|
136
|
-
this.sendMessage = sendMessage;
|
|
137
|
-
this.isServiceUrl = isServiceUrl;
|
|
138
|
-
this.tokenUrlMatcher = tokenUrlMatcher;
|
|
139
|
-
}
|
|
140
|
-
apply(target, _, argsList) {
|
|
141
|
-
const input = argsList[0];
|
|
142
|
-
const init = argsList[1];
|
|
143
|
-
if (!input ||
|
|
144
|
-
// @ts-ignore
|
|
145
|
-
(typeof input !== 'string' && !input?.url)) {
|
|
146
|
-
return target.apply(window, argsList);
|
|
147
|
-
}
|
|
148
|
-
const isORUrl = input instanceof URL || typeof input === 'string'
|
|
149
|
-
? this.isServiceUrl(String(input))
|
|
150
|
-
: this.isServiceUrl(String(input.url));
|
|
151
|
-
if (isORUrl) {
|
|
152
|
-
return target.apply(window, argsList);
|
|
153
|
-
}
|
|
154
|
-
const item = new networkMessage_js_1.default(this.ignoredHeaders, this.setSessionTokenHeader, this.sanitize);
|
|
155
|
-
this.beforeFetch(item, input, init);
|
|
156
|
-
this.setSessionTokenHeader((name, value) => {
|
|
157
|
-
if (this.tokenUrlMatcher !== undefined) {
|
|
158
|
-
if (!this.tokenUrlMatcher(item.url)) {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
if (argsList[1] === undefined && argsList[0] instanceof Request) {
|
|
163
|
-
return argsList[0].headers.append(name, value);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
if (!argsList[1])
|
|
167
|
-
argsList[1] = {};
|
|
168
|
-
if (argsList[1].headers === undefined) {
|
|
169
|
-
argsList[1] = { ...argsList[1], headers: {} };
|
|
170
|
-
}
|
|
171
|
-
if (argsList[1].headers instanceof Headers) {
|
|
172
|
-
argsList[1].headers.append(name, value);
|
|
173
|
-
}
|
|
174
|
-
else if (Array.isArray(argsList[1].headers)) {
|
|
175
|
-
argsList[1].headers.push([name, value]);
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
// @ts-ignore
|
|
179
|
-
argsList[1].headers[name] = value;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
return target.apply(window, argsList)
|
|
184
|
-
.then(this.afterFetch(item))
|
|
185
|
-
.catch((e) => {
|
|
186
|
-
// mock finally
|
|
187
|
-
item.endTime = performance.now();
|
|
188
|
-
item.duration = item.endTime - (item.startTime || item.endTime);
|
|
189
|
-
throw e;
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
beforeFetch(item, input, init) {
|
|
193
|
-
let url, method = 'GET', requestHeader = {};
|
|
194
|
-
// handle `input` content
|
|
195
|
-
if (typeof input === 'string') {
|
|
196
|
-
// when `input` is a string
|
|
197
|
-
method = init?.method || 'GET';
|
|
198
|
-
url = (0, utils_js_1.getURL)(input);
|
|
199
|
-
requestHeader = init?.headers || {};
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
// when `input` is a `Request` object
|
|
203
|
-
method = input.method || 'GET';
|
|
204
|
-
url = (0, utils_js_1.getURL)(input.url);
|
|
205
|
-
requestHeader = input.headers;
|
|
206
|
-
}
|
|
207
|
-
item.method = method;
|
|
208
|
-
item.requestType = 'fetch';
|
|
209
|
-
item.requestHeader = requestHeader;
|
|
210
|
-
item.url = url.toString();
|
|
211
|
-
item.name = (url.pathname.split('/').pop() || '') + url.search;
|
|
212
|
-
item.status = 0;
|
|
213
|
-
item.statusText = 'Pending';
|
|
214
|
-
item.readyState = 1;
|
|
215
|
-
if (!item.startTime) {
|
|
216
|
-
// UNSENT
|
|
217
|
-
item.startTime = performance.now();
|
|
218
|
-
}
|
|
219
|
-
if (Object.prototype.toString.call(requestHeader) === '[object Headers]') {
|
|
220
|
-
item.requestHeader = {};
|
|
221
|
-
for (const [key, value] of requestHeader) {
|
|
222
|
-
item.requestHeader[key] = value;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
item.requestHeader = requestHeader;
|
|
227
|
-
}
|
|
228
|
-
// save GET data
|
|
229
|
-
if (url.search && url.searchParams) {
|
|
230
|
-
item.getData = {};
|
|
231
|
-
for (const [key, value] of url.searchParams) {
|
|
232
|
-
item.getData[key] = value;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
// save POST data
|
|
236
|
-
if (init?.body) {
|
|
237
|
-
item.requestData = (0, utils_js_1.genStringBody)(init.body);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
afterFetch(item) {
|
|
241
|
-
return (resp) => {
|
|
242
|
-
item.endTime = performance.now();
|
|
243
|
-
item.duration = item.endTime - (item.startTime || item.endTime);
|
|
244
|
-
item.status = resp.status;
|
|
245
|
-
item.statusText = String(resp.status);
|
|
246
|
-
let isChunked = false;
|
|
247
|
-
item.header = {};
|
|
248
|
-
for (const [key, value] of resp.headers) {
|
|
249
|
-
item.header[key] = value;
|
|
250
|
-
isChunked = value.toLowerCase().indexOf('chunked') > -1 ? true : isChunked;
|
|
251
|
-
}
|
|
252
|
-
if (isChunked) {
|
|
253
|
-
// when `transfer-encoding` is chunked, the response is a stream which is under loading,
|
|
254
|
-
// so the `readyState` should be 3 (Loading),
|
|
255
|
-
// and the response should NOT be `clone()` which will affect stream reading.
|
|
256
|
-
item.readyState = 3;
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
// Otherwise, not chunked, the response is not a stream,
|
|
260
|
-
// so it's completed and can be cloned for `text()` calling.
|
|
261
|
-
item.readyState = 4;
|
|
262
|
-
this.handleResponseBody(resp.clone(), item)
|
|
263
|
-
.then((responseValue) => {
|
|
264
|
-
item.responseSize =
|
|
265
|
-
typeof responseValue === 'string' ? responseValue.length : responseValue.byteLength;
|
|
266
|
-
item.responseSizeText = (0, utils_js_1.formatByteSize)(item.responseSize);
|
|
267
|
-
item.response = (0, utils_js_1.getStringResponseByType)(item.responseType, responseValue);
|
|
268
|
-
const msg = item.getMessage();
|
|
269
|
-
if (msg) {
|
|
270
|
-
this.sendMessage(msg);
|
|
271
|
-
}
|
|
272
|
-
})
|
|
273
|
-
.catch((e) => {
|
|
274
|
-
if (e.name !== 'AbortError') {
|
|
275
|
-
throw e;
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
// ignore AbortError
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
return new Proxy(resp, new ResponseProxyHandler(resp, item));
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
handleResponseBody(resp, item) {
|
|
286
|
-
// parse response body by Content-Type
|
|
287
|
-
const contentType = resp.headers.get('content-type');
|
|
288
|
-
if (contentType && contentType.includes('application/json')) {
|
|
289
|
-
item.responseType = 'json';
|
|
290
|
-
return resp.text();
|
|
291
|
-
}
|
|
292
|
-
else if (contentType &&
|
|
293
|
-
(contentType.includes('text/html') || contentType.includes('text/plain'))) {
|
|
294
|
-
item.responseType = 'text';
|
|
295
|
-
return resp.text();
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
item.responseType = 'arraybuffer';
|
|
299
|
-
return resp.arrayBuffer();
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
exports.FetchProxyHandler = FetchProxyHandler;
|
|
304
|
-
class FetchProxy {
|
|
305
|
-
static create(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher) {
|
|
306
|
-
return new Proxy(fetch, new FetchProxyHandler(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher));
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
exports.default = FetchProxy;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { RequestResponseData } from './types.js';
|
|
2
|
-
import { NetworkRequest } from '../../common/messages.gen.js';
|
|
3
|
-
export default function setProxy(context: typeof globalThis, ignoredHeaders: boolean | string[], setSessionTokenHeader: (cb: (name: string, value: string) => void) => void, sanitize: (data: RequestResponseData) => RequestResponseData | null, sendMessage: (message: NetworkRequest) => void, isServiceUrl: (url: string) => boolean, tokenUrlMatcher?: (url: string) => boolean): void;
|
|
@@ -1,28 +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 fetchProxy_js_1 = __importDefault(require("./fetchProxy.js"));
|
|
7
|
-
const xhrProxy_js_1 = __importDefault(require("./xhrProxy.js"));
|
|
8
|
-
const beaconProxy_js_1 = __importDefault(require("./beaconProxy.js"));
|
|
9
|
-
const getWarning = (api) => console.warn(`Openreplay: Can't find ${api} in global context.
|
|
10
|
-
If you're using serverside rendering in your app, make sure that tracker is loaded dynamically, otherwise ${api} won't be tracked.`);
|
|
11
|
-
function setProxy(context, ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher) {
|
|
12
|
-
if (context.XMLHttpRequest) {
|
|
13
|
-
context.XMLHttpRequest = xhrProxy_js_1.default.create(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher);
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
getWarning('XMLHttpRequest');
|
|
17
|
-
}
|
|
18
|
-
if (context.fetch) {
|
|
19
|
-
context.fetch = fetchProxy_js_1.default.create(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
getWarning('fetch');
|
|
23
|
-
}
|
|
24
|
-
if (context?.navigator?.sendBeacon) {
|
|
25
|
-
context.navigator.sendBeacon = beaconProxy_js_1.default.create(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
exports.default = setProxy;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { RequestResponseData } from './types.js';
|
|
2
|
-
export type httpMethod = '' | 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH';
|
|
3
|
-
export declare enum RequestState {
|
|
4
|
-
UNSENT = 0,
|
|
5
|
-
OPENED = 1,
|
|
6
|
-
HEADERS_RECEIVED = 2,
|
|
7
|
-
LOADING = 3,
|
|
8
|
-
DONE = 4
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* I know we're not using most of the information from this class
|
|
12
|
-
* but it can be useful in the future if we will decide to display more stuff in our ui
|
|
13
|
-
* */
|
|
14
|
-
export default class NetworkMessage {
|
|
15
|
-
private readonly ignoredHeaders;
|
|
16
|
-
private readonly setSessionTokenHeader;
|
|
17
|
-
private readonly sanitize;
|
|
18
|
-
id: string;
|
|
19
|
-
name?: string;
|
|
20
|
-
method: httpMethod;
|
|
21
|
-
url: string;
|
|
22
|
-
status: number;
|
|
23
|
-
statusText?: string;
|
|
24
|
-
cancelState?: 0 | 1 | 2 | 3;
|
|
25
|
-
readyState?: RequestState;
|
|
26
|
-
header: {
|
|
27
|
-
[key: string]: string;
|
|
28
|
-
};
|
|
29
|
-
responseType: XMLHttpRequest['responseType'];
|
|
30
|
-
requestType: 'xhr' | 'fetch' | 'ping' | 'custom' | 'beacon';
|
|
31
|
-
requestHeader: HeadersInit;
|
|
32
|
-
response: any;
|
|
33
|
-
responseSize: number;
|
|
34
|
-
responseSizeText: string;
|
|
35
|
-
startTime: number;
|
|
36
|
-
endTime: number;
|
|
37
|
-
duration: number;
|
|
38
|
-
getData: {
|
|
39
|
-
[key: string]: string;
|
|
40
|
-
};
|
|
41
|
-
requestData: string | null;
|
|
42
|
-
constructor(ignoredHeaders: boolean | string[], setSessionTokenHeader: (cb: (name: string, value: string) => void) => void, sanitize: (data: RequestResponseData) => RequestResponseData | null);
|
|
43
|
-
getMessage(): import("../../common/messages.gen.js").NetworkRequest | undefined;
|
|
44
|
-
writeHeaders(): {
|
|
45
|
-
reqHs: Record<string, string>;
|
|
46
|
-
resHs: Record<string, string>;
|
|
47
|
-
};
|
|
48
|
-
isHeaderIgnored(key: string): boolean;
|
|
49
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RequestState = void 0;
|
|
4
|
-
const messages_gen_js_1 = require("../../app/messages.gen.js");
|
|
5
|
-
const utils_js_1 = require("../../utils.js");
|
|
6
|
-
var RequestState;
|
|
7
|
-
(function (RequestState) {
|
|
8
|
-
RequestState[RequestState["UNSENT"] = 0] = "UNSENT";
|
|
9
|
-
RequestState[RequestState["OPENED"] = 1] = "OPENED";
|
|
10
|
-
RequestState[RequestState["HEADERS_RECEIVED"] = 2] = "HEADERS_RECEIVED";
|
|
11
|
-
RequestState[RequestState["LOADING"] = 3] = "LOADING";
|
|
12
|
-
RequestState[RequestState["DONE"] = 4] = "DONE";
|
|
13
|
-
})(RequestState = exports.RequestState || (exports.RequestState = {}));
|
|
14
|
-
/**
|
|
15
|
-
* I know we're not using most of the information from this class
|
|
16
|
-
* but it can be useful in the future if we will decide to display more stuff in our ui
|
|
17
|
-
* */
|
|
18
|
-
class NetworkMessage {
|
|
19
|
-
constructor(ignoredHeaders = [], setSessionTokenHeader, sanitize) {
|
|
20
|
-
this.ignoredHeaders = ignoredHeaders;
|
|
21
|
-
this.setSessionTokenHeader = setSessionTokenHeader;
|
|
22
|
-
this.sanitize = sanitize;
|
|
23
|
-
this.id = '';
|
|
24
|
-
this.name = '';
|
|
25
|
-
this.method = '';
|
|
26
|
-
this.url = '';
|
|
27
|
-
this.status = 0;
|
|
28
|
-
this.statusText = '';
|
|
29
|
-
this.cancelState = 0;
|
|
30
|
-
this.readyState = 0;
|
|
31
|
-
this.header = {};
|
|
32
|
-
this.responseType = '';
|
|
33
|
-
this.requestHeader = {};
|
|
34
|
-
this.responseSize = 0; // bytes
|
|
35
|
-
this.responseSizeText = '';
|
|
36
|
-
this.startTime = 0;
|
|
37
|
-
this.endTime = 0;
|
|
38
|
-
this.duration = 0;
|
|
39
|
-
this.getData = {};
|
|
40
|
-
this.requestData = null;
|
|
41
|
-
}
|
|
42
|
-
getMessage() {
|
|
43
|
-
const { reqHs, resHs } = this.writeHeaders();
|
|
44
|
-
const request = {
|
|
45
|
-
headers: reqHs,
|
|
46
|
-
body: this.method === 'GET' ? JSON.stringify(this.getData) : this.requestData,
|
|
47
|
-
};
|
|
48
|
-
const response = { headers: resHs, body: this.response };
|
|
49
|
-
const messageInfo = this.sanitize({
|
|
50
|
-
url: this.url,
|
|
51
|
-
method: this.method,
|
|
52
|
-
status: this.status,
|
|
53
|
-
request,
|
|
54
|
-
response,
|
|
55
|
-
});
|
|
56
|
-
if (!messageInfo)
|
|
57
|
-
return;
|
|
58
|
-
return (0, messages_gen_js_1.NetworkRequest)(this.requestType, messageInfo.method, messageInfo.url, JSON.stringify(messageInfo.request), JSON.stringify(messageInfo.response), messageInfo.status, this.startTime + (0, utils_js_1.getTimeOrigin)(), this.duration, this.responseSize);
|
|
59
|
-
}
|
|
60
|
-
writeHeaders() {
|
|
61
|
-
const reqHs = {};
|
|
62
|
-
Object.entries(this.requestHeader).forEach(([key, value]) => {
|
|
63
|
-
if (this.isHeaderIgnored(key))
|
|
64
|
-
return;
|
|
65
|
-
reqHs[key] = value;
|
|
66
|
-
});
|
|
67
|
-
this.setSessionTokenHeader((name, value) => {
|
|
68
|
-
reqHs[name] = value;
|
|
69
|
-
});
|
|
70
|
-
const resHs = {};
|
|
71
|
-
Object.entries(this.header).forEach(([key, value]) => {
|
|
72
|
-
if (this.isHeaderIgnored(key))
|
|
73
|
-
return;
|
|
74
|
-
resHs[key] = value;
|
|
75
|
-
});
|
|
76
|
-
return { reqHs, resHs };
|
|
77
|
-
}
|
|
78
|
-
isHeaderIgnored(key) {
|
|
79
|
-
if (Array.isArray(this.ignoredHeaders)) {
|
|
80
|
-
return this.ignoredHeaders.map((k) => k.toLowerCase()).includes(key.toLowerCase());
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
return this.ignoredHeaders;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
exports.default = NetworkMessage;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export interface RequestResponseData {
|
|
2
|
-
readonly status: number;
|
|
3
|
-
readonly method: string;
|
|
4
|
-
url: string;
|
|
5
|
-
request: {
|
|
6
|
-
body: string | null;
|
|
7
|
-
headers: Record<string, string>;
|
|
8
|
-
};
|
|
9
|
-
response: {
|
|
10
|
-
body: string | null;
|
|
11
|
-
headers: Record<string, string>;
|
|
12
|
-
};
|
|
13
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare const genResponseByType: (responseType: XMLHttpRequest['responseType'], response: any) => string | Record<string, any>;
|
|
2
|
-
export declare const getStringResponseByType: (responseType: XMLHttpRequest['responseType'], response: any) => string;
|
|
3
|
-
export declare const genStringBody: (body?: BodyInit) => string | null;
|
|
4
|
-
export declare const genGetDataByUrl: (url: string, getData?: Record<string, any>) => Record<string, any>;
|
|
5
|
-
export declare const genFormattedBody: (body?: BodyInit) => string | {
|
|
6
|
-
[key: string]: string;
|
|
7
|
-
} | null;
|
|
8
|
-
export declare function isPureObject(input: any): input is Record<any, any>;
|
|
9
|
-
export declare function isIterable(value: any): boolean;
|
|
10
|
-
export declare function formatByteSize(bytes: number): string;
|
|
11
|
-
export declare const getURL: (urlString: string) => URL;
|