@cloudcare/cocos-sdk 0.1.1-alpha.2 → 0.1.1-alpha.4

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.
Files changed (95) hide show
  1. package/dist/creator2/core/auto-tracking.d.ts +3 -1
  2. package/dist/creator2/core/auto-tracking.d.ts.map +1 -1
  3. package/dist/creator2/core/auto-tracking.js +360 -164
  4. package/dist/creator2/core/auto-tracking.js.map +1 -1
  5. package/dist/creator2/core/client.d.ts.map +1 -1
  6. package/dist/creator2/core/client.js +1 -3
  7. package/dist/creator2/core/client.js.map +1 -1
  8. package/dist/creator2/core/modules.d.ts.map +1 -1
  9. package/dist/creator2/core/modules.js +2 -2
  10. package/dist/creator2/core/modules.js.map +1 -1
  11. package/dist/creator2/core/observation.d.ts +25 -0
  12. package/dist/creator2/core/observation.d.ts.map +1 -0
  13. package/dist/creator2/core/observation.js +93 -0
  14. package/dist/creator2/core/observation.js.map +1 -0
  15. package/dist/creator2/core/platform-runtime.d.ts +2 -1
  16. package/dist/creator2/core/platform-runtime.d.ts.map +1 -1
  17. package/dist/creator2/core/platform-runtime.js.map +1 -1
  18. package/dist/creator2/core/types.d.ts +9 -0
  19. package/dist/creator2/core/types.d.ts.map +1 -1
  20. package/dist/creator2/core/types.js.map +1 -1
  21. package/dist/creator2/core/validation.d.ts +1 -0
  22. package/dist/creator2/core/validation.d.ts.map +1 -1
  23. package/dist/creator2/core/validation.js +13 -0
  24. package/dist/creator2/core/validation.js.map +1 -1
  25. package/dist/creator2/core/version.d.ts +1 -3
  26. package/dist/creator2/core/version.d.ts.map +1 -1
  27. package/dist/creator2/core/version.js +2 -4
  28. package/dist/creator2/core/version.js.map +1 -1
  29. package/dist/creator2/creator2/auto.js +14 -5
  30. package/dist/creator2/creator2/auto.js.map +1 -1
  31. package/dist/creator2/native/bootstrap.js +3 -2
  32. package/dist/creator2/native/bootstrap.js.map +1 -1
  33. package/dist/creator2/native/error-bootstrap.d.ts +2 -0
  34. package/dist/creator2/native/error-bootstrap.d.ts.map +1 -0
  35. package/dist/creator2/native/error-bootstrap.js +7 -0
  36. package/dist/creator2/native/error-bootstrap.js.map +1 -0
  37. package/dist/creator2/native/jsb-errors.d.ts +21 -0
  38. package/dist/creator2/native/jsb-errors.d.ts.map +1 -0
  39. package/dist/creator2/native/jsb-errors.js +91 -0
  40. package/dist/creator2/native/jsb-errors.js.map +1 -0
  41. package/dist/creator2/web/runtime.d.ts.map +1 -1
  42. package/dist/creator2/web/runtime.js +0 -1
  43. package/dist/creator2/web/runtime.js.map +1 -1
  44. package/dist/creator3/core/auto-tracking.d.ts +3 -1
  45. package/dist/creator3/core/auto-tracking.d.ts.map +1 -1
  46. package/dist/creator3/core/auto-tracking.js +327 -91
  47. package/dist/creator3/core/auto-tracking.js.map +1 -1
  48. package/dist/creator3/core/client.d.ts.map +1 -1
  49. package/dist/creator3/core/client.js +1 -3
  50. package/dist/creator3/core/client.js.map +1 -1
  51. package/dist/creator3/core/modules.d.ts.map +1 -1
  52. package/dist/creator3/core/modules.js +4 -9
  53. package/dist/creator3/core/modules.js.map +1 -1
  54. package/dist/creator3/core/observation.d.ts +25 -0
  55. package/dist/creator3/core/observation.d.ts.map +1 -0
  56. package/dist/creator3/core/observation.js +84 -0
  57. package/dist/creator3/core/observation.js.map +1 -0
  58. package/dist/creator3/core/platform-runtime.d.ts +2 -1
  59. package/dist/creator3/core/platform-runtime.d.ts.map +1 -1
  60. package/dist/creator3/core/platform-runtime.js.map +1 -1
  61. package/dist/creator3/core/types.d.ts +9 -0
  62. package/dist/creator3/core/types.d.ts.map +1 -1
  63. package/dist/creator3/core/validation.d.ts +1 -0
  64. package/dist/creator3/core/validation.d.ts.map +1 -1
  65. package/dist/creator3/core/validation.js +11 -0
  66. package/dist/creator3/core/validation.js.map +1 -1
  67. package/dist/creator3/core/version.d.ts +1 -3
  68. package/dist/creator3/core/version.d.ts.map +1 -1
  69. package/dist/creator3/core/version.js +1 -3
  70. package/dist/creator3/core/version.js.map +1 -1
  71. package/dist/creator3/creator3/index.js +2 -2
  72. package/dist/creator3/creator3/index.js.map +1 -1
  73. package/dist/creator3/native/bootstrap.js +2 -2
  74. package/dist/creator3/native/bootstrap.js.map +1 -1
  75. package/dist/creator3/native/error-bootstrap.d.ts +2 -0
  76. package/dist/creator3/native/error-bootstrap.d.ts.map +1 -0
  77. package/dist/creator3/native/error-bootstrap.js +5 -0
  78. package/dist/creator3/native/error-bootstrap.js.map +1 -0
  79. package/dist/creator3/native/jsb-errors.d.ts +21 -0
  80. package/dist/creator3/native/jsb-errors.d.ts.map +1 -0
  81. package/dist/creator3/native/jsb-errors.js +82 -0
  82. package/dist/creator3/native/jsb-errors.js.map +1 -0
  83. package/dist/creator3/web/runtime.d.ts.map +1 -1
  84. package/dist/creator3/web/runtime.js +1 -2
  85. package/dist/creator3/web/runtime.js.map +1 -1
  86. package/extensions/creator2/install-native.cjs +19 -1
  87. package/extensions/creator3/install-native.cjs +19 -1
  88. package/native/android/src/main/java/com/ft/sdk/cocos/FTCocosBridge.java +7 -10
  89. package/native/ios/FTCocosBridge.m +6 -4
  90. package/native/ios/FTCocosBridge.podspec +1 -1
  91. package/native/jsb-errors.js +266 -0
  92. package/package.json +1 -1
  93. package/runtime/native.js +511 -243
  94. package/web/bootstrap.js +17 -6
  95. package/web/bootstrap.js.map +2 -2
