@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.
Files changed (101) hide show
  1. package/dist/esm/SessionRecorderIdGenerator.d.ts +2 -1
  2. package/dist/esm/SessionRecorderIdGenerator.d.ts.map +1 -1
  3. package/dist/esm/SessionRecorderIdGenerator.js +21 -15
  4. package/dist/esm/SessionRecorderIdGenerator.js.map +1 -1
  5. package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -1
  6. package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js +8 -2
  7. package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -1
  8. package/dist/esm/constants/constants.base.d.ts +7 -1
  9. package/dist/esm/constants/constants.base.d.ts.map +1 -1
  10. package/dist/esm/constants/constants.base.js +13 -1
  11. package/dist/esm/constants/constants.base.js.map +1 -1
  12. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts +3 -1
  13. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
  14. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js +22 -17
  15. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  16. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  17. package/dist/esm/type/crash-buffer.d.ts +59 -0
  18. package/dist/esm/type/crash-buffer.d.ts.map +1 -0
  19. package/dist/esm/type/crash-buffer.js +2 -0
  20. package/dist/esm/type/crash-buffer.js.map +1 -0
  21. package/dist/esm/type/index.d.ts +1 -0
  22. package/dist/esm/type/index.d.ts.map +1 -1
  23. package/dist/esm/type/index.js +1 -0
  24. package/dist/esm/type/index.js.map +1 -1
  25. package/dist/esm/type/session-type.enum.d.ts +3 -1
  26. package/dist/esm/type/session-type.enum.d.ts.map +1 -1
  27. package/dist/esm/type/session-type.enum.js +2 -0
  28. package/dist/esm/type/session-type.enum.js.map +1 -1
  29. package/dist/esm/type/session.d.ts +2 -2
  30. package/dist/esm/type/session.d.ts.map +1 -1
  31. package/dist/esm/type/session.js.map +1 -1
  32. package/dist/esnext/SessionRecorderIdGenerator.d.ts +2 -1
  33. package/dist/esnext/SessionRecorderIdGenerator.d.ts.map +1 -1
  34. package/dist/esnext/SessionRecorderIdGenerator.js +20 -15
  35. package/dist/esnext/SessionRecorderIdGenerator.js.map +1 -1
  36. package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -1
  37. package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js +8 -2
  38. package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -1
  39. package/dist/esnext/constants/constants.base.d.ts +7 -1
  40. package/dist/esnext/constants/constants.base.d.ts.map +1 -1
  41. package/dist/esnext/constants/constants.base.js +12 -1
  42. package/dist/esnext/constants/constants.base.js.map +1 -1
  43. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts +3 -1
  44. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
  45. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js +23 -19
  46. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  47. package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
  48. package/dist/esnext/type/crash-buffer.d.ts +59 -0
  49. package/dist/esnext/type/crash-buffer.d.ts.map +1 -0
  50. package/dist/esnext/type/crash-buffer.js +2 -0
  51. package/dist/esnext/type/crash-buffer.js.map +1 -0
  52. package/dist/esnext/type/index.d.ts +1 -0
  53. package/dist/esnext/type/index.d.ts.map +1 -1
  54. package/dist/esnext/type/index.js +1 -0
  55. package/dist/esnext/type/index.js.map +1 -1
  56. package/dist/esnext/type/session-type.enum.d.ts +3 -1
  57. package/dist/esnext/type/session-type.enum.d.ts.map +1 -1
  58. package/dist/esnext/type/session-type.enum.js +2 -0
  59. package/dist/esnext/type/session-type.enum.js.map +1 -1
  60. package/dist/esnext/type/session.d.ts +2 -2
  61. package/dist/esnext/type/session.d.ts.map +1 -1
  62. package/dist/esnext/type/session.js.map +1 -1
  63. package/dist/src/SessionRecorderIdGenerator.d.ts +2 -1
  64. package/dist/src/SessionRecorderIdGenerator.d.ts.map +1 -1
  65. package/dist/src/SessionRecorderIdGenerator.js +20 -15
  66. package/dist/src/SessionRecorderIdGenerator.js.map +1 -1
  67. package/dist/src/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -1
  68. package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js +4 -1
  69. package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -1
  70. package/dist/src/constants/constants.base.d.ts +7 -1
  71. package/dist/src/constants/constants.base.d.ts.map +1 -1
  72. package/dist/src/constants/constants.base.js +13 -2
  73. package/dist/src/constants/constants.base.js.map +1 -1
  74. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts +3 -1
  75. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
  76. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js +22 -18
  77. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  78. package/dist/src/type/crash-buffer.d.ts +59 -0
  79. package/dist/src/type/crash-buffer.d.ts.map +1 -0
  80. package/dist/src/type/crash-buffer.js +3 -0
  81. package/dist/src/type/crash-buffer.js.map +1 -0
  82. package/dist/src/type/index.d.ts +1 -0
  83. package/dist/src/type/index.d.ts.map +1 -1
  84. package/dist/src/type/index.js +1 -0
  85. package/dist/src/type/index.js.map +1 -1
  86. package/dist/src/type/session-type.enum.d.ts +3 -1
  87. package/dist/src/type/session-type.enum.d.ts.map +1 -1
  88. package/dist/src/type/session-type.enum.js +2 -0
  89. package/dist/src/type/session-type.enum.js.map +1 -1
  90. package/dist/src/type/session.d.ts +2 -2
  91. package/dist/src/type/session.d.ts.map +1 -1
  92. package/dist/src/type/session.js.map +1 -1
  93. package/package.json +1 -1
  94. package/src/SessionRecorderIdGenerator.ts +26 -19
  95. package/src/SessionRecorderTraceIdRatioBasedSampler.ts +4 -0
  96. package/src/constants/constants.base.ts +18 -1
  97. package/src/exporters/SessionRecorderBrowserTraceExporter.ts +31 -25
  98. package/src/type/crash-buffer.ts +73 -0
  99. package/src/type/index.ts +2 -1
  100. package/src/type/session-type.enum.ts +3 -0
  101. 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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=crash-buffer.js.map
