@guomain/monitor-web 0.1.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/README.md +27 -0
- package/error/index.d.ts +8 -0
- package/error/index.d.ts.map +1 -0
- package/error/promise.d.ts +7 -0
- package/error/promise.d.ts.map +1 -0
- package/error/request.d.ts +15 -0
- package/error/request.d.ts.map +1 -0
- package/error/resource.d.ts +7 -0
- package/error/resource.d.ts.map +1 -0
- package/error/runtime.d.ts +7 -0
- package/error/runtime.d.ts.map +1 -0
- package/index.d.ts +8 -0
- package/index.d.ts.map +1 -0
- package/package.json +35 -0
- package/shared/browser.d.ts +15 -0
- package/shared/browser.d.ts.map +1 -0
- package/web.cjs.js +774 -0
- package/web.es.js +709 -0
- package/web.umd.js +717 -0
package/web.cjs.js
ADDED
|
@@ -0,0 +1,774 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/******************************************************************************
|
|
4
|
+
Copyright (c) Microsoft Corporation.
|
|
5
|
+
|
|
6
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
7
|
+
purpose with or without fee is hereby granted.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
16
|
+
***************************************************************************** */
|
|
17
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
var __assign = function() {
|
|
21
|
+
__assign = Object.assign || function __assign(t) {
|
|
22
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
23
|
+
s = arguments[i];
|
|
24
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
25
|
+
}
|
|
26
|
+
return t;
|
|
27
|
+
};
|
|
28
|
+
return __assign.apply(this, arguments);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
32
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
33
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
34
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
35
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
36
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
37
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function __generator(thisArg, body) {
|
|
42
|
+
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);
|
|
43
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
44
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
45
|
+
function step(op) {
|
|
46
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
47
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
48
|
+
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;
|
|
49
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
50
|
+
switch (op[0]) {
|
|
51
|
+
case 0: case 1: t = op; break;
|
|
52
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
53
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
54
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
55
|
+
default:
|
|
56
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
57
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
58
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
59
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
60
|
+
if (t[2]) _.ops.pop();
|
|
61
|
+
_.trys.pop(); continue;
|
|
62
|
+
}
|
|
63
|
+
op = body.call(thisArg, _);
|
|
64
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
65
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function __values(o) {
|
|
70
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
71
|
+
if (m) return m.call(o);
|
|
72
|
+
if (o && typeof o.length === "number") return {
|
|
73
|
+
next: function () {
|
|
74
|
+
if (o && i >= o.length) o = void 0;
|
|
75
|
+
return { value: o && o[i++], done: !o };
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function __read(o, n) {
|
|
82
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
83
|
+
if (!m) return o;
|
|
84
|
+
var i = m.call(o), r, ar = [], e;
|
|
85
|
+
try {
|
|
86
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
87
|
+
}
|
|
88
|
+
catch (error) { e = { error: error }; }
|
|
89
|
+
finally {
|
|
90
|
+
try {
|
|
91
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
92
|
+
}
|
|
93
|
+
finally { if (e) throw e.error; }
|
|
94
|
+
}
|
|
95
|
+
return ar;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function __spreadArray(to, from, pack) {
|
|
99
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
100
|
+
if (ar || !(i in from)) {
|
|
101
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
102
|
+
ar[i] = from[i];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
109
|
+
var e = new Error(message);
|
|
110
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
var defaultLimits = {
|
|
114
|
+
maxQueueSize: 50
|
|
115
|
+
};
|
|
116
|
+
function createMonitor(config) {
|
|
117
|
+
if (!config.appId) {
|
|
118
|
+
throw new Error('appId is required');
|
|
119
|
+
}
|
|
120
|
+
if (!(config.dsn || config.transport)) {
|
|
121
|
+
throw new Error('dsn or transport is required');
|
|
122
|
+
}
|
|
123
|
+
var mergedLimits = __assign(__assign({}, defaultLimits), config.limits);
|
|
124
|
+
var plugins = [];
|
|
125
|
+
var pluginTeardowns = [];
|
|
126
|
+
var queue = [];
|
|
127
|
+
var queuedKeys = new Set();
|
|
128
|
+
var draining = false;
|
|
129
|
+
var idleDrainHandle;
|
|
130
|
+
var started = false;
|
|
131
|
+
function defaultTransport(payloads) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
133
|
+
var sent;
|
|
134
|
+
return __generator(this, function (_a) {
|
|
135
|
+
switch (_a.label) {
|
|
136
|
+
case 0:
|
|
137
|
+
if (!config.dsn) {
|
|
138
|
+
return [2];
|
|
139
|
+
}
|
|
140
|
+
if (typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {
|
|
141
|
+
sent = navigator.sendBeacon(config.dsn, JSON.stringify(payloads));
|
|
142
|
+
if (sent) {
|
|
143
|
+
return [2];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return [4, fetch(config.dsn, {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
body: JSON.stringify(payloads),
|
|
149
|
+
headers: { 'Content-Type': 'application/json' }
|
|
150
|
+
})];
|
|
151
|
+
case 1:
|
|
152
|
+
_a.sent();
|
|
153
|
+
return [2];
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
var setupPlugin = function (plugin) {
|
|
159
|
+
try {
|
|
160
|
+
var teardown = plugin.setup(monitor);
|
|
161
|
+
if (typeof teardown === 'function') {
|
|
162
|
+
pluginTeardowns.push(teardown);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
reportSdkError(monitor, error, {
|
|
167
|
+
stage: 'plugin',
|
|
168
|
+
pluginName: plugin.name
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
var monitor = {
|
|
173
|
+
config: config,
|
|
174
|
+
limits: mergedLimits,
|
|
175
|
+
start: function () {
|
|
176
|
+
if (started) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
started = true;
|
|
180
|
+
plugins.forEach(function (plugin) {
|
|
181
|
+
setupPlugin(plugin);
|
|
182
|
+
});
|
|
183
|
+
},
|
|
184
|
+
stop: function () {
|
|
185
|
+
if (!started) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
started = false;
|
|
189
|
+
var tasks = pluginTeardowns.splice(0).reverse();
|
|
190
|
+
tasks.forEach(function (task) {
|
|
191
|
+
task();
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
use: function (plugin) {
|
|
195
|
+
plugins.push(plugin);
|
|
196
|
+
if (started) {
|
|
197
|
+
setupPlugin(plugin);
|
|
198
|
+
}
|
|
199
|
+
return monitor;
|
|
200
|
+
},
|
|
201
|
+
capture: function (event) {
|
|
202
|
+
if (!started) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
var key = stringifyQueueEvent(event);
|
|
206
|
+
if (queuedKeys.has(key)) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (queue.length >= mergedLimits.maxQueueSize) {
|
|
210
|
+
var removed = queue.shift();
|
|
211
|
+
if (removed) {
|
|
212
|
+
queuedKeys.delete(removed.key);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
queuedKeys.add(key);
|
|
216
|
+
queue.push({ event: event, key: key });
|
|
217
|
+
scheduleIdleDrain();
|
|
218
|
+
},
|
|
219
|
+
flush: function () {
|
|
220
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
221
|
+
return __generator(this, function (_a) {
|
|
222
|
+
switch (_a.label) {
|
|
223
|
+
case 0: return [4, drainQueue()];
|
|
224
|
+
case 1:
|
|
225
|
+
_a.sent();
|
|
226
|
+
return [2];
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
function drainQueue() {
|
|
233
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
234
|
+
var batch, context_1, _a, error_1, payloads, error_2;
|
|
235
|
+
var _b;
|
|
236
|
+
return __generator(this, function (_c) {
|
|
237
|
+
switch (_c.label) {
|
|
238
|
+
case 0:
|
|
239
|
+
if (draining) {
|
|
240
|
+
return [2];
|
|
241
|
+
}
|
|
242
|
+
cancelIdleDrain();
|
|
243
|
+
draining = true;
|
|
244
|
+
_c.label = 1;
|
|
245
|
+
case 1:
|
|
246
|
+
_c.trys.push([1, , 13, 14]);
|
|
247
|
+
batch = queue.splice(0);
|
|
248
|
+
if (!batch.length) {
|
|
249
|
+
return [2];
|
|
250
|
+
}
|
|
251
|
+
batch.forEach(function (item) {
|
|
252
|
+
queuedKeys.delete(item.key);
|
|
253
|
+
});
|
|
254
|
+
_c.label = 2;
|
|
255
|
+
case 2:
|
|
256
|
+
_c.trys.push([2, 7, , 8]);
|
|
257
|
+
if (!config.context) return [3, 6];
|
|
258
|
+
if (!(typeof config.context === 'function')) return [3, 4];
|
|
259
|
+
return [4, config.context()];
|
|
260
|
+
case 3:
|
|
261
|
+
_a = _c.sent();
|
|
262
|
+
return [3, 5];
|
|
263
|
+
case 4:
|
|
264
|
+
_a = config.context;
|
|
265
|
+
_c.label = 5;
|
|
266
|
+
case 5:
|
|
267
|
+
context_1 = _a;
|
|
268
|
+
_c.label = 6;
|
|
269
|
+
case 6: return [3, 8];
|
|
270
|
+
case 7:
|
|
271
|
+
error_1 = _c.sent();
|
|
272
|
+
reportSdkError(monitor, error_1, { stage: 'context' });
|
|
273
|
+
return [3, 8];
|
|
274
|
+
case 8:
|
|
275
|
+
payloads = batch.map(function (_a) {
|
|
276
|
+
var _b;
|
|
277
|
+
var event = _a.event;
|
|
278
|
+
return (__assign(__assign({}, event), { timestamp: (_b = event.timestamp) !== null && _b !== void 0 ? _b : Date.now(), appId: config.appId, release: config.release, context: context_1 }));
|
|
279
|
+
});
|
|
280
|
+
_c.label = 9;
|
|
281
|
+
case 9:
|
|
282
|
+
_c.trys.push([9, 11, , 12]);
|
|
283
|
+
return [4, ((_b = config.transport) !== null && _b !== void 0 ? _b : defaultTransport)(payloads)];
|
|
284
|
+
case 10:
|
|
285
|
+
_c.sent();
|
|
286
|
+
return [3, 12];
|
|
287
|
+
case 11:
|
|
288
|
+
error_2 = _c.sent();
|
|
289
|
+
if (typeof console !== 'undefined' && console.error) {
|
|
290
|
+
console.error('[gm-monitor] Transport failed:', error_2);
|
|
291
|
+
}
|
|
292
|
+
return [3, 12];
|
|
293
|
+
case 12: return [3, 14];
|
|
294
|
+
case 13:
|
|
295
|
+
draining = false;
|
|
296
|
+
return [7];
|
|
297
|
+
case 14: return [2];
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function scheduleIdleDrain() {
|
|
303
|
+
if (idleDrainHandle !== undefined) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
if (typeof requestIdleCallback === 'function') {
|
|
307
|
+
idleDrainHandle = requestIdleCallback(function () {
|
|
308
|
+
idleDrainHandle = undefined;
|
|
309
|
+
void drainQueue();
|
|
310
|
+
});
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
idleDrainHandle = setTimeout(function () {
|
|
314
|
+
idleDrainHandle = undefined;
|
|
315
|
+
void drainQueue();
|
|
316
|
+
}, 16);
|
|
317
|
+
}
|
|
318
|
+
function cancelIdleDrain() {
|
|
319
|
+
if (idleDrainHandle === undefined) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (typeof cancelIdleCallback === 'function') {
|
|
323
|
+
cancelIdleCallback(idleDrainHandle);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
clearTimeout(idleDrainHandle);
|
|
327
|
+
}
|
|
328
|
+
idleDrainHandle = undefined;
|
|
329
|
+
}
|
|
330
|
+
return monitor;
|
|
331
|
+
}
|
|
332
|
+
function toErrorEvent(type, error, meta) {
|
|
333
|
+
if (error instanceof Error) {
|
|
334
|
+
return __assign({ type: type, message: error.message, stack: error.stack, timestamp: Date.now() }, meta);
|
|
335
|
+
}
|
|
336
|
+
var message;
|
|
337
|
+
if (typeof error === 'string') {
|
|
338
|
+
message = error;
|
|
339
|
+
}
|
|
340
|
+
else if (error === undefined) {
|
|
341
|
+
message = 'undefined';
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
try {
|
|
345
|
+
message = JSON.stringify(error);
|
|
346
|
+
}
|
|
347
|
+
catch (_a) {
|
|
348
|
+
message = String(error);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return __assign({ type: type, message: message, timestamp: Date.now() }, meta);
|
|
352
|
+
}
|
|
353
|
+
function stringifyQueueEvent(event) {
|
|
354
|
+
return JSON.stringify({
|
|
355
|
+
type: event.type,
|
|
356
|
+
message: event.message,
|
|
357
|
+
url: event.url,
|
|
358
|
+
stack: event.stack,
|
|
359
|
+
filename: event.filename,
|
|
360
|
+
lineno: event.lineno,
|
|
361
|
+
colno: event.colno,
|
|
362
|
+
tags: event.tags,
|
|
363
|
+
extra: event.extra
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
function reportSdkError(monitor, error, extra) {
|
|
367
|
+
try {
|
|
368
|
+
monitor.capture(toErrorEvent('sdk-error', error, { extra: extra }));
|
|
369
|
+
}
|
|
370
|
+
catch (_a) {
|
|
371
|
+
if (typeof console !== 'undefined' && console.error) {
|
|
372
|
+
console.error('[gm-monitor] SDK internal error:', error);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function on(target, type, listener, options) {
|
|
378
|
+
target.addEventListener(type, listener, options);
|
|
379
|
+
return function () { return target.removeEventListener(type, listener, options); };
|
|
380
|
+
}
|
|
381
|
+
function getResourceUrl(target) {
|
|
382
|
+
var _a, _b, _c;
|
|
383
|
+
if (!(target instanceof Element)) {
|
|
384
|
+
return undefined;
|
|
385
|
+
}
|
|
386
|
+
return ((_c = (_b = (_a = target.getAttribute('src')) !== null && _a !== void 0 ? _a : target.getAttribute('href')) !== null && _b !== void 0 ? _b : target.getAttribute('data')) !== null && _c !== void 0 ? _c : undefined);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function setupPromiseError(monitor) {
|
|
390
|
+
return on(window, 'unhandledrejection', function (event) {
|
|
391
|
+
monitor.capture(toErrorEvent('promise-error', event.reason));
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
var requestMonitors = new Set();
|
|
396
|
+
var xhrInfo = new WeakMap();
|
|
397
|
+
var originalFetch;
|
|
398
|
+
var originalOpen;
|
|
399
|
+
var originalSend;
|
|
400
|
+
var activeTransportDepth = 0;
|
|
401
|
+
function beginTransportScope() {
|
|
402
|
+
activeTransportDepth += 1;
|
|
403
|
+
}
|
|
404
|
+
function endTransportScope() {
|
|
405
|
+
if (activeTransportDepth > 0) {
|
|
406
|
+
activeTransportDepth -= 1;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
function setupRequestError(monitor) {
|
|
410
|
+
requestMonitors.add(monitor);
|
|
411
|
+
patchFetch();
|
|
412
|
+
patchXhr();
|
|
413
|
+
return function () {
|
|
414
|
+
requestMonitors.delete(monitor);
|
|
415
|
+
restoreRequestPatch();
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
function patchFetch() {
|
|
419
|
+
var _this = this;
|
|
420
|
+
if (originalFetch || typeof fetch !== 'function') {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
originalFetch = fetch;
|
|
424
|
+
var localFetch = fetch;
|
|
425
|
+
globalThis.fetch = (function (input, init) { return __awaiter(_this, void 0, void 0, function () {
|
|
426
|
+
var info, response, error_1;
|
|
427
|
+
return __generator(this, function (_a) {
|
|
428
|
+
switch (_a.label) {
|
|
429
|
+
case 0:
|
|
430
|
+
info = getFetchInfo(input, init);
|
|
431
|
+
_a.label = 1;
|
|
432
|
+
case 1:
|
|
433
|
+
_a.trys.push([1, 3, , 4]);
|
|
434
|
+
return [4, localFetch(input, init)];
|
|
435
|
+
case 2:
|
|
436
|
+
response = _a.sent();
|
|
437
|
+
if (response && !response.ok) {
|
|
438
|
+
captureForActiveMonitors(__assign(__assign({}, info), { status: response.status, statusText: response.statusText }));
|
|
439
|
+
}
|
|
440
|
+
return [2, response];
|
|
441
|
+
case 3:
|
|
442
|
+
error_1 = _a.sent();
|
|
443
|
+
captureForActiveMonitors(__assign(__assign({}, info), { error: error_1 }));
|
|
444
|
+
throw error_1;
|
|
445
|
+
case 4: return [2];
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
}); });
|
|
449
|
+
}
|
|
450
|
+
function patchXhr() {
|
|
451
|
+
if (originalOpen || typeof XMLHttpRequest === 'undefined') {
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
var proto = XMLHttpRequest.prototype;
|
|
455
|
+
originalOpen = proto.open;
|
|
456
|
+
originalSend = proto.send;
|
|
457
|
+
proto.open = function open(method, url) {
|
|
458
|
+
var rest = [];
|
|
459
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
460
|
+
rest[_i - 2] = arguments[_i];
|
|
461
|
+
}
|
|
462
|
+
xhrInfo.set(this, { method: method.toUpperCase(), url: String(url) });
|
|
463
|
+
return originalOpen.apply(this, __spreadArray([method, url], __read(rest), false));
|
|
464
|
+
};
|
|
465
|
+
proto.send = function send() {
|
|
466
|
+
var _this = this;
|
|
467
|
+
var args = [];
|
|
468
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
469
|
+
args[_i] = arguments[_i];
|
|
470
|
+
}
|
|
471
|
+
var captured = false;
|
|
472
|
+
var handleDone = function (event) {
|
|
473
|
+
if (captured) {
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
var info = xhrInfo.get(_this);
|
|
477
|
+
if (!info) {
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
if (_this.status >= 400 || (_this.status === 0 && event.type !== 'loadend')) {
|
|
481
|
+
captured = true;
|
|
482
|
+
captureForActiveMonitors(__assign(__assign({}, info), { status: _this.status, statusText: _this.statusText }));
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
this.addEventListener('loadend', handleDone, { once: true });
|
|
486
|
+
this.addEventListener('error', handleDone, { once: true });
|
|
487
|
+
this.addEventListener('timeout', handleDone, { once: true });
|
|
488
|
+
return originalSend === null || originalSend === void 0 ? void 0 : originalSend.apply(this, args);
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
function restoreRequestPatch() {
|
|
492
|
+
if (requestMonitors.size > 0) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (originalFetch) {
|
|
496
|
+
globalThis.fetch = originalFetch;
|
|
497
|
+
originalFetch = undefined;
|
|
498
|
+
}
|
|
499
|
+
if (typeof XMLHttpRequest !== 'undefined' && originalOpen && originalSend) {
|
|
500
|
+
XMLHttpRequest.prototype.open = originalOpen;
|
|
501
|
+
XMLHttpRequest.prototype.send = originalSend;
|
|
502
|
+
originalOpen = undefined;
|
|
503
|
+
originalSend = undefined;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
function captureForActiveMonitors(info) {
|
|
507
|
+
if (activeTransportDepth > 0) {
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
requestMonitors.forEach(function (monitor) {
|
|
511
|
+
if (!isMonitorDsn(monitor, info.url)) {
|
|
512
|
+
captureRequestError(monitor, info);
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
function captureRequestError(monitor, info) {
|
|
517
|
+
monitor.capture({
|
|
518
|
+
type: 'request-error',
|
|
519
|
+
message: "Request failed: ".concat(info.method, " ").concat(info.url),
|
|
520
|
+
timestamp: Date.now(),
|
|
521
|
+
url: info.url,
|
|
522
|
+
extra: __assign({}, info)
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
function getFetchInfo(input, init) {
|
|
526
|
+
var _a, _b, _c;
|
|
527
|
+
if (input instanceof Request) {
|
|
528
|
+
return {
|
|
529
|
+
method: ((_b = (_a = init === null || init === void 0 ? void 0 : init.method) !== null && _a !== void 0 ? _a : input.method) !== null && _b !== void 0 ? _b : 'GET').toUpperCase(),
|
|
530
|
+
url: input.url
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
return {
|
|
534
|
+
method: ((_c = init === null || init === void 0 ? void 0 : init.method) !== null && _c !== void 0 ? _c : 'GET').toUpperCase(),
|
|
535
|
+
url: String(input)
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
function isMonitorDsn(monitor, url) {
|
|
539
|
+
var dsn = monitor.config.dsn;
|
|
540
|
+
if (!dsn) {
|
|
541
|
+
return false;
|
|
542
|
+
}
|
|
543
|
+
return normalizeRequestUrl(url) === normalizeRequestUrl(dsn);
|
|
544
|
+
}
|
|
545
|
+
function normalizeRequestUrl(url) {
|
|
546
|
+
if (typeof URL === 'undefined') {
|
|
547
|
+
return url;
|
|
548
|
+
}
|
|
549
|
+
try {
|
|
550
|
+
var base = typeof location === 'undefined' ? undefined : location.href;
|
|
551
|
+
return new URL(url, base).href;
|
|
552
|
+
}
|
|
553
|
+
catch (_a) {
|
|
554
|
+
return url;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
function setupResourceError(monitor) {
|
|
559
|
+
return on(window, 'error', function (event) {
|
|
560
|
+
if (event.target === window) {
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
var url = getResourceUrl(event.target);
|
|
564
|
+
if (!url) {
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
monitor.capture({
|
|
568
|
+
type: 'resource-error',
|
|
569
|
+
message: "Resource load failed: ".concat(url),
|
|
570
|
+
url: url,
|
|
571
|
+
timestamp: Date.now()
|
|
572
|
+
});
|
|
573
|
+
}, true);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
function setupRuntimeError(monitor) {
|
|
577
|
+
return on(window, 'error', function (event) {
|
|
578
|
+
if (!('message' in event)) {
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
monitor.capture({
|
|
582
|
+
type: 'runtime-error',
|
|
583
|
+
message: event.message,
|
|
584
|
+
stack: event.error instanceof Error ? event.error.stack : undefined,
|
|
585
|
+
filename: event.filename,
|
|
586
|
+
lineno: event.lineno,
|
|
587
|
+
colno: event.colno,
|
|
588
|
+
timestamp: Date.now()
|
|
589
|
+
});
|
|
590
|
+
}, true);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
function setupWebError(monitor) {
|
|
594
|
+
var e_1, _a;
|
|
595
|
+
var teardowns = [];
|
|
596
|
+
var setup = [
|
|
597
|
+
{ name: 'runtime', fn: function () { return setupRuntimeError(monitor); } },
|
|
598
|
+
{ name: 'promise', fn: function () { return setupPromiseError(monitor); } },
|
|
599
|
+
{ name: 'resource', fn: function () { return setupResourceError(monitor); } },
|
|
600
|
+
{ name: 'request', fn: function () { return setupRequestError(monitor); } }
|
|
601
|
+
];
|
|
602
|
+
try {
|
|
603
|
+
for (var setup_1 = __values(setup), setup_1_1 = setup_1.next(); !setup_1_1.done; setup_1_1 = setup_1.next()) {
|
|
604
|
+
var _b = setup_1_1.value, name_1 = _b.name, fn = _b.fn;
|
|
605
|
+
try {
|
|
606
|
+
teardowns.push(fn());
|
|
607
|
+
}
|
|
608
|
+
catch (_c) {
|
|
609
|
+
if (typeof console !== 'undefined' && console.warn) {
|
|
610
|
+
console.warn("[gm-monitor] Failed to setup ".concat(name_1, " error listener"));
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
616
|
+
finally {
|
|
617
|
+
try {
|
|
618
|
+
if (setup_1_1 && !setup_1_1.done && (_a = setup_1.return)) _a.call(setup_1);
|
|
619
|
+
}
|
|
620
|
+
finally { if (e_1) throw e_1.error; }
|
|
621
|
+
}
|
|
622
|
+
return function () {
|
|
623
|
+
var cleanupTasks = teardowns.splice(0).reverse();
|
|
624
|
+
cleanupTasks.forEach(function (task) {
|
|
625
|
+
try {
|
|
626
|
+
task();
|
|
627
|
+
}
|
|
628
|
+
catch (_a) {
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
function createWebMonitor(config) {
|
|
635
|
+
var monitor = createMonitor(__assign(__assign({}, config), { transport: wrapTransport(config.transport) }));
|
|
636
|
+
var startCore = monitor.start;
|
|
637
|
+
var stopCore = monitor.stop;
|
|
638
|
+
var teardowns = [];
|
|
639
|
+
var ReactBoundary = createReactBoundaryType(monitor);
|
|
640
|
+
var webStarted = false;
|
|
641
|
+
monitor.start = function () {
|
|
642
|
+
if (webStarted) {
|
|
643
|
+
return;
|
|
644
|
+
}
|
|
645
|
+
startCore();
|
|
646
|
+
try {
|
|
647
|
+
webStarted = true;
|
|
648
|
+
if (config.error !== false) {
|
|
649
|
+
teardowns.push(setupWebError(monitor));
|
|
650
|
+
}
|
|
651
|
+
var teardownVue = setupVue(config, monitor);
|
|
652
|
+
if (teardownVue) {
|
|
653
|
+
teardowns.push(teardownVue);
|
|
654
|
+
}
|
|
655
|
+
teardowns.push(setupFlushOnPageUnload(monitor));
|
|
656
|
+
}
|
|
657
|
+
catch (_a) {
|
|
658
|
+
webStarted = false;
|
|
659
|
+
runTeardowns(teardowns);
|
|
660
|
+
stopCore();
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
monitor.stop = function () {
|
|
664
|
+
if (!webStarted) {
|
|
665
|
+
stopCore();
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
runTeardowns(teardowns);
|
|
669
|
+
webStarted = false;
|
|
670
|
+
stopCore();
|
|
671
|
+
};
|
|
672
|
+
monitor.renderReact = function (root, element) {
|
|
673
|
+
root.render(createReactBoundaryElement(ReactBoundary, element));
|
|
674
|
+
};
|
|
675
|
+
return monitor;
|
|
676
|
+
}
|
|
677
|
+
function createReactBoundaryType(monitor) {
|
|
678
|
+
var MonitorReactBoundary = (function () {
|
|
679
|
+
function MonitorReactBoundary(props) {
|
|
680
|
+
this.state = { hasError: false };
|
|
681
|
+
this.props = props;
|
|
682
|
+
}
|
|
683
|
+
MonitorReactBoundary.getDerivedStateFromError = function () {
|
|
684
|
+
return { hasError: true };
|
|
685
|
+
};
|
|
686
|
+
MonitorReactBoundary.prototype.componentDidCatch = function (error, info) {
|
|
687
|
+
monitor.capture(toErrorEvent('react-error', error, { extra: { info: info } }));
|
|
688
|
+
};
|
|
689
|
+
MonitorReactBoundary.prototype.render = function () {
|
|
690
|
+
return this.state.hasError ? null : this.props.children;
|
|
691
|
+
};
|
|
692
|
+
return MonitorReactBoundary;
|
|
693
|
+
}());
|
|
694
|
+
Object.defineProperty(MonitorReactBoundary.prototype, 'isReactComponent', {
|
|
695
|
+
value: {}
|
|
696
|
+
});
|
|
697
|
+
return MonitorReactBoundary;
|
|
698
|
+
}
|
|
699
|
+
function createReactBoundaryElement(type, children) {
|
|
700
|
+
return {
|
|
701
|
+
$$typeof: Symbol.for('react.element'),
|
|
702
|
+
type: type,
|
|
703
|
+
key: null,
|
|
704
|
+
ref: null,
|
|
705
|
+
props: { children: children },
|
|
706
|
+
_owner: null
|
|
707
|
+
};
|
|
708
|
+
}
|
|
709
|
+
function setupVue(config, monitor) {
|
|
710
|
+
var _a;
|
|
711
|
+
var app = (_a = config.vue) === null || _a === void 0 ? void 0 : _a.app;
|
|
712
|
+
if (!app) {
|
|
713
|
+
return undefined;
|
|
714
|
+
}
|
|
715
|
+
var previousHandler = app.config.errorHandler;
|
|
716
|
+
app.config.errorHandler = function (err, instance, info) {
|
|
717
|
+
monitor.capture(toErrorEvent('vue-error', err, { extra: { info: info } }));
|
|
718
|
+
previousHandler === null || previousHandler === void 0 ? void 0 : previousHandler(err, instance, info);
|
|
719
|
+
};
|
|
720
|
+
return function () {
|
|
721
|
+
app.config.errorHandler = previousHandler;
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
function setupFlushOnPageUnload(monitor) {
|
|
725
|
+
if (typeof window === 'undefined') {
|
|
726
|
+
return function () { return undefined; };
|
|
727
|
+
}
|
|
728
|
+
var handlePageUnload = function () {
|
|
729
|
+
void monitor.flush();
|
|
730
|
+
};
|
|
731
|
+
window.addEventListener('pagehide', handlePageUnload);
|
|
732
|
+
window.addEventListener('beforeunload', handlePageUnload);
|
|
733
|
+
return function () {
|
|
734
|
+
window.removeEventListener('pagehide', handlePageUnload);
|
|
735
|
+
window.removeEventListener('beforeunload', handlePageUnload);
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
function runTeardowns(teardowns) {
|
|
739
|
+
var cleanupTasks = teardowns.splice(0).reverse();
|
|
740
|
+
cleanupTasks.forEach(function (task) {
|
|
741
|
+
try {
|
|
742
|
+
task();
|
|
743
|
+
}
|
|
744
|
+
catch (_a) {
|
|
745
|
+
}
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
function wrapTransport(transport) {
|
|
749
|
+
var _this = this;
|
|
750
|
+
if (!transport) {
|
|
751
|
+
return undefined;
|
|
752
|
+
}
|
|
753
|
+
return function (payloads) { return __awaiter(_this, void 0, void 0, function () {
|
|
754
|
+
return __generator(this, function (_a) {
|
|
755
|
+
switch (_a.label) {
|
|
756
|
+
case 0:
|
|
757
|
+
beginTransportScope();
|
|
758
|
+
_a.label = 1;
|
|
759
|
+
case 1:
|
|
760
|
+
_a.trys.push([1, , 3, 4]);
|
|
761
|
+
return [4, transport(payloads)];
|
|
762
|
+
case 2:
|
|
763
|
+
_a.sent();
|
|
764
|
+
return [3, 4];
|
|
765
|
+
case 3:
|
|
766
|
+
endTransportScope();
|
|
767
|
+
return [7];
|
|
768
|
+
case 4: return [2];
|
|
769
|
+
}
|
|
770
|
+
});
|
|
771
|
+
}); };
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
exports.createWebMonitor = createWebMonitor;
|