@grafana/faro-web-sdk 2.0.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/instrumentations/_internal/monitors/consoleMonitor.d.ts +11 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/const.d.ts +1 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/types.d.ts +7 -1
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +3 -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/errors/registerOnunhandledrejection.d.ts +1 -0
- package/dist/bundle/types/instrumentations/navigation/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/bundle/types/transports/console/transport.d.ts +1 -1
- package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
- package/dist/bundle/types/transports/fetch/types.d.ts +7 -1
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +56 -0
- package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/const.js +2 -1
- package/dist/cjs/instrumentations/_internal/monitors/const.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/index.js +4 -1
- package/dist/cjs/instrumentations/_internal/monitors/index.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/monitors/types.js.map +1 -1
- package/dist/cjs/instrumentations/console/instrumentation.js +41 -38
- package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/csp/instrumentation.js +18 -1
- package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +13 -1
- package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
- package/dist/cjs/transports/fetch/transport.js +7 -2
- package/dist/cjs/transports/fetch/transport.js.map +1 -1
- package/dist/cjs/transports/fetch/types.js.map +1 -1
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js +47 -0
- package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/const.js +1 -0
- package/dist/esm/instrumentations/_internal/monitors/const.js.map +1 -1
- package/dist/esm/instrumentations/_internal/monitors/index.js +1 -0
- package/dist/esm/instrumentations/_internal/monitors/index.js.map +1 -1
- package/dist/esm/instrumentations/_internal/monitors/types.js.map +1 -1
- package/dist/esm/instrumentations/console/instrumentation.js +41 -34
- package/dist/esm/instrumentations/console/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/csp/instrumentation.js +18 -1
- package/dist/esm/instrumentations/csp/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/errors/registerOnunhandledrejection.js +12 -1
- package/dist/esm/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
- package/dist/esm/transports/fetch/transport.js +6 -2
- package/dist/esm/transports/fetch/transport.js.map +1 -1
- package/dist/esm/transports/fetch/types.js.map +1 -1
- package/dist/types/instrumentations/_internal/monitors/consoleMonitor.d.ts +11 -0
- package/dist/types/instrumentations/_internal/monitors/const.d.ts +1 -0
- package/dist/types/instrumentations/_internal/monitors/index.d.ts +1 -0
- package/dist/types/instrumentations/_internal/monitors/types.d.ts +7 -1
- package/dist/types/instrumentations/console/instrumentation.d.ts +3 -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/errors/registerOnunhandledrejection.d.ts +1 -0
- package/dist/types/instrumentations/navigation/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/dist/types/transports/fetch/types.d.ts +7 -1
- package/package.json +5 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseInstrumentation } from '@grafana/faro-core';
|
|
2
2
|
export declare class ViewInstrumentation extends BaseInstrumentation {
|
|
3
3
|
readonly name = "@grafana/faro-web-sdk:instrumentation-view";
|
|
4
|
-
readonly version = "2.0
|
|
4
|
+
readonly version = "2.2.0";
|
|
5
5
|
private notifiedView;
|
|
6
6
|
private sendViewChangedEvent;
|
|
7
7
|
initialize(): void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseInstrumentation } from '@grafana/faro-core';
|
|
2
2
|
export declare class WebVitalsInstrumentation extends BaseInstrumentation {
|
|
3
3
|
readonly name = "@grafana/faro-web-sdk:instrumentation-web-vitals";
|
|
4
|
-
readonly version = "2.0
|
|
4
|
+
readonly version = "2.2.0";
|
|
5
5
|
initialize(): void;
|
|
6
6
|
}
|
|
@@ -4,7 +4,7 @@ import type { ConsoleTransportOptions } from './types';
|
|
|
4
4
|
export declare class ConsoleTransport extends BaseTransport {
|
|
5
5
|
private options;
|
|
6
6
|
readonly name = "@grafana/faro-web-sdk:transport-console";
|
|
7
|
-
readonly version = "2.0
|
|
7
|
+
readonly version = "2.2.0";
|
|
8
8
|
constructor(options?: ConsoleTransportOptions);
|
|
9
9
|
send(item: TransportItem): void;
|
|
10
10
|
}
|
|
@@ -4,7 +4,7 @@ import type { FetchTransportOptions } from './types';
|
|
|
4
4
|
export declare class FetchTransport extends BaseTransport {
|
|
5
5
|
private options;
|
|
6
6
|
readonly name = "@grafana/faro-web-sdk:transport-fetch";
|
|
7
|
-
readonly version = "2.0
|
|
7
|
+
readonly version = "2.2.0";
|
|
8
8
|
promiseBuffer: PromiseBuffer<Response | void>;
|
|
9
9
|
private readonly rateLimitBackoffMs;
|
|
10
10
|
private readonly getNow;
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export interface FetchTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Headers to include in every request.
|
|
4
|
+
* Each value can be:
|
|
5
|
+
* - a string (static value)
|
|
6
|
+
* - a function returning a string (dynamic value)
|
|
7
|
+
*/
|
|
8
|
+
headers?: Record<string, string | (() => string)>;
|
|
3
9
|
}
|
|
4
10
|
export interface FetchTransportOptions {
|
|
5
11
|
url: string;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.monitorConsole = monitorConsole;
|
|
4
|
+
exports.__resetConsoleMonitorForTests = __resetConsoleMonitorForTests;
|
|
5
|
+
var faro_core_1 = require("@grafana/faro-core");
|
|
6
|
+
var const_1 = require("./const");
|
|
7
|
+
var consoleObservable;
|
|
8
|
+
var isInstrumented = false;
|
|
9
|
+
/**
|
|
10
|
+
* Monitors console methods and emits events to subscribers.
|
|
11
|
+
* @param unpatchedConsole - Optional console to call after notifying subscribers.
|
|
12
|
+
* Only the first caller's value is used (since we patch once).
|
|
13
|
+
* Defaults to defaultUnpatchedConsole.
|
|
14
|
+
*/
|
|
15
|
+
function monitorConsole(unpatchedConsole) {
|
|
16
|
+
if (!consoleObservable) {
|
|
17
|
+
consoleObservable = new faro_core_1.Observable();
|
|
18
|
+
}
|
|
19
|
+
if (!isInstrumented) {
|
|
20
|
+
var originalConsole_1 = unpatchedConsole !== null && unpatchedConsole !== void 0 ? unpatchedConsole : faro_core_1.defaultUnpatchedConsole;
|
|
21
|
+
// Patch ALL console methods - subscribers decide which levels to process
|
|
22
|
+
faro_core_1.allLogLevels.forEach(function (level) {
|
|
23
|
+
// eslint-disable-next-line no-console
|
|
24
|
+
console[level] = function () {
|
|
25
|
+
var _a;
|
|
26
|
+
var args = [];
|
|
27
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
28
|
+
args[_i] = arguments[_i];
|
|
29
|
+
}
|
|
30
|
+
// Notify all subscribers
|
|
31
|
+
consoleObservable.notify({
|
|
32
|
+
type: const_1.MESSAGE_TYPE_CONSOLE,
|
|
33
|
+
level: level,
|
|
34
|
+
args: args,
|
|
35
|
+
});
|
|
36
|
+
// Call the unpatchedConsole method
|
|
37
|
+
(_a = originalConsole_1[level]) === null || _a === void 0 ? void 0 : _a.apply(console, args);
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
isInstrumented = true;
|
|
41
|
+
}
|
|
42
|
+
return consoleObservable;
|
|
43
|
+
}
|
|
44
|
+
// Test-only utility to reset state between tests
|
|
45
|
+
function __resetConsoleMonitorForTests() {
|
|
46
|
+
// Restore original console methods from defaultUnpatchedConsole
|
|
47
|
+
for (var _i = 0, allLogLevels_1 = faro_core_1.allLogLevels; _i < allLogLevels_1.length; _i++) {
|
|
48
|
+
var level = allLogLevels_1[_i];
|
|
49
|
+
if (faro_core_1.defaultUnpatchedConsole[level]) {
|
|
50
|
+
console[level] = faro_core_1.defaultUnpatchedConsole[level];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
consoleObservable = undefined;
|
|
54
|
+
isInstrumented = false;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=consoleMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consoleMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/consoleMonitor.ts"],"names":[],"mappings":";;AAeA,wCA4BC;AAGD,sEAUC;AAxDD,gDAAuF;AAGvF,iCAA+C;AAG/C,IAAI,iBAAyD,CAAC;AAC9D,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,gBAAmC;IAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,sBAAU,EAAkB,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,IAAM,iBAAe,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,mCAAuB,CAAC;QAEpE,yEAAyE;QACzE,wBAAY,CAAC,OAAO,CAAC,UAAC,KAAK;YACzB,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,GAAG;;gBAAC,cAAkB;qBAAlB,UAAkB,EAAlB,qBAAkB,EAAlB,IAAkB;oBAAlB,yBAAkB;;gBAClC,yBAAyB;gBACzB,iBAAkB,CAAC,MAAM,CAAC;oBACxB,IAAI,EAAE,4BAAoB;oBAC1B,KAAK,OAAA;oBACL,IAAI,MAAA;iBACL,CAAC,CAAC;gBAEH,mCAAmC;gBACnC,MAAA,iBAAe,CAAC,KAAK,CAAC,0CAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,iDAAiD;AACjD,SAAgB,6BAA6B;IAC3C,gEAAgE;IAChE,KAAoB,UAAY,EAAZ,iBAAA,wBAAY,EAAZ,0BAAY,EAAZ,IAAY,EAAE,CAAC;QAA9B,IAAM,KAAK,qBAAA;QACd,IAAI,mCAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,GAAG,mCAAuB,CAAC,KAAK,CAAuB,CAAC;QACxE,CAAC;IACH,CAAC;IAED,iBAAiB,GAAG,SAAS,CAAC;IAC9B,cAAc,GAAG,KAAK,CAAC;AACzB,CAAC","sourcesContent":["import { allLogLevels, defaultUnpatchedConsole, Observable } from '@grafana/faro-core';\nimport type { UnpatchedConsole } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_CONSOLE } from './const';\nimport type { ConsoleMessage } from './types';\n\nlet consoleObservable: Observable<ConsoleMessage> | undefined;\nlet isInstrumented = false;\n\n/**\n * Monitors console methods and emits events to subscribers.\n * @param unpatchedConsole - Optional console to call after notifying subscribers.\n * Only the first caller's value is used (since we patch once).\n * Defaults to defaultUnpatchedConsole.\n */\nexport function monitorConsole(unpatchedConsole?: UnpatchedConsole): Observable<ConsoleMessage> {\n if (!consoleObservable) {\n consoleObservable = new Observable<ConsoleMessage>();\n }\n\n if (!isInstrumented) {\n const originalConsole = unpatchedConsole ?? defaultUnpatchedConsole;\n\n // Patch ALL console methods - subscribers decide which levels to process\n allLogLevels.forEach((level) => {\n // eslint-disable-next-line no-console\n console[level] = (...args: unknown[]) => {\n // Notify all subscribers\n consoleObservable!.notify({\n type: MESSAGE_TYPE_CONSOLE,\n level,\n args,\n });\n\n // Call the unpatchedConsole method\n originalConsole[level]?.apply(console, args);\n };\n });\n\n isInstrumented = true;\n }\n\n return consoleObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetConsoleMonitorForTests() {\n // Restore original console methods from defaultUnpatchedConsole\n for (const level of allLogLevels) {\n if (defaultUnpatchedConsole[level]) {\n console[level] = defaultUnpatchedConsole[level] as typeof console.log;\n }\n }\n\n consoleObservable = undefined;\n isInstrumented = false;\n}\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MESSAGE_TYPE_DOM_MUTATION = exports.MESSAGE_TYPE_HTTP_REQUEST_END = exports.MESSAGE_TYPE_HTTP_REQUEST_START = exports.MESSAGE_TYPE_RESOURCE_ENTRY = void 0;
|
|
3
|
+
exports.MESSAGE_TYPE_CONSOLE = exports.MESSAGE_TYPE_DOM_MUTATION = exports.MESSAGE_TYPE_HTTP_REQUEST_END = exports.MESSAGE_TYPE_HTTP_REQUEST_START = exports.MESSAGE_TYPE_RESOURCE_ENTRY = void 0;
|
|
4
4
|
exports.MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';
|
|
5
5
|
exports.MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';
|
|
6
6
|
exports.MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';
|
|
7
7
|
exports.MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';
|
|
8
|
+
exports.MESSAGE_TYPE_CONSOLE = 'console';
|
|
8
9
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,2BAA2B,GAAG,gBAAgB,CAAC;AAC/C,QAAA,+BAA+B,GAAG,oBAAoB,CAAC;AACvD,QAAA,6BAA6B,GAAG,kBAAkB,CAAC;AACnD,QAAA,yBAAyB,GAAG,cAAc,CAAC","sourcesContent":["export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';\nexport const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';\nexport const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';\nexport const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';\n"]}
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,2BAA2B,GAAG,gBAAgB,CAAC;AAC/C,QAAA,+BAA+B,GAAG,oBAAoB,CAAC;AACvD,QAAA,6BAA6B,GAAG,kBAAkB,CAAC;AACnD,QAAA,yBAAyB,GAAG,cAAc,CAAC;AAC3C,QAAA,oBAAoB,GAAG,SAAS,CAAC","sourcesContent":["export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';\nexport const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';\nexport const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';\nexport const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';\nexport const MESSAGE_TYPE_CONSOLE = 'console';\n"]}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.monitorInteractions = exports.monitorUrlChanges = exports.monitorPerformanceEntries = exports.monitorHttpRequests = exports.monitorDomMutations = void 0;
|
|
3
|
+
exports.monitorInteractions = exports.monitorUrlChanges = exports.monitorPerformanceEntries = exports.monitorHttpRequests = exports.monitorDomMutations = exports.__resetConsoleMonitorForTests = exports.monitorConsole = void 0;
|
|
4
|
+
var consoleMonitor_1 = require("./consoleMonitor");
|
|
5
|
+
Object.defineProperty(exports, "monitorConsole", { enumerable: true, get: function () { return consoleMonitor_1.monitorConsole; } });
|
|
6
|
+
Object.defineProperty(exports, "__resetConsoleMonitorForTests", { enumerable: true, get: function () { return consoleMonitor_1.__resetConsoleMonitorForTests; } });
|
|
4
7
|
var domMutationMonitor_1 = require("./domMutationMonitor");
|
|
5
8
|
Object.defineProperty(exports, "monitorDomMutations", { enumerable: true, get: function () { return domMutationMonitor_1.monitorDomMutations; } });
|
|
6
9
|
var httpRequestMonitor_1 = require("./httpRequestMonitor");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/index.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,uDAAuD;AAA9C,qHAAA,iBAAiB,OAAA;AAC1B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA","sourcesContent":["export { monitorDomMutations } from './domMutationMonitor';\nexport { monitorHttpRequests } from './httpRequestMonitor';\nexport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nexport { monitorUrlChanges } from './urlChangeMonitor';\nexport { monitorInteractions } from './interactionMonitor';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/index.ts"],"names":[],"mappings":";;;AAAA,mDAAiF;AAAxE,gHAAA,cAAc,OAAA;AAAE,+HAAA,6BAA6B,OAAA;AACtD,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,uDAAuD;AAA9C,qHAAA,iBAAiB,OAAA;AAC1B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA","sourcesContent":["export { monitorConsole, __resetConsoleMonitorForTests } from './consoleMonitor';\nexport { monitorDomMutations } from './domMutationMonitor';\nexport { monitorHttpRequests } from './httpRequestMonitor';\nexport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nexport { monitorUrlChanges } from './urlChangeMonitor';\nexport { monitorInteractions } from './interactionMonitor';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { LogLevel } from '@grafana/faro-core';\n\nimport type {\n MESSAGE_TYPE_CONSOLE,\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type ConsoleMessage = {\n type: typeof MESSAGE_TYPE_CONSOLE;\n level: LogLevel;\n args: unknown[];\n};\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
|
|
@@ -17,6 +17,7 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.ConsoleInstrumentation = void 0;
|
|
19
19
|
var faro_core_1 = require("@grafana/faro-core");
|
|
20
|
+
var consoleMonitor_1 = require("../_internal/monitors/consoleMonitor");
|
|
20
21
|
var getErrorDetails_1 = require("../errors/getErrorDetails");
|
|
21
22
|
var ConsoleInstrumentation = /** @class */ (function (_super) {
|
|
22
23
|
__extends(ConsoleInstrumentation, _super);
|
|
@@ -29,55 +30,57 @@ var ConsoleInstrumentation = /** @class */ (function (_super) {
|
|
|
29
30
|
}
|
|
30
31
|
ConsoleInstrumentation.prototype.initialize = function () {
|
|
31
32
|
var _this = this;
|
|
32
|
-
var _a;
|
|
33
|
+
var _a, _b;
|
|
33
34
|
var instrumentationOptions = this.config.consoleInstrumentation;
|
|
34
35
|
var serializeErrors = (instrumentationOptions === null || instrumentationOptions === void 0 ? void 0 : instrumentationOptions.serializeErrors) || !!(instrumentationOptions === null || instrumentationOptions === void 0 ? void 0 : instrumentationOptions.errorSerializer);
|
|
35
36
|
this.errorSerializer = serializeErrors
|
|
36
37
|
? ((_a = instrumentationOptions === null || instrumentationOptions === void 0 ? void 0 : instrumentationOptions.errorSerializer) !== null && _a !== void 0 ? _a : faro_core_1.defaultErrorArgsSerializer)
|
|
37
38
|
: faro_core_1.defaultLogArgsSerializer;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
_this.api.pushError(new Error(ConsoleInstrumentation.consoleErrorPrefix + value), { type: type, stackFrames: stackFrames });
|
|
56
|
-
}
|
|
57
|
-
else if (level === faro_core_1.LogLevel.ERROR && (instrumentationOptions === null || instrumentationOptions === void 0 ? void 0 : instrumentationOptions.consoleErrorAsLog)) {
|
|
58
|
-
var _c = (0, getErrorDetails_1.getDetailsFromConsoleErrorArgs)(args, _this.errorSerializer), value = _c.value, type = _c.type, stackFrames = _c.stackFrames;
|
|
59
|
-
_this.api.pushLog(value ? [ConsoleInstrumentation.consoleErrorPrefix + value] : args, {
|
|
60
|
-
level: level,
|
|
61
|
-
context: {
|
|
62
|
-
value: value !== null && value !== void 0 ? value : '',
|
|
63
|
-
type: type !== null && type !== void 0 ? type : '',
|
|
64
|
-
stackFrames: (stackFrames === null || stackFrames === void 0 ? void 0 : stackFrames.length) ? (0, faro_core_1.defaultErrorArgsSerializer)(stackFrames) : '',
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
_this.api.pushLog(args, { level: level });
|
|
39
|
+
var disabledLevels = (_b = instrumentationOptions === null || instrumentationOptions === void 0 ? void 0 : instrumentationOptions.disabledLevels) !== null && _b !== void 0 ? _b : ConsoleInstrumentation.defaultDisabledLevels;
|
|
40
|
+
// Pass unpatchedConsole to the monitor (only first caller's value is used)
|
|
41
|
+
var consoleMonitor = (0, consoleMonitor_1.monitorConsole)(this.unpatchedConsole);
|
|
42
|
+
// Subscribe this Faro instance to console events
|
|
43
|
+
this.subscription = consoleMonitor.subscribe(function (_a) {
|
|
44
|
+
var level = _a.level, args = _a.args;
|
|
45
|
+
// Skip if this level is disabled for this instance
|
|
46
|
+
if (disabledLevels.includes(level)) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
if (level === faro_core_1.LogLevel.ERROR && !(instrumentationOptions === null || instrumentationOptions === void 0 ? void 0 : instrumentationOptions.consoleErrorAsLog)) {
|
|
51
|
+
var _b = (0, getErrorDetails_1.getDetailsFromConsoleErrorArgs)(args, _this.errorSerializer), value = _b.value, type = _b.type, stackFrames = _b.stackFrames;
|
|
52
|
+
if (value && !type && !stackFrames) {
|
|
53
|
+
_this.api.pushError(new Error(ConsoleInstrumentation.consoleErrorPrefix + value));
|
|
54
|
+
return;
|
|
70
55
|
}
|
|
56
|
+
_this.api.pushError(new Error(ConsoleInstrumentation.consoleErrorPrefix + value), { type: type, stackFrames: stackFrames });
|
|
71
57
|
}
|
|
72
|
-
|
|
73
|
-
_this.
|
|
58
|
+
else if (level === faro_core_1.LogLevel.ERROR && (instrumentationOptions === null || instrumentationOptions === void 0 ? void 0 : instrumentationOptions.consoleErrorAsLog)) {
|
|
59
|
+
var _c = (0, getErrorDetails_1.getDetailsFromConsoleErrorArgs)(args, _this.errorSerializer), value = _c.value, type = _c.type, stackFrames = _c.stackFrames;
|
|
60
|
+
_this.api.pushLog(value ? [ConsoleInstrumentation.consoleErrorPrefix + value] : args, {
|
|
61
|
+
level: level,
|
|
62
|
+
context: {
|
|
63
|
+
value: value !== null && value !== void 0 ? value : '',
|
|
64
|
+
type: type !== null && type !== void 0 ? type : '',
|
|
65
|
+
stackFrames: (stackFrames === null || stackFrames === void 0 ? void 0 : stackFrames.length) ? (0, faro_core_1.defaultErrorArgsSerializer)(stackFrames) : '',
|
|
66
|
+
},
|
|
67
|
+
});
|
|
74
68
|
}
|
|
75
|
-
|
|
76
|
-
|
|
69
|
+
else {
|
|
70
|
+
_this.api.pushLog(args, { level: level });
|
|
77
71
|
}
|
|
78
|
-
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
_this.logError(err);
|
|
75
|
+
}
|
|
79
76
|
});
|
|
80
77
|
};
|
|
78
|
+
// Clean up subscription when instrumentation is destroyed
|
|
79
|
+
ConsoleInstrumentation.prototype.destroy = function () {
|
|
80
|
+
var _a;
|
|
81
|
+
(_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
82
|
+
this.subscription = undefined;
|
|
83
|
+
};
|
|
81
84
|
ConsoleInstrumentation.defaultDisabledLevels = [faro_core_1.LogLevel.DEBUG, faro_core_1.LogLevel.TRACE, faro_core_1.LogLevel.LOG];
|
|
82
85
|
ConsoleInstrumentation.consoleErrorPrefix = 'console.error: ';
|
|
83
86
|
return ConsoleInstrumentation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/console/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/console/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAM4B;AAG5B,uEAAsE;AACtE,6DAA2E;AAE3E;IAA4C,0CAAmB;IAA/D;;QACW,UAAI,GAAG,+CAA+C,CAAC;QACvD,aAAO,GAAG,mBAAO,CAAC;QAKnB,qBAAe,GAAsB,oCAAwB,CAAC;;IA0DxE,CAAC;IAvDC,2CAAU,GAAV;QAAA,iBAgDC;;QA/CC,IAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;QAElE,IAAM,eAAe,GAAG,CAAA,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,eAAe,KAAI,CAAC,CAAC,CAAA,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,eAAe,CAAA,CAAC;QAC7G,IAAI,CAAC,eAAe,GAAG,eAAe;YACpC,CAAC,CAAC,CAAC,MAAA,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,eAAe,mCAAI,sCAA0B,CAAC;YACzE,CAAC,CAAC,oCAAwB,CAAC;QAE7B,IAAM,cAAc,GAAG,MAAA,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,cAAc,mCAAI,sBAAsB,CAAC,qBAAqB,CAAC;QAE9G,2EAA2E;QAC3E,IAAM,cAAc,GAAG,IAAA,+BAAc,EAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAE7D,iDAAiD;QACjD,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC,UAAC,EAAe;gBAAb,KAAK,WAAA,EAAE,IAAI,UAAA;YACzD,mDAAmD;YACnD,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,KAAK,KAAK,oBAAQ,CAAC,KAAK,IAAI,CAAC,CAAA,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,iBAAiB,CAAA,EAAE,CAAC;oBACrE,IAAA,KAA+B,IAAA,gDAA8B,EAAC,IAAI,EAAE,KAAI,CAAC,eAAe,CAAC,EAAvF,KAAK,WAAA,EAAE,IAAI,UAAA,EAAE,WAAW,iBAA+D,CAAC;oBAEhG,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBACnC,KAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC;wBACjF,OAAO;oBACT,CAAC;oBAED,KAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,kBAAkB,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,MAAA,EAAE,WAAW,aAAA,EAAE,CAAC,CAAC;gBAC1G,CAAC;qBAAM,IAAI,KAAK,KAAK,oBAAQ,CAAC,KAAK,KAAI,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,iBAAiB,CAAA,EAAE,CAAC;oBAC3E,IAAA,KAA+B,IAAA,gDAA8B,EAAC,IAAI,EAAE,KAAI,CAAC,eAAe,CAAC,EAAvF,KAAK,WAAA,EAAE,IAAI,UAAA,EAAE,WAAW,iBAA+D,CAAC;oBAEhG,KAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBACnF,KAAK,OAAA;wBACL,OAAO,EAAE;4BACP,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE;4BAClB,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE;4BAChB,WAAW,EAAE,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,EAAC,CAAC,CAAC,IAAA,sCAA0B,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;yBAChF;qBACF,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,KAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0DAA0D;IAC1D,wCAAO,GAAP;;QACE,MAAA,IAAI,CAAC,YAAY,0CAAE,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAChC,CAAC;IA5DM,4CAAqB,GAAe,CAAC,oBAAQ,CAAC,KAAK,EAAE,oBAAQ,CAAC,KAAK,EAAE,oBAAQ,CAAC,GAAG,CAAC,AAA7D,CAA8D;IACnF,yCAAkB,GAAG,iBAAiB,AAApB,CAAqB;IA4DhD,6BAAC;CAAA,AAjED,CAA4C,+BAAmB,GAiE9D;AAjEY,wDAAsB","sourcesContent":["import {\n BaseInstrumentation,\n defaultErrorArgsSerializer,\n defaultLogArgsSerializer,\n LogLevel,\n VERSION,\n} from '@grafana/faro-core';\nimport type { LogArgsSerializer, Subscription } from '@grafana/faro-core';\n\nimport { monitorConsole } from '../_internal/monitors/consoleMonitor';\nimport { getDetailsFromConsoleErrorArgs } from '../errors/getErrorDetails';\n\nexport class ConsoleInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-console';\n readonly version = VERSION;\n\n static defaultDisabledLevels: LogLevel[] = [LogLevel.DEBUG, LogLevel.TRACE, LogLevel.LOG];\n static consoleErrorPrefix = 'console.error: ';\n\n private errorSerializer: LogArgsSerializer = defaultLogArgsSerializer;\n private subscription: Subscription | undefined;\n\n initialize() {\n const instrumentationOptions = this.config.consoleInstrumentation;\n\n const serializeErrors = instrumentationOptions?.serializeErrors || !!instrumentationOptions?.errorSerializer;\n this.errorSerializer = serializeErrors\n ? (instrumentationOptions?.errorSerializer ?? defaultErrorArgsSerializer)\n : defaultLogArgsSerializer;\n\n const disabledLevels = instrumentationOptions?.disabledLevels ?? ConsoleInstrumentation.defaultDisabledLevels;\n\n // Pass unpatchedConsole to the monitor (only first caller's value is used)\n const consoleMonitor = monitorConsole(this.unpatchedConsole);\n\n // Subscribe this Faro instance to console events\n this.subscription = consoleMonitor.subscribe(({ level, args }) => {\n // Skip if this level is disabled for this instance\n if (disabledLevels.includes(level)) {\n return;\n }\n\n try {\n if (level === LogLevel.ERROR && !instrumentationOptions?.consoleErrorAsLog) {\n const { value, type, stackFrames } = getDetailsFromConsoleErrorArgs(args, this.errorSerializer);\n\n if (value && !type && !stackFrames) {\n this.api.pushError(new Error(ConsoleInstrumentation.consoleErrorPrefix + value));\n return;\n }\n\n this.api.pushError(new Error(ConsoleInstrumentation.consoleErrorPrefix + value), { type, stackFrames });\n } else if (level === LogLevel.ERROR && instrumentationOptions?.consoleErrorAsLog) {\n const { value, type, stackFrames } = getDetailsFromConsoleErrorArgs(args, this.errorSerializer);\n\n this.api.pushLog(value ? [ConsoleInstrumentation.consoleErrorPrefix + value] : args, {\n level,\n context: {\n value: value ?? '',\n type: type ?? '',\n stackFrames: stackFrames?.length ? defaultErrorArgsSerializer(stackFrames) : '',\n },\n });\n } else {\n this.api.pushLog(args, { level });\n }\n } catch (err) {\n this.logError(err);\n }\n });\n }\n\n // Clean up subscription when instrumentation is destroyed\n destroy() {\n this.subscription?.unsubscribe();\n this.subscription = undefined;\n }\n}\n"]}
|
|
@@ -32,7 +32,24 @@ var CSPInstrumentation = /** @class */ (function (_super) {
|
|
|
32
32
|
document.removeEventListener('securitypolicyviolation', this.securitypolicyviolationHandler);
|
|
33
33
|
};
|
|
34
34
|
CSPInstrumentation.prototype.securitypolicyviolationHandler = function (ev) {
|
|
35
|
-
|
|
35
|
+
// We must explicitly extract properties because SecurityPolicyViolationEvent
|
|
36
|
+
// properties are getters on the prototype chain, not own enumerable properties.
|
|
37
|
+
// Object.entries() would not capture them.
|
|
38
|
+
var attributes = {
|
|
39
|
+
blockedURI: ev.blockedURI,
|
|
40
|
+
columnNumber: ev.columnNumber,
|
|
41
|
+
disposition: ev.disposition,
|
|
42
|
+
documentURI: ev.documentURI,
|
|
43
|
+
effectiveDirective: ev.effectiveDirective,
|
|
44
|
+
lineNumber: ev.lineNumber,
|
|
45
|
+
originalPolicy: ev.originalPolicy,
|
|
46
|
+
referrer: ev.referrer,
|
|
47
|
+
sample: ev.sample,
|
|
48
|
+
sourceFile: ev.sourceFile,
|
|
49
|
+
statusCode: ev.statusCode,
|
|
50
|
+
violatedDirective: ev.violatedDirective,
|
|
51
|
+
};
|
|
52
|
+
this.api.pushEvent('securitypolicyviolation', (0, faro_core_1.stringifyObjectValues)(attributes));
|
|
36
53
|
};
|
|
37
54
|
return CSPInstrumentation;
|
|
38
55
|
}(faro_core_1.BaseInstrumentation));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/csp/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAyF;AAGzF;IAAwC,sCAAmB;IAIzD;QACE,YAAA,MAAK,WAAE,SAAC;QAJD,UAAI,GAAG,2CAA2C,CAAC;QACnD,aAAO,GAAG,mBAAO,CAAC;;IAI3B,CAAC;IAED,uCAAU,GAAV;QACE,QAAQ,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,oCAAO,GAAP;QACE,QAAQ,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC/F,CAAC;IAEM,2DAA8B,GAArC,UAAsC,EAAgC;QACpE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,EAAE,IAAA,iCAAqB,EAAC,
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/csp/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAyF;AAGzF;IAAwC,sCAAmB;IAIzD;QACE,YAAA,MAAK,WAAE,SAAC;QAJD,UAAI,GAAG,2CAA2C,CAAC;QACnD,aAAO,GAAG,mBAAO,CAAC;;IAI3B,CAAC;IAED,uCAAU,GAAV;QACE,QAAQ,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,oCAAO,GAAP;QACE,QAAQ,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC/F,CAAC;IAEM,2DAA8B,GAArC,UAAsC,EAAgC;QACpE,6EAA6E;QAC7E,gFAAgF;QAChF,2CAA2C;QAC3C,IAAM,UAAU,GAAG;YACjB,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;YACzC,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,cAAc,EAAE,EAAE,CAAC,cAAc;YACjC,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,iBAAiB,EAAE,EAAE,CAAC,iBAAiB;SACxC,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,EAAE,IAAA,iCAAqB,EAAC,UAAU,CAAC,CAAC,CAAC;IACnF,CAAC;IACH,yBAAC;AAAD,CAAC,AArCD,CAAwC,+BAAmB,GAqC1D;AArCY,gDAAkB","sourcesContent":["import { BaseInstrumentation, stringifyObjectValues, VERSION } from '@grafana/faro-core';\nimport type { Instrumentation } from '@grafana/faro-core';\n\nexport class CSPInstrumentation extends BaseInstrumentation implements Instrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-csp';\n readonly version = VERSION;\n\n constructor() {\n super();\n }\n\n initialize() {\n document.addEventListener('securitypolicyviolation', this.securitypolicyviolationHandler.bind(this));\n }\n\n destroy() {\n document.removeEventListener('securitypolicyviolation', this.securitypolicyviolationHandler);\n }\n\n public securitypolicyviolationHandler(ev: SecurityPolicyViolationEvent) {\n // We must explicitly extract properties because SecurityPolicyViolationEvent\n // properties are getters on the prototype chain, not own enumerable properties.\n // Object.entries() would not capture them.\n const attributes = {\n blockedURI: ev.blockedURI,\n columnNumber: ev.columnNumber,\n disposition: ev.disposition,\n documentURI: ev.documentURI,\n effectiveDirective: ev.effectiveDirective,\n lineNumber: ev.lineNumber,\n originalPolicy: ev.originalPolicy,\n referrer: ev.referrer,\n sample: ev.sample,\n sourceFile: ev.sourceFile,\n statusCode: ev.statusCode,\n violatedDirective: ev.violatedDirective,\n };\n\n this.api.pushEvent('securitypolicyviolation', stringifyObjectValues(attributes));\n }\n}\n"]}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerOnunhandledrejection = registerOnunhandledrejection;
|
|
4
|
+
exports.__resetOnunhandledrejectionForTests = __resetOnunhandledrejectionForTests;
|
|
4
5
|
var faro_core_1 = require("@grafana/faro-core");
|
|
5
6
|
var const_1 = require("./const");
|
|
6
7
|
var getErrorDetails_1 = require("./getErrorDetails");
|
|
8
|
+
// Store handlers for cleanup in tests
|
|
9
|
+
var registeredHandlers = [];
|
|
7
10
|
function registerOnunhandledrejection(api) {
|
|
8
|
-
|
|
11
|
+
var handler = function (evt) {
|
|
9
12
|
var _a;
|
|
10
13
|
var _b, _c;
|
|
11
14
|
var error = evt;
|
|
@@ -28,6 +31,15 @@ function registerOnunhandledrejection(api) {
|
|
|
28
31
|
if (value) {
|
|
29
32
|
api.pushError(new Error(value), { type: type, stackFrames: stackFrames });
|
|
30
33
|
}
|
|
34
|
+
};
|
|
35
|
+
window.addEventListener('unhandledrejection', handler);
|
|
36
|
+
registeredHandlers.push(handler);
|
|
37
|
+
}
|
|
38
|
+
// Test-only utility to reset state between tests
|
|
39
|
+
function __resetOnunhandledrejectionForTests() {
|
|
40
|
+
registeredHandlers.forEach(function (handler) {
|
|
41
|
+
window.removeEventListener('unhandledrejection', handler);
|
|
31
42
|
});
|
|
43
|
+
registeredHandlers.length = 0;
|
|
32
44
|
}
|
|
33
45
|
//# sourceMappingURL=registerOnunhandledrejection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerOnunhandledrejection.js","sourceRoot":"","sources":["../../../../src/instrumentations/errors/registerOnunhandledrejection.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"registerOnunhandledrejection.js","sourceRoot":"","sources":["../../../../src/instrumentations/errors/registerOnunhandledrejection.ts"],"names":[],"mappings":";;AAUA,oEA2BC;AAGD,kFAKC;AA7CD,gDAAiD;AAGjD,iCAA0E;AAC1E,qDAAoD;AAGpD,sCAAsC;AACtC,IAAM,kBAAkB,GAAwD,EAAE,CAAC;AAEnF,SAAgB,4BAA4B,CAAC,GAAQ;IACnD,IAAM,OAAO,GAAG,UAAC,GAAkC;;;QACjD,IAAI,KAAK,GAAG,GAAG,CAAC;QAEhB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;QACrB,CAAC;aAAM,IAAI,MAAA,GAAG,CAAC,MAAM,0CAAE,MAAM,EAAE,CAAC;YAC9B,KAAK,GAAG,MAAA,GAAG,CAAC,MAAM,0CAAE,MAAM,CAAC;QAC7B,CAAC;QAED,IAAI,KAAyB,CAAC;QAC9B,IAAI,IAAwB,CAAC;QAC7B,IAAI,WAAW,GAA0B,EAAE,CAAC;QAC5C,IAAI,IAAA,uBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,GAAG,UAAG,+BAAuB,cAAI,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC;YACtD,IAAI,GAAG,8BAAsB,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,KAA6B,IAAA,iCAAe,EAAC,KAAK,CAAC,EAAlD,KAAK,QAAA,EAAE,IAAI,QAAA,EAAE,WAAW,QAAA,CAA2B;QACtD,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,MAAA,EAAE,WAAW,aAAA,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACvD,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,iDAAiD;AACjD,SAAgB,mCAAmC;IACjD,kBAAkB,CAAC,OAAO,CAAC,UAAC,OAAO;QACjC,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import { isPrimitive } from '@grafana/faro-core';\nimport type { API, ExceptionStackFrame } from '@grafana/faro-core';\n\nimport { primitiveUnhandledType, primitiveUnhandledValue } from './const';\nimport { getErrorDetails } from './getErrorDetails';\nimport type { ExtendedPromiseRejectionEvent } from './types';\n\n// Store handlers for cleanup in tests\nconst registeredHandlers: Array<(evt: ExtendedPromiseRejectionEvent) => void> = [];\n\nexport function registerOnunhandledrejection(api: API): void {\n const handler = (evt: ExtendedPromiseRejectionEvent) => {\n let error = evt;\n\n if (error.reason) {\n error = evt.reason;\n } else if (evt.detail?.reason) {\n error = evt.detail?.reason;\n }\n\n let value: string | undefined;\n let type: string | undefined;\n let stackFrames: ExceptionStackFrame[] = [];\n if (isPrimitive(error)) {\n value = `${primitiveUnhandledValue} ${String(error)}`;\n type = primitiveUnhandledType;\n } else {\n [value, type, stackFrames] = getErrorDetails(error);\n }\n\n if (value) {\n api.pushError(new Error(value), { type, stackFrames });\n }\n };\n\n window.addEventListener('unhandledrejection', handler);\n registeredHandlers.push(handler);\n}\n\n// Test-only utility to reset state between tests\nexport function __resetOnunhandledrejectionForTests(): void {\n registeredHandlers.forEach((handler) => {\n window.removeEventListener('unhandledrejection', handler);\n });\n registeredHandlers.length = 0;\n}\n"]}
|
|
@@ -115,13 +115,18 @@ var FetchTransport = /** @class */ (function (_super) {
|
|
|
115
115
|
return [4 /*yield*/, this.promiseBuffer.add(function () {
|
|
116
116
|
var body = JSON.stringify((0, faro_core_1.getTransportBody)(items));
|
|
117
117
|
var _a = _this.options, url = _a.url, requestOptions = _a.requestOptions, apiKey = _a.apiKey;
|
|
118
|
-
var _b = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {},
|
|
118
|
+
var _b = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, _c = _b.headers, headers = _c === void 0 ? {} : _c, restOfRequestOptions = __rest(_b, ["headers"]);
|
|
119
119
|
var sessionId;
|
|
120
120
|
var sessionMeta = _this.metas.value.session;
|
|
121
121
|
if (sessionMeta != null) {
|
|
122
122
|
sessionId = sessionMeta.id;
|
|
123
123
|
}
|
|
124
|
-
|
|
124
|
+
var resolvedHeaders = {};
|
|
125
|
+
for (var _i = 0, _d = Object.entries(headers); _i < _d.length; _i++) {
|
|
126
|
+
var _e = _d[_i], key = _e[0], value = _e[1];
|
|
127
|
+
resolvedHeaders[key] = typeof value === 'function' ? value() : value;
|
|
128
|
+
}
|
|
129
|
+
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 : {})))
|
|
125
130
|
.then(function (response) { return __awaiter(_this, void 0, void 0, function () {
|
|
126
131
|
var sessionExpired;
|
|
127
132
|
return __generator(this, function (_a) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwH;AAGxH,gFAA0F;AAC1F,yGAA0G;AAI1G,IAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,IAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,uCAAuC;AACtE,IAAM,6BAA6B,GAAG,IAAI,CAAC;AAE3C,IAAM,sBAAsB,GAAG,KAAK,CAAC;AACrC,IAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,IAAM,QAAQ,GAAG,GAAG,CAAC;AAErB;IAAoC,kCAAa;IAU/C,wBAAoB,OAA8B;;QAChD,YAAA,MAAK,WAAE,SAAC;QADU,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,CAAC;4BACjD,IAAI,CAAC,OAAO,CAAC,0EAAmE,IAAI,CAAC,aAAa,CAAE,CAAC,CAAC;4BAEtG,sBAAO,OAAO,CAAC,OAAO,EAAE,EAAC;wBAC3B,CAAC;wBAED,qBAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;gCAC3B,IAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAA,4BAAgB,EAAC,KAAK,CAAC,CAAC,CAAC;gCAE/C,IAAA,KAAkC,KAAI,CAAC,OAAO,EAA5C,GAAG,SAAA,EAAE,cAAc,oBAAA,EAAE,MAAM,YAAiB,CAAC;gCAErD,IAAM,
|
|
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();\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 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' ? 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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/transports/fetch/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface FetchTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {\n headers?: Record<string, string>;\n}\n\nexport interface FetchTransportOptions {\n // url of the collector endpoint\n url: string;\n\n // will be added as `x-api-key` header\n apiKey?: string;\n // how many requests to buffer in total\n bufferSize?: number;\n // how many requests to execute concurrently\n concurrency?: number;\n // if rate limit response does not include a Retry-After header,\n // how many milliseconds to back off before attempting a request.\n // intermediate events will be dropped, not buffered\n defaultRateLimitBackoffMs?: number;\n // get current date. for mocking purposes in tests\n getNow?: ClockFn;\n // addition options for global.Fetch\n requestOptions?: FetchTransportRequestOptions;\n}\n\nexport type ClockFn = () => number;\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/transports/fetch/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface FetchTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {\n /**\n * Headers to include in every request.\n * Each value can be:\n * - a string (static value)\n * - a function returning a string (dynamic value)\n */\n headers?: Record<string, string | (() => string)>;\n}\n\nexport interface FetchTransportOptions {\n // url of the collector endpoint\n url: string;\n\n // will be added as `x-api-key` header\n apiKey?: string;\n // how many requests to buffer in total\n bufferSize?: number;\n // how many requests to execute concurrently\n concurrency?: number;\n // if rate limit response does not include a Retry-After header,\n // how many milliseconds to back off before attempting a request.\n // intermediate events will be dropped, not buffered\n defaultRateLimitBackoffMs?: number;\n // get current date. for mocking purposes in tests\n getNow?: ClockFn;\n // addition options for global.Fetch\n requestOptions?: FetchTransportRequestOptions;\n}\n\nexport type ClockFn = () => number;\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { allLogLevels, defaultUnpatchedConsole, Observable } from '@grafana/faro-core';
|
|
2
|
+
import { MESSAGE_TYPE_CONSOLE } from './const';
|
|
3
|
+
let consoleObservable;
|
|
4
|
+
let isInstrumented = false;
|
|
5
|
+
/**
|
|
6
|
+
* Monitors console methods and emits events to subscribers.
|
|
7
|
+
* @param unpatchedConsole - Optional console to call after notifying subscribers.
|
|
8
|
+
* Only the first caller's value is used (since we patch once).
|
|
9
|
+
* Defaults to defaultUnpatchedConsole.
|
|
10
|
+
*/
|
|
11
|
+
export function monitorConsole(unpatchedConsole) {
|
|
12
|
+
if (!consoleObservable) {
|
|
13
|
+
consoleObservable = new Observable();
|
|
14
|
+
}
|
|
15
|
+
if (!isInstrumented) {
|
|
16
|
+
const originalConsole = unpatchedConsole !== null && unpatchedConsole !== void 0 ? unpatchedConsole : defaultUnpatchedConsole;
|
|
17
|
+
// Patch ALL console methods - subscribers decide which levels to process
|
|
18
|
+
allLogLevels.forEach((level) => {
|
|
19
|
+
// eslint-disable-next-line no-console
|
|
20
|
+
console[level] = (...args) => {
|
|
21
|
+
var _a;
|
|
22
|
+
// Notify all subscribers
|
|
23
|
+
consoleObservable.notify({
|
|
24
|
+
type: MESSAGE_TYPE_CONSOLE,
|
|
25
|
+
level,
|
|
26
|
+
args,
|
|
27
|
+
});
|
|
28
|
+
// Call the unpatchedConsole method
|
|
29
|
+
(_a = originalConsole[level]) === null || _a === void 0 ? void 0 : _a.apply(console, args);
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
isInstrumented = true;
|
|
33
|
+
}
|
|
34
|
+
return consoleObservable;
|
|
35
|
+
}
|
|
36
|
+
// Test-only utility to reset state between tests
|
|
37
|
+
export function __resetConsoleMonitorForTests() {
|
|
38
|
+
// Restore original console methods from defaultUnpatchedConsole
|
|
39
|
+
for (const level of allLogLevels) {
|
|
40
|
+
if (defaultUnpatchedConsole[level]) {
|
|
41
|
+
console[level] = defaultUnpatchedConsole[level];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
consoleObservable = undefined;
|
|
45
|
+
isInstrumented = false;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=consoleMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consoleMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/consoleMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG/C,IAAI,iBAAyD,CAAC;AAC9D,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,gBAAmC;IAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,UAAU,EAAkB,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,uBAAuB,CAAC;QAEpE,yEAAyE;QACzE,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7B,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;;gBACtC,yBAAyB;gBACzB,iBAAkB,CAAC,MAAM,CAAC;oBACxB,IAAI,EAAE,oBAAoB;oBAC1B,KAAK;oBACL,IAAI;iBACL,CAAC,CAAC;gBAEH,mCAAmC;gBACnC,MAAA,eAAe,CAAC,KAAK,CAAC,0CAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,6BAA6B;IAC3C,gEAAgE;IAChE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAuB,CAAC;QACxE,CAAC;IACH,CAAC;IAED,iBAAiB,GAAG,SAAS,CAAC;IAC9B,cAAc,GAAG,KAAK,CAAC;AACzB,CAAC","sourcesContent":["import { allLogLevels, defaultUnpatchedConsole, Observable } from '@grafana/faro-core';\nimport type { UnpatchedConsole } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_CONSOLE } from './const';\nimport type { ConsoleMessage } from './types';\n\nlet consoleObservable: Observable<ConsoleMessage> | undefined;\nlet isInstrumented = false;\n\n/**\n * Monitors console methods and emits events to subscribers.\n * @param unpatchedConsole - Optional console to call after notifying subscribers.\n * Only the first caller's value is used (since we patch once).\n * Defaults to defaultUnpatchedConsole.\n */\nexport function monitorConsole(unpatchedConsole?: UnpatchedConsole): Observable<ConsoleMessage> {\n if (!consoleObservable) {\n consoleObservable = new Observable<ConsoleMessage>();\n }\n\n if (!isInstrumented) {\n const originalConsole = unpatchedConsole ?? defaultUnpatchedConsole;\n\n // Patch ALL console methods - subscribers decide which levels to process\n allLogLevels.forEach((level) => {\n // eslint-disable-next-line no-console\n console[level] = (...args: unknown[]) => {\n // Notify all subscribers\n consoleObservable!.notify({\n type: MESSAGE_TYPE_CONSOLE,\n level,\n args,\n });\n\n // Call the unpatchedConsole method\n originalConsole[level]?.apply(console, args);\n };\n });\n\n isInstrumented = true;\n }\n\n return consoleObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetConsoleMonitorForTests() {\n // Restore original console methods from defaultUnpatchedConsole\n for (const level of allLogLevels) {\n if (defaultUnpatchedConsole[level]) {\n console[level] = defaultUnpatchedConsole[level] as typeof console.log;\n }\n }\n\n consoleObservable = undefined;\n isInstrumented = false;\n}\n"]}
|
|
@@ -2,4 +2,5 @@ export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';
|
|
|
2
2
|
export const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';
|
|
3
3
|
export const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';
|
|
4
4
|
export const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';
|
|
5
|
+
export const MESSAGE_TYPE_CONSOLE = 'console';
|
|
5
6
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG,gBAAgB,CAAC;AAC5D,MAAM,CAAC,MAAM,+BAA+B,GAAG,oBAAoB,CAAC;AACpE,MAAM,CAAC,MAAM,6BAA6B,GAAG,kBAAkB,CAAC;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC","sourcesContent":["export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';\nexport const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';\nexport const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';\nexport const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';\n"]}
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG,gBAAgB,CAAC;AAC5D,MAAM,CAAC,MAAM,+BAA+B,GAAG,oBAAoB,CAAC;AACpE,MAAM,CAAC,MAAM,6BAA6B,GAAG,kBAAkB,CAAC;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC","sourcesContent":["export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';\nexport const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';\nexport const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';\nexport const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';\nexport const MESSAGE_TYPE_CONSOLE = 'console';\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { monitorConsole, __resetConsoleMonitorForTests } from './consoleMonitor';
|
|
1
2
|
export { monitorDomMutations } from './domMutationMonitor';
|
|
2
3
|
export { monitorHttpRequests } from './httpRequestMonitor';
|
|
3
4
|
export { monitorPerformanceEntries } from './performanceEntriesMonitor';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export { monitorDomMutations } from './domMutationMonitor';\nexport { monitorHttpRequests } from './httpRequestMonitor';\nexport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nexport { monitorUrlChanges } from './urlChangeMonitor';\nexport { monitorInteractions } from './interactionMonitor';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export { monitorConsole, __resetConsoleMonitorForTests } from './consoleMonitor';\nexport { monitorDomMutations } from './domMutationMonitor';\nexport { monitorHttpRequests } from './httpRequestMonitor';\nexport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nexport { monitorUrlChanges } from './urlChangeMonitor';\nexport { monitorInteractions } from './interactionMonitor';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { LogLevel } from '@grafana/faro-core';\n\nimport type {\n MESSAGE_TYPE_CONSOLE,\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type ConsoleMessage = {\n type: typeof MESSAGE_TYPE_CONSOLE;\n level: LogLevel;\n args: unknown[];\n};\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
|