@grafana/faro-web-sdk 2.3.1 → 2.5.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 +1 -0
- package/dist/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/index.d.ts +2 -2
- 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/metas/index.d.ts +1 -0
- package/dist/bundle/types/metas/os/index.d.ts +1 -0
- package/dist/bundle/types/metas/os/meta.d.ts +2 -0
- package/dist/bundle/types/metas/shared/index.d.ts +1 -0
- package/dist/bundle/types/metas/shared/uaParser.d.ts +4 -0
- 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 +49 -60
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.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 +52 -68
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +11 -16
- 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 +47 -65
- 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 +13 -14
- package/dist/cjs/metas/browser/meta.js.map +1 -1
- package/dist/cjs/metas/index.js +3 -1
- package/dist/cjs/metas/index.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/os/index.js +6 -0
- package/dist/cjs/metas/os/index.js.map +1 -0
- package/dist/cjs/metas/os/meta.js +20 -0
- package/dist/cjs/metas/os/meta.js.map +1 -0
- 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/metas/shared/index.js +6 -0
- package/dist/cjs/metas/shared/index.js.map +1 -0
- package/dist/cjs/metas/shared/uaParser.js +18 -0
- package/dist/cjs/metas/shared/uaParser.js.map +1 -0
- 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/config/makeCoreConfig.js +2 -1
- package/dist/esm/config/makeCoreConfig.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instrumentations/_internal/activityWindowTracker.js +10 -5
- package/dist/esm/instrumentations/_internal/activityWindowTracker.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/metas/browser/meta.js +5 -6
- package/dist/esm/metas/browser/meta.js.map +1 -1
- package/dist/esm/metas/index.js +1 -0
- package/dist/esm/metas/index.js.map +1 -1
- package/dist/esm/metas/os/index.js +2 -0
- package/dist/esm/metas/os/index.js.map +1 -0
- package/dist/esm/metas/os/meta.js +16 -0
- package/dist/esm/metas/os/meta.js.map +1 -0
- package/dist/esm/metas/shared/index.js +2 -0
- package/dist/esm/metas/shared/index.js.map +1 -0
- package/dist/esm/metas/shared/uaParser.js +15 -0
- package/dist/esm/metas/shared/uaParser.js.map +1 -0
- package/dist/esm/transports/fetch/transport.js +1 -1
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- 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/metas/index.d.ts +1 -0
- package/dist/types/metas/os/index.d.ts +1 -0
- package/dist/types/metas/os/meta.d.ts +2 -0
- package/dist/types/metas/shared/index.d.ts +1 -0
- package/dist/types/metas/shared/uaParser.d.ts +4 -0
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +5 -5
|
@@ -1,30 +1,18 @@
|
|
|
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
3
|
exports.createPageMeta = createPageMeta;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
function createPageMeta(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
var locationHref = location.href;
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
let currentHref;
|
|
6
|
+
let pageId;
|
|
7
|
+
function createPageMeta({ generatePageId, initialPageMeta } = {}) {
|
|
8
|
+
const pageMeta = () => {
|
|
9
|
+
const locationHref = location.href;
|
|
22
10
|
if ((0, faro_core_1.isFunction)(generatePageId) && currentHref !== locationHref) {
|
|
23
11
|
currentHref = locationHref;
|
|
24
12
|
pageId = generatePageId(location);
|
|
25
13
|
}
|
|
26
14
|
return {
|
|
27
|
-
page:
|
|
15
|
+
page: Object.assign(Object.assign({ url: locationHref }, (pageId ? { id: pageId } : {})), initialPageMeta),
|
|
28
16
|
};
|
|
29
17
|
};
|
|
30
18
|
return pageMeta;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/page/meta.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/page/meta.ts"],"names":[],"mappings":";;AAUA,wCAqBC;AA/BD,kDAA0E;AAE1E,IAAI,WAA+B,CAAC;AACpC,IAAI,MAA0B,CAAC;AAO/B,SAAgB,cAAc,CAAC,EAAE,cAAc,EAAE,eAAe,KAA0B,EAAE;IAG1F,MAAM,QAAQ,GAAiC,GAAG,EAAE;QAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;QAEnC,IAAI,IAAA,sBAAU,EAAC,cAAc,CAAC,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;YAC/D,WAAW,GAAG,YAAY,CAAC;YAC3B,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO;YACL,IAAI,gCACF,GAAG,EAAE,YAAY,IACd,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC9B,eAAe,CACnB;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { isFunction, type Meta, type MetaItem } from '@grafana/faro-core';\n\nlet currentHref: string | undefined;\nlet pageId: string | undefined;\n\ntype createPageMetaProps = {\n generatePageId?: (location: Location) => string;\n initialPageMeta?: Meta['page'];\n};\n\nexport function createPageMeta({ generatePageId, initialPageMeta }: createPageMetaProps = {}): MetaItem<\n Pick<Meta, 'page'>\n> {\n const pageMeta: MetaItem<Pick<Meta, 'page'>> = () => {\n const locationHref = location.href;\n\n if (isFunction(generatePageId) && currentHref !== locationHref) {\n currentHref = locationHref;\n pageId = generatePageId(location);\n }\n\n return {\n page: {\n url: locationHref,\n ...(pageId ? { id: pageId } : {}),\n ...initialPageMeta,\n },\n };\n };\n\n return pageMeta;\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.sdkMeta = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const sdkMeta = () => ({
|
|
6
6
|
sdk: {
|
|
7
7
|
name: 'faro-web',
|
|
8
8
|
version: faro_core_1.VERSION,
|
|
9
9
|
},
|
|
10
|
-
});
|
|
10
|
+
});
|
|
11
11
|
exports.sdkMeta = sdkMeta;
|
|
12
12
|
//# sourceMappingURL=meta.js.map
|
|
@@ -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"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUAResult = void 0;
|
|
4
|
+
var uaParser_1 = require("./uaParser");
|
|
5
|
+
Object.defineProperty(exports, "getUAResult", { enumerable: true, get: function () { return uaParser_1.getUAResult; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/metas/shared/index.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAAhC,uGAAA,WAAW,OAAA","sourcesContent":["export { getUAResult } from './uaParser';\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUAResult = getUAResult;
|
|
4
|
+
const ua_parser_js_1 = require("ua-parser-js");
|
|
5
|
+
let cachedUA;
|
|
6
|
+
let cachedResult;
|
|
7
|
+
// Browser and OS meta providers both need to parse navigator.userAgent.
|
|
8
|
+
// Cache keyed on the UA string so we parse at most once per unique UA
|
|
9
|
+
// (test mutations of navigator.userAgent invalidate naturally).
|
|
10
|
+
function getUAResult() {
|
|
11
|
+
const currentUA = typeof navigator !== 'undefined' ? navigator.userAgent : '';
|
|
12
|
+
if (cachedUA !== currentUA || !cachedResult) {
|
|
13
|
+
cachedResult = new ua_parser_js_1.UAParser(currentUA).getResult();
|
|
14
|
+
cachedUA = currentUA;
|
|
15
|
+
}
|
|
16
|
+
return cachedResult;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=uaParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uaParser.js","sourceRoot":"","sources":["../../../../src/metas/shared/uaParser.ts"],"names":[],"mappings":";;AAUA,kCASC;AAnBD,+CAAwC;AAIxC,IAAI,QAA4B,CAAC;AACjC,IAAI,YAAkC,CAAC;AAEvC,wEAAwE;AACxE,sEAAsE;AACtE,gEAAgE;AAChE,SAAgB,WAAW;IACzB,MAAM,SAAS,GAAG,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,YAAY,GAAG,IAAI,uBAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC;QACnD,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { UAParser } from 'ua-parser-js';\n\ntype UAResult = ReturnType<InstanceType<typeof UAParser>['getResult']>;\n\nlet cachedUA: string | undefined;\nlet cachedResult: UAResult | undefined;\n\n// Browser and OS meta providers both need to parse navigator.userAgent.\n// Cache keyed on the UA string so we parse at most once per unique UA\n// (test mutations of navigator.userAgent invalidate naturally).\nexport function getUAResult(): UAResult {\n const currentUA = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n if (cachedUA !== currentUA || !cachedResult) {\n cachedResult = new UAParser(currentUA).getResult();\n cachedUA = currentUA;\n }\n\n return cachedResult;\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.
|