@openreplay/tracker 16.4.8 → 16.4.10-beta.0
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/dist/cjs/entry.js +115 -135
- package/dist/cjs/entry.js.map +1 -1
- package/dist/cjs/index.js +115 -135
- package/dist/cjs/index.js.map +1 -1
- package/dist/lib/entry.js +115 -135
- package/dist/lib/entry.js.map +1 -1
- package/dist/lib/index.js +115 -135
- package/dist/lib/index.js.map +1 -1
- package/package.json +2 -2
package/dist/cjs/entry.js
CHANGED
|
@@ -5276,7 +5276,7 @@ class App {
|
|
|
5276
5276
|
this.stopCallbacks = [];
|
|
5277
5277
|
this.commitCallbacks = [];
|
|
5278
5278
|
this.activityState = ActivityState.NotActive;
|
|
5279
|
-
this.version = '16.4.
|
|
5279
|
+
this.version = '16.4.10-beta.0'; // TODO: version compatability check inside each plugin.
|
|
5280
5280
|
this.socketMode = false;
|
|
5281
5281
|
this.compressionThreshold = 24 * 1000;
|
|
5282
5282
|
this.bc = null;
|
|
@@ -6440,7 +6440,12 @@ class App {
|
|
|
6440
6440
|
startOpts.startCallback(SuccessfulStart(onStartInfo));
|
|
6441
6441
|
}
|
|
6442
6442
|
if (this.features['feature-flags']) {
|
|
6443
|
-
|
|
6443
|
+
try {
|
|
6444
|
+
void this.featureFlags.reloadFlags();
|
|
6445
|
+
}
|
|
6446
|
+
catch (e) {
|
|
6447
|
+
this.debug.log("Error getting feature flags", e);
|
|
6448
|
+
}
|
|
6444
6449
|
}
|
|
6445
6450
|
await this.tagWatcher.fetchTags(this.options.ingestPoint, token);
|
|
6446
6451
|
this.activityState = ActivityState.Active;
|
|
@@ -8762,15 +8767,6 @@ class BeaconProxy {
|
|
|
8762
8767
|
}
|
|
8763
8768
|
}
|
|
8764
8769
|
|
|
8765
|
-
var RequestState;
|
|
8766
|
-
(function (RequestState) {
|
|
8767
|
-
RequestState[RequestState["UNSENT"] = 0] = "UNSENT";
|
|
8768
|
-
RequestState[RequestState["OPENED"] = 1] = "OPENED";
|
|
8769
|
-
RequestState[RequestState["HEADERS_RECEIVED"] = 2] = "HEADERS_RECEIVED";
|
|
8770
|
-
RequestState[RequestState["LOADING"] = 3] = "LOADING";
|
|
8771
|
-
RequestState[RequestState["DONE"] = 4] = "DONE";
|
|
8772
|
-
})(RequestState || (RequestState = {}));
|
|
8773
|
-
|
|
8774
8770
|
/**
|
|
8775
8771
|
* I took inspiration in few stack exchange posts
|
|
8776
8772
|
* and Tencent vConsole library (MIT)
|
|
@@ -8782,19 +8778,19 @@ class ResponseProxyHandler {
|
|
|
8782
8778
|
constructor(resp, item) {
|
|
8783
8779
|
this.resp = resp;
|
|
8784
8780
|
this.item = item;
|
|
8785
|
-
this.mockReader();
|
|
8786
8781
|
}
|
|
8787
8782
|
set(target, key, value) {
|
|
8788
8783
|
return Reflect.set(target, key, value);
|
|
8789
8784
|
}
|
|
8790
8785
|
get(target, key) {
|
|
8791
8786
|
const value = Reflect.get(target, key);
|
|
8787
|
+
if (key === "arrayBuffer" || key === "blob") {
|
|
8788
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
8789
|
+
}
|
|
8792
8790
|
switch (key) {
|
|
8793
|
-
case
|
|
8794
|
-
case
|
|
8795
|
-
case
|
|
8796
|
-
case 'json':
|
|
8797
|
-
case 'text':
|
|
8791
|
+
case "formData":
|
|
8792
|
+
case "json":
|
|
8793
|
+
case "text":
|
|
8798
8794
|
return () => {
|
|
8799
8795
|
this.item.responseType = key.toLowerCase();
|
|
8800
8796
|
// @ts-ignore
|
|
@@ -8804,74 +8800,13 @@ class ResponseProxyHandler {
|
|
|
8804
8800
|
});
|
|
8805
8801
|
};
|
|
8806
8802
|
}
|
|
8807
|
-
if (typeof value ===
|
|
8803
|
+
if (typeof value === "function") {
|
|
8808
8804
|
return value.bind(target);
|
|
8809
8805
|
}
|
|
8810
8806
|
else {
|
|
8811
8807
|
return value;
|
|
8812
8808
|
}
|
|
8813
8809
|
}
|
|
8814
|
-
mockReader() {
|
|
8815
|
-
let readerReceivedValue;
|
|
8816
|
-
if (!this.resp.body) {
|
|
8817
|
-
// some browsers do not return `body` in some cases, like `OPTIONS` method
|
|
8818
|
-
return;
|
|
8819
|
-
}
|
|
8820
|
-
if (typeof this.resp.body.getReader !== 'function') {
|
|
8821
|
-
return;
|
|
8822
|
-
}
|
|
8823
|
-
const clonedResp = this.resp.clone();
|
|
8824
|
-
const _getReader = clonedResp.body.getReader;
|
|
8825
|
-
// @ts-ignore
|
|
8826
|
-
clonedResp.body.getReader = () => {
|
|
8827
|
-
const reader = _getReader.apply(this.resp.body);
|
|
8828
|
-
// when readyState is already 4,
|
|
8829
|
-
// it's not a chunked stream, or it had already been read.
|
|
8830
|
-
// so should not update status.
|
|
8831
|
-
if (this.item.readyState === RequestState.DONE) {
|
|
8832
|
-
return reader;
|
|
8833
|
-
}
|
|
8834
|
-
const _read = reader.read;
|
|
8835
|
-
const _cancel = reader.cancel;
|
|
8836
|
-
this.item.responseType = 'arraybuffer';
|
|
8837
|
-
// @ts-ignore
|
|
8838
|
-
reader.read = () => {
|
|
8839
|
-
return _read.apply(reader).then((result) => {
|
|
8840
|
-
if (!readerReceivedValue) {
|
|
8841
|
-
// @ts-ignore
|
|
8842
|
-
readerReceivedValue = new Uint8Array(result.value);
|
|
8843
|
-
}
|
|
8844
|
-
else {
|
|
8845
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
8846
|
-
const newValue = new Uint8Array(readerReceivedValue.length + result.value.length);
|
|
8847
|
-
newValue.set(readerReceivedValue);
|
|
8848
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
8849
|
-
newValue.set(result.value, readerReceivedValue.length);
|
|
8850
|
-
readerReceivedValue = newValue;
|
|
8851
|
-
}
|
|
8852
|
-
this.item.endTime = performance.now();
|
|
8853
|
-
this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
|
|
8854
|
-
this.item.readyState = result.done ? 4 : 3;
|
|
8855
|
-
this.item.statusText = result.done ? String(this.item.status) : 'Loading';
|
|
8856
|
-
this.item.responseSize = readerReceivedValue.length;
|
|
8857
|
-
this.item.responseSizeText = formatByteSize(this.item.responseSize);
|
|
8858
|
-
if (result.done) {
|
|
8859
|
-
this.item.response = getStringResponseByType(this.item.responseType, readerReceivedValue);
|
|
8860
|
-
}
|
|
8861
|
-
return result;
|
|
8862
|
-
});
|
|
8863
|
-
};
|
|
8864
|
-
reader.cancel = (...args) => {
|
|
8865
|
-
this.item.cancelState = 2;
|
|
8866
|
-
this.item.statusText = 'Cancel';
|
|
8867
|
-
this.item.endTime = performance.now();
|
|
8868
|
-
this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
|
|
8869
|
-
this.item.response = getStringResponseByType(this.item.responseType, readerReceivedValue);
|
|
8870
|
-
return _cancel.apply(reader, args);
|
|
8871
|
-
};
|
|
8872
|
-
return reader;
|
|
8873
|
-
};
|
|
8874
|
-
}
|
|
8875
8810
|
}
|
|
8876
8811
|
class FetchProxyHandler {
|
|
8877
8812
|
constructor(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher) {
|
|
@@ -8887,10 +8822,10 @@ class FetchProxyHandler {
|
|
|
8887
8822
|
const init = argsList[1];
|
|
8888
8823
|
if (!input ||
|
|
8889
8824
|
// @ts-ignore
|
|
8890
|
-
(typeof input !==
|
|
8825
|
+
(typeof input !== "string" && !(input === null || input === void 0 ? void 0 : input.url))) {
|
|
8891
8826
|
return target.apply(window, argsList);
|
|
8892
8827
|
}
|
|
8893
|
-
const isORUrl = input instanceof URL || typeof input ===
|
|
8828
|
+
const isORUrl = input instanceof URL || typeof input === "string"
|
|
8894
8829
|
? this.isServiceUrl(String(input))
|
|
8895
8830
|
: this.isServiceUrl(String(input.url));
|
|
8896
8831
|
if (isORUrl) {
|
|
@@ -8935,33 +8870,33 @@ class FetchProxyHandler {
|
|
|
8935
8870
|
});
|
|
8936
8871
|
}
|
|
8937
8872
|
beforeFetch(item, input, init) {
|
|
8938
|
-
let url, method =
|
|
8873
|
+
let url, method = "GET", requestHeader = {};
|
|
8939
8874
|
// handle `input` content
|
|
8940
|
-
if (typeof input ===
|
|
8875
|
+
if (typeof input === "string") {
|
|
8941
8876
|
// when `input` is a string
|
|
8942
|
-
method = (init === null || init === void 0 ? void 0 : init.method) ||
|
|
8877
|
+
method = (init === null || init === void 0 ? void 0 : init.method) || "GET";
|
|
8943
8878
|
url = getURL(input);
|
|
8944
8879
|
requestHeader = (init === null || init === void 0 ? void 0 : init.headers) || {};
|
|
8945
8880
|
}
|
|
8946
8881
|
else {
|
|
8947
8882
|
// when `input` is a `Request` object
|
|
8948
|
-
method = input.method ||
|
|
8883
|
+
method = input.method || "GET";
|
|
8949
8884
|
url = getURL(input.url);
|
|
8950
8885
|
requestHeader = input.headers;
|
|
8951
8886
|
}
|
|
8952
8887
|
item.method = method;
|
|
8953
|
-
item.requestType =
|
|
8888
|
+
item.requestType = "fetch";
|
|
8954
8889
|
item.requestHeader = requestHeader;
|
|
8955
8890
|
item.url = url.toString();
|
|
8956
|
-
item.name = (url.pathname.split(
|
|
8891
|
+
item.name = (url.pathname.split("/").pop() || "") + url.search;
|
|
8957
8892
|
item.status = 0;
|
|
8958
|
-
item.statusText =
|
|
8893
|
+
item.statusText = "Pending";
|
|
8959
8894
|
item.readyState = 1;
|
|
8960
8895
|
if (!item.startTime) {
|
|
8961
8896
|
// UNSENT
|
|
8962
8897
|
item.startTime = performance.now();
|
|
8963
8898
|
}
|
|
8964
|
-
if (Object.prototype.toString.call(requestHeader) ===
|
|
8899
|
+
if (Object.prototype.toString.call(requestHeader) === "[object Headers]") {
|
|
8965
8900
|
item.requestHeader = {};
|
|
8966
8901
|
for (const [key, value] of requestHeader) {
|
|
8967
8902
|
item.requestHeader[key] = value;
|
|
@@ -8992,7 +8927,8 @@ class FetchProxyHandler {
|
|
|
8992
8927
|
item.header = {};
|
|
8993
8928
|
for (const [key, value] of resp.headers) {
|
|
8994
8929
|
item.header[key] = value;
|
|
8995
|
-
isChunked =
|
|
8930
|
+
isChunked =
|
|
8931
|
+
value.toLowerCase().indexOf("chunked") > -1 ? true : isChunked;
|
|
8996
8932
|
}
|
|
8997
8933
|
if (isChunked) {
|
|
8998
8934
|
// when `transfer-encoding` is chunked, the response is a stream which is under loading,
|
|
@@ -9007,7 +8943,9 @@ class FetchProxyHandler {
|
|
|
9007
8943
|
this.handleResponseBody(resp.clone(), item)
|
|
9008
8944
|
.then((responseValue) => {
|
|
9009
8945
|
item.responseSize =
|
|
9010
|
-
typeof responseValue ===
|
|
8946
|
+
typeof responseValue === "string"
|
|
8947
|
+
? responseValue.length
|
|
8948
|
+
: responseValue.byteLength;
|
|
9011
8949
|
item.responseSizeText = formatByteSize(item.responseSize);
|
|
9012
8950
|
item.response = getStringResponseByType(item.responseType, responseValue);
|
|
9013
8951
|
const msg = item.getMessage();
|
|
@@ -9016,28 +8954,32 @@ class FetchProxyHandler {
|
|
|
9016
8954
|
}
|
|
9017
8955
|
})
|
|
9018
8956
|
.catch((e) => {
|
|
9019
|
-
if (e.name !==
|
|
8957
|
+
if (e.name !== "AbortError") {
|
|
9020
8958
|
throw e;
|
|
9021
8959
|
}
|
|
9022
8960
|
});
|
|
9023
8961
|
}
|
|
9024
|
-
|
|
8962
|
+
const ct = (resp.headers.get("content-type") || "").toLowerCase();
|
|
8963
|
+
const isTextLike = ct.includes("application/json") || ct.startsWith("text/");
|
|
8964
|
+
return isTextLike
|
|
8965
|
+
? new Proxy(resp, new ResponseProxyHandler(resp, item))
|
|
8966
|
+
: resp;
|
|
9025
8967
|
};
|
|
9026
8968
|
}
|
|
9027
8969
|
handleResponseBody(resp, item) {
|
|
9028
8970
|
// parse response body by Content-Type
|
|
9029
|
-
const contentType = resp.headers.get(
|
|
9030
|
-
if (contentType && contentType.includes(
|
|
9031
|
-
item.responseType =
|
|
8971
|
+
const contentType = resp.headers.get("content-type");
|
|
8972
|
+
if (contentType && contentType.includes("application/json")) {
|
|
8973
|
+
item.responseType = "json";
|
|
9032
8974
|
return resp.text();
|
|
9033
8975
|
}
|
|
9034
8976
|
else if (contentType &&
|
|
9035
|
-
(contentType.includes(
|
|
9036
|
-
item.responseType =
|
|
8977
|
+
(contentType.includes("text/html") || contentType.includes("text/plain"))) {
|
|
8978
|
+
item.responseType = "text";
|
|
9037
8979
|
return resp.text();
|
|
9038
8980
|
}
|
|
9039
8981
|
else {
|
|
9040
|
-
item.responseType =
|
|
8982
|
+
item.responseType = "arraybuffer";
|
|
9041
8983
|
return resp.arrayBuffer();
|
|
9042
8984
|
}
|
|
9043
8985
|
}
|
|
@@ -9048,6 +8990,15 @@ class FetchProxy {
|
|
|
9048
8990
|
}
|
|
9049
8991
|
}
|
|
9050
8992
|
|
|
8993
|
+
var RequestState;
|
|
8994
|
+
(function (RequestState) {
|
|
8995
|
+
RequestState[RequestState["UNSENT"] = 0] = "UNSENT";
|
|
8996
|
+
RequestState[RequestState["OPENED"] = 1] = "OPENED";
|
|
8997
|
+
RequestState[RequestState["HEADERS_RECEIVED"] = 2] = "HEADERS_RECEIVED";
|
|
8998
|
+
RequestState[RequestState["LOADING"] = 3] = "LOADING";
|
|
8999
|
+
RequestState[RequestState["DONE"] = 4] = "DONE";
|
|
9000
|
+
})(RequestState || (RequestState = {}));
|
|
9001
|
+
|
|
9051
9002
|
/**
|
|
9052
9003
|
* I took inspiration in few stack exchange posts
|
|
9053
9004
|
* and Tencent vConsole library (MIT)
|
|
@@ -9074,28 +9025,29 @@ class XHRProxyHandler {
|
|
|
9074
9025
|
this.onTimeout();
|
|
9075
9026
|
};
|
|
9076
9027
|
this.item = new NetworkMessage(ignoredHeaders, setSessionTokenHeader, sanitize);
|
|
9077
|
-
this.item.requestType =
|
|
9028
|
+
this.item.requestType = "xhr";
|
|
9078
9029
|
}
|
|
9079
9030
|
get(target, key) {
|
|
9080
9031
|
switch (key) {
|
|
9081
|
-
case
|
|
9032
|
+
case "open":
|
|
9082
9033
|
return this.getOpen(target);
|
|
9083
|
-
case
|
|
9034
|
+
case "send":
|
|
9084
9035
|
this.setSessionTokenHeader((name, value) => {
|
|
9085
9036
|
if (this.tokenUrlMatcher !== undefined) {
|
|
9086
9037
|
if (!this.tokenUrlMatcher(this.item.url)) {
|
|
9087
9038
|
return;
|
|
9088
9039
|
}
|
|
9089
9040
|
}
|
|
9090
|
-
target.
|
|
9041
|
+
if (target.readyState === 1)
|
|
9042
|
+
target.setRequestHeader(name, value);
|
|
9091
9043
|
});
|
|
9092
9044
|
return this.getSend(target);
|
|
9093
|
-
case
|
|
9045
|
+
case "setRequestHeader":
|
|
9094
9046
|
return this.getSetRequestHeader(target);
|
|
9095
9047
|
default:
|
|
9096
9048
|
// eslint-disable-next-line no-case-declarations
|
|
9097
9049
|
const value = Reflect.get(target, key);
|
|
9098
|
-
if (typeof value ===
|
|
9050
|
+
if (typeof value === "function") {
|
|
9099
9051
|
return value.bind(target);
|
|
9100
9052
|
}
|
|
9101
9053
|
else {
|
|
@@ -9105,11 +9057,11 @@ class XHRProxyHandler {
|
|
|
9105
9057
|
}
|
|
9106
9058
|
set(target, key, value) {
|
|
9107
9059
|
switch (key) {
|
|
9108
|
-
case
|
|
9060
|
+
case "onreadystatechange":
|
|
9109
9061
|
return this.setOnReadyStateChange(target, key, value);
|
|
9110
|
-
case
|
|
9062
|
+
case "onabort":
|
|
9111
9063
|
return this.setOnAbort(target, key, value);
|
|
9112
|
-
case
|
|
9064
|
+
case "ontimeout":
|
|
9113
9065
|
return this.setOnTimeout(target, key, value);
|
|
9114
9066
|
// not tracked methods
|
|
9115
9067
|
}
|
|
@@ -9123,9 +9075,12 @@ class XHRProxyHandler {
|
|
|
9123
9075
|
this.item.endTime = performance.now();
|
|
9124
9076
|
this.item.duration = this.item.endTime - this.item.startTime;
|
|
9125
9077
|
this.updateItemByReadyState();
|
|
9126
|
-
|
|
9127
|
-
|
|
9128
|
-
|
|
9078
|
+
const rt = this.item.responseType || "";
|
|
9079
|
+
if (rt === "" || rt === "text" || rt === "json") {
|
|
9080
|
+
setTimeout(() => {
|
|
9081
|
+
this.item.response = getStringResponseByType(rt, this.XMLReq.response);
|
|
9082
|
+
}, 0);
|
|
9083
|
+
}
|
|
9129
9084
|
if (this.XMLReq.readyState === RequestState.DONE) {
|
|
9130
9085
|
const msg = this.item.getMessage();
|
|
9131
9086
|
if (msg) {
|
|
@@ -9135,7 +9090,7 @@ class XHRProxyHandler {
|
|
|
9135
9090
|
}
|
|
9136
9091
|
onAbort() {
|
|
9137
9092
|
this.item.cancelState = 1;
|
|
9138
|
-
this.item.statusText =
|
|
9093
|
+
this.item.statusText = "Abort";
|
|
9139
9094
|
const msg = this.item.getMessage();
|
|
9140
9095
|
if (msg) {
|
|
9141
9096
|
this.sendMessage(msg);
|
|
@@ -9143,27 +9098,28 @@ class XHRProxyHandler {
|
|
|
9143
9098
|
}
|
|
9144
9099
|
onTimeout() {
|
|
9145
9100
|
this.item.cancelState = 3;
|
|
9146
|
-
this.item.statusText =
|
|
9101
|
+
this.item.statusText = "Timeout";
|
|
9147
9102
|
const msg = this.item.getMessage();
|
|
9148
9103
|
if (msg) {
|
|
9149
9104
|
this.sendMessage(msg);
|
|
9150
9105
|
}
|
|
9151
9106
|
}
|
|
9152
9107
|
getOpen(target) {
|
|
9153
|
-
const targetFunction = Reflect.get(target,
|
|
9108
|
+
const targetFunction = Reflect.get(target, "open");
|
|
9154
9109
|
return (...args) => {
|
|
9155
9110
|
var _a, _b, _c;
|
|
9156
9111
|
const method = args[0];
|
|
9157
9112
|
const url = args[1];
|
|
9158
|
-
this.item.method = method ? method.toUpperCase() :
|
|
9159
|
-
this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) ||
|
|
9160
|
-
this.item.name =
|
|
9113
|
+
this.item.method = method ? method.toUpperCase() : "GET";
|
|
9114
|
+
this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) || "";
|
|
9115
|
+
this.item.name =
|
|
9116
|
+
(_c = (_b = this.item.url) === null || _b === void 0 ? void 0 : _b.replace(new RegExp("/*$"), "").split("/").pop()) !== null && _c !== void 0 ? _c : "";
|
|
9161
9117
|
this.item.getData = genGetDataByUrl(this.item.url, {});
|
|
9162
9118
|
return targetFunction.apply(target, args);
|
|
9163
9119
|
};
|
|
9164
9120
|
}
|
|
9165
9121
|
getSend(target) {
|
|
9166
|
-
const targetFunction = Reflect.get(target,
|
|
9122
|
+
const targetFunction = Reflect.get(target, "send");
|
|
9167
9123
|
return (...args) => {
|
|
9168
9124
|
const data = args[0];
|
|
9169
9125
|
this.item.requestData = genStringBody(data);
|
|
@@ -9171,7 +9127,7 @@ class XHRProxyHandler {
|
|
|
9171
9127
|
};
|
|
9172
9128
|
}
|
|
9173
9129
|
getSetRequestHeader(target) {
|
|
9174
|
-
const targetFunction = Reflect.get(target,
|
|
9130
|
+
const targetFunction = Reflect.get(target, "setRequestHeader");
|
|
9175
9131
|
return (...args) => {
|
|
9176
9132
|
if (!this.item.requestHeader) {
|
|
9177
9133
|
this.item.requestHeader = {};
|
|
@@ -9207,34 +9163,44 @@ class XHRProxyHandler {
|
|
|
9207
9163
|
case RequestState.UNSENT:
|
|
9208
9164
|
case RequestState.OPENED:
|
|
9209
9165
|
this.item.status = RequestState.UNSENT;
|
|
9210
|
-
this.item.statusText =
|
|
9166
|
+
this.item.statusText = "Pending";
|
|
9211
9167
|
if (!this.item.startTime) {
|
|
9212
9168
|
this.item.startTime = performance.now();
|
|
9213
9169
|
}
|
|
9214
9170
|
break;
|
|
9215
9171
|
case RequestState.HEADERS_RECEIVED:
|
|
9216
9172
|
this.item.status = this.XMLReq.status;
|
|
9217
|
-
this.item.statusText =
|
|
9173
|
+
this.item.statusText = "Loading";
|
|
9218
9174
|
this.item.header = {};
|
|
9219
9175
|
// eslint-disable-next-line no-case-declarations
|
|
9220
|
-
const header = this.XMLReq.getAllResponseHeaders() ||
|
|
9176
|
+
const header = this.XMLReq.getAllResponseHeaders() || "", headerArr = header.split("\n");
|
|
9221
9177
|
// extract plain text to key-value format
|
|
9222
9178
|
for (let i = 0; i < headerArr.length; i++) {
|
|
9223
9179
|
const line = headerArr[i];
|
|
9224
9180
|
if (!line) {
|
|
9225
9181
|
continue;
|
|
9226
9182
|
}
|
|
9227
|
-
const arr = line.split(
|
|
9183
|
+
const arr = line.split(": ");
|
|
9228
9184
|
const key = arr[0];
|
|
9229
|
-
this.item.header[key] = arr.slice(1).join(
|
|
9185
|
+
this.item.header[key] = arr.slice(1).join(": ");
|
|
9230
9186
|
}
|
|
9231
9187
|
break;
|
|
9232
9188
|
case RequestState.LOADING:
|
|
9233
9189
|
this.item.status = this.XMLReq.status;
|
|
9234
|
-
this.item.statusText =
|
|
9235
|
-
|
|
9236
|
-
|
|
9237
|
-
|
|
9190
|
+
this.item.statusText = "Loading";
|
|
9191
|
+
const response = this.XMLReq.response;
|
|
9192
|
+
if (response) {
|
|
9193
|
+
const respSize = typeof response === "string"
|
|
9194
|
+
? response.length
|
|
9195
|
+
: response instanceof ArrayBuffer
|
|
9196
|
+
? response.byteLength
|
|
9197
|
+
: typeof Blob !== "undefined" && response instanceof Blob
|
|
9198
|
+
? response.size
|
|
9199
|
+
: 0;
|
|
9200
|
+
if (respSize) {
|
|
9201
|
+
this.item.responseSize = respSize;
|
|
9202
|
+
this.item.responseSizeText = formatByteSize(this.item.responseSize);
|
|
9203
|
+
}
|
|
9238
9204
|
}
|
|
9239
9205
|
break;
|
|
9240
9206
|
case RequestState.DONE:
|
|
@@ -9243,16 +9209,30 @@ class XHRProxyHandler {
|
|
|
9243
9209
|
// show status code when request completed
|
|
9244
9210
|
this.item.statusText = String(this.item.status);
|
|
9245
9211
|
this.item.endTime = performance.now();
|
|
9246
|
-
this.item.duration =
|
|
9247
|
-
|
|
9248
|
-
|
|
9249
|
-
|
|
9250
|
-
|
|
9212
|
+
this.item.duration =
|
|
9213
|
+
this.item.endTime - (this.item.startTime || this.item.endTime);
|
|
9214
|
+
const resp = this.XMLReq.response;
|
|
9215
|
+
const respType = this.XMLReq.responseType || "";
|
|
9216
|
+
if (respType === "" || respType === "text" || respType === "json") {
|
|
9217
|
+
this.item.response = resp;
|
|
9218
|
+
}
|
|
9219
|
+
if (resp) {
|
|
9220
|
+
const respSize = typeof resp === "string"
|
|
9221
|
+
? resp.length
|
|
9222
|
+
: resp instanceof ArrayBuffer
|
|
9223
|
+
? resp.byteLength
|
|
9224
|
+
: typeof Blob !== "undefined" && resp instanceof Blob
|
|
9225
|
+
? resp.size
|
|
9226
|
+
: 0;
|
|
9227
|
+
if (respSize) {
|
|
9228
|
+
this.item.responseSize = respSize;
|
|
9229
|
+
this.item.responseSizeText = formatByteSize(respSize);
|
|
9230
|
+
}
|
|
9251
9231
|
}
|
|
9252
9232
|
break;
|
|
9253
9233
|
default:
|
|
9254
9234
|
this.item.status = this.XMLReq.status;
|
|
9255
|
-
this.item.statusText =
|
|
9235
|
+
this.item.statusText = "Unknown";
|
|
9256
9236
|
break;
|
|
9257
9237
|
}
|
|
9258
9238
|
}
|
|
@@ -9670,7 +9650,7 @@ class API {
|
|
|
9670
9650
|
this.signalStartIssue = (reason, missingApi) => {
|
|
9671
9651
|
const doNotTrack = this.checkDoNotTrack();
|
|
9672
9652
|
console.log("Tracker couldn't start due to:", JSON.stringify({
|
|
9673
|
-
trackerVersion: '16.4.
|
|
9653
|
+
trackerVersion: '16.4.10-beta.0',
|
|
9674
9654
|
projectKey: this.options.projectKey,
|
|
9675
9655
|
doNotTrack,
|
|
9676
9656
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|