@@ -1,62 +1,7 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
50
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
51
- if (ar || !(i in from)) {
52
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
53
- ar[i] = from[i];
54
- }
55
- }
56
- return to.concat(ar || Array.prototype.slice.call(from));
57
- };
58
2
  Object.defineProperty(exports, "__esModule", { value: true });
59
3
  exports.FTDefaultAutoTracking = void 0;
4
+ var observation_js_1 = require("./observation.js");
60
5
  var FTDefaultAutoTracking = /** @class */ (function () {
61
6
  function FTDefaultAutoTracking(rum, logger, trace, hooks, target) {
62
7
  if (target === void 0) { target = globalThis; }
@@ -67,6 +12,7 @@ var FTDefaultAutoTracking = /** @class */ (function () {
67
12
  this.target = target;
68
13
  this.stops = [];
69
14
  this.networkStops = [];
15
+ this.observations = new observation_js_1.FTObservationQueue(target);
70
16
  }
71
17
  FTDefaultAutoTracking.prototype.start = function (config, viewName, scope) {
72
18
  if (scope === void 0) { scope = 'all'; }
@@ -113,6 +59,7 @@ var FTDefaultAutoTracking = /** @class */ (function () {
113
59
  if (scope !== 'page')
114
60
  this.networkStops.splice(0).reverse().forEach(cleanup);
115
61
  if (scope !== 'network') {
62
+ this.observations.stop();
116
63
  this.stops.splice(0).reverse().forEach(cleanup);
117
64
  if (this.activeView) {
118
65
  cleanup(function () { return _this.rum.stopView(); });
@@ -140,6 +87,29 @@ var FTDefaultAutoTracking = /** @class */ (function () {
140
87
  };
141
88
  FTDefaultAutoTracking.prototype.installErrorTracking = function () {
142
89
  var _this = this;
90
+ var _a;
91
+ var nativeErrors = this.target.__FT_COCOS_JSB_ERRORS__;
92
+ if ((nativeErrors === null || nativeErrors === void 0 ? void 0 : nativeErrors.protocol) === 2) {
93
+ this.stops.push(nativeErrors.subscribe(function (location, message, stack) {
94
+ var _a;
95
+ // Creator 2 also reports promise bookkeeping notifications through onError.
96
+ if (message === 'handlerAddedAfterPromiseRejected' || message === 'rejectAfterPromiseResolved'
97
+ || message === 'resolveAfterPromiseResolved')
98
+ return;
99
+ var rejection = message === 'unhandledRejectedPromise';
100
+ var reason = rejection ? (_a = stack.split(/\r?\n/, 1)[0]) === null || _a === void 0 ? void 0 : _a.replace(/^Error:\s*/, '') : message;
101
+ var errorMessage = reason || message || 'Uncaught JavaScript error';
102
+ var errorStack = stack || location || '';
103
+ var type = rejection ? 'unhandled_promise_rejection' : 'cocos_error';
104
+ _this.observations.enqueue(function () {
105
+ _this.rum.addError(errorMessage, errorStack, type);
106
+ }, 2 * (location.length + message.length + stack.length));
107
+ }));
108
+ return;
109
+ }
110
+ if (nativeErrors || typeof ((_a = this.target.jsb) === null || _a === void 0 ? void 0 : _a.onError) === 'function') {
111
+ throw new Error('Cocos native error bootstrap is missing. Rerun the SDK installer and rebuild the native project.');
112
+ }
143
113
  if (!this.target.addEventListener || !this.target.removeEventListener)
144
114
  return;
145
115
  var errorListener = function (event) {
@@ -170,24 +140,51 @@ var FTDefaultAutoTracking = /** @class */ (function () {
170
140
  'warn',
171
141
  'error',
172
142
  ];
143
+ var observations = this.observations;
144
+ var state = (0, observation_js_1.observationState)(this.target);
173
145
  var originals = new Map();
146
+ var wrappers = new Map();
147
+ var active = true;
174
148
  methods.forEach(function (method) {
175
- var original = consoleObject[method].bind(consoleObject);
149
+ var original = consoleObject[method];
176
150
  originals.set(method, original);
177
- consoleObject[method] = (function () {
151
+ var logger = _this.logger;
152
+ consoleObject[method] = function () {
178
153
  var args = [];
179
154
  for (var _i = 0; _i < arguments.length; _i++) {
180
155
  args[_i] = arguments[_i];
181
156
  }
182
- original.apply(void 0, args);
183
- var level = method === 'warn' ? 'warning' : method === 'error' ? 'error' : 'info';
184
- _this.logger.log(args.map(stringifyLogValue).join(' '), level);
185
- });
157
+ var snapshot;
158
+ try {
159
+ if (active && !state.reporting)
160
+ snapshot = { timestampMs: Date.now(), values: args.slice(0, 16) };
161
+ }
162
+ catch ( /* Snapshot failures cannot prevent the original console call. */_a) { /* Snapshot failures cannot prevent the original console call. */ }
163
+ // Keep the original receiver, result and thrown value. No SDK work can
164
+ // escape this finally block and replace the original console outcome.
165
+ try {
166
+ return original.apply(this, args);
167
+ }
168
+ finally {
169
+ try {
170
+ if (active && snapshot) {
171
+ var timestampMs_1 = snapshot.timestampMs, values_1 = snapshot.values;
172
+ observations.enqueue(function () {
173
+ var level = method === 'warn' ? 'warning' : method === 'error' ? 'error' : 'info';
174
+ logger.log(values_1.map(stringifyLogValue).join(' '), level, { cocos_observed_at_ms: timestampMs_1 });
175
+ }, values_1.reduce(function (size, value) { return size + (typeof value === 'string' ? value.length * 2 : 64); }, 0));
176
+ }
177
+ }
178
+ catch ( /* Logging must never change application console behavior. */_b) { /* Logging must never change application console behavior. */ }
179
+ }
180
+ };
181
+ wrappers.set(method, consoleObject[method]);
186
182
  });
187
183
  this.stops.push(function () {
184
+ active = false;
188
185
  methods.forEach(function (method) {
189
186
  var original = originals.get(method);
190
- if (original)
187
+ if (original && consoleObject[method] === wrappers.get(method))
191
188
  consoleObject[method] = original;
192
189
  });
193
190
  });
@@ -197,46 +194,93 @@ var FTDefaultAutoTracking = /** @class */ (function () {
197
194
  var original = this.target.fetch;
198
195
  if (!original)
199
196
  return;
200
- var tracked = (function (input, init) { return __awaiter(_this, void 0, void 0, function () {
201
- var inputObject, url, method, key, headers, start, response, end, error_1;
202
- return __generator(this, function (_a) {
203
- switch (_a.label) {
204
- case 0:
205
- inputObject = typeof input === 'object' ? input : undefined;
206
- url = typeof input === 'string' ? input : (inputObject === null || inputObject === void 0 ? void 0 : inputObject.url) || String(input);
207
- method = (init === null || init === void 0 ? void 0 : init.method) || (inputObject === null || inputObject === void 0 ? void 0 : inputObject.method) || 'GET';
208
- key = resourceKey();
209
- headers = createHeaders((init === null || init === void 0 ? void 0 : init.headers) || (inputObject === null || inputObject === void 0 ? void 0 : inputObject.headers));
210
- forEachOwn(this.trace.getHeaders(url, key), function (name, value) { return setHeader(headers, name, value); });
211
- this.rum.startResource(key);
212
- start = nowNs();
213
- _a.label = 1;
214
- case 1:
215
- _a.trys.push([1, 3, , 4]);
216
- return [4 /*yield*/, original(input, __assign(__assign({}, init), { headers: headers }))];
217
- case 2:
218
- response = _a.sent();
219
- end = nowNs();
220
- this.rum.stopResource(key);
221
- this.rum.addResource(key, {
222
- url: url,
223
- httpMethod: method,
224
- requestHeaders: headersToObject(headers),
225
- responseHeaders: headersToObject(response.headers),
226
- statusCode: response.status,
227
- }, { fetchStartTime: start, responseStartTime: end, responseEndTime: end });
228
- return [2 /*return*/, response];
229
- case 3:
230
- error_1 = _a.sent();
231
- this.rum.stopResource(key);
232
- this.rum.addError(String(error_1), error_1 instanceof Error ? error_1.stack || '' : '', 'network_error');
233
- throw error_1;
234
- case 4: return [2 /*return*/];
197
+ var rum = this.rum;
198
+ var trace = this.trace;
199
+ var active = true;
200
+ var tracked = function () {
201
+ var args = [];
202
+ for (var _i = 0; _i < arguments.length; _i++) {
203
+ args[_i] = arguments[_i];
204
+ }
205
+ if (!active)
206
+ return original.apply(this, args);
207
+ var outgoing = args;
208
+ var data;
209
+ observeNetwork(function () {
210
+ var input = args[0], init = args[1];
211
+ var inputObject = networkInput(input);
212
+ if (!inputObject)
213
+ return;
214
+ var url = inputObject.url;
215
+ var method = networkOption(init, 'method');
216
+ var sourceHeaders = networkOption(init, 'headers');
217
+ var record = { key: resourceKey(), url: url, method: method || inputObject.method || 'GET',
218
+ start: nowNs(), headers: undefined };
219
+ data = record;
220
+ try {
221
+ var headers_1 = createHeaders(sourceHeaders === undefined ? inputObject.headers : sourceHeaders);
222
+ var appended_1 = false;
223
+ forEachOwn(trace.getHeaders(url, record.key), function (name, value) {
224
+ if (!hasHeader(headers_1, name)) {
225
+ appendHeader(headers_1, name, value);
226
+ appended_1 = true;
227
+ }
228
+ });
229
+ if (appended_1) {
230
+ outgoing = args.slice();
231
+ outgoing[1] = withRequestHeaders(init, headers_1);
232
+ }
233
+ record.headers = headers_1;
235
234
  }
235
+ catch ( /* Failed instrumentation leaves the original fetch arguments intact. */_a) { /* Failed instrumentation leaves the original fetch arguments intact. */ }
236
+ observeNetwork(function () { return rum.startResource(record.key); });
236
237
  });
237
- }); });
238
+ var reportFailure = function (error) {
239
+ if (!data)
240
+ return;
241
+ var key = data.key;
242
+ observeNetwork(function () { return rum.stopResource(key); });
243
+ observeNetwork(function () { return rum.addError(String(error), error instanceof Error ? error.stack || '' : '', 'network_error'); });
244
+ };
245
+ var result;
246
+ // Invoke the application request once. Observation failures must never retry it.
247
+ try {
248
+ result = original.apply(this, outgoing);
249
+ }
250
+ catch (error) {
251
+ reportFailure(error);
252
+ throw error;
253
+ }
254
+ if (!data)
255
+ return result;
256
+ var record = data;
257
+ try {
258
+ return result.then(function (response) {
259
+ observeNetwork(function () { return rum.stopResource(record.key); });
260
+ observeNetwork(function () {
261
+ var end = nowNs();
262
+ rum.addResource(record.key, {
263
+ url: record.url,
264
+ httpMethod: record.method,
265
+ requestHeaders: record.headers && headersToObject(record.headers),
266
+ responseHeaders: headersToObject(response.headers),
267
+ statusCode: response.status,
268
+ }, { fetchStartTime: record.start, responseStartTime: end, responseEndTime: end });
269
+ });
270
+ return response;
271
+ }, function (error) {
272
+ reportFailure(error);
273
+ throw error;
274
+ });
275
+ }
276
+ catch (_a) {
277
+ return result;
278
+ }
279
+ };
238
280
  this.networkStops.push(function () {
239
- _this.target.fetch = original;
281
+ active = false;
282
+ if (_this.target.fetch === tracked)
283
+ _this.target.fetch = original;
240
284
  });
241
285
  this.target.fetch = tracked;
242
286
  };
@@ -250,71 +294,155 @@ var FTDefaultAutoTracking = /** @class */ (function () {
250
294
  var metadata = new WeakMap();
251
295
  var rum = this.rum;
252
296
  var trace = this.trace;
253
- // Register each restore before assignment so partial installation can roll back.
254
- this.networkStops.push(function () { Xhr.prototype.open = open; });
255
- Xhr.prototype.open = function trackedOpen(method, url) {
256
- var _a;
257
- var rest = [];
258
- for (var _i = 2; _i < arguments.length; _i++) {
259
- rest[_i - 2] = arguments[_i];
297
+ var active = true;
298
+ var trackedOpen = function () {
299
+ var _this = this;
300
+ var args = [];
301
+ for (var _i = 0; _i < arguments.length; _i++) {
302
+ args[_i] = arguments[_i];
303
+ }
304
+ if (!active)
305
+ return open.apply(this, args);
306
+ var previous = metadata.get(this);
307
+ observeNetwork(function () {
308
+ metadata.delete(_this);
309
+ if (typeof args[0] !== 'string' || typeof args[1] !== 'string')
310
+ return;
311
+ metadata.set(_this, { key: resourceKey(), method: args[0], url: String(args[1]),
312
+ headers: Object.create(null), headersKnown: true });
313
+ });
314
+ try {
315
+ return open.apply(this, args);
316
+ }
317
+ catch (error) {
318
+ observeNetwork(function () { if (previous)
319
+ metadata.set(_this, previous);
320
+ else
321
+ metadata.delete(_this); });
322
+ throw error;
260
323
  }
261
- metadata.set(this, { key: resourceKey(), method: method, url: String(url), headers: {} });
262
- (_a = open).call.apply(_a, __spreadArray([this, method, url], rest, false));
263
324
  };
264
- this.networkStops.push(function () { Xhr.prototype.setRequestHeader = setRequestHeader; });
265
- Xhr.prototype.setRequestHeader = function trackedHeader(name, value) {
266
- var data = metadata.get(this);
267
- if (data)
268
- data.headers[name] = value;
269
- setRequestHeader.call(this, name, value);
325
+ // Register each restore before assignment so partial installation can roll back.
326
+ this.networkStops.push(function () { active = false; if (Xhr.prototype.open === trackedOpen)
327
+ Xhr.prototype.open = open; });
328
+ Xhr.prototype.open = trackedOpen;
329
+ var trackedHeader = function () {
330
+ var _this = this;
331
+ var args = [];
332
+ for (var _i = 0; _i < arguments.length; _i++) {
333
+ args[_i] = arguments[_i];
334
+ }
335
+ var result = setRequestHeader.apply(this, args);
336
+ observeNetwork(function () {
337
+ var data = active && metadata.get(_this);
338
+ if (!data)
339
+ return;
340
+ var name = args[0], value = args[1];
341
+ if (typeof name !== 'string' || typeof value !== 'string') {
342
+ data.headersKnown = false;
343
+ return;
344
+ }
345
+ var key = name.toLowerCase();
346
+ data.headers[key] = key in data.headers ? "".concat(data.headers[key], ", ").concat(value) : value;
347
+ });
348
+ return result;
270
349
  };
271
- this.networkStops.push(function () { Xhr.prototype.send = send; });
272
- Xhr.prototype.send = function trackedSend(body) {
350
+ this.networkStops.push(function () {
351
+ active = false;
352
+ if (Xhr.prototype.setRequestHeader === trackedHeader)
353
+ Xhr.prototype.setRequestHeader = setRequestHeader;
354
+ });
355
+ Xhr.prototype.setRequestHeader = trackedHeader;
356
+ var trackedSend = function () {
273
357
  var _this = this;
274
- var data = metadata.get(this);
358
+ var args = [];
359
+ for (var _i = 0; _i < arguments.length; _i++) {
360
+ args[_i] = arguments[_i];
361
+ }
362
+ var data = active && metadata.get(this);
275
363
  if (!data)
276
- return send.call(this, body);
277
- forEachOwn(trace.getHeaders(data.url, data.key), function (name, value) {
278
- data.headers[name] = value;
279
- setRequestHeader.call(_this, name, value);
364
+ return send.apply(this, args);
365
+ observeNetwork(function () {
366
+ if (!data.headersKnown)
367
+ return;
368
+ forEachOwn(trace.getHeaders(data.url, data.key), function (name, value) {
369
+ if (!validTraceHeader(name, value))
370
+ return;
371
+ var key = name.toLowerCase();
372
+ if (key in data.headers)
373
+ return;
374
+ setRequestHeader.call(_this, name, value);
375
+ data.headers[key] = value;
376
+ });
280
377
  });
281
- var started = nowNs();
282
- rum.startResource(data.key);
378
+ var started = 0;
379
+ observeNetwork(function () { started = nowNs(); rum.startResource(data.key); });
283
380
  var completed = false;
381
+ var cleanup;
284
382
  var report = function () {
285
383
  if (completed)
286
384
  return;
287
385
  completed = true;
288
- var ended = nowNs();
289
- rum.stopResource(data.key);
290
- rum.addResource(data.key, {
291
- url: data.url,
292
- httpMethod: data.method,
293
- requestHeaders: data.headers,
294
- responseHeaders: parseXhrHeaders(_this.getAllResponseHeaders()),
295
- statusCode: _this.status,
296
- }, { fetchStartTime: started, responseStartTime: ended, responseEndTime: ended });
386
+ observeNetwork(function () { return cleanup === null || cleanup === void 0 ? void 0 : cleanup(); });
387
+ observeNetwork(function () { return rum.stopResource(data.key); });
388
+ observeNetwork(function () {
389
+ var ended = nowNs();
390
+ rum.addResource(data.key, {
391
+ url: data.url,
392
+ httpMethod: data.method,
393
+ requestHeaders: data.headers,
394
+ responseHeaders: parseXhrHeaders(_this.getAllResponseHeaders()),
395
+ statusCode: _this.status,
396
+ }, { fetchStartTime: started, responseStartTime: ended, responseEndTime: ended });
397
+ });
297
398
  };
298
- var originalLoadEnd = this.onloadend;
299
- this.addEventListener('loadend', report, { once: true });
300
- // Creator 2 JSB implements addEventListener by assigning the on* property.
301
- // Preserve the business handler there; DOM runtimes already keep both listeners.
302
- if (this.onloadend === report) {
303
- var xhr_1 = this;
304
- var handler_1 = function (event) {
305
- if (xhr_1.onloadend === handler_1)
306
- xhr_1.onloadend = originalLoadEnd;
307
- try {
308
- originalLoadEnd === null || originalLoadEnd === void 0 ? void 0 : originalLoadEnd.call(xhr_1, event);
399
+ observeNetwork(function () {
400
+ var originalLoadEnd = _this.onloadend;
401
+ try {
402
+ _this.addEventListener('loadend', report, { once: true });
403
+ // Creator 2 JSB assigns the on* property instead of keeping a listener list.
404
+ if (_this.onloadend === report) {
405
+ var xhr_1 = _this;
406
+ var handler_1 = function () {
407
+ var events = [];
408
+ for (var _i = 0; _i < arguments.length; _i++) {
409
+ events[_i] = arguments[_i];
410
+ }
411
+ observeNetwork(function () { return cleanup === null || cleanup === void 0 ? void 0 : cleanup(); });
412
+ try {
413
+ return originalLoadEnd === null || originalLoadEnd === void 0 ? void 0 : originalLoadEnd.apply(this, events);
414
+ }
415
+ finally {
416
+ report();
417
+ }
418
+ };
419
+ cleanup = function () { if (xhr_1.onloadend === handler_1)
420
+ xhr_1.onloadend = originalLoadEnd; };
421
+ _this.onloadend = handler_1;
309
422
  }
310
- finally {
311
- report();
423
+ else {
424
+ cleanup = function () { return _this.removeEventListener('loadend', report); };
312
425
  }
313
- };
314
- this.onloadend = handler_1;
426
+ }
427
+ catch (_a) {
428
+ observeNetwork(function () { return cleanup === null || cleanup === void 0 ? void 0 : cleanup(); });
429
+ observeNetwork(function () { if (_this.onloadend === report)
430
+ _this.onloadend = originalLoadEnd; });
431
+ }
432
+ });
433
+ try {
434
+ return send.apply(this, args);
435
+ }
436
+ catch (error) {
437
+ completed = true;
438
+ observeNetwork(function () { return cleanup === null || cleanup === void 0 ? void 0 : cleanup(); });
439
+ observeNetwork(function () { return rum.stopResource(data.key); });
440
+ throw error;
315
441
  }
316
- send.call(this, body);
317
442
  };
443
+ this.networkStops.push(function () { active = false; if (Xhr.prototype.send === trackedSend)
444
+ Xhr.prototype.send = send; });
445
+ Xhr.prototype.send = trackedSend;
318
446
  };
319
447
  return FTDefaultAutoTracking;
320
448
  }());
@@ -327,39 +455,107 @@ function resourceKey() {
327
455
  resourceSequence = (resourceSequence + 1) % Number.MAX_SAFE_INTEGER;
328
456
  return "cocos-".concat(Date.now().toString(36), "-").concat(resourceSequence.toString(36));
329
457
  }
458
+ function observeNetwork(observe) {
459
+ try {
460
+ observe();
461
+ }
462
+ catch ( /* Monitoring cannot change the application's network result. */_a) { /* Monitoring cannot change the application's network result. */ }
463
+ }
464
+ function networkOption(init, name) {
465
+ for (var source = init; source; source = Object.getPrototypeOf(source)) {
466
+ var descriptor = Object.getOwnPropertyDescriptor(source, name);
467
+ if (!descriptor)
468
+ continue;
469
+ // Accessors may refresh tokens or mutate options. Leave them to the original fetch.
470
+ if (descriptor.get || descriptor.set)
471
+ throw new TypeError('Network option requires its original receiver');
472
+ return descriptor.value;
473
+ }
474
+ return undefined;
475
+ }
476
+ function networkInput(input) {
477
+ if (typeof input === 'string')
478
+ return { url: input };
479
+ if (typeof Request === 'function' && input instanceof Request) {
480
+ var read = function (name) {
481
+ var descriptor = Object.getOwnPropertyDescriptor(Request.prototype, name);
482
+ return (descriptor === null || descriptor === void 0 ? void 0 : descriptor.get) ? descriptor.get.call(input) : networkOption(input, name);
483
+ };
484
+ return { url: read('url'), method: read('method'), headers: read('headers') };
485
+ }
486
+ if (typeof URL === 'function' && input instanceof URL)
487
+ return { url: URL.prototype.toString.call(input) };
488
+ // Custom string conversion belongs to the application request and must only run there.
489
+ return undefined;
490
+ }
491
+ function withRequestHeaders(init, headers) {
492
+ var result = Object.create(init || null);
493
+ var _loop_1 = function (source) {
494
+ Object.getOwnPropertyNames(source).forEach(function (name) {
495
+ if (name === 'headers' || Object.prototype.hasOwnProperty.call(result, name))
496
+ return;
497
+ var descriptor = Object.getOwnPropertyDescriptor(source, name);
498
+ Object.defineProperty(result, name, { enumerable: descriptor === null || descriptor === void 0 ? void 0 : descriptor.enumerable, configurable: true,
499
+ get: function () { return init[name]; } });
500
+ });
501
+ };
502
+ // Forward getters to their original receiver, including inherited/non-enumerable options.
503
+ for (var source = init; source && source !== Object.prototype; source = Object.getPrototypeOf(source)) {
504
+ _loop_1(source);
505
+ }
506
+ Object.defineProperty(result, 'headers', { value: headers, enumerable: true, configurable: true, writable: true });
507
+ return result;
508
+ }
330
509
  function createHeaders(source) {
331
510
  var HeadersConstructor = globalThis.Headers;
332
511
  if (HeadersConstructor)
333
512
  return new HeadersConstructor(source);
334
- var result = {};
513
+ var result = [];
335
514
  if (Array.isArray(source)) {
336
515
  source.forEach(function (_a) {
337
516
  var name = _a[0], value = _a[1];
338
- result[name] = String(value);
517
+ result.push([String(name), String(value)]);
339
518
  });
340
519
  }
341
520
  else if (source && typeof source.forEach === 'function') {
342
- source.forEach(function (value, name) { result[name] = value; });
521
+ source.forEach(function (value, name) { result.push([name, value]); });
343
522
  }
344
523
  else if (source) {
345
- forEachOwn(source, function (name, value) { result[name] = String(value); });
524
+ forEachOwn(source, function (name, value) { result.push([name, String(value)]); });
346
525
  }
347
526
  return result;
348
527
  }
349
- function setHeader(headers, name, value) {
350
- if (typeof headers.set === 'function')
351
- headers.set(name, value);
528
+ function hasHeader(headers, name) {
529
+ return Array.isArray(headers) ? headers.some(function (_a) {
530
+ var key = _a[0];
531
+ return key.toLowerCase() === name.toLowerCase();
532
+ }) : headers.has(name);
533
+ }
534
+ function appendHeader(headers, name, value) {
535
+ if (!validTraceHeader(name, value))
536
+ throw new TypeError('Invalid trace header');
537
+ if (Array.isArray(headers))
538
+ headers.push([name, value]);
352
539
  else
353
- headers[name] = value;
540
+ headers.append(name, value);
541
+ }
542
+ function validTraceHeader(name, value) {
543
+ return /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(name) && typeof value === 'string'
544
+ && !/[\x00-\x08\x0a-\x1f\x7f\u0100-\uffff]/.test(value);
354
545
  }
355
546
  function headersToObject(headers) {
356
- var result = {};
357
- if (typeof headers.forEach === 'function') {
358
- headers.forEach(function (value, key) { result[key] = value; });
359
- }
360
- else {
361
- forEachOwn(headers, function (key, value) { result[key] = value; });
362
- }
547
+ var result = Object.create(null);
548
+ var append = function (value, name) {
549
+ var key = name.toLowerCase();
550
+ result[key] = key in result ? "".concat(result[key], ", ").concat(value) : value;
551
+ };
552
+ if (Array.isArray(headers))
553
+ headers.forEach(function (_a) {
554
+ var name = _a[0], value = _a[1];
555
+ return append(value, name);
556
+ });
557
+ else
558
+ headers.forEach(append);
363
559
  return result;
364
560
  }
365
561
  function forEachOwn(value, callback) {