@grafana/faro-web-sdk 1.2.0 → 1.2.2
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/config/getWebInstrumentations.d.ts +3 -0
- package/dist/bundle/types/config/index.d.ts +3 -0
- package/dist/bundle/types/config/makeCoreConfig.d.ts +3 -0
- package/dist/bundle/types/config/types.d.ts +9 -0
- package/dist/bundle/types/consts.d.ts +1 -0
- package/dist/bundle/types/index.d.ts +11 -0
- package/dist/bundle/types/initialize.d.ts +3 -0
- package/dist/bundle/types/instrumentations/console/index.d.ts +2 -0
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +10 -0
- package/dist/bundle/types/instrumentations/console/types.d.ts +4 -0
- package/dist/bundle/types/instrumentations/errors/const.d.ts +7 -0
- package/dist/bundle/types/instrumentations/errors/getErrorDetails.d.ts +3 -0
- package/dist/bundle/types/instrumentations/errors/getValueAndTypeFromMessage.d.ts +1 -0
- package/dist/bundle/types/instrumentations/errors/index.d.ts +3 -0
- package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +6 -0
- package/dist/bundle/types/instrumentations/errors/registerOnerror.d.ts +2 -0
- package/dist/bundle/types/instrumentations/errors/registerOnunhandledrejection.d.ts +2 -0
- package/dist/bundle/types/instrumentations/errors/stackFrames/buildStackFrame.d.ts +2 -0
- package/dist/bundle/types/instrumentations/errors/stackFrames/const.d.ts +15 -0
- package/dist/bundle/types/instrumentations/errors/stackFrames/getDataFromSafariExtensions.d.ts +1 -0
- package/dist/bundle/types/instrumentations/errors/stackFrames/getStackFramesFromError.d.ts +2 -0
- package/dist/bundle/types/instrumentations/errors/stackFrames/index.d.ts +4 -0
- package/dist/bundle/types/instrumentations/errors/stackFrames/parseStacktrace.d.ts +2 -0
- package/dist/bundle/types/instrumentations/errors/types.d.ts +8 -0
- package/dist/bundle/types/instrumentations/index.d.ts +7 -0
- package/dist/bundle/types/instrumentations/session/index.d.ts +2 -0
- package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +9 -0
- package/dist/bundle/types/instrumentations/session/sessionHandler.d.ts +22 -0
- package/dist/bundle/types/instrumentations/view/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +8 -0
- package/dist/bundle/types/instrumentations/webVitals/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +14 -0
- package/dist/bundle/types/metas/browser/index.d.ts +1 -0
- package/dist/bundle/types/metas/browser/meta.d.ts +2 -0
- package/dist/bundle/types/metas/const.d.ts +2 -0
- package/dist/bundle/types/metas/index.d.ts +5 -0
- package/dist/bundle/types/metas/k6/index.d.ts +1 -0
- package/dist/bundle/types/metas/k6/meta.d.ts +2 -0
- package/dist/bundle/types/metas/page/index.d.ts +1 -0
- package/dist/bundle/types/metas/page/meta.d.ts +2 -0
- package/dist/bundle/types/metas/session/createSession.d.ts +2 -0
- package/dist/bundle/types/metas/session/index.d.ts +1 -0
- package/dist/bundle/types/metas/view/const.d.ts +3 -0
- package/dist/bundle/types/metas/view/index.d.ts +1 -0
- package/dist/bundle/types/transports/console/index.d.ts +2 -0
- package/dist/bundle/types/transports/console/transport.d.ts +10 -0
- package/dist/bundle/types/transports/console/types.d.ts +4 -0
- package/dist/bundle/types/transports/fetch/index.d.ts +2 -0
- package/dist/bundle/types/transports/fetch/transport.d.ts +17 -0
- package/dist/bundle/types/transports/fetch/types.d.ts +13 -0
- package/dist/bundle/types/transports/index.d.ts +4 -0
- package/dist/bundle/types/utils/index.d.ts +2 -0
- package/dist/bundle/types/utils/throttle.d.ts +4 -0
- package/dist/bundle/types/utils/webStorage.d.ts +7 -0
- package/dist/cjs/config/makeCoreConfig.js +42 -8
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/config/types.js.map +1 -1
- package/dist/cjs/instrumentations/session/index.js +15 -0
- package/dist/cjs/instrumentations/session/index.js.map +1 -1
- package/dist/cjs/instrumentations/session/instrumentation.js +24 -2
- package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/session/sessionHandler.js +170 -0
- package/dist/cjs/instrumentations/session/sessionHandler.js.map +1 -0
- package/dist/cjs/metas/browser/meta.js +1 -0
- package/dist/cjs/metas/browser/meta.js.map +1 -1
- package/dist/cjs/metas/k6/index.js +6 -0
- package/dist/cjs/metas/k6/index.js.map +1 -0
- package/dist/cjs/metas/k6/meta.js +10 -0
- package/dist/cjs/metas/k6/meta.js.map +1 -0
- package/dist/cjs/transports/fetch/transport.js +6 -3
- package/dist/cjs/transports/fetch/transport.js.map +1 -1
- package/dist/cjs/utils/index.js +19 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/throttle.js +34 -0
- package/dist/cjs/utils/throttle.js.map +1 -0
- package/dist/cjs/utils/webStorage.js +47 -0
- package/dist/cjs/utils/webStorage.js.map +1 -0
- package/dist/esm/config/makeCoreConfig.js +34 -9
- package/dist/esm/config/makeCoreConfig.js.map +1 -1
- package/dist/esm/config/types.js.map +1 -1
- package/dist/esm/instrumentations/session/index.js +1 -0
- package/dist/esm/instrumentations/session/index.js.map +1 -1
- package/dist/esm/instrumentations/session/instrumentation.js +14 -2
- package/dist/esm/instrumentations/session/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/session/sessionHandler.js +148 -0
- package/dist/esm/instrumentations/session/sessionHandler.js.map +1 -0
- package/dist/esm/metas/browser/meta.js +1 -0
- package/dist/esm/metas/browser/meta.js.map +1 -1
- package/dist/esm/metas/k6/index.js +2 -0
- package/dist/esm/metas/k6/index.js.map +1 -0
- package/dist/esm/metas/k6/meta.js +6 -0
- package/dist/esm/metas/k6/meta.js.map +1 -0
- package/dist/esm/transports/fetch/transport.js +5 -2
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/throttle.js +26 -0
- package/dist/esm/utils/throttle.js.map +1 -0
- package/dist/esm/utils/webStorage.js +40 -0
- package/dist/esm/utils/webStorage.js.map +1 -0
- package/dist/types/config/types.d.ts +0 -1
- package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/index.d.ts +1 -0
- package/dist/types/instrumentations/session/instrumentation.d.ts +2 -1
- package/dist/types/instrumentations/session/sessionHandler.d.ts +22 -0
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +5 -5
- package/dist/types/metas/k6/index.d.ts +1 -0
- package/dist/types/metas/k6/meta.d.ts +2 -0
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/throttle.d.ts +4 -0
- package/dist/types/utils/webStorage.d.ts +7 -0
- package/package.json +4 -4
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseTransport } from '@grafana/faro-core';
|
|
2
|
+
import type { TransportItem } from '@grafana/faro-core';
|
|
3
|
+
import type { ConsoleTransportOptions } from './types';
|
|
4
|
+
export declare class ConsoleTransport extends BaseTransport {
|
|
5
|
+
private options;
|
|
6
|
+
readonly name = "@grafana/faro-web-sdk:transport-console";
|
|
7
|
+
readonly version = "1.2.2";
|
|
8
|
+
constructor(options?: ConsoleTransportOptions);
|
|
9
|
+
send(item: TransportItem): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseTransport, PromiseBuffer } from '@grafana/faro-core';
|
|
2
|
+
import type { TransportItem } from '@grafana/faro-core';
|
|
3
|
+
import type { FetchTransportOptions } from './types';
|
|
4
|
+
export declare class FetchTransport extends BaseTransport {
|
|
5
|
+
private options;
|
|
6
|
+
readonly name = "@grafana/faro-web-sdk:transport-fetch";
|
|
7
|
+
readonly version = "1.2.2";
|
|
8
|
+
promiseBuffer: PromiseBuffer<Response | void>;
|
|
9
|
+
private readonly rateLimitBackoffMs;
|
|
10
|
+
private readonly getNow;
|
|
11
|
+
private disabledUntil;
|
|
12
|
+
constructor(options: FetchTransportOptions);
|
|
13
|
+
send(items: TransportItem[]): Promise<void>;
|
|
14
|
+
getIgnoreUrls(): Array<string | RegExp>;
|
|
15
|
+
isBatched(): boolean;
|
|
16
|
+
private getRetryAfterDate;
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface FetchTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {
|
|
2
|
+
headers?: Record<string, string>;
|
|
3
|
+
}
|
|
4
|
+
export interface FetchTransportOptions {
|
|
5
|
+
url: string;
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
bufferSize?: number;
|
|
8
|
+
concurrency?: number;
|
|
9
|
+
defaultRateLimitBackoffMs?: number;
|
|
10
|
+
getNow?: ClockFn;
|
|
11
|
+
requestOptions?: FetchTransportRequestOptions;
|
|
12
|
+
}
|
|
13
|
+
export type ClockFn = () => number;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type StorageMechanism = 'sessionStorage' | 'localStorage';
|
|
2
|
+
export declare function isWebStorageAvailable(type: StorageMechanism): boolean;
|
|
3
|
+
export declare const isLocalStorageAvailable: boolean;
|
|
4
|
+
export declare function getItem(key: string): string | null;
|
|
5
|
+
export declare function setItem(key: string, value: string): void;
|
|
6
|
+
export declare function removeItem(key: string): void;
|
|
7
|
+
export {};
|
|
@@ -10,16 +10,27 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
+
if (ar || !(i in from)) {
|
|
16
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
+
ar[i] = from[i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
+
};
|
|
13
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
23
|
exports.makeCoreConfig = void 0;
|
|
15
24
|
var faro_core_1 = require("@grafana/faro-core");
|
|
16
25
|
var consts_1 = require("../consts");
|
|
17
26
|
var instrumentations_1 = require("../instrumentations");
|
|
27
|
+
var session_1 = require("../instrumentations/session");
|
|
18
28
|
var metas_1 = require("../metas");
|
|
29
|
+
var k6_1 = require("../metas/k6");
|
|
19
30
|
var transports_1 = require("../transports");
|
|
20
31
|
var getWebInstrumentations_1 = require("./getWebInstrumentations");
|
|
21
32
|
function makeCoreConfig(browserConfig) {
|
|
22
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k
|
|
33
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
23
34
|
var transports = [];
|
|
24
35
|
var internalLogger = (0, faro_core_1.createInternalLogger)(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);
|
|
25
36
|
if (browserConfig.transports) {
|
|
@@ -37,6 +48,17 @@ function makeCoreConfig(browserConfig) {
|
|
|
37
48
|
else {
|
|
38
49
|
internalLogger.error('either "url" or "transports" must be defined');
|
|
39
50
|
}
|
|
51
|
+
function createMetas() {
|
|
52
|
+
var initialMetas = metas_1.defaultMetas;
|
|
53
|
+
if (browserConfig.metas) {
|
|
54
|
+
initialMetas.push.apply(initialMetas, browserConfig.metas);
|
|
55
|
+
}
|
|
56
|
+
var isK6BrowserSession = (0, faro_core_1.isObject)(window.k6);
|
|
57
|
+
if (isK6BrowserSession) {
|
|
58
|
+
return __spreadArray(__spreadArray([], initialMetas, true), [k6_1.k6Meta], false);
|
|
59
|
+
}
|
|
60
|
+
return initialMetas;
|
|
61
|
+
}
|
|
40
62
|
return {
|
|
41
63
|
app: browserConfig.app,
|
|
42
64
|
batching: __assign(__assign({}, faro_core_1.defaultBatchingConfig), browserConfig.batching),
|
|
@@ -45,19 +67,31 @@ function makeCoreConfig(browserConfig) {
|
|
|
45
67
|
instrumentations: (_b = browserConfig.instrumentations) !== null && _b !== void 0 ? _b : (0, getWebInstrumentations_1.getWebInstrumentations)(),
|
|
46
68
|
internalLoggerLevel: (_c = browserConfig.internalLoggerLevel) !== null && _c !== void 0 ? _c : faro_core_1.defaultInternalLoggerLevel,
|
|
47
69
|
isolate: (_d = browserConfig.isolate) !== null && _d !== void 0 ? _d : false,
|
|
48
|
-
metas: (
|
|
70
|
+
metas: createMetas(),
|
|
49
71
|
parseStacktrace: instrumentations_1.parseStacktrace,
|
|
50
|
-
paused: (
|
|
51
|
-
preventGlobalExposure: (
|
|
72
|
+
paused: (_e = browserConfig.paused) !== null && _e !== void 0 ? _e : false,
|
|
73
|
+
preventGlobalExposure: (_f = browserConfig.preventGlobalExposure) !== null && _f !== void 0 ? _f : false,
|
|
52
74
|
transports: transports,
|
|
53
|
-
unpatchedConsole: (
|
|
75
|
+
unpatchedConsole: (_g = browserConfig.unpatchedConsole) !== null && _g !== void 0 ? _g : faro_core_1.defaultUnpatchedConsole,
|
|
54
76
|
beforeSend: browserConfig.beforeSend,
|
|
55
|
-
eventDomain: (
|
|
77
|
+
eventDomain: (_h = browserConfig.eventDomain) !== null && _h !== void 0 ? _h : consts_1.defaultEventDomain,
|
|
56
78
|
ignoreErrors: browserConfig.ignoreErrors,
|
|
57
|
-
|
|
79
|
+
// The new session management feature is a PoC and still under development and IS NOT READY for any production use!
|
|
80
|
+
experimentalSessions: __assign({
|
|
81
|
+
// TODO: will be true on release
|
|
82
|
+
enabled: false, persistent: false, session: createSessionMeta() }, browserConfig.experimentalSessions),
|
|
83
|
+
// TODO: deprecate/remove old init code or maybe rename to legacy_session?
|
|
84
|
+
session: (_j = browserConfig.session) !== null && _j !== void 0 ? _j : (0, metas_1.createSession)(),
|
|
58
85
|
user: browserConfig.user,
|
|
59
|
-
view: (
|
|
86
|
+
view: (_k = browserConfig.view) !== null && _k !== void 0 ? _k : metas_1.defaultViewMeta,
|
|
60
87
|
};
|
|
61
88
|
}
|
|
62
89
|
exports.makeCoreConfig = makeCoreConfig;
|
|
90
|
+
function createSessionMeta() {
|
|
91
|
+
var userSession = (0, session_1.fetchUserSession)();
|
|
92
|
+
var sessionId = (0, session_1.isUserSessionValid)(userSession) ? userSession === null || userSession === void 0 ? void 0 : userSession.sessionId : (0, metas_1.createSession)().id;
|
|
93
|
+
return {
|
|
94
|
+
id: sessionId,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
63
97
|
//# sourceMappingURL=makeCoreConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createInternalLogger,\n defaultBatchingConfig,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultUnpatchedConsole,\n isObject,\n} from '@grafana/faro-core';\nimport type { Config, MetaSession, Transport } from '@grafana/faro-core';\n\nimport type { MetaItem } from '..';\nimport { defaultEventDomain } from '../consts';\nimport { parseStacktrace } from '../instrumentations';\nimport { fetchUserSession, isUserSessionValid } from '../instrumentations/session';\nimport { createSession, defaultMetas, defaultViewMeta } from '../metas';\nimport { k6Meta } from '../metas/k6';\nimport { FetchTransport } from '../transports';\n\nimport { getWebInstrumentations } from './getWebInstrumentations';\nimport type { BrowserConfig } from './types';\n\nexport function makeCoreConfig(browserConfig: BrowserConfig): Config | undefined {\n const transports: Transport[] = [];\n\n const internalLogger = createInternalLogger(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);\n\n if (browserConfig.transports) {\n if (browserConfig.url || browserConfig.apiKey) {\n internalLogger.error('if \"transports\" is defined, \"url\" and \"apiKey\" should not be defined');\n }\n\n transports.push(...browserConfig.transports);\n } else if (browserConfig.url) {\n transports.push(\n new FetchTransport({\n url: browserConfig.url,\n apiKey: browserConfig.apiKey,\n })\n );\n } else {\n internalLogger.error('either \"url\" or \"transports\" must be defined');\n }\n\n function createMetas(): MetaItem[] {\n const initialMetas = defaultMetas;\n\n if (browserConfig.metas) {\n initialMetas.push(...browserConfig.metas);\n }\n\n const isK6BrowserSession = isObject((window as any).k6);\n\n if (isK6BrowserSession) {\n return [...initialMetas, k6Meta];\n }\n\n return initialMetas;\n }\n\n return {\n app: browserConfig.app,\n batching: {\n ...defaultBatchingConfig,\n ...browserConfig.batching,\n },\n dedupe: browserConfig.dedupe ?? true,\n globalObjectKey: browserConfig.globalObjectKey || defaultGlobalObjectKey,\n instrumentations: browserConfig.instrumentations ?? getWebInstrumentations(),\n internalLoggerLevel: browserConfig.internalLoggerLevel ?? defaultInternalLoggerLevel,\n isolate: browserConfig.isolate ?? false,\n metas: createMetas(),\n parseStacktrace,\n paused: browserConfig.paused ?? false,\n preventGlobalExposure: browserConfig.preventGlobalExposure ?? false,\n transports,\n unpatchedConsole: browserConfig.unpatchedConsole ?? defaultUnpatchedConsole,\n\n beforeSend: browserConfig.beforeSend,\n eventDomain: browserConfig.eventDomain ?? defaultEventDomain,\n ignoreErrors: browserConfig.ignoreErrors,\n\n // The new session management feature is a PoC and still under development and IS NOT READY for any production use!\n experimentalSessions: {\n // TODO: will be true on release\n enabled: false,\n persistent: false,\n session: createSessionMeta(),\n ...browserConfig.experimentalSessions,\n },\n\n // TODO: deprecate/remove old init code or maybe rename to legacy_session?\n session: browserConfig.session ?? createSession(),\n\n user: browserConfig.user,\n view: browserConfig.view ?? defaultViewMeta,\n };\n}\n\nfunction createSessionMeta(): MetaSession {\n const userSession = fetchUserSession();\n const sessionId = isUserSessionValid(userSession) ? userSession?.sessionId : createSession().id;\n\n return {\n id: sessionId,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Config, LogLevel } from '@grafana/faro-core';\n\nexport interface BrowserConfig extends Partial<Omit<Config, 'app' | 'parseStacktrace'>>, Pick<Config, 'app'> {\n url?: string;\n apiKey?: string;\n}\n\nexport interface GetWebInstrumentationsOptions {\n captureConsole?: boolean;\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Config, LogLevel } from '@grafana/faro-core';\n\nexport interface BrowserConfig extends Partial<Omit<Config, 'app' | 'parseStacktrace'>>, Pick<Config, 'app'> {\n url?: string;\n apiKey?: string;\n}\n\nexport interface GetWebInstrumentationsOptions {\n captureConsole?: boolean;\n captureConsoleDisabledLevels?: LogLevel[];\n}\n"]}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
17
|
exports.SessionInstrumentation = void 0;
|
|
4
18
|
var instrumentation_1 = require("./instrumentation");
|
|
5
19
|
Object.defineProperty(exports, "SessionInstrumentation", { enumerable: true, get: function () { return instrumentation_1.SessionInstrumentation; } });
|
|
20
|
+
__exportStar(require("./sessionHandler"), exports);
|
|
6
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAA2D;AAAlD,yHAAA,sBAAsB,OAAA;AAE/B,mDAAiC","sourcesContent":["export { SessionInstrumentation } from './instrumentation';\n\nexport * from './sessionHandler';\n"]}
|
|
@@ -14,10 +14,19 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
14
14
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
15
|
};
|
|
16
16
|
})();
|
|
17
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
18
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
19
|
+
if (ar || !(i in from)) {
|
|
20
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
21
|
+
ar[i] = from[i];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
25
|
+
};
|
|
17
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
27
|
exports.SessionInstrumentation = void 0;
|
|
19
28
|
var faro_core_1 = require("@grafana/faro-core");
|
|
20
|
-
|
|
29
|
+
var sessionHandler_1 = require("./sessionHandler");
|
|
21
30
|
var SessionInstrumentation = /** @class */ (function (_super) {
|
|
22
31
|
__extends(SessionInstrumentation, _super);
|
|
23
32
|
function SessionInstrumentation() {
|
|
@@ -27,8 +36,9 @@ var SessionInstrumentation = /** @class */ (function (_super) {
|
|
|
27
36
|
return _this;
|
|
28
37
|
}
|
|
29
38
|
SessionInstrumentation.prototype.sendSessionStartEvent = function (meta) {
|
|
39
|
+
var _a;
|
|
30
40
|
var session = meta.session;
|
|
31
|
-
if (session && session !== this.notifiedSession) {
|
|
41
|
+
if (session && session.id !== ((_a = this.notifiedSession) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
32
42
|
this.notifiedSession = session;
|
|
33
43
|
// no need to add attributes and session id, they are included as part of meta
|
|
34
44
|
// automatically
|
|
@@ -36,8 +46,20 @@ var SessionInstrumentation = /** @class */ (function (_super) {
|
|
|
36
46
|
}
|
|
37
47
|
};
|
|
38
48
|
SessionInstrumentation.prototype.initialize = function () {
|
|
49
|
+
var _this = this;
|
|
50
|
+
var _a, _b, _c;
|
|
51
|
+
this.logDebug('init session instrumentation');
|
|
39
52
|
this.sendSessionStartEvent(this.metas.value);
|
|
40
53
|
this.metas.addListener(this.sendSessionStartEvent.bind(this));
|
|
54
|
+
if ((_a = this.config.experimentalSessions) === null || _a === void 0 ? void 0 : _a.enabled) {
|
|
55
|
+
this.sessionUpdater = (0, sessionHandler_1.getSessionUpdater)((_b = this.metas.value.session) === null || _b === void 0 ? void 0 : _b.id);
|
|
56
|
+
this.sessionUpdater.init();
|
|
57
|
+
(_c = this.transports) === null || _c === void 0 ? void 0 : _c.addBeforeSendHooks.apply(_c, __spreadArray(__spreadArray([], this.transports.getBeforeSendHooks(), false), [function (item) {
|
|
58
|
+
var _a;
|
|
59
|
+
(_a = _this.sessionUpdater) === null || _a === void 0 ? void 0 : _a.handleUpdate();
|
|
60
|
+
return item;
|
|
61
|
+
}], false));
|
|
62
|
+
}
|
|
41
63
|
};
|
|
42
64
|
return SessionInstrumentation;
|
|
43
65
|
}(faro_core_1.BaseInstrumentation));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/instrumentation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkG;AAElG,mDAAyE;AAEzE;IAA4C,0CAAmB;IAA/D;QAAA,qEAsCC;QArCU,UAAI,GAAG,+CAA+C,CAAC;QACvD,aAAO,GAAG,mBAAO,CAAC;;IAoC7B,CAAC;IA5BS,sDAAqB,GAA7B,UAA8B,IAAU;;QACtC,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,MAAK,MAAA,IAAI,CAAC,eAAe,0CAAE,EAAE,CAAA,EAAE;YACtD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;YAE/B,8EAA8E;YAC9E,gBAAgB;YAChB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAW,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;SAC/F;IACH,CAAC;IAED,2CAAU,GAAV;QAAA,iBAeC;;QAdC,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;QAE9C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9D,IAAI,MAAA,IAAI,CAAC,MAAM,CAAC,oBAAoB,0CAAE,OAAO,EAAE;YAC7C,IAAI,CAAC,cAAc,GAAG,IAAA,kCAAiB,EAAC,MAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,0CAAE,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAE3B,MAAA,IAAI,CAAC,UAAU,0CAAE,kBAAkB,2CAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,WAAE,UAAC,IAAS;;oBACrF,MAAA,KAAI,CAAC,cAAc,0CAAE,YAAY,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC;gBACd,CAAC,UAAC,CAAC;SACJ;IACH,CAAC;IACH,6BAAC;AAAD,CAAC,AAtCD,CAA4C,+BAAmB,GAsC9D;AAtCY,wDAAsB","sourcesContent":["import { BaseInstrumentation, Conventions, Meta, MetaSession, VERSION } from '@grafana/faro-core';\n\nimport { getSessionUpdater, UserSessionUpdater } from './sessionHandler';\n\nexport class SessionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-session';\n readonly version = VERSION;\n\n // previously notified session, to ensure we don't send session start\n // event twice for the same session\n private notifiedSession: MetaSession | undefined;\n\n private sessionUpdater: UserSessionUpdater | undefined;\n\n private sendSessionStartEvent(meta: Meta): void {\n const session = meta.session;\n\n if (session && session.id !== this.notifiedSession?.id) {\n this.notifiedSession = session;\n\n // no need to add attributes and session id, they are included as part of meta\n // automatically\n this.api.pushEvent(Conventions.EventNames.SESSION_START, {}, undefined, { skipDedupe: true });\n }\n }\n\n initialize() {\n this.logDebug('init session instrumentation');\n\n this.sendSessionStartEvent(this.metas.value);\n this.metas.addListener(this.sendSessionStartEvent.bind(this));\n\n if (this.config.experimentalSessions?.enabled) {\n this.sessionUpdater = getSessionUpdater(this.metas.value.session?.id);\n this.sessionUpdater.init();\n\n this.transports?.addBeforeSendHooks(...this.transports.getBeforeSendHooks(), (item: any) => {\n this.sessionUpdater?.handleUpdate();\n return item;\n });\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.getSessionUpdater = exports.inMemoryUserSessionsUpdater = exports.persistentUserSessionsUpdater = exports.isUserSessionValid = exports.fetchUserSession = exports.storeUserSession = exports.removeUserSession = exports.createUserSessionObject = exports.STORAGE_KEY = exports.SESSION_INACTIVITY_TIME = exports.SESSION_EXPIRATION_TIME = void 0;
|
|
15
|
+
var faro_core_1 = require("@grafana/faro-core");
|
|
16
|
+
var utils_1 = require("../../utils");
|
|
17
|
+
var webStorage_1 = require("../../utils/webStorage");
|
|
18
|
+
// TODO: make this configurable from the outside
|
|
19
|
+
exports.SESSION_EXPIRATION_TIME = 4 * 60 * 60 * 1000; // n hrs
|
|
20
|
+
exports.SESSION_INACTIVITY_TIME = 15 * 60 * 1000; // n minutes
|
|
21
|
+
var STORAGE_UPDATE_DELAY = 1 * 1000; // n seconds
|
|
22
|
+
exports.STORAGE_KEY = '__FARO_SESSION__';
|
|
23
|
+
function createUserSessionObject(sessionId) {
|
|
24
|
+
var now = (0, faro_core_1.dateNow)();
|
|
25
|
+
return {
|
|
26
|
+
sessionId: sessionId !== null && sessionId !== void 0 ? sessionId : (0, faro_core_1.genShortID)(),
|
|
27
|
+
lastActivity: now,
|
|
28
|
+
started: now,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
exports.createUserSessionObject = createUserSessionObject;
|
|
32
|
+
function removeUserSession() {
|
|
33
|
+
(0, webStorage_1.removeItem)(exports.STORAGE_KEY);
|
|
34
|
+
}
|
|
35
|
+
exports.removeUserSession = removeUserSession;
|
|
36
|
+
function storeUserSession(session) {
|
|
37
|
+
(0, webStorage_1.setItem)(exports.STORAGE_KEY, JSON.stringify(session));
|
|
38
|
+
}
|
|
39
|
+
exports.storeUserSession = storeUserSession;
|
|
40
|
+
function fetchUserSession() {
|
|
41
|
+
var storedSession = (0, webStorage_1.getItem)(exports.STORAGE_KEY);
|
|
42
|
+
if (storedSession) {
|
|
43
|
+
return JSON.parse(storedSession);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
exports.fetchUserSession = fetchUserSession;
|
|
48
|
+
function isUserSessionValid(session) {
|
|
49
|
+
if (session == null) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
var now = (0, faro_core_1.dateNow)();
|
|
53
|
+
var lifetimeValid = now - session.started < exports.SESSION_EXPIRATION_TIME;
|
|
54
|
+
if (!lifetimeValid) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
var inactivityPeriodValid = now - session.lastActivity < exports.SESSION_INACTIVITY_TIME;
|
|
58
|
+
return inactivityPeriodValid;
|
|
59
|
+
}
|
|
60
|
+
exports.isUserSessionValid = isUserSessionValid;
|
|
61
|
+
function persistentUserSessionsUpdater(initialSessionId) {
|
|
62
|
+
var throttledSessionUpdate = (0, utils_1.throttle)(function () {
|
|
63
|
+
var _a, _b, _c, _d, _e, _f;
|
|
64
|
+
var sessionFromLocalStorage = fetchUserSession();
|
|
65
|
+
if (isUserSessionValid(sessionFromLocalStorage)) {
|
|
66
|
+
storeUserSession(__assign(__assign({}, sessionFromLocalStorage), { lastActivity: (0, faro_core_1.dateNow)() }));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
var newSession = createUserSessionObject(); // create local srorage session
|
|
70
|
+
newSession = __assign(__assign({}, newSession), { sessionMeta: {
|
|
71
|
+
id: newSession.sessionId,
|
|
72
|
+
attributes: __assign(__assign({}, ((_b = (_a = faro_core_1.faro.metas.value.session) === null || _a === void 0 ? void 0 : _a.attributes) !== null && _b !== void 0 ? _b : {})), (sessionFromLocalStorage != null ? { previousSession: sessionFromLocalStorage.sessionId } : {})),
|
|
73
|
+
} });
|
|
74
|
+
storeUserSession(newSession);
|
|
75
|
+
(_c = faro_core_1.faro.api) === null || _c === void 0 ? void 0 : _c.setSession(newSession.sessionMeta);
|
|
76
|
+
(_e = (_d = faro_core_1.faro.config.experimentalSessions) === null || _d === void 0 ? void 0 : _d.onSessionChange) === null || _e === void 0 ? void 0 : _e.call(_d, (_f = sessionFromLocalStorage === null || sessionFromLocalStorage === void 0 ? void 0 : sessionFromLocalStorage.sessionMeta) !== null && _f !== void 0 ? _f : null, newSession.sessionMeta);
|
|
77
|
+
}
|
|
78
|
+
}, STORAGE_UPDATE_DELAY);
|
|
79
|
+
function init() {
|
|
80
|
+
storeUserSession(createUserSessionObject(initialSessionId));
|
|
81
|
+
document.addEventListener('visibilitychange', function () {
|
|
82
|
+
if (document.visibilityState === 'visible') {
|
|
83
|
+
throttledSessionUpdate();
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
window.addEventListener('storage', function (event) {
|
|
87
|
+
var _a, _b, _c;
|
|
88
|
+
if (event.key !== exports.STORAGE_KEY) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
var newSession = JSON.parse((_a = event.newValue) !== null && _a !== void 0 ? _a : '');
|
|
92
|
+
var previousSession = JSON.parse((_b = event.oldValue) !== null && _b !== void 0 ? _b : '');
|
|
93
|
+
if (newSession.sessionId !== previousSession.sessionId) {
|
|
94
|
+
(_c = faro_core_1.faro.api) === null || _c === void 0 ? void 0 : _c.setSession(newSession.sessionMeta);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
// Users can call the setSession() method, so we need to sync this with the local storage session
|
|
98
|
+
faro_core_1.faro.metas.addListener(function syncSessionIfChangedExternally(meta) {
|
|
99
|
+
var _a, _b;
|
|
100
|
+
var session = meta.session;
|
|
101
|
+
var sessionFromLocalStorage = fetchUserSession();
|
|
102
|
+
if (session && session.id !== (sessionFromLocalStorage === null || sessionFromLocalStorage === void 0 ? void 0 : sessionFromLocalStorage.sessionId)) {
|
|
103
|
+
var userSession = __assign(__assign({}, createUserSessionObject(session.id)), { sessionMeta: {
|
|
104
|
+
id: session.id,
|
|
105
|
+
attributes: __assign(__assign(__assign({}, ((_b = (_a = sessionFromLocalStorage === null || sessionFromLocalStorage === void 0 ? void 0 : sessionFromLocalStorage.sessionMeta) === null || _a === void 0 ? void 0 : _a.attributes) !== null && _b !== void 0 ? _b : {})), session.attributes), (sessionFromLocalStorage ? { previousSession: sessionFromLocalStorage.sessionId } : {})),
|
|
106
|
+
} });
|
|
107
|
+
storeUserSession(userSession);
|
|
108
|
+
faro_core_1.faro.api.setSession(userSession.sessionMeta);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
handleUpdate: throttledSessionUpdate,
|
|
114
|
+
init: init,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
exports.persistentUserSessionsUpdater = persistentUserSessionsUpdater;
|
|
118
|
+
function inMemoryUserSessionsUpdater(initialSessionId) {
|
|
119
|
+
var inMemoryUserSession = createUserSessionObject(initialSessionId);
|
|
120
|
+
function handleUpdate() {
|
|
121
|
+
var _a, _b, _c, _d, _e;
|
|
122
|
+
if (isUserSessionValid(inMemoryUserSession)) {
|
|
123
|
+
inMemoryUserSession.lastActivity = (0, faro_core_1.dateNow)();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
inMemoryUserSession = createUserSessionObject();
|
|
127
|
+
var previousSessionMeta = faro_core_1.faro.metas.value.session;
|
|
128
|
+
var newSessionMeta = {
|
|
129
|
+
id: inMemoryUserSession.sessionId,
|
|
130
|
+
attributes: __assign(__assign({}, ((_b = (_a = faro_core_1.faro.metas.value.session) === null || _a === void 0 ? void 0 : _a.attributes) !== null && _b !== void 0 ? _b : {})), ((previousSessionMeta === null || previousSessionMeta === void 0 ? void 0 : previousSessionMeta.id) ? { previousSession: previousSessionMeta.id } : {})),
|
|
131
|
+
};
|
|
132
|
+
(_d = (_c = faro_core_1.faro.config.experimentalSessions) === null || _c === void 0 ? void 0 : _c.onSessionChange) === null || _d === void 0 ? void 0 : _d.call(_c, previousSessionMeta !== null && previousSessionMeta !== void 0 ? previousSessionMeta : null, newSessionMeta);
|
|
133
|
+
(_e = faro_core_1.faro.api) === null || _e === void 0 ? void 0 : _e.setSession(newSessionMeta);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function init() {
|
|
137
|
+
document.addEventListener('visibilitychange', function () {
|
|
138
|
+
if (document.visibilityState === 'visible') {
|
|
139
|
+
handleUpdate();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Users can call the setSession() method, so we need to sync this with the inMemoryUserSession
|
|
143
|
+
faro_core_1.faro.metas.addListener(function syncSessionIfChangedExternally(meta) {
|
|
144
|
+
var _a;
|
|
145
|
+
var session = meta.session;
|
|
146
|
+
if (session && session.id !== (inMemoryUserSession === null || inMemoryUserSession === void 0 ? void 0 : inMemoryUserSession.sessionId)) {
|
|
147
|
+
var previousSessionId = inMemoryUserSession.sessionId;
|
|
148
|
+
inMemoryUserSession = createUserSessionObject(session.id);
|
|
149
|
+
faro_core_1.faro.api.setSession({
|
|
150
|
+
id: inMemoryUserSession.sessionId,
|
|
151
|
+
attributes: __assign(__assign({}, ((_a = session.attributes) !== null && _a !== void 0 ? _a : {})), { previousSession: previousSessionId }),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
handleUpdate: handleUpdate,
|
|
158
|
+
init: init,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
exports.inMemoryUserSessionsUpdater = inMemoryUserSessionsUpdater;
|
|
162
|
+
function getSessionUpdater(initialSessionId) {
|
|
163
|
+
var _a;
|
|
164
|
+
if (((_a = faro_core_1.faro.config.experimentalSessions) === null || _a === void 0 ? void 0 : _a.persistent) && webStorage_1.isLocalStorageAvailable) {
|
|
165
|
+
return persistentUserSessionsUpdater(initialSessionId);
|
|
166
|
+
}
|
|
167
|
+
return inMemoryUserSessionsUpdater(initialSessionId);
|
|
168
|
+
}
|
|
169
|
+
exports.getSessionUpdater = getSessionUpdater;
|
|
170
|
+
//# sourceMappingURL=sessionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/sessionHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { dateNow, faro, genShortID, Meta, MetaSession } from '@grafana/faro-core';\n\nimport { throttle } from '../../utils';\nimport { getItem, isLocalStorageAvailable, removeItem, setItem } from '../../utils/webStorage';\n\nexport interface FaroUserSession {\n sessionId: string;\n lastActivity: number;\n started: number;\n sessionMeta?: MetaSession;\n}\nexport interface UserSessionUpdater {\n handleUpdate: () => void;\n init: () => void;\n}\n\n// TODO: make this configurable from the outside\nexport const SESSION_EXPIRATION_TIME = 4 * 60 * 60 * 1000; // n hrs\nexport const SESSION_INACTIVITY_TIME = 15 * 60 * 1000; // n minutes\nconst STORAGE_UPDATE_DELAY = 1 * 1000; // n seconds\n\nexport const STORAGE_KEY = '__FARO_SESSION__';\n\nexport function createUserSessionObject(sessionId?: string): FaroUserSession {\n const now = dateNow();\n\n return {\n sessionId: sessionId ?? genShortID(),\n lastActivity: now,\n started: now,\n };\n}\n\nexport function removeUserSession() {\n removeItem(STORAGE_KEY);\n}\n\nexport function storeUserSession(session: FaroUserSession): void {\n setItem(STORAGE_KEY, JSON.stringify(session));\n}\n\nexport function fetchUserSession(): FaroUserSession | null {\n const storedSession = getItem(STORAGE_KEY);\n\n if (storedSession) {\n return JSON.parse(storedSession) as FaroUserSession;\n }\n\n return null;\n}\n\nexport function isUserSessionValid(session: FaroUserSession | null): boolean {\n if (session == null) {\n return false;\n }\n\n const now = dateNow();\n const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME;\n\n if (!lifetimeValid) {\n return false;\n }\n\n const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME;\n return inactivityPeriodValid;\n}\n\nexport function persistentUserSessionsUpdater(initialSessionId?: string): UserSessionUpdater {\n const throttledSessionUpdate = throttle(() => {\n const sessionFromLocalStorage = fetchUserSession();\n\n if (isUserSessionValid(sessionFromLocalStorage)) {\n storeUserSession({ ...sessionFromLocalStorage!, lastActivity: dateNow() });\n } else {\n let newSession = createUserSessionObject(); // create local srorage session\n newSession = {\n ...newSession,\n sessionMeta: {\n id: newSession.sessionId,\n attributes: {\n ...(faro.metas.value.session?.attributes ?? {}),\n ...(sessionFromLocalStorage != null ? { previousSession: sessionFromLocalStorage.sessionId } : {}),\n },\n },\n };\n\n storeUserSession(newSession);\n\n faro.api?.setSession(newSession.sessionMeta);\n faro.config.experimentalSessions?.onSessionChange?.(\n sessionFromLocalStorage?.sessionMeta ?? null,\n newSession.sessionMeta!\n );\n }\n }, STORAGE_UPDATE_DELAY);\n\n function init() {\n storeUserSession(createUserSessionObject(initialSessionId));\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n throttledSessionUpdate();\n }\n });\n\n window.addEventListener('storage', (event: StorageEvent) => {\n if (event.key !== STORAGE_KEY) {\n return;\n }\n\n const newSession: FaroUserSession = JSON.parse(event.newValue ?? '');\n const previousSession: FaroUserSession = JSON.parse(event.oldValue ?? '');\n\n if (newSession.sessionId !== previousSession.sessionId) {\n faro.api?.setSession(newSession.sessionMeta);\n }\n });\n\n // Users can call the setSession() method, so we need to sync this with the local storage session\n faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) {\n const session = meta.session;\n const sessionFromLocalStorage = fetchUserSession();\n\n if (session && session.id !== sessionFromLocalStorage?.sessionId) {\n const userSession = {\n ...createUserSessionObject(session.id),\n sessionMeta: {\n id: session.id,\n attributes: {\n ...(sessionFromLocalStorage?.sessionMeta?.attributes ?? {}),\n ...session.attributes,\n ...(sessionFromLocalStorage ? { previousSession: sessionFromLocalStorage.sessionId } : {}),\n },\n },\n };\n\n storeUserSession(userSession);\n faro.api.setSession(userSession.sessionMeta);\n }\n });\n }\n\n return {\n handleUpdate: throttledSessionUpdate,\n init,\n };\n}\n\nexport function inMemoryUserSessionsUpdater(initialSessionId?: string): UserSessionUpdater {\n let inMemoryUserSession: FaroUserSession = createUserSessionObject(initialSessionId);\n\n function handleUpdate() {\n if (isUserSessionValid(inMemoryUserSession)) {\n inMemoryUserSession.lastActivity = dateNow();\n } else {\n inMemoryUserSession = createUserSessionObject();\n\n const previousSessionMeta = faro.metas.value.session;\n const newSessionMeta = {\n id: inMemoryUserSession.sessionId,\n attributes: {\n ...(faro.metas.value.session?.attributes ?? {}),\n ...(previousSessionMeta?.id ? { previousSession: previousSessionMeta.id } : {}),\n },\n };\n\n faro.config.experimentalSessions?.onSessionChange?.(previousSessionMeta ?? null, newSessionMeta);\n\n faro.api?.setSession(newSessionMeta);\n }\n }\n\n function init() {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n handleUpdate();\n }\n });\n\n // Users can call the setSession() method, so we need to sync this with the inMemoryUserSession\n faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) {\n const session = meta.session;\n\n if (session && session.id !== inMemoryUserSession?.sessionId) {\n const previousSessionId = inMemoryUserSession.sessionId;\n inMemoryUserSession = createUserSessionObject(session.id);\n\n faro.api.setSession({\n id: inMemoryUserSession.sessionId,\n attributes: {\n ...(session.attributes ?? {}),\n previousSession: previousSessionId,\n },\n });\n }\n });\n }\n\n return {\n handleUpdate,\n init,\n };\n}\n\nexport function getSessionUpdater(initialSessionId?: string): UserSessionUpdater {\n if (faro.config.experimentalSessions?.persistent && isLocalStorageAvailable) {\n return persistentUserSessionsUpdater(initialSessionId);\n }\n\n return inMemoryUserSessionsUpdater(initialSessionId);\n}\n"]}
|
|
@@ -27,6 +27,7 @@ var browserMeta = function () {
|
|
|
27
27
|
return undefined;
|
|
28
28
|
}
|
|
29
29
|
if ('userAgentData' in navigator) {
|
|
30
|
+
// userAgentData in experimental (only Chrome supports it) thus TS does not ship the respective type declarations
|
|
30
31
|
return navigator.userAgentData.brands;
|
|
31
32
|
}
|
|
32
33
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/browser/meta.ts"],"names":[],"mappings":";;;AAAA,6CAAwC;AAIjC,IAAM,WAAW,GAAoC;IAC1D,IAAM,MAAM,GAAG,IAAI,uBAAQ,EAAE,CAAC;IACxB,IAAA,KAAoB,MAAM,CAAC,UAAU,EAAE,EAArC,IAAI,UAAA,EAAE,OAAO,aAAwB,CAAC;IACxC,IAAA,KAAuC,MAAM,CAAC,KAAK,EAAE,EAA7C,MAAM,UAAA,EAAW,SAAS,aAAmB,CAAC;IAC5D,IAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,IAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACpC,IAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAM,OAAO,GAAG,SAAS,CAAC;IAE1B,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,OAAO;YACrB,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,OAAO;YAC3B,EAAE,EAAE,UAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,OAAO,cAAI,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,OAAO,CAAE;YAClD,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,OAAO;YAC/B,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,OAAO;YAC7B,MAAM,QAAA;YACN,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,OAAO;SAC1B;KACF,CAAC;IAEF,SAAS,SAAS;QAChB,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YACrB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,eAAe,IAAI,SAAS,EAAE;YAChC,OAAQ,
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/browser/meta.ts"],"names":[],"mappings":";;;AAAA,6CAAwC;AAIjC,IAAM,WAAW,GAAoC;IAC1D,IAAM,MAAM,GAAG,IAAI,uBAAQ,EAAE,CAAC;IACxB,IAAA,KAAoB,MAAM,CAAC,UAAU,EAAE,EAArC,IAAI,UAAA,EAAE,OAAO,aAAwB,CAAC;IACxC,IAAA,KAAuC,MAAM,CAAC,KAAK,EAAE,EAA7C,MAAM,UAAA,EAAW,SAAS,aAAmB,CAAC;IAC5D,IAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,IAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACpC,IAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAM,OAAO,GAAG,SAAS,CAAC;IAE1B,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,OAAO;YACrB,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,OAAO;YAC3B,EAAE,EAAE,UAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,OAAO,cAAI,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,OAAO,CAAE;YAClD,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,OAAO;YAC/B,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,OAAO;YAC7B,MAAM,QAAA;YACN,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,OAAO;SAC1B;KACF,CAAC;IAEF,SAAS,SAAS;QAChB,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YACrB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,eAAe,IAAI,SAAS,EAAE;YAChC,iHAAiH;YACjH,OAAQ,SAAiB,CAAC,aAAa,CAAC,MAAM,CAAC;SAChD;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAlCW,QAAA,WAAW,eAkCtB","sourcesContent":["import { UAParser } from 'ua-parser-js';\n\nimport type { Meta, MetaBrowser, MetaItem } from '@grafana/faro-core';\n\nexport const browserMeta: MetaItem<Pick<Meta, 'browser'>> = () => {\n const parser = new UAParser();\n const { name, version } = parser.getBrowser();\n const { name: osName, version: osVersion } = parser.getOS();\n const userAgent = parser.getUA();\n const language = navigator.language;\n const mobile = navigator.userAgent.includes('Mobi');\n const brands = getBrands();\n const unknown = 'unknown';\n\n return {\n browser: {\n name: name ?? unknown,\n version: version ?? unknown,\n os: `${osName ?? unknown} ${osVersion ?? unknown}`,\n userAgent: userAgent ?? unknown,\n language: language ?? unknown,\n mobile,\n brands: brands ?? unknown,\n },\n };\n\n function getBrands(): MetaBrowser['brands'] | undefined {\n if (!name || !version) {\n return undefined;\n }\n\n if ('userAgentData' in navigator) {\n // userAgentData in experimental (only Chrome supports it) thus TS does not ship the respective type declarations\n return (navigator as any).userAgentData.brands;\n }\n\n return undefined;\n }\n};\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.k6Meta = void 0;
|
|
4
|
+
var meta_1 = require("./meta");
|
|
5
|
+
Object.defineProperty(exports, "k6Meta", { enumerable: true, get: function () { return meta_1.k6Meta; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/metas/k6/index.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAAvB,8FAAA,MAAM,OAAA","sourcesContent":["export { k6Meta } from './meta';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/k6/meta.ts"],"names":[],"mappings":";;;AAEO,IAAM,MAAM,GAA+B;IAChD,OAAO;QACL,EAAE,EAAE,EAAE;KACP,CAAC;AACJ,CAAC,CAAC;AAJW,QAAA,MAAM,UAIjB","sourcesContent":["import type { Meta, MetaItem } from '@grafana/faro-core';\n\nexport const k6Meta: MetaItem<Pick<Meta, 'k6'>> = () => {\n return {\n k6: {},\n };\n};\n"]}
|
|
@@ -109,10 +109,13 @@ var FetchTransport = /** @class */ (function (_super) {
|
|
|
109
109
|
return [2 /*return*/, Promise.resolve()];
|
|
110
110
|
}
|
|
111
111
|
return [4 /*yield*/, this.promiseBuffer.add(function () {
|
|
112
|
+
var _a, _b, _c;
|
|
112
113
|
var body = JSON.stringify((0, faro_core_1.getTransportBody)(items));
|
|
113
|
-
var
|
|
114
|
-
var
|
|
115
|
-
return fetch(url, __assign({ method: 'POST', headers: __assign(__assign({ 'Content-Type': 'application/json' }, (headers !== null && headers !== void 0 ? headers : {})), (apiKey ? { 'x-api-key': apiKey } : {})),
|
|
114
|
+
var _d = _this.options, url = _d.url, requestOptions = _d.requestOptions, apiKey = _d.apiKey;
|
|
115
|
+
var _e = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, headers = _e.headers, restOfRequestOptions = __rest(_e, ["headers"]);
|
|
116
|
+
return fetch(url, __assign({ method: 'POST', headers: __assign(__assign(__assign({ 'Content-Type': 'application/json' }, (headers !== null && headers !== void 0 ? headers : {})), (apiKey ? { 'x-api-key': apiKey } : {})), (((_a = _this.config.experimentalSessions) === null || _a === void 0 ? void 0 : _a.enabled) && ((_b = _this.metas.value.session) === null || _b === void 0 ? void 0 : _b.id)
|
|
117
|
+
? { 'x-faro-session-id': (_c = _this.metas.value.session) === null || _c === void 0 ? void 0 : _c.id }
|
|
118
|
+
: {})), body: body, keepalive: true }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
116
119
|
.then(function (response) {
|
|
117
120
|
if (response.status === 429) {
|
|
118
121
|
_this.disabledUntil = _this.getRetryAfterDate(response);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwH;AAKxH,IAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,IAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,uCAAuC;AACtE,IAAM,6BAA6B,GAAG,IAAI,CAAC;AAE3C;IAAoC,kCAAa;IAU/C,wBAAoB,OAA8B;QAAlD,iBAUC;;gBATC,iBAAO;QADW,aAAO,GAAP,OAAO,CAAuB;QATzC,UAAI,GAAG,uCAAuC,CAAC;QAC/C,aAAO,GAAG,mBAAO,CAAC;QAMnB,mBAAa,GAAS,IAAI,IAAI,EAAE,CAAC;QAKvC,KAAI,CAAC,kBAAkB,GAAG,MAAA,OAAO,CAAC,yBAAyB,mCAAI,6BAA6B,CAAC;QAC7F,KAAI,CAAC,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,CAAC,cAAM,OAAA,IAAI,CAAC,GAAG,EAAE,EAAV,CAAU,CAAC,CAAC;QAEnD,KAAI,CAAC,aAAa,GAAG,IAAA,+BAAmB,EAAC;YACvC,IAAI,EAAE,MAAA,OAAO,CAAC,UAAU,mCAAI,mBAAmB;YAC/C,WAAW,EAAE,MAAA,OAAO,CAAC,WAAW,mCAAI,mBAAmB;SACxD,CAAC,CAAC;;IACL,CAAC;IAEK,6BAAI,GAAV,UAAW,KAAsB;;;;;;;;wBAE7B,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;4BAChD,IAAI,CAAC,OAAO,CAAC,0EAAmE,IAAI,CAAC,aAAa,CAAE,CAAC,CAAC;4BAEtG,sBAAO,OAAO,CAAC,OAAO,EAAE,EAAC;yBAC1B;wBAED,qBAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport, createPromiseBuffer, getTransportBody, noop, PromiseBuffer, VERSION } from '@grafana/faro-core';\nimport type { TransportItem } from '@grafana/faro-core';\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\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();\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(() => {\n const body = JSON.stringify(getTransportBody(items));\n\n const { url, requestOptions, apiKey } = this.options;\n\n const { headers, ...restOfRequestOptions } = requestOptions ?? {};\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(headers ?? {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n ...(this.config.experimentalSessions?.enabled && this.metas.value.session?.id\n ? { 'x-faro-session-id': this.metas.value.session?.id }\n : {}),\n },\n body,\n keepalive: true,\n ...(restOfRequestOptions ?? {}),\n })\n .then((response) => {\n if (response.status === 429) {\n this.disabledUntil = this.getRetryAfterDate(response);\n this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);\n }\n // read the body so the connection can be closed\n response.text().catch(noop);\n\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(): Array<string | RegExp> {\n return [this.options.url];\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"]}
|