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