@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 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.8'; // 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;
@@ -6440,7 +6440,12 @@ class App {
6440
6440
  startOpts.startCallback(SuccessfulStart(onStartInfo));
6441
6441
  }
6442
6442
  if (this.features['feature-flags']) {
6443
- void this.featureFlags.reloadFlags();
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 'arrayBuffer':
8794
- case 'blob':
8795
- case 'formData':
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 === 'function') {
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 !== 'string' && !(input === null || input === void 0 ? void 0 : input.url))) {
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 === 'string'
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 = 'GET', requestHeader = {};
8873
+ let url, method = "GET", requestHeader = {};
8939
8874
  // handle `input` content
8940
- if (typeof input === 'string') {
8875
+ if (typeof input === "string") {
8941
8876
  // when `input` is a string
8942
- method = (init === null || init === void 0 ? void 0 : init.method) || 'GET';
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 || 'GET';
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 = 'fetch';
8888
+ item.requestType = "fetch";
8954
8889
  item.requestHeader = requestHeader;
8955
8890
  item.url = url.toString();
8956
- item.name = (url.pathname.split('/').pop() || '') + url.search;
8891
+ item.name = (url.pathname.split("/").pop() || "") + url.search;
8957
8892
  item.status = 0;
8958
- item.statusText = 'Pending';
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) === '[object Headers]') {
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 = value.toLowerCase().indexOf('chunked') > -1 ? true : 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 === 'string' ? responseValue.length : responseValue.byteLength;
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 !== 'AbortError') {
8957
+ if (e.name !== "AbortError") {
9020
8958
  throw e;
9021
8959
  }
9022
8960
  });
9023
8961
  }
9024
- 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;
9025
8967
  };
9026
8968
  }
9027
8969
  handleResponseBody(resp, item) {
9028
8970
  // parse response body by Content-Type
9029
- const contentType = resp.headers.get('content-type');
9030
- if (contentType && contentType.includes('application/json')) {
9031
- item.responseType = 'json';
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('text/html') || contentType.includes('text/plain'))) {
9036
- item.responseType = 'text';
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 = 'arraybuffer';
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 = 'xhr';
9028
+ this.item.requestType = "xhr";
9078
9029
  }
9079
9030
  get(target, key) {
9080
9031
  switch (key) {
9081
- case 'open':
9032
+ case "open":
9082
9033
  return this.getOpen(target);
9083
- case 'send':
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.setRequestHeader(name, value);
9041
+ if (target.readyState === 1)
9042
+ target.setRequestHeader(name, value);
9091
9043
  });
9092
9044
  return this.getSend(target);
9093
- case 'setRequestHeader':
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 === 'function') {
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 'onreadystatechange':
9060
+ case "onreadystatechange":
9109
9061
  return this.setOnReadyStateChange(target, key, value);
9110
- case 'onabort':
9062
+ case "onabort":
9111
9063
  return this.setOnAbort(target, key, value);
9112
- case 'ontimeout':
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
- setTimeout(() => {
9127
- this.item.response = getStringResponseByType(this.item.responseType, this.item.response);
9128
- }, 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
+ }
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 = 'Abort';
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 = 'Timeout';
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, 'open');
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() : 'GET';
9159
- this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) || '';
9160
- 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 : "";
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, 'send');
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, 'setRequestHeader');
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 = 'Pending';
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 = 'Loading';
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() || '', headerArr = header.split('\n');
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 = 'Loading';
9235
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9236
- this.item.responseSize = this.XMLReq.response.length;
9237
- 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
+ }
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 = this.item.endTime - (this.item.startTime || this.item.endTime);
9247
- this.item.response = this.XMLReq.response;
9248
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9249
- this.item.responseSize = this.XMLReq.response.length;
9250
- 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
+ }
9251
9231
  }
9252
9232
  break;
9253
9233
  default:
9254
9234
  this.item.status = this.XMLReq.status;
9255
- this.item.statusText = 'Unknown';
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.8',
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,