@@ -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"]}
@@ -1,4 +1,5 @@
1
1
  export * from './session-type.enum';
2
2
  export * from './user-type.enum';
3
3
  export * from './session';
4
+ export * from './crash-buffer';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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;CAClB"}
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,WAOX;AAPD,WAAY,WAAW;IACrB,wCAAyB,CAAA;IACzB;;OAEG;IACH,+BAAgB,CAAA;IAChB,gCAAiB,CAAA;AACnB,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB","sourcesContent":["export enum SessionType {\n CONTINUOUS = 'CONTINUOUS',\n /**\n * @deprecated Use MANUAL instead\n */\n PLAIN = 'MANUAL',\n MANUAL = 'MANUAL',\n}\n"]}
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 "./session-type.enum";
2
- import { UserType } from "./user-type.enum";
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,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,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
+ {"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 \"./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"]}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplayer-app/session-recorder-common",
3
- "version": "1.3.16",
3
+ "version": "1.3.18-beta.0",
4
4
  "description": "Multiplayer Fullstack Session Recorder - opentelemetry",
5
5
  "author": {
6
6
  "name": "Multiplayer Software, Inc.",
@@ -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
- MULTIPLAYER_TRACE_DEBUG_PREFIX,
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
- let sessionTypePrefix: string = ''
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
- return traceId
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 MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 16
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
- concurrencyLimit,
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 traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
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._serializeSpan(span)),
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
- private _serializeSpan(span: ReadableSpan): any {
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
- startTime: span.startTime,
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
- resource: {
147
- attributes: span.resource.attributes,
148
- asyncAttributesPending: span.resource.asyncAttributesPending,
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 ? { 'Authorization': 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
@@ -1,3 +1,4 @@
1
1
  export * from './session-type.enum'
2
2
  export * from './user-type.enum'
3
- export * from './session'
3
+ export * from './session'
4
+ export * from './crash-buffer'
@@ -5,4 +5,7 @@ export enum SessionType {
5
5
  */
6
6
  PLAIN = 'MANUAL',
7
7
  MANUAL = 'MANUAL',
8
+
9
+ CONTINUOUS_SESSION_CACHE = 'CONTINUOUS_SESSION_CACHE',
10
+ SESSION_CACHE = 'SESSION_CACHE',
8
11
  }
@@ -1,5 +1,5 @@
1
- import { SessionType } from "./session-type.enum";
2
- import { UserType } from "./user-type.enum";
1
+ import { SessionType } from './session-type.enum'
2
+ import { UserType } from './user-type.enum'
3
3
 
4
4
  export interface IResourceAttributes {
5
5
  browserInfo?: string;