@grafana/faro-web-sdk 2.3.0 → 2.4.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/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/navigation/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/bundle/types/transports/console/transport.d.ts +1 -1
- package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
- package/dist/cjs/config/getWebInstrumentations.js +3 -4
- package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
- package/dist/cjs/config/makeCoreConfig.js +48 -60
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/initialize.js +3 -3
- package/dist/cjs/initialize.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js +44 -65
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +11 -17
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js +5 -5
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js +28 -30
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js +7 -7
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js +8 -8
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js +24 -32
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -1
- package/dist/cjs/instrumentations/console/instrumentation.js +29 -49
- package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/csp/instrumentation.js +14 -32
- package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getErrorDetails.js +23 -23
- package/dist/cjs/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js +5 -5
- package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js.map +1 -1
- package/dist/cjs/instrumentations/errors/instrumentation.js +11 -29
- package/dist/cjs/instrumentations/errors/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnerror.js +6 -10
- package/dist/cjs/instrumentations/errors/registerOnerror.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +16 -17
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js +2 -2
- package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js +4 -4
- package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js +16 -17
- package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js +1 -1
- package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js.map +1 -1
- package/dist/cjs/instrumentations/navigation/instrumentation.js +27 -45
- package/dist/cjs/instrumentations/navigation/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/instrumentation.js +19 -74
- package/dist/cjs/instrumentations/performance/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/navigation.js +15 -26
- package/dist/cjs/instrumentations/performance/navigation.js.map +1 -1
- package/dist/cjs/instrumentations/performance/performanceUtils.js +18 -33
- package/dist/cjs/instrumentations/performance/performanceUtils.js.map +1 -1
- package/dist/cjs/instrumentations/performance/resource.js +13 -25
- package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
- package/dist/cjs/instrumentations/session/instrumentation.js +45 -74
- package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js +21 -24
- package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js +21 -24
- package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js +2 -2
- package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js +5 -5
- package/dist/cjs/instrumentations/session/sessionManager/sampling.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +64 -61
- package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/instrumentation.js +15 -34
- package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +11 -11
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/userActionController.js +49 -53
- package/dist/cjs/instrumentations/userActions/userActionController.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/util.js +4 -4
- package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
- package/dist/cjs/instrumentations/view/instrumentation.js +12 -30
- package/dist/cjs/instrumentations/view/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/instrumentation.js +11 -29
- package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js +87 -94
- package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
- package/dist/cjs/metas/browser/meta.js +14 -14
- package/dist/cjs/metas/browser/meta.js.map +1 -1
- package/dist/cjs/metas/k6/meta.js +3 -14
- package/dist/cjs/metas/k6/meta.js.map +1 -1
- package/dist/cjs/metas/page/meta.js +7 -19
- package/dist/cjs/metas/page/meta.js.map +1 -1
- package/dist/cjs/metas/sdk/meta.js +3 -3
- package/dist/cjs/metas/sdk/meta.js.map +1 -1
- package/dist/cjs/metas/session/createSession.js +2 -2
- package/dist/cjs/metas/session/createSession.js.map +1 -1
- package/dist/cjs/transports/console/transport.js +10 -29
- package/dist/cjs/transports/console/transport.js.map +1 -1
- package/dist/cjs/transports/fetch/transport.js +82 -176
- package/dist/cjs/transports/fetch/transport.js.map +1 -1
- package/dist/cjs/utils/throttle.js +6 -10
- package/dist/cjs/utils/throttle.js.map +1 -1
- package/dist/cjs/utils/url.js +4 -5
- package/dist/cjs/utils/url.js.map +1 -1
- package/dist/cjs/utils/webStorage.js +4 -4
- package/dist/cjs/utils/webStorage.js.map +1 -1
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js +0 -1
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
- package/dist/esm/instrumentations/errors/getErrorDetails.js +1 -0
- package/dist/esm/instrumentations/errors/getErrorDetails.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js +22 -2
- package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
- package/dist/esm/transports/fetch/transport.js +1 -1
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/navigation/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +9 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/sdk/meta.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/sdk/meta.ts"],"names":[],"mappings":";;;AAAA,kDAA6C;AAGtC,MAAM,OAAO,GAAgC,GAAG,EAAE,CAAC,CAAC;IACzD,GAAG,EAAE;QACH,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,mBAAO;KACjB;CACF,CAAC,CAAC;AALU,QAAA,OAAO,WAKjB","sourcesContent":["import { VERSION } from '@grafana/faro-core';\nimport type { Meta, MetaItem } from '@grafana/faro-core';\n\nexport const sdkMeta: MetaItem<Pick<Meta, 'sdk'>> = () => ({\n sdk: {\n name: 'faro-web',\n version: VERSION,\n },\n});\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createSession = createSession;
|
|
4
|
-
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
5
|
function createSession(attributes) {
|
|
6
6
|
var _a, _b, _c, _d;
|
|
7
7
|
return {
|
|
8
8
|
id: (_d = (_c = (_b = (_a = faro_core_1.faro.config) === null || _a === void 0 ? void 0 : _a.sessionTracking) === null || _b === void 0 ? void 0 : _b.generateSessionId) === null || _c === void 0 ? void 0 : _c.call(_b)) !== null && _d !== void 0 ? _d : (0, faro_core_1.genShortID)(),
|
|
9
|
-
attributes
|
|
9
|
+
attributes,
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=createSession.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSession.js","sourceRoot":"","sources":["../../../../src/metas/session/createSession.ts"],"names":[],"mappings":";;AAGA,sCAKC;AARD,
|
|
1
|
+
{"version":3,"file":"createSession.js","sourceRoot":"","sources":["../../../../src/metas/session/createSession.ts"],"names":[],"mappings":";;AAGA,sCAKC;AARD,kDAAsD;AAGtD,SAAgB,aAAa,CAAC,UAAsC;;IAClE,OAAO;QACL,EAAE,EAAE,MAAA,MAAA,MAAA,MAAA,gBAAI,CAAC,MAAM,0CAAE,eAAe,0CAAE,iBAAiB,kDAAI,mCAAI,IAAA,sBAAU,GAAE;QACvE,UAAU;KACX,CAAC;AACJ,CAAC","sourcesContent":["import { faro, genShortID } from '@grafana/faro-core';\nimport type { MetaSession } from '@grafana/faro-core';\n\nexport function createSession(attributes?: MetaSession['attributes']): MetaSession {\n return {\n id: faro.config?.sessionTracking?.generateSessionId?.() ?? genShortID(),\n attributes,\n };\n}\n"]}
|
|
@@ -1,37 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
3
|
exports.ConsoleTransport = void 0;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
_this.name = '@grafana/faro-web-sdk:transport-console';
|
|
27
|
-
_this.version = faro_core_1.VERSION;
|
|
28
|
-
return _this;
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
class ConsoleTransport extends faro_core_1.BaseTransport {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
super();
|
|
8
|
+
this.options = options;
|
|
9
|
+
this.name = '@grafana/faro-web-sdk:transport-console';
|
|
10
|
+
this.version = faro_core_1.VERSION;
|
|
29
11
|
}
|
|
30
|
-
|
|
12
|
+
send(item) {
|
|
31
13
|
var _a;
|
|
32
14
|
return this.unpatchedConsole[(_a = this.options.level) !== null && _a !== void 0 ? _a : faro_core_1.LogLevel.DEBUG]('New event', (0, faro_core_1.getTransportBody)([item]));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
}(faro_core_1.BaseTransport));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
36
17
|
exports.ConsoleTransport = ConsoleTransport;
|
|
37
18
|
//# sourceMappingURL=transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/console/transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/console/transport.ts"],"names":[],"mappings":";;;AAAA,kDAAwF;AAKxF,MAAa,gBAAiB,SAAQ,yBAAa;IAIjD,YAAoB,UAAmC,EAAE;QACvD,KAAK,EAAE,CAAC;QADU,YAAO,GAAP,OAAO,CAA8B;QAHhD,SAAI,GAAG,yCAAyC,CAAC;QACjD,YAAO,GAAG,mBAAO,CAAC;IAI3B,CAAC;IAED,IAAI,CAAC,IAAmB;;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,KAAK,mCAAI,oBAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,IAAA,4BAAgB,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5G,CAAC;CACF;AAXD,4CAWC","sourcesContent":["import { BaseTransport, getTransportBody, LogLevel, VERSION } from '@grafana/faro-core';\nimport type { TransportItem } from '@grafana/faro-core';\n\nimport type { ConsoleTransportOptions } from './types';\n\nexport class ConsoleTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-console';\n readonly version = VERSION;\n\n constructor(private options: ConsoleTransportOptions = {}) {\n super();\n }\n\n send(item: TransportItem): void {\n return this.unpatchedConsole[this.options.level ?? LogLevel.DEBUG]('New event', getTransportBody([item]));\n }\n}\n"]}
|
|
@@ -1,30 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __assign = (this && this.__assign) || function () {
|
|
18
|
-
__assign = Object.assign || function(t) {
|
|
19
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
20
|
-
s = arguments[i];
|
|
21
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
22
|
-
t[p] = s[p];
|
|
23
|
-
}
|
|
24
|
-
return t;
|
|
25
|
-
};
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
27
|
-
};
|
|
28
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
29
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
30
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -34,33 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
34
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
35
9
|
});
|
|
36
10
|
};
|
|
37
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
38
|
-
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);
|
|
39
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
40
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
41
|
-
function step(op) {
|
|
42
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
43
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
44
|
-
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;
|
|
45
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
46
|
-
switch (op[0]) {
|
|
47
|
-
case 0: case 1: t = op; break;
|
|
48
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
49
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
50
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
51
|
-
default:
|
|
52
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
53
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
54
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
55
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
56
|
-
if (t[2]) _.ops.pop();
|
|
57
|
-
_.trys.pop(); continue;
|
|
58
|
-
}
|
|
59
|
-
op = body.call(thisArg, _);
|
|
60
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
61
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
11
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
65
12
|
var t = {};
|
|
66
13
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -74,151 +21,110 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
74
21
|
};
|
|
75
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
76
23
|
exports.FetchTransport = void 0;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
function FetchTransport(options) {
|
|
24
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
25
|
+
const sessionManager_1 = require("../../instrumentations/session/sessionManager");
|
|
26
|
+
const sessionManagerUtils_1 = require("../../instrumentations/session/sessionManager/sessionManagerUtils");
|
|
27
|
+
const DEFAULT_BUFFER_SIZE = 30;
|
|
28
|
+
const DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17
|
|
29
|
+
const DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;
|
|
30
|
+
const BEACON_BODY_SIZE_LIMIT = 60000;
|
|
31
|
+
const TOO_MANY_REQUESTS = 429;
|
|
32
|
+
const ACCEPTED = 202;
|
|
33
|
+
class FetchTransport extends faro_core_1.BaseTransport {
|
|
34
|
+
constructor(options) {
|
|
89
35
|
var _a, _b, _c, _d;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
36
|
+
super();
|
|
37
|
+
this.options = options;
|
|
38
|
+
this.name = '@grafana/faro-web-sdk:transport-fetch';
|
|
39
|
+
this.version = faro_core_1.VERSION;
|
|
40
|
+
this.disabledUntil = new Date(0);
|
|
41
|
+
this.rateLimitBackoffMs = (_a = options.defaultRateLimitBackoffMs) !== null && _a !== void 0 ? _a : DEFAULT_RATE_LIMIT_BACKOFF_MS;
|
|
42
|
+
this.getNow = (_b = options.getNow) !== null && _b !== void 0 ? _b : (() => Date.now());
|
|
43
|
+
this.promiseBuffer = (0, faro_core_1.createPromiseBuffer)({
|
|
98
44
|
size: (_c = options.bufferSize) !== null && _c !== void 0 ? _c : DEFAULT_BUFFER_SIZE,
|
|
99
45
|
concurrency: (_d = options.concurrency) !== null && _d !== void 0 ? _d : DEFAULT_CONCURRENCY,
|
|
100
46
|
});
|
|
101
|
-
return _this;
|
|
102
47
|
}
|
|
103
|
-
|
|
104
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
case 0:
|
|
110
|
-
_a.trys.push([0, 2, , 3]);
|
|
111
|
-
if (this.disabledUntil > new Date(this.getNow())) {
|
|
112
|
-
this.logWarn("Dropping transport item due to too many requests. Backoff until ".concat(this.disabledUntil));
|
|
113
|
-
return [2 /*return*/, Promise.resolve()];
|
|
114
|
-
}
|
|
115
|
-
return [4 /*yield*/, this.promiseBuffer.add(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
116
|
-
var body, _a, url, requestOptions, apiKey, _b, _c, headers, restOfRequestOptions, sessionId, sessionMeta, resolvedHeaders, _i, _d, _e, key, value, _f, _g, _h;
|
|
117
|
-
var _this = this;
|
|
118
|
-
return __generator(this, function (_j) {
|
|
119
|
-
switch (_j.label) {
|
|
120
|
-
case 0:
|
|
121
|
-
body = JSON.stringify((0, faro_core_1.getTransportBody)(items));
|
|
122
|
-
_a = this.options, url = _a.url, requestOptions = _a.requestOptions, apiKey = _a.apiKey;
|
|
123
|
-
_b = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, _c = _b.headers, headers = _c === void 0 ? {} : _c, restOfRequestOptions = __rest(_b, ["headers"]);
|
|
124
|
-
sessionMeta = this.metas.value.session;
|
|
125
|
-
if (sessionMeta != null) {
|
|
126
|
-
sessionId = sessionMeta.id;
|
|
127
|
-
}
|
|
128
|
-
resolvedHeaders = {};
|
|
129
|
-
_i = 0, _d = Object.entries(headers);
|
|
130
|
-
_j.label = 1;
|
|
131
|
-
case 1:
|
|
132
|
-
if (!(_i < _d.length)) return [3 /*break*/, 6];
|
|
133
|
-
_e = _d[_i], key = _e[0], value = _e[1];
|
|
134
|
-
_f = resolvedHeaders;
|
|
135
|
-
_g = key;
|
|
136
|
-
if (!(typeof value === 'function')) return [3 /*break*/, 3];
|
|
137
|
-
return [4 /*yield*/, Promise.resolve(value())];
|
|
138
|
-
case 2:
|
|
139
|
-
_h = _j.sent();
|
|
140
|
-
return [3 /*break*/, 4];
|
|
141
|
-
case 3:
|
|
142
|
-
_h = value;
|
|
143
|
-
_j.label = 4;
|
|
144
|
-
case 4:
|
|
145
|
-
_f[_g] = _h;
|
|
146
|
-
_j.label = 5;
|
|
147
|
-
case 5:
|
|
148
|
-
_i++;
|
|
149
|
-
return [3 /*break*/, 1];
|
|
150
|
-
case 6: return [2 /*return*/, fetch(url, __assign({ method: 'POST', headers: __assign(__assign(__assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), (sessionId ? { 'x-faro-session-id': sessionId } : {})), body: body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
151
|
-
.then(function (response) { return __awaiter(_this, void 0, void 0, function () {
|
|
152
|
-
var sessionExpired;
|
|
153
|
-
return __generator(this, function (_a) {
|
|
154
|
-
if (response.status === ACCEPTED) {
|
|
155
|
-
sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid';
|
|
156
|
-
if (sessionExpired) {
|
|
157
|
-
this.extendFaroSession(this.config, this.logDebug);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
if (response.status === TOO_MANY_REQUESTS) {
|
|
161
|
-
this.disabledUntil = this.getRetryAfterDate(response);
|
|
162
|
-
this.logWarn("Too many requests, backing off until ".concat(this.disabledUntil));
|
|
163
|
-
}
|
|
164
|
-
// read the body so the connection can be closed
|
|
165
|
-
response.text().catch(faro_core_1.noop);
|
|
166
|
-
return [2 /*return*/, response];
|
|
167
|
-
});
|
|
168
|
-
}); })
|
|
169
|
-
.catch(function (err) {
|
|
170
|
-
_this.logError('Failed sending payload to the receiver\n', JSON.parse(body), err);
|
|
171
|
-
})];
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
}); })];
|
|
175
|
-
case 1:
|
|
176
|
-
_a.sent();
|
|
177
|
-
return [3 /*break*/, 3];
|
|
178
|
-
case 2:
|
|
179
|
-
err_1 = _a.sent();
|
|
180
|
-
this.logError(err_1);
|
|
181
|
-
return [3 /*break*/, 3];
|
|
182
|
-
case 3: return [2 /*return*/];
|
|
48
|
+
send(items) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
try {
|
|
51
|
+
if (this.disabledUntil > new Date(this.getNow())) {
|
|
52
|
+
this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`);
|
|
53
|
+
return Promise.resolve();
|
|
183
54
|
}
|
|
184
|
-
|
|
55
|
+
yield this.promiseBuffer.add(() => __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
const body = JSON.stringify((0, faro_core_1.getTransportBody)(items));
|
|
57
|
+
const { url, requestOptions, apiKey } = this.options;
|
|
58
|
+
const _a = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, { headers = {} } = _a, restOfRequestOptions = __rest(_a, ["headers"]);
|
|
59
|
+
let sessionId;
|
|
60
|
+
const sessionMeta = this.metas.value.session;
|
|
61
|
+
if (sessionMeta != null) {
|
|
62
|
+
sessionId = sessionMeta.id;
|
|
63
|
+
}
|
|
64
|
+
const resolvedHeaders = {};
|
|
65
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
66
|
+
resolvedHeaders[key] = typeof value === 'function' ? yield Promise.resolve(value()) : value;
|
|
67
|
+
}
|
|
68
|
+
return fetch(url, Object.assign({ method: 'POST', headers: Object.assign(Object.assign(Object.assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), (sessionId ? { 'x-faro-session-id': sessionId } : {})), body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
69
|
+
.then((response) => __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
if (response.status === ACCEPTED) {
|
|
71
|
+
const sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid';
|
|
72
|
+
if (sessionExpired) {
|
|
73
|
+
this.extendFaroSession(this.config, this.logDebug);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (response.status === TOO_MANY_REQUESTS) {
|
|
77
|
+
this.disabledUntil = this.getRetryAfterDate(response);
|
|
78
|
+
this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);
|
|
79
|
+
}
|
|
80
|
+
// read the body so the connection can be closed
|
|
81
|
+
response.text().catch(faro_core_1.noop);
|
|
82
|
+
return response;
|
|
83
|
+
}))
|
|
84
|
+
.catch((err) => {
|
|
85
|
+
this.logError('Failed sending payload to the receiver\n', JSON.parse(body), err);
|
|
86
|
+
});
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
this.logError(err);
|
|
91
|
+
}
|
|
185
92
|
});
|
|
186
|
-
}
|
|
187
|
-
|
|
93
|
+
}
|
|
94
|
+
getIgnoreUrls() {
|
|
188
95
|
var _a;
|
|
189
96
|
return [this.options.url].concat((_a = this.config.ignoreUrls) !== null && _a !== void 0 ? _a : []);
|
|
190
|
-
}
|
|
191
|
-
|
|
97
|
+
}
|
|
98
|
+
isBatched() {
|
|
192
99
|
return true;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
100
|
+
}
|
|
101
|
+
getRetryAfterDate(response) {
|
|
102
|
+
const now = this.getNow();
|
|
103
|
+
const retryAfterHeader = response.headers.get('Retry-After');
|
|
197
104
|
if (retryAfterHeader) {
|
|
198
|
-
|
|
105
|
+
const delay = Number(retryAfterHeader);
|
|
199
106
|
if (!isNaN(delay)) {
|
|
200
107
|
return new Date(delay * 1000 + now);
|
|
201
108
|
}
|
|
202
|
-
|
|
109
|
+
const date = Date.parse(retryAfterHeader);
|
|
203
110
|
if (!isNaN(date)) {
|
|
204
111
|
return new Date(date);
|
|
205
112
|
}
|
|
206
113
|
}
|
|
207
114
|
return new Date(now + this.rateLimitBackoffMs);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
115
|
+
}
|
|
116
|
+
extendFaroSession(config, logDebug) {
|
|
117
|
+
const SessionExpiredString = `Session expired`;
|
|
118
|
+
const sessionTrackingConfig = config.sessionTracking;
|
|
212
119
|
if (sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.enabled) {
|
|
213
|
-
|
|
214
|
-
(0, sessionManagerUtils_1.getUserSessionUpdater)({ fetchUserSession
|
|
215
|
-
logDebug(
|
|
120
|
+
const { fetchUserSession, storeUserSession } = (0, sessionManager_1.getSessionManagerByConfig)(sessionTrackingConfig);
|
|
121
|
+
(0, sessionManagerUtils_1.getUserSessionUpdater)({ fetchUserSession, storeUserSession })({ forceSessionExtend: true });
|
|
122
|
+
logDebug(`${SessionExpiredString} created new session.`);
|
|
216
123
|
}
|
|
217
124
|
else {
|
|
218
|
-
logDebug(
|
|
125
|
+
logDebug(`${SessionExpiredString}.`);
|
|
219
126
|
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
}(faro_core_1.BaseTransport));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
223
129
|
exports.FetchTransport = FetchTransport;
|
|
224
130
|
//# sourceMappingURL=transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseExtension, BaseTransport, createPromiseBuffer, getTransportBody, noop, VERSION } from '@grafana/faro-core';\nimport type { Config, Patterns, PromiseBuffer, TransportItem } from '@grafana/faro-core';\n\nimport { getSessionManagerByConfig } from '../../instrumentations/session/sessionManager';\nimport { getUserSessionUpdater } from '../../instrumentations/session/sessionManager/sessionManagerUtils';\n\nimport type { FetchTransportOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 30;\nconst DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17\nconst DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;\n\nconst BEACON_BODY_SIZE_LIMIT = 60000;\nconst TOO_MANY_REQUESTS = 429;\nconst ACCEPTED = 202;\n\nexport class FetchTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-fetch';\n readonly version = VERSION;\n\n promiseBuffer: PromiseBuffer<Response | void>;\n\n private readonly rateLimitBackoffMs: number;\n private readonly getNow: () => number;\n private disabledUntil: Date = new Date(0);\n\n constructor(private options: FetchTransportOptions) {\n super();\n\n this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;\n this.getNow = options.getNow ?? (() => Date.now());\n\n this.promiseBuffer = createPromiseBuffer({\n size: options.bufferSize ?? DEFAULT_BUFFER_SIZE,\n concurrency: options.concurrency ?? DEFAULT_CONCURRENCY,\n });\n }\n\n async send(items: TransportItem[]): Promise<void> {\n try {\n if (this.disabledUntil > new Date(this.getNow())) {\n this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`);\n\n return Promise.resolve();\n }\n\n await this.promiseBuffer.add(async () => {\n const body = JSON.stringify(getTransportBody(items));\n\n const { url, requestOptions, apiKey } = this.options;\n\n const { headers = {}, ...restOfRequestOptions } = requestOptions ?? {};\n\n let sessionId;\n const sessionMeta = this.metas.value.session;\n if (sessionMeta != null) {\n sessionId = sessionMeta.id;\n }\n\n const resolvedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n resolvedHeaders[key] = typeof value === 'function' ? await Promise.resolve(value()) : value;\n }\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...resolvedHeaders,\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n ...(sessionId ? { 'x-faro-session-id': sessionId } : {}),\n },\n body,\n keepalive: body.length <= BEACON_BODY_SIZE_LIMIT,\n ...(restOfRequestOptions ?? {}),\n })\n .then(async (response) => {\n if (response.status === ACCEPTED) {\n const sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid';\n\n if (sessionExpired) {\n this.extendFaroSession(this.config, this.logDebug);\n }\n }\n\n if (response.status === TOO_MANY_REQUESTS) {\n this.disabledUntil = this.getRetryAfterDate(response);\n this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);\n }\n\n // read the body so the connection can be closed\n response.text().catch(noop);\n return response;\n })\n .catch((err) => {\n this.logError('Failed sending payload to the receiver\\n', JSON.parse(body), err);\n });\n });\n } catch (err) {\n this.logError(err);\n }\n }\n\n override getIgnoreUrls(): Patterns {\n return ([this.options.url] as Patterns).concat(this.config.ignoreUrls ?? []);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n private getRetryAfterDate(response: Response): Date {\n const now = this.getNow();\n const retryAfterHeader = response.headers.get('Retry-After');\n\n if (retryAfterHeader) {\n const delay = Number(retryAfterHeader);\n\n if (!isNaN(delay)) {\n return new Date(delay * 1000 + now);\n }\n\n const date = Date.parse(retryAfterHeader);\n\n if (!isNaN(date)) {\n return new Date(date);\n }\n }\n\n return new Date(now + this.rateLimitBackoffMs);\n }\n\n private extendFaroSession(config: Config, logDebug: BaseExtension['logDebug']) {\n const SessionExpiredString = `Session expired`;\n\n const sessionTrackingConfig = config.sessionTracking;\n\n if (sessionTrackingConfig?.enabled) {\n const { fetchUserSession, storeUserSession } = getSessionManagerByConfig(sessionTrackingConfig);\n\n getUserSessionUpdater({ fetchUserSession, storeUserSession })({ forceSessionExtend: true });\n\n logDebug(`${SessionExpiredString} created new session.`);\n } else {\n logDebug(`${SessionExpiredString}.`);\n }\n }\n}\n"]}
|
|
@@ -5,27 +5,23 @@ exports.throttle = throttle;
|
|
|
5
5
|
* Tail based throttle which caches the args of the last call and updates
|
|
6
6
|
*/
|
|
7
7
|
function throttle(callback, delay) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
let pause = false;
|
|
9
|
+
let lastPending;
|
|
10
|
+
const timeoutBehavior = () => {
|
|
11
11
|
if (lastPending == null) {
|
|
12
12
|
pause = false;
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
|
-
callback
|
|
15
|
+
callback(...lastPending);
|
|
16
16
|
lastPending = null;
|
|
17
17
|
setTimeout(timeoutBehavior, delay);
|
|
18
18
|
};
|
|
19
|
-
return
|
|
20
|
-
var args = [];
|
|
21
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
22
|
-
args[_i] = arguments[_i];
|
|
23
|
-
}
|
|
19
|
+
return (...args) => {
|
|
24
20
|
if (pause) {
|
|
25
21
|
lastPending = args;
|
|
26
22
|
return;
|
|
27
23
|
}
|
|
28
|
-
callback
|
|
24
|
+
callback(...args);
|
|
29
25
|
pause = true;
|
|
30
26
|
setTimeout(timeoutBehavior, delay);
|
|
31
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../../src/utils/throttle.ts"],"names":[],"mappings":";;AAGA,4BAyBC;AA5BD;;GAEG;AACH,SAAgB,QAAQ,CAAqC,QAAW,EAAE,KAAa;IACrF,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,WAAiC,CAAC;IAEtC,
|
|
1
|
+
{"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../../src/utils/throttle.ts"],"names":[],"mappings":";;AAGA,4BAyBC;AA5BD;;GAEG;AACH,SAAgB,QAAQ,CAAqC,QAAW,EAAE,KAAa;IACrF,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,WAAiC,CAAC;IAEtC,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC;YACd,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,GAAG,WAAW,CAAC,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC;QACnB,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,IAAmB,EAAE,EAAE;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Tail based throttle which caches the args of the last call and updates\n */\nexport function throttle<T extends (...args: any[]) => void>(callback: T, delay: number) {\n let pause = false;\n let lastPending: Parameters<T> | null;\n\n const timeoutBehavior = () => {\n if (lastPending == null) {\n pause = false;\n return;\n }\n\n callback(...lastPending);\n lastPending = null;\n setTimeout(timeoutBehavior, delay);\n };\n\n return (...args: Parameters<T>) => {\n if (pause) {\n lastPending = args;\n return;\n }\n\n callback(...args);\n pause = true;\n setTimeout(timeoutBehavior, delay);\n };\n}\n"]}
|
package/dist/cjs/utils/url.js
CHANGED
|
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getIgnoreUrls = getIgnoreUrls;
|
|
4
4
|
exports.isUrlIgnored = isUrlIgnored;
|
|
5
5
|
exports.getUrlFromResource = getUrlFromResource;
|
|
6
|
-
|
|
6
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
7
7
|
/**
|
|
8
8
|
* Retrieves a list of URLs to be ignored by aggregating the ignore URLs from all transports.
|
|
9
9
|
*
|
|
10
10
|
* @returns {string[]} An array of URLs to be ignored.
|
|
11
11
|
*/
|
|
12
12
|
function getIgnoreUrls() {
|
|
13
|
-
return faro_core_1.faro.transports.transports.flatMap(
|
|
13
|
+
return faro_core_1.faro.transports.transports.flatMap((transport) => transport.getIgnoreUrls());
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Checks if the given URL should be ignored based on a list of ignored URLs.
|
|
@@ -18,9 +18,8 @@ function getIgnoreUrls() {
|
|
|
18
18
|
* @param url - The URL to check.
|
|
19
19
|
* @returns `true` if the URL is in the list of ignored URLs, `false` otherwise.
|
|
20
20
|
*/
|
|
21
|
-
function isUrlIgnored(url) {
|
|
22
|
-
|
|
23
|
-
return getIgnoreUrls().some(function (ignoredUrl) { return url && url.match(ignoredUrl) != null; });
|
|
21
|
+
function isUrlIgnored(url = '') {
|
|
22
|
+
return getIgnoreUrls().some((ignoredUrl) => url && url.match(ignoredUrl) != null);
|
|
24
23
|
}
|
|
25
24
|
/**
|
|
26
25
|
* Extracts a URL string from the given resource.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":";;AAQA,sCAEC;AAQD,oCAEC;AASD,gDAcC;AA3CD,
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":";;AAQA,sCAEC;AAQD,oCAEC;AASD,gDAcC;AA3CD,kDAAyE;AAGzE;;;;GAIG;AACH,SAAgB,aAAa;IAC3B,OAAO,gBAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;AACjG,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,GAAG,GAAG,EAAE;IACnC,OAAO,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,QAAa;IAC9C,IAAI,IAAA,oBAAQ,EAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,YAAY,GAAG,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,IAAI,IAAA,sBAAU,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import { faro, isEmpty, isFunction, isString } from '@grafana/faro-core';\nimport type { Patterns, Transport } from '@grafana/faro-core';\n\n/**\n * Retrieves a list of URLs to be ignored by aggregating the ignore URLs from all transports.\n *\n * @returns {string[]} An array of URLs to be ignored.\n */\nexport function getIgnoreUrls(): Patterns {\n return faro.transports.transports.flatMap((transport: Transport) => transport.getIgnoreUrls());\n}\n\n/**\n * Checks if the given URL should be ignored based on a list of ignored URLs.\n *\n * @param url - The URL to check.\n * @returns `true` if the URL is in the list of ignored URLs, `false` otherwise.\n */\nexport function isUrlIgnored(url = ''): boolean {\n return getIgnoreUrls().some((ignoredUrl) => url && url.match(ignoredUrl) != null);\n}\n\n/**\n * Extracts a URL string from the given resource.\n *\n * @param resource - The input resource which can be a string, a URL object, or an object with a `toString` method.\n * @returns The URL as a string if the resource is a valid URL-like object, or `undefined` if the resource is not valid.\n *\n */\nexport function getUrlFromResource(resource: any): string | undefined {\n if (isString(resource)) {\n return resource;\n }\n\n if (resource instanceof URL) {\n return resource.href;\n }\n\n if (!isEmpty(resource) && isFunction(resource?.toString)) {\n return resource.toString();\n }\n\n return undefined;\n}\n"]}
|
|
@@ -5,7 +5,7 @@ exports.isWebStorageAvailable = isWebStorageAvailable;
|
|
|
5
5
|
exports.getItem = getItem;
|
|
6
6
|
exports.setItem = setItem;
|
|
7
7
|
exports.removeItem = removeItem;
|
|
8
|
-
|
|
8
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
9
9
|
exports.webStorageType = {
|
|
10
10
|
session: 'sessionStorage',
|
|
11
11
|
local: 'localStorage',
|
|
@@ -18,16 +18,16 @@ exports.webStorageType = {
|
|
|
18
18
|
function isWebStorageAvailable(type) {
|
|
19
19
|
var _a;
|
|
20
20
|
try {
|
|
21
|
-
|
|
21
|
+
let storage;
|
|
22
22
|
storage = window[type];
|
|
23
|
-
|
|
23
|
+
const testItem = '__faro_storage_test__';
|
|
24
24
|
storage.setItem(testItem, testItem);
|
|
25
25
|
storage.removeItem(testItem);
|
|
26
26
|
return true;
|
|
27
27
|
}
|
|
28
28
|
catch (error) {
|
|
29
29
|
// the above can throw
|
|
30
|
-
(_a = faro_core_1.faro.internalLogger) === null || _a === void 0 ? void 0 : _a.info(
|
|
30
|
+
(_a = faro_core_1.faro.internalLogger) === null || _a === void 0 ? void 0 : _a.info(`Web storage of type ${type} is not available. Reason: ${error}`);
|
|
31
31
|
return false;
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":";;;AAcA,sDAcC;AAOD,0BAMC;AAQD,0BAQC;AAOD,gCAIC;AApED,
|
|
1
|
+
{"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":";;;AAcA,sDAcC;AAOD,0BAMC;AAQD,0BAQC;AAOD,gCAIC;AApED,kDAA0C;AAE7B,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,cAAc;CACb,CAAC;AAIX;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,IAAsB;;IAC1D,IAAI,CAAC;QACH,IAAI,OAAO,CAAC;QACZ,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB;QACtB,MAAA,gBAAI,CAAC,cAAc,0CAAE,IAAI,CAAC,uBAAuB,IAAI,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,mBAAqC;IACxE,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,mBAAqC;IACvF,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,aAAa;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,GAAW,EAAE,mBAAqC;IAC3E,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAEY,QAAA,uBAAuB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,yBAAyB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,OAAO,CAAC,CAAC;AAEvF,SAAS,yBAAyB,CAAC,mBAAqC;IACtE,IAAI,mBAAmB,KAAK,sBAAc,CAAC,KAAK,EAAE,CAAC;QACjD,OAAO,+BAAuB,CAAC;IACjC,CAAC;IAED,IAAI,mBAAmB,KAAK,sBAAc,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,iCAAyB,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { faro } from '@grafana/faro-core';\n\nexport const webStorageType = {\n session: 'sessionStorage',\n local: 'localStorage',\n} as const;\n\ntype StorageMechanism = (typeof webStorageType)[keyof typeof webStorageType];\n\n/**\n * Check if selected web storage mechanism is available.\n * @param type storage mechanism to test availability for.\n * @returns\n */\nexport function isWebStorageAvailable(type: StorageMechanism): boolean {\n try {\n let storage;\n storage = window[type];\n\n const testItem = '__faro_storage_test__';\n storage.setItem(testItem, testItem);\n storage.removeItem(testItem);\n return true;\n } catch (error) {\n // the above can throw\n faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`);\n return false;\n }\n}\n\n/**\n * Get item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function getItem(key: string, webStorageMechanism: StorageMechanism): string | null {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n return window[webStorageMechanism].getItem(key);\n }\n\n return null;\n}\n\n/**\n * Store item in SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param value: the item data.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function setItem(key: string, value: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n try {\n window[webStorageMechanism].setItem(key, value);\n } catch (_error) {\n // do nothing\n }\n }\n}\n\n/**\n * Remove item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function removeItem(key: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n window[webStorageMechanism].removeItem(key);\n }\n}\n\nexport const isLocalStorageAvailable = isWebStorageAvailable(webStorageType.local);\nexport const isSessionStorageAvailable = isWebStorageAvailable(webStorageType.session);\n\nfunction isWebStorageTypeAvailable(webStorageMechanism: StorageMechanism) {\n if (webStorageMechanism === webStorageType.local) {\n return isLocalStorageAvailable;\n }\n\n if (webStorageMechanism === webStorageType.session) {\n return isSessionStorageAvailable;\n }\n\n return false;\n}\n"]}
|
|
@@ -16,7 +16,6 @@ export function monitorConsole(unpatchedConsole) {
|
|
|
16
16
|
const originalConsole = unpatchedConsole !== null && unpatchedConsole !== void 0 ? unpatchedConsole : defaultUnpatchedConsole;
|
|
17
17
|
// Patch ALL console methods - subscribers decide which levels to process
|
|
18
18
|
allLogLevels.forEach((level) => {
|
|
19
|
-
// eslint-disable-next-line no-console
|
|
20
19
|
console[level] = (...args) => {
|
|
21
20
|
var _a;
|
|
22
21
|
// Notify all subscribers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/consoleMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG/C,IAAI,iBAAyD,CAAC;AAC9D,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,gBAAmC;IAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,UAAU,EAAkB,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,uBAAuB,CAAC;QAEpE,yEAAyE;QACzE,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7B,
|
|
1
|
+
{"version":3,"file":"consoleMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/consoleMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG/C,IAAI,iBAAyD,CAAC;AAC9D,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,gBAAmC;IAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,UAAU,EAAkB,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,uBAAuB,CAAC;QAEpE,yEAAyE;QACzE,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;;gBACtC,yBAAyB;gBACzB,iBAAkB,CAAC,MAAM,CAAC;oBACxB,IAAI,EAAE,oBAAoB;oBAC1B,KAAK;oBACL,IAAI;iBACL,CAAC,CAAC;gBAEH,mCAAmC;gBACnC,MAAA,eAAe,CAAC,KAAK,CAAC,0CAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,6BAA6B;IAC3C,gEAAgE;IAChE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAuB,CAAC;QACxE,CAAC;IACH,CAAC;IAED,iBAAiB,GAAG,SAAS,CAAC;IAC9B,cAAc,GAAG,KAAK,CAAC;AACzB,CAAC","sourcesContent":["import { allLogLevels, defaultUnpatchedConsole, Observable } from '@grafana/faro-core';\nimport type { UnpatchedConsole } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_CONSOLE } from './const';\nimport type { ConsoleMessage } from './types';\n\nlet consoleObservable: Observable<ConsoleMessage> | undefined;\nlet isInstrumented = false;\n\n/**\n * Monitors console methods and emits events to subscribers.\n * @param unpatchedConsole - Optional console to call after notifying subscribers.\n * Only the first caller's value is used (since we patch once).\n * Defaults to defaultUnpatchedConsole.\n */\nexport function monitorConsole(unpatchedConsole?: UnpatchedConsole): Observable<ConsoleMessage> {\n if (!consoleObservable) {\n consoleObservable = new Observable<ConsoleMessage>();\n }\n\n if (!isInstrumented) {\n const originalConsole = unpatchedConsole ?? defaultUnpatchedConsole;\n\n // Patch ALL console methods - subscribers decide which levels to process\n allLogLevels.forEach((level) => {\n console[level] = (...args: unknown[]) => {\n // Notify all subscribers\n consoleObservable!.notify({\n type: MESSAGE_TYPE_CONSOLE,\n level,\n args,\n });\n\n // Call the unpatchedConsole method\n originalConsole[level]?.apply(console, args);\n };\n });\n\n isInstrumented = true;\n }\n\n return consoleObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetConsoleMonitorForTests() {\n // Restore original console methods from defaultUnpatchedConsole\n for (const level of allLogLevels) {\n if (defaultUnpatchedConsole[level]) {\n console[level] = defaultUnpatchedConsole[level] as typeof console.log;\n }\n }\n\n consoleObservable = undefined;\n isInstrumented = false;\n}\n"]}
|