@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/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.8'; // TODO: version compatability check inside each plugin.
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
- void this.featureFlags.reloadFlags();
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 'arrayBuffer':
8790
- case 'blob':
8791
- case 'formData':
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 === 'function') {
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 !== 'string' && !(input === null || input === void 0 ? void 0 : input.url))) {
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 === 'string'
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 = 'GET', requestHeader = {};
8869
+ let url, method = "GET", requestHeader = {};
8935
8870
  // handle `input` content
8936
- if (typeof input === 'string') {
8871
+ if (typeof input === "string") {
8937
8872
  // when `input` is a string
8938
- method = (init === null || init === void 0 ? void 0 : init.method) || 'GET';
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 || 'GET';
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 = 'fetch';
8884
+ item.requestType = "fetch";
8950
8885
  item.requestHeader = requestHeader;
8951
8886
  item.url = url.toString();
8952
- item.name = (url.pathname.split('/').pop() || '') + url.search;
8887
+ item.name = (url.pathname.split("/").pop() || "") + url.search;
8953
8888
  item.status = 0;
8954
- item.statusText = 'Pending';
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) === '[object Headers]') {
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 = value.toLowerCase().indexOf('chunked') > -1 ? true : 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 === 'string' ? responseValue.length : responseValue.byteLength;
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 !== 'AbortError') {
8953
+ if (e.name !== "AbortError") {
9016
8954
  throw e;
9017
8955
  }
9018
8956
  });
9019
8957
  }
9020
- return new Proxy(resp, new ResponseProxyHandler(resp, item));
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('content-type');
9026
- if (contentType && contentType.includes('application/json')) {
9027
- item.responseType = 'json';
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('text/html') || contentType.includes('text/plain'))) {
9032
- item.responseType = 'text';
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 = 'arraybuffer';
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 = 'xhr';
9024
+ this.item.requestType = "xhr";
9074
9025
  }
9075
9026
  get(target, key) {
9076
9027
  switch (key) {
9077
- case 'open':
9028
+ case "open":
9078
9029
  return this.getOpen(target);
9079
- case 'send':
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.setRequestHeader(name, value);
9037
+ if (target.readyState === 1)
9038
+ target.setRequestHeader(name, value);
9087
9039
  });
9088
9040
  return this.getSend(target);
9089
- case 'setRequestHeader':
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 === 'function') {
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 'onreadystatechange':
9056
+ case "onreadystatechange":
9105
9057
  return this.setOnReadyStateChange(target, key, value);
9106
- case 'onabort':
9058
+ case "onabort":
9107
9059
  return this.setOnAbort(target, key, value);
9108
- case 'ontimeout':
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
- setTimeout(() => {
9123
- this.item.response = getStringResponseByType(this.item.responseType, this.item.response);
9124
- }, 0);
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 = 'Abort';
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 = 'Timeout';
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, 'open');
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() : 'GET';
9155
- this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) || '';
9156
- 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 : '';
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, 'send');
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, 'setRequestHeader');
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 = 'Pending';
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 = 'Loading';
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() || '', headerArr = header.split('\n');
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 = 'Loading';
9231
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9232
- this.item.responseSize = this.XMLReq.response.length;
9233
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
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 = this.item.endTime - (this.item.startTime || this.item.endTime);
9243
- this.item.response = this.XMLReq.response;
9244
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9245
- this.item.responseSize = this.XMLReq.response.length;
9246
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
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 = 'Unknown';
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.8',
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,