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