@coralogix/browser 1.0.73 → 1.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/package.json +3 -2
- package/src/CoralogixExporter.d.ts +2 -0
- package/src/CoralogixExporter.js +33 -7
- package/src/CoralogixExporter.js.map +1 -1
- package/src/constants.d.ts +4 -0
- package/src/constants.js +4 -0
- package/src/constants.js.map +1 -1
- package/src/helpers.d.ts +7 -0
- package/src/helpers.js +16 -1
- package/src/helpers.js.map +1 -1
- package/src/index.js +26 -8
- package/src/index.js.map +1 -1
- package/src/instrumentations/CoralogixLongTaskInstrumentation.js +1 -1
- package/src/instrumentations/CoralogixLongTaskInstrumentation.js.map +1 -1
- package/src/instrumentations/CoralogixResourcesInstrumentation.js +1 -1
- package/src/instrumentations/CoralogixResourcesInstrumentation.js.map +1 -1
- package/src/instrumentations/CoralogixWebVitalsInstrumentation.js +8 -3
- package/src/instrumentations/CoralogixWebVitalsInstrumentation.js.map +1 -1
- package/src/label-providers/url-based-label-provider.d.ts +16 -0
- package/src/label-providers/url-based-label-provider.js +24 -0
- package/src/label-providers/url-based-label-provider.js.map +1 -0
- package/src/session/session.consts.d.ts +5 -0
- package/src/session/session.consts.js +8 -0
- package/src/session/session.consts.js.map +1 -0
- package/src/session/session.model.d.ts +74 -0
- package/src/session/session.model.js +11 -0
- package/src/session/session.model.js.map +1 -0
- package/src/session/sessionManager.d.ts +17 -0
- package/src/{sessionManager.js → session/sessionManager.js} +22 -4
- package/src/session/sessionManager.js.map +1 -0
- package/src/session/sessionRecorder.d.ts +32 -0
- package/src/session/sessionRecorder.js +178 -0
- package/src/session/sessionRecorder.js.map +1 -0
- package/src/types.d.ts +27 -2
- package/src/types.js +5 -0
- package/src/types.js.map +1 -1
- package/src/utils.d.ts +4 -0
- package/src/utils.js +30 -4
- package/src/utils.js.map +1 -1
- package/src/version.d.ts +1 -1
- package/src/version.js +1 -1
- package/src/workers/session-recording-worker.d.ts +1 -0
- package/src/workers/session-recording-worker.js +3729 -0
- package/src/workers/session-recording-worker.js.map +1 -0
- package/src/sessionManager.d.ts +0 -12
- package/src/sessionManager.js.map +0 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { recordOptions } from 'rrweb/typings/types';
|
|
2
|
+
import { eventWithTime } from '@rrweb/types';
|
|
3
|
+
/**
|
|
4
|
+
* Record config properties - based on rrweb
|
|
5
|
+
*
|
|
6
|
+
* | key | default | description |
|
|
7
|
+
* | ------------------------ | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
8
|
+
* | emit | required | the callback function to get emitted events |
|
|
9
|
+
* | checkoutEveryNth | - | take a full snapshot after every N events<br />refer to the [checkout](#checkout) chapter |
|
|
10
|
+
* | checkoutEveryNms | - | take a full snapshot after every N ms<br />refer to the [checkout](#checkout) chapter |
|
|
11
|
+
* | blockClass | 'rr-block' | Use a string or RegExp to configure which elements should be blocked, refer to the [privacy](#privacy) chapter |
|
|
12
|
+
* | blockSelector | null | Use a string to configure which selector should be blocked, refer to the [privacy](#privacy) chapter |
|
|
13
|
+
* | ignoreClass | 'rr-ignore' | Use a string or RegExp to configure which elements should be ignored, refer to the [privacy](#privacy) chapter |
|
|
14
|
+
* | ignoreSelector | null | Use a string to configure which selector should be ignored, refer to the [privacy](#privacy) chapter |
|
|
15
|
+
* | ignoreCSSAttributes | null | array of CSS attributes that should be ignored |
|
|
16
|
+
* | maskTextClass | 'rr-mask' | Use a string or RegExp to configure which elements should be masked, refer to the [privacy](#privacy) chapter |
|
|
17
|
+
* | maskTextSelector | null | Use a string to configure which selector should be masked, refer to the [privacy](#privacy) chapter |
|
|
18
|
+
* | maskAllInputs | false | mask all input content as \* |
|
|
19
|
+
* | maskInputOptions | { password: true } | mask some kinds of input \*<br />refer to the [list](https://github.com/rrweb-io/rrweb/blob/588164aa12f1d94576f89ae0210b98f6e971c895/packages/rrweb-snapshot/src/types.ts#L77-L95) |
|
|
20
|
+
* | maskInputFn | - | customize mask input content recording logic |
|
|
21
|
+
* | maskTextFn | - | customize mask text content recording logic |
|
|
22
|
+
* | slimDOMOptions | {} | remove unnecessary parts of the DOM <br />refer to the [list](https://github.com/rrweb-io/rrweb/blob/588164aa12f1d94576f89ae0210b98f6e971c895/packages/rrweb-snapshot/src/types.ts#L97-L108) |
|
|
23
|
+
* | dataURLOptions | {} | Canvas image format and quality ,This parameter will be passed to the OffscreenCanvas.convertToBlob(),Using this parameter effectively reduces the size of the recorded data |
|
|
24
|
+
* | inlineStylesheet | true | whether to inline the stylesheet in the events |
|
|
25
|
+
* | hooks | {} | hooks for events<br />refer to the [list](https://github.com/rrweb-io/rrweb/blob/9488deb6d54a5f04350c063d942da5e96ab74075/src/types.ts#L207) |
|
|
26
|
+
* | packFn | - | refer to the [storage optimization recipe](./docs/recipes/optimize-storage.md) |
|
|
27
|
+
* | sampling | - | refer to the [storage optimization recipe](./docs/recipes/optimize-storage.md) |
|
|
28
|
+
* | recordCanvas | false | Whether to record the canvas element. Available options:<br/>`false`, <br/>`true` |
|
|
29
|
+
* | recordCrossOriginIframes | false | Whether to record cross origin iframes. rrweb has to be injected in each child iframe for this to work. Available options:<br/>`false`, <br/>`true` |
|
|
30
|
+
* | recordAfter | 'load' | If the document is not ready, then the recorder will start recording after the specified event is fired. Available options: `DOMContentLoaded`, `load` |
|
|
31
|
+
* | inlineImages | false | whether to record the image content |
|
|
32
|
+
* | collectFonts | false | whether to collect fonts in the website |
|
|
33
|
+
* | userTriggeredOnInput | false | whether to add `userTriggered` on input events that indicates if this event was triggered directly by the user or not. [What is `userTriggered`?](https://github.com/rrweb-io/rrweb/pull/495) |
|
|
34
|
+
* | plugins | [] | load plugins to provide extended record functions. [What is plugins?](./docs/recipes/plugin.md) |
|
|
35
|
+
* | errorHandler | - | A callback that is called if something inside of rrweb throws an error. The callback receives the error as argument.
|
|
36
|
+
*/
|
|
37
|
+
export interface SessionRecordingConfig extends Omit<recordOptions<eventWithTime>, 'sampling' | 'emit' | 'packFn' | 'plugins' | 'hooks'> {
|
|
38
|
+
enable: boolean;
|
|
39
|
+
autoStartSessionRecording: boolean;
|
|
40
|
+
recordConsoleEvents?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export type RecordEvent = eventWithTime;
|
|
43
|
+
export type RecordPluginEvent<T = any> = {
|
|
44
|
+
type: SessionRecordingEventType.Plugin;
|
|
45
|
+
data: {
|
|
46
|
+
plugin: string;
|
|
47
|
+
payload: T;
|
|
48
|
+
};
|
|
49
|
+
timestamp: number;
|
|
50
|
+
};
|
|
51
|
+
export declare enum SessionRecordingEventType {
|
|
52
|
+
DomContentLoaded = 0,
|
|
53
|
+
Load = 1,
|
|
54
|
+
FullSnapshot = 2,
|
|
55
|
+
IncrementalSnapshot = 3,
|
|
56
|
+
Meta = 4,
|
|
57
|
+
Custom = 5,
|
|
58
|
+
Plugin = 6
|
|
59
|
+
}
|
|
60
|
+
export interface SessionRecordingMetadata {
|
|
61
|
+
segmentIndex: number;
|
|
62
|
+
segmentTimestamp: number;
|
|
63
|
+
sessionId: string;
|
|
64
|
+
sessionCreationTime: number;
|
|
65
|
+
application: string;
|
|
66
|
+
subIndex: number | undefined;
|
|
67
|
+
}
|
|
68
|
+
export type SessionRecordingWorkerEvent = 'compressRecordData' | 'splitRecordData' | 'sendRecordData';
|
|
69
|
+
export interface SessionRecordingWorkerData {
|
|
70
|
+
gzipBlob?: Blob;
|
|
71
|
+
chunkIndex?: number;
|
|
72
|
+
totalChunks?: number;
|
|
73
|
+
event: SessionRecordingWorkerEvent;
|
|
74
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export var SessionRecordingEventType;
|
|
2
|
+
(function (SessionRecordingEventType) {
|
|
3
|
+
SessionRecordingEventType[SessionRecordingEventType["DomContentLoaded"] = 0] = "DomContentLoaded";
|
|
4
|
+
SessionRecordingEventType[SessionRecordingEventType["Load"] = 1] = "Load";
|
|
5
|
+
SessionRecordingEventType[SessionRecordingEventType["FullSnapshot"] = 2] = "FullSnapshot";
|
|
6
|
+
SessionRecordingEventType[SessionRecordingEventType["IncrementalSnapshot"] = 3] = "IncrementalSnapshot";
|
|
7
|
+
SessionRecordingEventType[SessionRecordingEventType["Meta"] = 4] = "Meta";
|
|
8
|
+
SessionRecordingEventType[SessionRecordingEventType["Custom"] = 5] = "Custom";
|
|
9
|
+
SessionRecordingEventType[SessionRecordingEventType["Plugin"] = 6] = "Plugin";
|
|
10
|
+
})(SessionRecordingEventType || (SessionRecordingEventType = {}));
|
|
11
|
+
//# sourceMappingURL=session.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.model.js","sourceRoot":"","sources":["../../../../../libs/browser/src/session/session.model.ts"],"names":[],"mappings":"AA0DA,MAAM,CAAN,IAAY,yBAQX;AARD,WAAY,yBAAyB;IACnC,iGAAoB,CAAA;IACpB,yEAAQ,CAAA;IACR,yFAAgB,CAAA;IAChB,uGAAuB,CAAA;IACvB,yEAAQ,CAAA;IACR,6EAAU,CAAA;IACV,6EAAU,CAAA;AACZ,CAAC,EARW,yBAAyB,KAAzB,yBAAyB,QAQpC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Session } from '../types';
|
|
2
|
+
import { SessionRecordingConfig } from './session.model';
|
|
3
|
+
export declare class SessionManager {
|
|
4
|
+
private readonly sessionKey;
|
|
5
|
+
private idle;
|
|
6
|
+
private sessionRecorder;
|
|
7
|
+
private activeSession;
|
|
8
|
+
constructor(recordConfig?: SessionRecordingConfig);
|
|
9
|
+
getSessionKey(): string;
|
|
10
|
+
getActiveSession(): Session;
|
|
11
|
+
start(): void;
|
|
12
|
+
stop(): void;
|
|
13
|
+
getSession(): Session;
|
|
14
|
+
private initIdle;
|
|
15
|
+
private clearSession;
|
|
16
|
+
setSession(sessionId?: string): Session;
|
|
17
|
+
}
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import IdleJs from 'idle-js';
|
|
2
2
|
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
-
import { miillisecondsInSecond, MILLISECONDS_PER_HOUR, SESSION_EXPIRATION_IN_HOURS, SESSION_IDLE_TIME_IN_MINUTES, SESSION_MANAGER_KEY, } from '
|
|
3
|
+
import { miillisecondsInSecond, MILLISECONDS_PER_HOUR, SESSION_EXPIRATION_IN_HOURS, SESSION_IDLE_TIME_IN_MINUTES, SESSION_MANAGER_KEY, } from '../constants';
|
|
4
|
+
import { SessionRecorder } from './sessionRecorder';
|
|
5
|
+
import { getNowTime, getSessionRecorder } from '../helpers';
|
|
4
6
|
export class SessionManager {
|
|
5
|
-
constructor() {
|
|
7
|
+
constructor(recordConfig) {
|
|
6
8
|
this.sessionKey = 'rum_session';
|
|
7
9
|
this.initIdle();
|
|
8
10
|
window[SESSION_MANAGER_KEY] = this;
|
|
11
|
+
if (recordConfig === null || recordConfig === void 0 ? void 0 : recordConfig.enable) {
|
|
12
|
+
this.sessionRecorder = new SessionRecorder(this, recordConfig);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
getSessionKey() {
|
|
16
|
+
return this.sessionKey;
|
|
17
|
+
}
|
|
18
|
+
getActiveSession() {
|
|
19
|
+
return this.activeSession;
|
|
9
20
|
}
|
|
10
21
|
start() {
|
|
11
22
|
this.idle.start();
|
|
@@ -16,7 +27,7 @@ export class SessionManager {
|
|
|
16
27
|
}
|
|
17
28
|
getSession() {
|
|
18
29
|
const storedSession = JSON.parse(window.sessionStorage.getItem(this.sessionKey));
|
|
19
|
-
const now =
|
|
30
|
+
const now = getNowTime();
|
|
20
31
|
let session;
|
|
21
32
|
if (storedSession) {
|
|
22
33
|
if (storedSession.sessionExpirationDate > now) {
|
|
@@ -49,17 +60,24 @@ export class SessionManager {
|
|
|
49
60
|
});
|
|
50
61
|
}
|
|
51
62
|
clearSession() {
|
|
63
|
+
var _a;
|
|
64
|
+
(_a = this.sessionRecorder) === null || _a === void 0 ? void 0 : _a.stopRecording();
|
|
52
65
|
window.sessionStorage.removeItem(this.sessionKey);
|
|
53
66
|
}
|
|
54
67
|
setSession(sessionId) {
|
|
55
|
-
|
|
68
|
+
var _a, _b;
|
|
69
|
+
const now = getNowTime();
|
|
56
70
|
const expirationDate = now + MILLISECONDS_PER_HOUR * SESSION_EXPIRATION_IN_HOURS;
|
|
57
71
|
const session = {
|
|
58
72
|
sessionId: sessionId || uuidv4(),
|
|
59
73
|
sessionCreationDate: now,
|
|
60
74
|
sessionExpirationDate: expirationDate,
|
|
61
75
|
};
|
|
76
|
+
this.activeSession = session;
|
|
62
77
|
window.sessionStorage.setItem(this.sessionKey, JSON.stringify(session));
|
|
78
|
+
if ((_a = getSessionRecorder()) === null || _a === void 0 ? void 0 : _a.getIsAutoStartRecording()) {
|
|
79
|
+
(_b = this.sessionRecorder) === null || _b === void 0 ? void 0 : _b.startRecording();
|
|
80
|
+
}
|
|
63
81
|
return session;
|
|
64
82
|
}
|
|
65
83
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../../../../libs/browser/src/session/sessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,OAAO,cAAc;IAMzB,YAAY,YAAqC;QALhC,eAAU,GAAW,aAAa,CAAC;QAMlD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC;QAEnC,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,EAAE;YACxB,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;SAChE;IACH,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,UAAU;QACR,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAW,CACzD,CAAC;QAEF,MAAM,GAAG,GAAW,UAAU,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC;QAEZ,IAAI,aAAa,EAAE;YACjB,IAAI,aAAa,CAAC,qBAAqB,GAAG,GAAG,EAAE;gBAC7C,OAAO,GAAG,aAAa,CAAC;aACzB;iBAAM;gBACL,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;aAC7B;SACF;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO;SACR;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC;YACrB,IAAI,EAAE,4BAA4B,GAAG,qBAAqB,GAAG,EAAE;YAC/D,MAAM,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC;YAC3D,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE;gBACb,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,kFAAkF;YAClF,mFAAmF;YACnF,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,KAAK,EAAE,wDAAwD;SAC7E,CAAC,CAAC;IACL,CAAC;IAEO,YAAY;;QAClB,MAAA,IAAI,CAAC,eAAe,0CAAE,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,SAAkB;;QAC3B,MAAM,GAAG,GAAW,UAAU,EAAE,CAAC;QAEjC,MAAM,cAAc,GAClB,GAAG,GAAG,qBAAqB,GAAG,2BAA2B,CAAC;QAE5D,MAAM,OAAO,GAAY;YACvB,SAAS,EAAE,SAAS,IAAI,MAAM,EAAE;YAChC,mBAAmB,EAAE,GAAG;YACxB,qBAAqB,EAAE,cAAc;SACtC,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAE7B,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAExE,IAAI,MAAA,kBAAkB,EAAE,0CAAE,uBAAuB,EAAE,EAAE;YACnD,MAAA,IAAI,CAAC,eAAe,0CAAE,cAAc,EAAE,CAAC;SACxC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SessionRecordingConfig } from './session.model';
|
|
2
|
+
import { SessionManager } from './sessionManager';
|
|
3
|
+
export declare class SessionRecorder {
|
|
4
|
+
private readonly sessionWorker;
|
|
5
|
+
private readonly isAutoStartRecording;
|
|
6
|
+
private recordEvents;
|
|
7
|
+
private recordRef;
|
|
8
|
+
private recordConfig;
|
|
9
|
+
private segmentIndexCounter;
|
|
10
|
+
private sessionManager;
|
|
11
|
+
private hasRecording;
|
|
12
|
+
private recordingStopped;
|
|
13
|
+
private batchingTimeInterval;
|
|
14
|
+
private batchTimeDelay;
|
|
15
|
+
private batchTimeout;
|
|
16
|
+
private isErrorOccurred;
|
|
17
|
+
private debugMode;
|
|
18
|
+
constructor(sessionManager: SessionManager, recordConfig: SessionRecordingConfig);
|
|
19
|
+
getSessionHasRecording(): boolean;
|
|
20
|
+
getIsAutoStartRecording(): boolean;
|
|
21
|
+
startRecording(): void;
|
|
22
|
+
stopRecording(): void;
|
|
23
|
+
private clearIntervals;
|
|
24
|
+
private prepareRecordConfig;
|
|
25
|
+
private handleRecordEvent;
|
|
26
|
+
private prepareRecordEventsBeforeSend;
|
|
27
|
+
private registerToWorkerMessages;
|
|
28
|
+
private resetBatching;
|
|
29
|
+
private sendRecordEvents;
|
|
30
|
+
private handleSessionRecordingResponse;
|
|
31
|
+
private startBatchingRecords;
|
|
32
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { CoralogixDomainsApiUrlMap, SESSION_RECORDER_KEY } from '../constants';
|
|
3
|
+
import { BATCH_TIME_DELAY, MAX_BATCH_TIME_MS, SESSION_RECORDING_DEFAULT_ERROR_MESSAGE, SESSION_RECORDING_DEFAULT_HEADERS, SESSION_RECORDING_NETWORK_ERR0R_MESSAGE, } from './session.consts';
|
|
4
|
+
import { getNowTime, getSdkConfig } from '../helpers';
|
|
5
|
+
import { getWorkerString } from '../workers/session-recording-worker';
|
|
6
|
+
import { getRecordConsolePlugin, record } from 'rrweb';
|
|
7
|
+
export class SessionRecorder {
|
|
8
|
+
constructor(sessionManager, recordConfig) {
|
|
9
|
+
var _a;
|
|
10
|
+
this.isAutoStartRecording = false;
|
|
11
|
+
this.recordEvents = [];
|
|
12
|
+
this.segmentIndexCounter = 0;
|
|
13
|
+
this.hasRecording = false;
|
|
14
|
+
this.recordingStopped = false;
|
|
15
|
+
this.batchTimeDelay = BATCH_TIME_DELAY;
|
|
16
|
+
this.isErrorOccurred = false;
|
|
17
|
+
this.debugMode = !!((_a = getSdkConfig()) === null || _a === void 0 ? void 0 : _a.debug);
|
|
18
|
+
this.handleRecordEvent = (event) => {
|
|
19
|
+
if (!this.recordingStopped) {
|
|
20
|
+
this.recordEvents.push(event);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
this.prepareRecordEventsBeforeSend = () => {
|
|
24
|
+
if (!this.recordEvents.length) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.sessionWorker.postMessage({
|
|
28
|
+
event: 'compressRecordData',
|
|
29
|
+
records: this.recordEvents,
|
|
30
|
+
});
|
|
31
|
+
this.resetBatching();
|
|
32
|
+
};
|
|
33
|
+
this.sendRecordEvents = (data, chunkIndex, totalChunks, dataSplit) => {
|
|
34
|
+
const formData = new FormData();
|
|
35
|
+
const { sessionId, sessionCreationDate } = this.sessionManager.getActiveSession() || {};
|
|
36
|
+
const { application, public_key, coralogixDomain } = getSdkConfig();
|
|
37
|
+
const baseUrl = CoralogixDomainsApiUrlMap[coralogixDomain];
|
|
38
|
+
const fullUrl = `${baseUrl}/browser/v1/sessionrecording`;
|
|
39
|
+
let segmentIndex;
|
|
40
|
+
if (dataSplit) {
|
|
41
|
+
segmentIndex =
|
|
42
|
+
chunkIndex === totalChunks
|
|
43
|
+
? this.segmentIndexCounter++
|
|
44
|
+
: this.segmentIndexCounter;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
segmentIndex = this.segmentIndexCounter++;
|
|
48
|
+
}
|
|
49
|
+
const metaData = {
|
|
50
|
+
segmentIndex,
|
|
51
|
+
segmentTimestamp: getNowTime(),
|
|
52
|
+
sessionCreationTime: sessionCreationDate,
|
|
53
|
+
sessionId,
|
|
54
|
+
application,
|
|
55
|
+
subIndex: chunkIndex !== null && chunkIndex !== void 0 ? chunkIndex : -1,
|
|
56
|
+
};
|
|
57
|
+
formData.append('chunk', data);
|
|
58
|
+
formData.append('metaData', JSON.stringify(metaData));
|
|
59
|
+
const sendRecordRequest = () => __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
const response = !this.isErrorOccurred
|
|
61
|
+
? yield fetch(fullUrl, {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
body: formData,
|
|
64
|
+
headers: Object.assign(Object.assign({}, SESSION_RECORDING_DEFAULT_HEADERS), { Authorization: `Bearer ${public_key}` }),
|
|
65
|
+
})
|
|
66
|
+
: undefined;
|
|
67
|
+
this.handleSessionRecordingResponse(response);
|
|
68
|
+
});
|
|
69
|
+
if (dataSplit) {
|
|
70
|
+
this.batchTimeout = setTimeout(sendRecordRequest, this.batchTimeDelay);
|
|
71
|
+
this.batchTimeDelay += BATCH_TIME_DELAY;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
sendRecordRequest();
|
|
75
|
+
this.batchTimeDelay = BATCH_TIME_DELAY;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
window[SESSION_RECORDER_KEY] = this;
|
|
79
|
+
this.sessionManager = sessionManager;
|
|
80
|
+
this.recordConfig = this.prepareRecordConfig(recordConfig);
|
|
81
|
+
this.isAutoStartRecording = recordConfig.autoStartSessionRecording;
|
|
82
|
+
if (window.Worker) {
|
|
83
|
+
try {
|
|
84
|
+
const workerCode = `(${getWorkerString.toString()})()`;
|
|
85
|
+
const workerUrl = URL.createObjectURL(new Blob([workerCode]));
|
|
86
|
+
this.sessionWorker = new Worker(workerUrl);
|
|
87
|
+
if (this.isAutoStartRecording) {
|
|
88
|
+
this.startRecording();
|
|
89
|
+
}
|
|
90
|
+
this.registerToWorkerMessages();
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
// todo:warp with debug flag
|
|
94
|
+
console.warn('Coralogix Browser SDK - Web worker not created due to: ', err);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// todo:warp with debug flag
|
|
99
|
+
console.warn(SESSION_RECORDING_DEFAULT_ERROR_MESSAGE);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
getSessionHasRecording() {
|
|
103
|
+
return this.hasRecording;
|
|
104
|
+
}
|
|
105
|
+
getIsAutoStartRecording() {
|
|
106
|
+
return this.isAutoStartRecording;
|
|
107
|
+
}
|
|
108
|
+
startRecording() {
|
|
109
|
+
if (this.recordRef) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (this.debugMode) {
|
|
113
|
+
console.log('Coralogix Browser SDK - Session recording started');
|
|
114
|
+
}
|
|
115
|
+
this.resetBatching();
|
|
116
|
+
this.hasRecording = true;
|
|
117
|
+
this.recordingStopped = false;
|
|
118
|
+
this.isErrorOccurred = false;
|
|
119
|
+
this.recordRef = record(this.recordConfig);
|
|
120
|
+
this.startBatchingRecords();
|
|
121
|
+
}
|
|
122
|
+
stopRecording() {
|
|
123
|
+
if (!this.recordRef) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (this.debugMode) {
|
|
127
|
+
console.log('Coralogix Browser SDK - Session recording stopped');
|
|
128
|
+
}
|
|
129
|
+
this.recordRef();
|
|
130
|
+
this.recordRef = undefined;
|
|
131
|
+
this.recordingStopped = true;
|
|
132
|
+
this.prepareRecordEventsBeforeSend();
|
|
133
|
+
this.clearIntervals();
|
|
134
|
+
}
|
|
135
|
+
clearIntervals() {
|
|
136
|
+
if (this.batchingTimeInterval) {
|
|
137
|
+
clearInterval(this.batchingTimeInterval);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
prepareRecordConfig(recordConfig) {
|
|
141
|
+
this.recordConfig = Object.assign(Object.assign({}, recordConfig), { emit: this.handleRecordEvent, plugins: recordConfig.recordConsoleEvents
|
|
142
|
+
? [getRecordConsolePlugin()]
|
|
143
|
+
: [] });
|
|
144
|
+
return this.recordConfig;
|
|
145
|
+
}
|
|
146
|
+
registerToWorkerMessages() {
|
|
147
|
+
this.sessionWorker.onmessage = ({ data, }) => {
|
|
148
|
+
switch (data.event) {
|
|
149
|
+
case 'sendRecordData':
|
|
150
|
+
this.sendRecordEvents(data.gzipBlob);
|
|
151
|
+
break;
|
|
152
|
+
case 'splitRecordData':
|
|
153
|
+
this.sendRecordEvents(data.gzipBlob, data.chunkIndex, data.totalChunks, true);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
resetBatching() {
|
|
159
|
+
this.recordEvents = [];
|
|
160
|
+
}
|
|
161
|
+
handleSessionRecordingResponse(response) {
|
|
162
|
+
if (!(response === null || response === void 0 ? void 0 : response.ok) && !this.isErrorOccurred) {
|
|
163
|
+
console.warn(SESSION_RECORDING_NETWORK_ERR0R_MESSAGE);
|
|
164
|
+
this.isErrorOccurred = true;
|
|
165
|
+
this.stopRecording();
|
|
166
|
+
if (this.batchTimeout) {
|
|
167
|
+
clearTimeout(this.batchTimeout);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
this.isErrorOccurred = false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
startBatchingRecords() {
|
|
175
|
+
this.batchingTimeInterval = setInterval(this.prepareRecordEventsBeforeSend, MAX_BATCH_TIME_MS);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=sessionRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionRecorder.js","sourceRoot":"","sources":["../../../../../libs/browser/src/session/sessionRecorder.ts"],"names":[],"mappings":"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"}
|
package/src/types.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ import { StackFrame } from 'error-stack-parser';
|
|
|
10
10
|
import { CoralogixUserInteractionInstrumentationConfig } from './instrumentations/CoralogixUserInteractionInstrumentation';
|
|
11
11
|
import { Metric } from 'web-vitals/attribution';
|
|
12
12
|
import { CoralogixWebVitalsInstrumentationConfig } from './instrumentations/instrumentation.model';
|
|
13
|
+
import { UrlBasedLabelProvider } from './label-providers/url-based-label-provider';
|
|
14
|
+
import { SessionRecordingConfig } from './session/session.model';
|
|
13
15
|
export declare enum CoralogixEventType {
|
|
14
16
|
ERROR = "error",
|
|
15
17
|
NETWORK_REQUEST = "network-request",
|
|
@@ -103,6 +105,10 @@ export interface CoralogixBrowserSdkConfig {
|
|
|
103
105
|
environment?: string;
|
|
104
106
|
/** Stringify custom log data property */
|
|
105
107
|
stringifyCustomLogData?: boolean;
|
|
108
|
+
/** Sets recording config for session replay */
|
|
109
|
+
sessionRecordingConfig?: SessionRecordingConfig;
|
|
110
|
+
/** Provide labels based on url or event */
|
|
111
|
+
labelProviders?: Array<LabelProvider>;
|
|
106
112
|
}
|
|
107
113
|
export interface CoralogixOtelWebType extends SendLog {
|
|
108
114
|
/**
|
|
@@ -131,6 +137,14 @@ export interface CoralogixOtelWebType extends SendLog {
|
|
|
131
137
|
* Provides the session id.
|
|
132
138
|
*/
|
|
133
139
|
getSessionId: () => string | undefined;
|
|
140
|
+
/**
|
|
141
|
+
* Stop session recording
|
|
142
|
+
*/
|
|
143
|
+
stopSessionRecording: () => void;
|
|
144
|
+
/**
|
|
145
|
+
* Start session recording
|
|
146
|
+
*/
|
|
147
|
+
startSessionRecording: () => void;
|
|
134
148
|
readonly isInited: boolean;
|
|
135
149
|
}
|
|
136
150
|
export interface ErrorContext {
|
|
@@ -195,6 +209,7 @@ export interface SessionContext {
|
|
|
195
209
|
os: OS;
|
|
196
210
|
osVersion: string;
|
|
197
211
|
device: Device;
|
|
212
|
+
hasRecording: boolean;
|
|
198
213
|
user_metadata?: {
|
|
199
214
|
[key: string]: any;
|
|
200
215
|
};
|
|
@@ -220,7 +235,7 @@ interface VersionMetaData {
|
|
|
220
235
|
app_name: string;
|
|
221
236
|
app_version: string;
|
|
222
237
|
}
|
|
223
|
-
export interface
|
|
238
|
+
export interface CxRumEvent extends EventTypeContext {
|
|
224
239
|
browser_sdk: {
|
|
225
240
|
version: string;
|
|
226
241
|
};
|
|
@@ -246,7 +261,7 @@ export interface CxSpan {
|
|
|
246
261
|
isErrorWithStacktrace: boolean;
|
|
247
262
|
instrumentation_data?: InstrumentationData;
|
|
248
263
|
text: {
|
|
249
|
-
cx_rum:
|
|
264
|
+
cx_rum: CxRumEvent;
|
|
250
265
|
};
|
|
251
266
|
}
|
|
252
267
|
export interface Session {
|
|
@@ -267,4 +282,14 @@ export type Browser = 'Chrome' | 'Edge' | 'Firefox' | 'Safari' | 'Opera' | 'IE'
|
|
|
267
282
|
export type OS = 'Windows' | 'MacOS' | 'Linux' | 'iOS' | 'Android' | 'Unknown';
|
|
268
283
|
export type Device = 'Mobile' | 'Tablet' | 'Desktop' | 'Unknown';
|
|
269
284
|
export type EventName = keyof HTMLElementEventMap;
|
|
285
|
+
export declare enum UrlType {
|
|
286
|
+
PAGE = "page",
|
|
287
|
+
NETWORK_REQUEST = "network_request"
|
|
288
|
+
}
|
|
289
|
+
export type LabelProviderLabels = Record<string, string | undefined>;
|
|
290
|
+
export interface GenericLabelProvider {
|
|
291
|
+
urlType?: UrlType;
|
|
292
|
+
providerFunc: (url: string, event: CxRumEvent) => LabelProviderLabels;
|
|
293
|
+
}
|
|
294
|
+
export type LabelProvider = UrlBasedLabelProvider | GenericLabelProvider;
|
|
270
295
|
export {};
|
package/src/types.js
CHANGED
|
@@ -24,4 +24,9 @@ export var OtelNetworkAttrs;
|
|
|
24
24
|
OtelNetworkAttrs["STATUS_TEXT"] = "http.status_text";
|
|
25
25
|
OtelNetworkAttrs["RESPONSE_CONTENT_LENGTH"] = "http.response_content_length";
|
|
26
26
|
})(OtelNetworkAttrs || (OtelNetworkAttrs = {}));
|
|
27
|
+
export var UrlType;
|
|
28
|
+
(function (UrlType) {
|
|
29
|
+
UrlType["PAGE"] = "page";
|
|
30
|
+
UrlType["NETWORK_REQUEST"] = "network_request";
|
|
31
|
+
})(UrlType || (UrlType = {}));
|
|
27
32
|
//# sourceMappingURL=types.js.map
|
package/src/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../libs/browser/src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../libs/browser/src/types.ts"],"names":[],"mappings":"AAeA,MAAM,CAAN,IAAY,kBAQX;AARD,WAAY,kBAAkB;IAC5B,qCAAe,CAAA;IACf,yDAAmC,CAAA;IACnC,iCAAW,CAAA;IACX,2DAAqC,CAAA;IACrC,+CAAyB,CAAA;IACzB,4CAAsB,CAAA;IACtB,6CAAuB,CAAA;AACzB,CAAC,EARW,kBAAkB,KAAlB,kBAAkB,QAQ7B;AAED,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,yCAAqB,CAAA;IACrB,yCAAqB,CAAA;IACrB,6CAAyB,CAAA;AAC3B,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B;AA0SD,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC1B,0CAAsB,CAAA;IACtB,oCAAgB,CAAA;IAChB,oDAAgC,CAAA;IAChC,sCAAkB,CAAA;IAClB,0CAAsB,CAAA;IACtB,oDAAgC,CAAA;IAChC,4EAAwD,CAAA;AAC1D,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AAiBD,MAAM,CAAN,IAAY,OAGX;AAHD,WAAY,OAAO;IACjB,wBAAa,CAAA;IACb,8CAAmC,CAAA;AACrC,CAAC,EAHW,OAAO,KAAP,OAAO,QAGlB"}
|
package/src/utils.d.ts
CHANGED
|
@@ -22,3 +22,7 @@ export declare function generateWebVitalUniqueID(): string;
|
|
|
22
22
|
export declare function rateForTBTMetricValue(value: number): WebVitalsRating;
|
|
23
23
|
export declare function flattenAttributes(attributes: Attributes): Attributes;
|
|
24
24
|
export declare const getCircularReplacer: () => (key: any, value: any) => undefined | any;
|
|
25
|
+
export declare function deepClone<T>(obj: T): T;
|
|
26
|
+
export declare function saveInternalRumData(key: string, value: any): void;
|
|
27
|
+
export declare function getInternalRumData<T>(key: string): T;
|
|
28
|
+
export declare function partition<T>(array: T[], predicate: (value: T) => boolean): [T[], T[]];
|
package/src/utils.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
var _a;
|
|
2
|
+
import { CoralogixAttributes, ID_MASK_KEY, NANOID_REGEX, OPTIONS_DEFAULTS, RUM_INTERNAL_DATA_KEY, UUID_REGEX, } from './constants';
|
|
2
3
|
import { LONGTASK_DURATION } from './instrumentations/instrumentation.consts';
|
|
3
4
|
import { omit } from 'lodash-es';
|
|
4
|
-
export const supportedPerformanceTypes = !(window === null || window === void 0 ? void 0 : window.PerformanceObserver)
|
|
5
|
+
export const supportedPerformanceTypes = !((_a = window === null || window === void 0 ? void 0 : window.PerformanceObserver) === null || _a === void 0 ? void 0 : _a.supportedEntryTypes)
|
|
5
6
|
? {}
|
|
6
7
|
: window.PerformanceObserver.supportedEntryTypes.reduce((obj, type) => {
|
|
7
8
|
obj[type] = true;
|
|
@@ -55,7 +56,7 @@ export const getUrlFragments = (url) => {
|
|
|
55
56
|
return replacedFragments === null || replacedFragments === void 0 ? void 0 : replacedFragments.join('/');
|
|
56
57
|
};
|
|
57
58
|
export function parseUserAgent(userAgent) {
|
|
58
|
-
var _a;
|
|
59
|
+
var _a, _b;
|
|
59
60
|
const browsers = {
|
|
60
61
|
Chrome: /Chrome\/([\d.]+)/,
|
|
61
62
|
Firefox: /Firefox\/([\d.]+)/,
|
|
@@ -92,7 +93,7 @@ export function parseUserAgent(userAgent) {
|
|
|
92
93
|
const match = userAgent.match(regex);
|
|
93
94
|
if (match) {
|
|
94
95
|
os = name;
|
|
95
|
-
osVersion = ((_a = match[1]) === null || _a === void 0 ? void 0 : _a.
|
|
96
|
+
osVersion = ((_b = (_a = match[1]) === null || _a === void 0 ? void 0 : _a.split('_')) === null || _b === void 0 ? void 0 : _b.join('.')) || 'Unknown';
|
|
96
97
|
break;
|
|
97
98
|
}
|
|
98
99
|
}
|
|
@@ -146,4 +147,29 @@ export const getCircularReplacer = () => {
|
|
|
146
147
|
return value;
|
|
147
148
|
};
|
|
148
149
|
};
|
|
150
|
+
export function deepClone(obj) {
|
|
151
|
+
return JSON.parse(JSON.stringify(obj));
|
|
152
|
+
}
|
|
153
|
+
export function saveInternalRumData(key, value) {
|
|
154
|
+
if (!window[RUM_INTERNAL_DATA_KEY]) {
|
|
155
|
+
window[RUM_INTERNAL_DATA_KEY] = {};
|
|
156
|
+
}
|
|
157
|
+
window[RUM_INTERNAL_DATA_KEY][key] = value;
|
|
158
|
+
}
|
|
159
|
+
export function getInternalRumData(key) {
|
|
160
|
+
return window[RUM_INTERNAL_DATA_KEY][key];
|
|
161
|
+
}
|
|
162
|
+
export function partition(array, predicate) {
|
|
163
|
+
const truthyValues = [];
|
|
164
|
+
const falsyValues = [];
|
|
165
|
+
for (const element of array) {
|
|
166
|
+
if (predicate(element)) {
|
|
167
|
+
truthyValues.push(element);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
falsyValues.push(element);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return [truthyValues, falsyValues];
|
|
174
|
+
}
|
|
149
175
|
//# sourceMappingURL=utils.js.map
|
package/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../libs/browser/src/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAE9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,yBAAyB,GACpC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../libs/browser/src/utils.ts"],"names":[],"mappings":"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"}
|
package/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "1.0.
|
|
1
|
+
export declare const SDK_VERSION = "1.0.77";
|
package/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const SDK_VERSION = '1.0.
|
|
1
|
+
export const SDK_VERSION = '1.0.77';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getWorkerString(): void;
|