@multiplayer-app/session-recorder-common 1.3.16 → 1.3.18-beta.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/esm/SessionRecorderIdGenerator.d.ts +2 -1
- package/dist/esm/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/esm/SessionRecorderIdGenerator.js +21 -15
- package/dist/esm/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -1
- package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js +8 -2
- package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -1
- package/dist/esm/constants/constants.base.d.ts +7 -1
- package/dist/esm/constants/constants.base.d.ts.map +1 -1
- package/dist/esm/constants/constants.base.js +13 -1
- package/dist/esm/constants/constants.base.js.map +1 -1
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts +3 -1
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js +22 -17
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/type/crash-buffer.d.ts +59 -0
- package/dist/esm/type/crash-buffer.d.ts.map +1 -0
- package/dist/esm/type/crash-buffer.js +2 -0
- package/dist/esm/type/crash-buffer.js.map +1 -0
- package/dist/esm/type/index.d.ts +1 -0
- package/dist/esm/type/index.d.ts.map +1 -1
- package/dist/esm/type/index.js +1 -0
- package/dist/esm/type/index.js.map +1 -1
- package/dist/esm/type/session-type.enum.d.ts +3 -1
- package/dist/esm/type/session-type.enum.d.ts.map +1 -1
- package/dist/esm/type/session-type.enum.js +2 -0
- package/dist/esm/type/session-type.enum.js.map +1 -1
- package/dist/esm/type/session.d.ts +2 -2
- package/dist/esm/type/session.d.ts.map +1 -1
- package/dist/esm/type/session.js.map +1 -1
- package/dist/esnext/SessionRecorderIdGenerator.d.ts +2 -1
- package/dist/esnext/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/esnext/SessionRecorderIdGenerator.js +20 -15
- package/dist/esnext/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -1
- package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js +8 -2
- package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -1
- package/dist/esnext/constants/constants.base.d.ts +7 -1
- package/dist/esnext/constants/constants.base.d.ts.map +1 -1
- package/dist/esnext/constants/constants.base.js +12 -1
- package/dist/esnext/constants/constants.base.js.map +1 -1
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts +3 -1
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js +23 -19
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
- package/dist/esnext/type/crash-buffer.d.ts +59 -0
- package/dist/esnext/type/crash-buffer.d.ts.map +1 -0
- package/dist/esnext/type/crash-buffer.js +2 -0
- package/dist/esnext/type/crash-buffer.js.map +1 -0
- package/dist/esnext/type/index.d.ts +1 -0
- package/dist/esnext/type/index.d.ts.map +1 -1
- package/dist/esnext/type/index.js +1 -0
- package/dist/esnext/type/index.js.map +1 -1
- package/dist/esnext/type/session-type.enum.d.ts +3 -1
- package/dist/esnext/type/session-type.enum.d.ts.map +1 -1
- package/dist/esnext/type/session-type.enum.js +2 -0
- package/dist/esnext/type/session-type.enum.js.map +1 -1
- package/dist/esnext/type/session.d.ts +2 -2
- package/dist/esnext/type/session.d.ts.map +1 -1
- package/dist/esnext/type/session.js.map +1 -1
- package/dist/src/SessionRecorderIdGenerator.d.ts +2 -1
- package/dist/src/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/src/SessionRecorderIdGenerator.js +20 -15
- package/dist/src/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/src/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -1
- package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js +4 -1
- package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -1
- package/dist/src/constants/constants.base.d.ts +7 -1
- package/dist/src/constants/constants.base.d.ts.map +1 -1
- package/dist/src/constants/constants.base.js +13 -2
- package/dist/src/constants/constants.base.js.map +1 -1
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts +3 -1
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js +22 -18
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/dist/src/type/crash-buffer.d.ts +59 -0
- package/dist/src/type/crash-buffer.d.ts.map +1 -0
- package/dist/src/type/crash-buffer.js +3 -0
- package/dist/src/type/crash-buffer.js.map +1 -0
- package/dist/src/type/index.d.ts +1 -0
- package/dist/src/type/index.d.ts.map +1 -1
- package/dist/src/type/index.js +1 -0
- package/dist/src/type/index.js.map +1 -1
- package/dist/src/type/session-type.enum.d.ts +3 -1
- package/dist/src/type/session-type.enum.d.ts.map +1 -1
- package/dist/src/type/session-type.enum.js +2 -0
- package/dist/src/type/session-type.enum.js.map +1 -1
- package/dist/src/type/session.d.ts +2 -2
- package/dist/src/type/session.d.ts.map +1 -1
- package/dist/src/type/session.js.map +1 -1
- package/package.json +1 -1
- package/src/SessionRecorderIdGenerator.ts +26 -19
- package/src/SessionRecorderTraceIdRatioBasedSampler.ts +4 -0
- package/src/constants/constants.base.ts +18 -1
- package/src/exporters/SessionRecorderBrowserTraceExporter.ts +31 -25
- package/src/type/crash-buffer.ts +73 -0
- package/src/type/index.ts +2 -1
- package/src/type/session-type.enum.ts +3 -0
- package/src/type/session.ts +2 -2
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export type CrashBufferAttrs = {
|
|
2
|
+
sessionAttributes?: Record<string, any>;
|
|
3
|
+
resourceAttributes?: Record<string, any>;
|
|
4
|
+
userAttributes?: any;
|
|
5
|
+
};
|
|
6
|
+
export type CrashBufferRrwebEventPayload = {
|
|
7
|
+
ts: number;
|
|
8
|
+
isFullSnapshot?: boolean;
|
|
9
|
+
event: any;
|
|
10
|
+
};
|
|
11
|
+
export type CrashBufferOtelSpanPayload = {
|
|
12
|
+
ts: number;
|
|
13
|
+
span: any;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Batch append payload for OTEL spans.
|
|
17
|
+
* This is intentionally the same per-span shape as `CrashBufferOtelSpanPayload`,
|
|
18
|
+
* just provided as an array to allow implementations to persist efficiently.
|
|
19
|
+
*/
|
|
20
|
+
export type CrashBufferOtelSpanBatchPayload = CrashBufferOtelSpanPayload[];
|
|
21
|
+
export type CrashBufferErrorSpanAppendedEvent = CrashBufferOtelSpanPayload;
|
|
22
|
+
export type CrashBufferEventName = 'error-span-appended';
|
|
23
|
+
export type CrashBufferEventMap = {
|
|
24
|
+
'error-span-appended': CrashBufferErrorSpanAppendedEvent;
|
|
25
|
+
};
|
|
26
|
+
export type CrashBufferSnapshot = {
|
|
27
|
+
rrwebEvents: CrashBufferRrwebEventPayload[];
|
|
28
|
+
otelSpans: CrashBufferOtelSpanPayload[];
|
|
29
|
+
attrs: CrashBufferAttrs | null;
|
|
30
|
+
windowMs: number;
|
|
31
|
+
fromTs: number;
|
|
32
|
+
toTs: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Shared CrashBuffer contract used across browser + react-native implementations.
|
|
36
|
+
*
|
|
37
|
+
* Notes:
|
|
38
|
+
* - `windowMs` is optional because browser implementations usually bake the window into the instance,
|
|
39
|
+
* while React Native typically passes it per call.
|
|
40
|
+
* - `pruneOlderThan` is optional because browser implementations can handle pruning internally.
|
|
41
|
+
*/
|
|
42
|
+
export interface CrashBuffer {
|
|
43
|
+
setAttrs(attrs: CrashBufferAttrs): Promise<void>;
|
|
44
|
+
appendEvent(payload: CrashBufferRrwebEventPayload, windowMs?: number): Promise<void>;
|
|
45
|
+
appendSpans(payload: CrashBufferOtelSpanBatchPayload, windowMs?: number): Promise<void>;
|
|
46
|
+
snapshot(windowMs?: number, now?: number): Promise<CrashBufferSnapshot>;
|
|
47
|
+
clear(): Promise<void>;
|
|
48
|
+
pruneOlderThan?(cutoffTs: number): Promise<void>;
|
|
49
|
+
on?(event: CrashBufferEventName, listener: (payload: CrashBufferEventMap[CrashBufferEventName]) => void): () => void;
|
|
50
|
+
off?(event: CrashBufferEventName, listener: (payload: CrashBufferEventMap[CrashBufferEventName]) => void): void;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Optional lifecycle controls supported by some CrashBuffer implementations (e.g. browser tabs).
|
|
54
|
+
*/
|
|
55
|
+
export interface CrashBufferLifecycle extends CrashBuffer {
|
|
56
|
+
setActive(active: boolean): void;
|
|
57
|
+
needsFullSnapshot(): boolean;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=crash-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-buffer.d.ts","sourceRoot":"","sources":["../../../src/type/crash-buffer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,cAAc,CAAC,EAAE,GAAG,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,EAAE,GAAG,CAAA;CACX,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,GAAG,CAAA;CACV,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,+BAA+B,GAAG,0BAA0B,EAAE,CAAA;AAE1E,MAAM,MAAM,iCAAiC,GAAG,0BAA0B,CAAA;AAE1E,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,CAAA;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,qBAAqB,EAAE,iCAAiC,CAAA;CACzD,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,4BAA4B,EAAE,CAAA;IAC3C,SAAS,EAAE,0BAA0B,EAAE,CAAA;IACvC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,WAAW,CAAC,OAAO,EAAE,4BAA4B,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpF,WAAW,CAAC,OAAO,EAAE,+BAA+B,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,cAAc,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,EAAE,CAAC,CACD,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,KAAK,IAAI,GACrE,MAAM,IAAI,CAAA;IACb,GAAG,CAAC,CACF,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,KAAK,IAAI,GACrE,IAAI,CAAA;CACR;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IAChC,iBAAiB,IAAI,OAAO,CAAA;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-buffer.js","sourceRoot":"","sources":["../../../src/type/crash-buffer.ts"],"names":[],"mappings":"","sourcesContent":["export type CrashBufferAttrs = {\n sessionAttributes?: Record<string, any>\n resourceAttributes?: Record<string, any>\n userAttributes?: any\n}\n\nexport type CrashBufferRrwebEventPayload = {\n ts: number\n isFullSnapshot?: boolean\n event: any\n}\n\nexport type CrashBufferOtelSpanPayload = {\n ts: number\n span: any\n}\n\n/**\n * Batch append payload for OTEL spans.\n * This is intentionally the same per-span shape as `CrashBufferOtelSpanPayload`,\n * just provided as an array to allow implementations to persist efficiently.\n */\nexport type CrashBufferOtelSpanBatchPayload = CrashBufferOtelSpanPayload[]\n\nexport type CrashBufferErrorSpanAppendedEvent = CrashBufferOtelSpanPayload\n\nexport type CrashBufferEventName = 'error-span-appended'\n\nexport type CrashBufferEventMap = {\n 'error-span-appended': CrashBufferErrorSpanAppendedEvent\n}\n\nexport type CrashBufferSnapshot = {\n rrwebEvents: CrashBufferRrwebEventPayload[]\n otelSpans: CrashBufferOtelSpanPayload[]\n attrs: CrashBufferAttrs | null\n windowMs: number\n fromTs: number\n toTs: number\n}\n\n/**\n * Shared CrashBuffer contract used across browser + react-native implementations.\n *\n * Notes:\n * - `windowMs` is optional because browser implementations usually bake the window into the instance,\n * while React Native typically passes it per call.\n * - `pruneOlderThan` is optional because browser implementations can handle pruning internally.\n */\nexport interface CrashBuffer {\n setAttrs(attrs: CrashBufferAttrs): Promise<void>\n appendEvent(payload: CrashBufferRrwebEventPayload, windowMs?: number): Promise<void>\n appendSpans(payload: CrashBufferOtelSpanBatchPayload, windowMs?: number): Promise<void>\n snapshot(windowMs?: number, now?: number): Promise<CrashBufferSnapshot>\n clear(): Promise<void>\n pruneOlderThan?(cutoffTs: number): Promise<void>\n on?(\n event: CrashBufferEventName,\n listener: (payload: CrashBufferEventMap[CrashBufferEventName]) => void\n ): () => void\n off?(\n event: CrashBufferEventName,\n listener: (payload: CrashBufferEventMap[CrashBufferEventName]) => void\n ): void\n}\n\n/**\n * Optional lifecycle controls supported by some CrashBuffer implementations (e.g. browser tabs).\n */\nexport interface CrashBufferLifecycle extends CrashBuffer {\n setActive(active: boolean): void\n needsFullSnapshot(): boolean\n}\n"]}
|
package/dist/src/type/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/type/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/type/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA"}
|
package/dist/src/type/index.js
CHANGED
|
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./session-type.enum"), exports);
|
|
18
18
|
__exportStar(require("./user-type.enum"), exports);
|
|
19
19
|
__exportStar(require("./session"), exports);
|
|
20
|
+
__exportStar(require("./crash-buffer"), exports);
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/type/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAmC;AACnC,mDAAgC;AAChC,4CAAyB","sourcesContent":["export * from './session-type.enum'\nexport * from './user-type.enum'\nexport * from './session'"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/type/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAmC;AACnC,mDAAgC;AAChC,4CAAyB;AACzB,iDAA8B","sourcesContent":["export * from './session-type.enum'\nexport * from './user-type.enum'\nexport * from './session'\nexport * from './crash-buffer'\n"]}
|
|
@@ -4,6 +4,8 @@ export declare enum SessionType {
|
|
|
4
4
|
* @deprecated Use MANUAL instead
|
|
5
5
|
*/
|
|
6
6
|
PLAIN = "MANUAL",
|
|
7
|
-
MANUAL = "MANUAL"
|
|
7
|
+
MANUAL = "MANUAL",
|
|
8
|
+
CONTINUOUS_SESSION_CACHE = "CONTINUOUS_SESSION_CACHE",
|
|
9
|
+
SESSION_CACHE = "SESSION_CACHE"
|
|
8
10
|
}
|
|
9
11
|
//# sourceMappingURL=session-type.enum.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-type.enum.d.ts","sourceRoot":"","sources":["../../../src/type/session-type.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,UAAU,eAAe;IACzB;;OAEG;IACH,KAAK,WAAW;IAChB,MAAM,WAAW;
|
|
1
|
+
{"version":3,"file":"session-type.enum.d.ts","sourceRoot":"","sources":["../../../src/type/session-type.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,UAAU,eAAe;IACzB;;OAEG;IACH,KAAK,WAAW;IAChB,MAAM,WAAW;IAEjB,wBAAwB,6BAA6B;IACrD,aAAa,kBAAkB;CAChC"}
|
|
@@ -9,5 +9,7 @@ var SessionType;
|
|
|
9
9
|
*/
|
|
10
10
|
SessionType["PLAIN"] = "MANUAL";
|
|
11
11
|
SessionType["MANUAL"] = "MANUAL";
|
|
12
|
+
SessionType["CONTINUOUS_SESSION_CACHE"] = "CONTINUOUS_SESSION_CACHE";
|
|
13
|
+
SessionType["SESSION_CACHE"] = "SESSION_CACHE";
|
|
12
14
|
})(SessionType || (exports.SessionType = SessionType = {}));
|
|
13
15
|
//# sourceMappingURL=session-type.enum.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-type.enum.js","sourceRoot":"","sources":["../../../src/type/session-type.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,
|
|
1
|
+
{"version":3,"file":"session-type.enum.js","sourceRoot":"","sources":["../../../src/type/session-type.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAUX;AAVD,WAAY,WAAW;IACrB,wCAAyB,CAAA;IACzB;;OAEG;IACH,+BAAgB,CAAA;IAChB,gCAAiB,CAAA;IAEjB,oEAAqD,CAAA;IACrD,8CAA+B,CAAA;AACjC,CAAC,EAVW,WAAW,2BAAX,WAAW,QAUtB","sourcesContent":["export enum SessionType {\n CONTINUOUS = 'CONTINUOUS',\n /**\n * @deprecated Use MANUAL instead\n */\n PLAIN = 'MANUAL',\n MANUAL = 'MANUAL',\n\n CONTINUOUS_SESSION_CACHE = 'CONTINUOUS_SESSION_CACHE',\n SESSION_CACHE = 'SESSION_CACHE',\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SessionType } from
|
|
2
|
-
import { UserType } from
|
|
1
|
+
import { SessionType } from './session-type.enum';
|
|
2
|
+
import { UserType } from './user-type.enum';
|
|
3
3
|
export interface IResourceAttributes {
|
|
4
4
|
browserInfo?: string;
|
|
5
5
|
cookiesEnabled?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/type/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/type/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,WAAW,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,GAAG,EAAE,CAAC;IAEZ,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IAEvC,cAAc,CAAC,EAAE,eAAe,CAAA;IAEhC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,oBAAoB,CAAC;QAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IACJ,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAGD,oBAAY,oBAAoB;IAC9B,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/type/session.ts"],"names":[],"mappings":";;;AA+EA,IAAY,oBAIX;AAJD,WAAY,oBAAoB;IAC9B,mDAA2B,CAAA;IAC3B,+CAAuB,CAAA;IACvB,qDAA6B,CAAA;AAC/B,CAAC,EAJW,oBAAoB,oCAApB,oBAAoB,QAI/B","sourcesContent":["import { SessionType } from
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/type/session.ts"],"names":[],"mappings":";;;AA+EA,IAAY,oBAIX;AAJD,WAAY,oBAAoB;IAC9B,mDAA2B,CAAA;IAC3B,+CAAuB,CAAA;IACvB,qDAA6B,CAAA;AAC/B,CAAC,EAJW,oBAAoB,oCAApB,oBAAoB,QAI/B","sourcesContent":["import { SessionType } from './session-type.enum'\nimport { UserType } from './user-type.enum'\n\nexport interface IResourceAttributes {\n browserInfo?: string;\n cookiesEnabled?: string;\n deviceInfo?: string;\n hardwareConcurrency?: number;\n osInfo?: string;\n pixelRatio?: number;\n screenSize?: string;\n packageVersion?: string;\n [key: string]: any;\n}\n\nexport interface ISessionAttributes {\n [key: string]: any;\n}\n\nexport interface IUserAttributes {\n type: UserType\n id?: string\n name?: string\n groupId?: string\n groupName?: string\n userEmail?: string\n userId?: string\n userName?: string\n accountId?: string\n accountName?: string\n orgId?: string\n orgName?: string\n tags?: string[]\n environment?: string\n}\n\nexport interface ISession {\n _id: string;\n shortId: string;\n workspace: string;\n project: string;\n continuousDebugSession?: string;\n creationType: SessionType;\n name: string;\n startedAt: string | Date;\n stoppedAt: string | Date;\n durationInSeconds?: number;\n createdAt: string | Date;\n updatedAt: string | Date;\n tags: any[];\n\n resourceAttributes?: IResourceAttributes;\n sessionAttributes?: ISessionAttributes;\n\n userAttributes?: IUserAttributes\n\n views: ISessionView[];\n starred: boolean;\n starredItems: string[];\n s3Files: {\n _id?: string;\n bucket: string;\n key: string;\n dataType: DebugSessionDataType;\n url?: string;\n }[];\n finishedS3Transfer?: boolean;\n tempApiKey?: string;\n}\n\n\n\nexport interface ISessionView {\n _id: string;\n name: string;\n components?: string[];\n}\n\n\nexport enum DebugSessionDataType {\n OTLP_TRACES = 'OTLP_TRACES',\n OTLP_LOGS = 'OTLP_LOGS',\n RRWEB_EVENTS = 'RRWEB_EVENTS',\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { IdGenerator } from '@opentelemetry/sdk-trace-base'
|
|
2
2
|
import { SessionType } from './type'
|
|
3
|
+
import { getIdGenerator } from './sdk'
|
|
3
4
|
import {
|
|
4
|
-
|
|
5
|
-
MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
|
|
5
|
+
MULTIPLAYER_TRACE_PREFIX_MAP,
|
|
6
6
|
} from './constants/constants.base'
|
|
7
|
-
import { getIdGenerator } from './sdk'
|
|
8
7
|
|
|
9
8
|
export class SessionRecorderIdGenerator implements IdGenerator {
|
|
10
9
|
sessionShortId: string
|
|
11
10
|
sessionType: SessionType
|
|
11
|
+
clientId: string
|
|
12
12
|
private generateLongId: () => string
|
|
13
13
|
private generateShortId: () => string
|
|
14
14
|
|
|
@@ -16,30 +16,22 @@ export class SessionRecorderIdGenerator implements IdGenerator {
|
|
|
16
16
|
this.generateLongId = getIdGenerator(16)
|
|
17
17
|
this.generateShortId = getIdGenerator(8)
|
|
18
18
|
this.sessionShortId = ''
|
|
19
|
+
this.clientId = ''
|
|
19
20
|
this.sessionType = SessionType.MANUAL
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
generateTraceId(): string {
|
|
23
24
|
const traceId = this.generateLongId()
|
|
24
25
|
|
|
25
|
-
if (this.sessionShortId) {
|
|
26
|
-
|
|
27
|
-
switch (this.sessionType) {
|
|
28
|
-
case SessionType.CONTINUOUS:
|
|
29
|
-
sessionTypePrefix = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX
|
|
30
|
-
break
|
|
31
|
-
default:
|
|
32
|
-
sessionTypePrefix = MULTIPLAYER_TRACE_DEBUG_PREFIX
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const prefix = `${sessionTypePrefix}${this.sessionShortId}`
|
|
36
|
-
|
|
37
|
-
const sessionTraceId = `${prefix}${traceId.substring(prefix.length, traceId.length)}`
|
|
38
|
-
|
|
39
|
-
return sessionTraceId
|
|
26
|
+
if (!this.sessionShortId && !this.sessionType) {
|
|
27
|
+
return traceId
|
|
40
28
|
}
|
|
41
29
|
|
|
42
|
-
|
|
30
|
+
const sessionTypePrefix = MULTIPLAYER_TRACE_PREFIX_MAP[this.sessionType]
|
|
31
|
+
const prefix = `${sessionTypePrefix}${[SessionType.CONTINUOUS_SESSION_CACHE, SessionType.SESSION_CACHE].includes(this.sessionType) ? this.clientId : ''}${this.sessionShortId}`
|
|
32
|
+
const sessionTraceId = `${prefix}${traceId.substring(prefix.length, traceId.length)}`
|
|
33
|
+
|
|
34
|
+
return sessionTraceId
|
|
43
35
|
}
|
|
44
36
|
|
|
45
37
|
generateSpanId(): string {
|
|
@@ -49,8 +41,23 @@ export class SessionRecorderIdGenerator implements IdGenerator {
|
|
|
49
41
|
setSessionId(
|
|
50
42
|
sessionShortId: string,
|
|
51
43
|
sessionType: SessionType = SessionType.MANUAL,
|
|
44
|
+
clientId: string = '',
|
|
52
45
|
) {
|
|
46
|
+
if (
|
|
47
|
+
!clientId &&
|
|
48
|
+
[
|
|
49
|
+
SessionType.SESSION_CACHE,
|
|
50
|
+
SessionType.CONTINUOUS_SESSION_CACHE,
|
|
51
|
+
].includes(sessionType)
|
|
52
|
+
) {
|
|
53
|
+
throw new Error(`Client ID is required for ${[
|
|
54
|
+
SessionType.SESSION_CACHE,
|
|
55
|
+
SessionType.CONTINUOUS_SESSION_CACHE,
|
|
56
|
+
].join(', ')} session types`)
|
|
57
|
+
}
|
|
58
|
+
|
|
53
59
|
this.sessionShortId = sessionShortId
|
|
54
60
|
this.sessionType = sessionType
|
|
61
|
+
this.clientId = clientId
|
|
55
62
|
}
|
|
56
63
|
}
|
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
MULTIPLAYER_TRACE_DEBUG_PREFIX,
|
|
9
9
|
MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
|
|
10
|
+
// MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX,
|
|
11
|
+
// MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX,
|
|
10
12
|
} from './constants/constants.base'
|
|
11
13
|
|
|
12
14
|
export class SessionRecorderTraceIdRatioBasedSampler implements Sampler {
|
|
@@ -21,6 +23,8 @@ export class SessionRecorderTraceIdRatioBasedSampler implements Sampler {
|
|
|
21
23
|
if (
|
|
22
24
|
traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
|
|
23
25
|
|| traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)
|
|
26
|
+
// || traceId.startsWith(MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
|
|
27
|
+
// || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX)
|
|
24
28
|
) {
|
|
25
29
|
return {
|
|
26
30
|
decision: SamplingDecision.RECORD_AND_SAMPLED,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SessionType } from '../type'
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* @deprecated
|
|
3
5
|
*/
|
|
@@ -7,7 +9,20 @@ export const MULTIPLAYER_TRACE_DEBUG_PREFIX = 'debdeb'
|
|
|
7
9
|
|
|
8
10
|
export const MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX = 'cdbcdb'
|
|
9
11
|
|
|
10
|
-
export const
|
|
12
|
+
export const MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX = 'cdbcac'
|
|
13
|
+
|
|
14
|
+
export const MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX = 'debcdb'
|
|
15
|
+
|
|
16
|
+
export const MULTIPLAYER_TRACE_PREFIX_MAP = {
|
|
17
|
+
[SessionType.CONTINUOUS]: MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
|
|
18
|
+
[SessionType.SESSION_CACHE]: MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX,
|
|
19
|
+
[SessionType.CONTINUOUS_SESSION_CACHE]: MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX,
|
|
20
|
+
[SessionType.MANUAL]: MULTIPLAYER_TRACE_DEBUG_PREFIX,
|
|
21
|
+
} as Record<SessionType, string>
|
|
22
|
+
|
|
23
|
+
export const MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 8
|
|
24
|
+
|
|
25
|
+
export const MULTIPLAYER_TRACE_CLIENT_ID_LENGTH = 8
|
|
11
26
|
|
|
12
27
|
/**
|
|
13
28
|
* @deprecated Use MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL instead
|
|
@@ -49,6 +64,8 @@ export const ATTR_MULTIPLAYER_INTEGRATION_ID = 'multiplayer.integration.id'
|
|
|
49
64
|
|
|
50
65
|
export const ATTR_MULTIPLAYER_SESSION_ID = 'multiplayer.session.id'
|
|
51
66
|
|
|
67
|
+
export const ATTR_MULTIPLAYER_SESSION_CLIENT_ID = 'multiplayer.session.client.id'
|
|
68
|
+
|
|
52
69
|
export const ATTR_MULTIPLAYER_HTTP_PROXY = 'multiplayer.http.proxy'
|
|
53
70
|
|
|
54
71
|
export const ATTR_MULTIPLAYER_HTTP_PROXY_TYPE = 'multiplayer.http.proxy.type'
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'
|
|
2
|
+
import { ExportResult } from '@opentelemetry/core'
|
|
3
|
+
|
|
2
4
|
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
|
|
3
5
|
import {
|
|
4
6
|
MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,
|
|
5
7
|
MULTIPLAYER_TRACE_DEBUG_PREFIX,
|
|
6
|
-
MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX
|
|
8
|
+
MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX
|
|
7
9
|
} from '../constants/constants.base'
|
|
8
10
|
|
|
9
11
|
export interface SessionRecorderBrowserTraceExporterConfig {
|
|
@@ -48,7 +50,7 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
48
50
|
keepAlive = true,
|
|
49
51
|
concurrencyLimit = 20,
|
|
50
52
|
postMessageType = 'MULTIPLAYER_SESSION_DEBUGGER_LIB',
|
|
51
|
-
postMessageTargetOrigin = '*'
|
|
53
|
+
postMessageTargetOrigin = '*'
|
|
52
54
|
} = config
|
|
53
55
|
|
|
54
56
|
this.config = {
|
|
@@ -56,9 +58,9 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
56
58
|
url,
|
|
57
59
|
apiKey,
|
|
58
60
|
headers,
|
|
59
|
-
timeoutMillis,
|
|
60
61
|
keepAlive,
|
|
61
|
-
|
|
62
|
+
timeoutMillis,
|
|
63
|
+
concurrencyLimit
|
|
62
64
|
}
|
|
63
65
|
this.postMessageType = postMessageType
|
|
64
66
|
this.postMessageTargetOrigin = postMessageTargetOrigin
|
|
@@ -66,15 +68,14 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
66
68
|
this.exporter = this._createExporter()
|
|
67
69
|
}
|
|
68
70
|
|
|
69
|
-
export(
|
|
70
|
-
spans: ReadableSpan[],
|
|
71
|
-
resultCallback: (result: { code: number }) => void,
|
|
72
|
-
): void {
|
|
71
|
+
export(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {
|
|
73
72
|
// Filter spans to only include those with Multiplayer trace prefixes
|
|
74
|
-
const filteredSpans = spans.filter(span => {
|
|
73
|
+
const filteredSpans = spans.filter((span) => {
|
|
75
74
|
const traceId = span.spanContext().traceId
|
|
76
|
-
return
|
|
75
|
+
return (
|
|
76
|
+
traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
|
|
77
77
|
traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)
|
|
78
|
+
)
|
|
78
79
|
})
|
|
79
80
|
|
|
80
81
|
// Only proceed if there are filtered spans
|
|
@@ -104,6 +105,14 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
104
105
|
return this.exporter.shutdown()
|
|
105
106
|
}
|
|
106
107
|
|
|
108
|
+
exportBuffer(spans: ReadableSpan[]): Promise<ExportResult | undefined> {
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
this.exporter.export(spans, (result) => {
|
|
111
|
+
resolve(result)
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
|
|
107
116
|
private exportViaPostMessage(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {
|
|
108
117
|
if (typeof window === 'undefined') {
|
|
109
118
|
resultCallback({ code: 1 })
|
|
@@ -115,9 +124,9 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
115
124
|
{
|
|
116
125
|
action: 'traces',
|
|
117
126
|
type: this.postMessageType,
|
|
118
|
-
payload: spans.map(span => this.
|
|
127
|
+
payload: spans.map((span) => this.serializeSpan(span))
|
|
119
128
|
},
|
|
120
|
-
this.postMessageTargetOrigin
|
|
129
|
+
this.postMessageTargetOrigin
|
|
121
130
|
)
|
|
122
131
|
resultCallback({ code: 0 })
|
|
123
132
|
} catch (e) {
|
|
@@ -125,7 +134,7 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
125
134
|
}
|
|
126
135
|
}
|
|
127
136
|
|
|
128
|
-
|
|
137
|
+
serializeSpan(span: ReadableSpan): any {
|
|
129
138
|
const spanContext = span.spanContext()
|
|
130
139
|
return {
|
|
131
140
|
_spanContext: spanContext,
|
|
@@ -136,17 +145,15 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
136
145
|
events: span.events,
|
|
137
146
|
status: span.status,
|
|
138
147
|
endTime: span.endTime,
|
|
139
|
-
|
|
148
|
+
resource: span.resource,
|
|
140
149
|
duration: span.duration,
|
|
150
|
+
startTime: span.startTime,
|
|
141
151
|
attributes: span.attributes,
|
|
142
|
-
parentSpanId: span.parentSpanContext?.spanId,
|
|
143
|
-
droppedAttributesCount: span.droppedAttributesCount,
|
|
144
|
-
droppedEventsCount: span.droppedEventsCount,
|
|
145
152
|
droppedLinksCount: span.droppedLinksCount,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
153
|
+
parentSpanContext: span.parentSpanContext,
|
|
154
|
+
droppedEventsCount: span.droppedEventsCount,
|
|
155
|
+
instrumentationScope: span.instrumentationScope,
|
|
156
|
+
droppedAttributesCount: span.droppedAttributesCount
|
|
150
157
|
}
|
|
151
158
|
}
|
|
152
159
|
|
|
@@ -155,18 +162,17 @@ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
|
155
162
|
url: this.config.url,
|
|
156
163
|
headers: {
|
|
157
164
|
'Content-Type': 'application/json',
|
|
158
|
-
...(this.config.apiKey ? {
|
|
159
|
-
...(this.config.headers || {})
|
|
165
|
+
...(this.config.apiKey ? { Authorization: this.config.apiKey } : {}),
|
|
166
|
+
...(this.config.headers || {})
|
|
160
167
|
},
|
|
161
168
|
timeoutMillis: this.config.timeoutMillis,
|
|
162
169
|
keepAlive: this.config.keepAlive,
|
|
163
|
-
concurrencyLimit: this.config.concurrencyLimit
|
|
170
|
+
concurrencyLimit: this.config.concurrencyLimit
|
|
164
171
|
})
|
|
165
172
|
}
|
|
166
173
|
|
|
167
174
|
setApiKey(apiKey: string): void {
|
|
168
175
|
this.config.apiKey = apiKey
|
|
169
|
-
|
|
170
176
|
this.exporter = this._createExporter()
|
|
171
177
|
}
|
|
172
178
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export type CrashBufferAttrs = {
|
|
2
|
+
sessionAttributes?: Record<string, any>
|
|
3
|
+
resourceAttributes?: Record<string, any>
|
|
4
|
+
userAttributes?: any
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type CrashBufferRrwebEventPayload = {
|
|
8
|
+
ts: number
|
|
9
|
+
isFullSnapshot?: boolean
|
|
10
|
+
event: any
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type CrashBufferOtelSpanPayload = {
|
|
14
|
+
ts: number
|
|
15
|
+
span: any
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Batch append payload for OTEL spans.
|
|
20
|
+
* This is intentionally the same per-span shape as `CrashBufferOtelSpanPayload`,
|
|
21
|
+
* just provided as an array to allow implementations to persist efficiently.
|
|
22
|
+
*/
|
|
23
|
+
export type CrashBufferOtelSpanBatchPayload = CrashBufferOtelSpanPayload[]
|
|
24
|
+
|
|
25
|
+
export type CrashBufferErrorSpanAppendedEvent = CrashBufferOtelSpanPayload
|
|
26
|
+
|
|
27
|
+
export type CrashBufferEventName = 'error-span-appended'
|
|
28
|
+
|
|
29
|
+
export type CrashBufferEventMap = {
|
|
30
|
+
'error-span-appended': CrashBufferErrorSpanAppendedEvent
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type CrashBufferSnapshot = {
|
|
34
|
+
rrwebEvents: CrashBufferRrwebEventPayload[]
|
|
35
|
+
otelSpans: CrashBufferOtelSpanPayload[]
|
|
36
|
+
attrs: CrashBufferAttrs | null
|
|
37
|
+
windowMs: number
|
|
38
|
+
fromTs: number
|
|
39
|
+
toTs: number
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Shared CrashBuffer contract used across browser + react-native implementations.
|
|
44
|
+
*
|
|
45
|
+
* Notes:
|
|
46
|
+
* - `windowMs` is optional because browser implementations usually bake the window into the instance,
|
|
47
|
+
* while React Native typically passes it per call.
|
|
48
|
+
* - `pruneOlderThan` is optional because browser implementations can handle pruning internally.
|
|
49
|
+
*/
|
|
50
|
+
export interface CrashBuffer {
|
|
51
|
+
setAttrs(attrs: CrashBufferAttrs): Promise<void>
|
|
52
|
+
appendEvent(payload: CrashBufferRrwebEventPayload, windowMs?: number): Promise<void>
|
|
53
|
+
appendSpans(payload: CrashBufferOtelSpanBatchPayload, windowMs?: number): Promise<void>
|
|
54
|
+
snapshot(windowMs?: number, now?: number): Promise<CrashBufferSnapshot>
|
|
55
|
+
clear(): Promise<void>
|
|
56
|
+
pruneOlderThan?(cutoffTs: number): Promise<void>
|
|
57
|
+
on?(
|
|
58
|
+
event: CrashBufferEventName,
|
|
59
|
+
listener: (payload: CrashBufferEventMap[CrashBufferEventName]) => void
|
|
60
|
+
): () => void
|
|
61
|
+
off?(
|
|
62
|
+
event: CrashBufferEventName,
|
|
63
|
+
listener: (payload: CrashBufferEventMap[CrashBufferEventName]) => void
|
|
64
|
+
): void
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Optional lifecycle controls supported by some CrashBuffer implementations (e.g. browser tabs).
|
|
69
|
+
*/
|
|
70
|
+
export interface CrashBufferLifecycle extends CrashBuffer {
|
|
71
|
+
setActive(active: boolean): void
|
|
72
|
+
needsFullSnapshot(): boolean
|
|
73
|
+
}
|
package/src/type/index.ts
CHANGED
package/src/type/session.ts
CHANGED