@safaricom-mxl/web-sdk 0.0.15 → 0.0.16

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 (55) hide show
  1. package/dist/constants/attributes.cjs +2 -0
  2. package/dist/constants/attributes.cjs.map +1 -1
  3. package/dist/constants/attributes.d.cts +2 -1
  4. package/dist/constants/attributes.d.cts.map +1 -1
  5. package/dist/constants/attributes.d.ts +2 -1
  6. package/dist/constants/attributes.d.ts.map +1 -1
  7. package/dist/constants/attributes.js +2 -1
  8. package/dist/constants/attributes.js.map +1 -1
  9. package/dist/constants/index.cjs +1 -0
  10. package/dist/constants/index.d.cts +2 -2
  11. package/dist/constants/index.d.ts +2 -2
  12. package/dist/constants/index.js +2 -2
  13. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.cjs +1 -1
  14. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.cjs.map +1 -1
  15. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.d.cts.map +1 -1
  16. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.d.ts.map +1 -1
  17. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.js +2 -2
  18. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.js.map +1 -1
  19. package/dist/managers/MXLLogManager/MXLLogManager.cjs +3 -1
  20. package/dist/managers/MXLLogManager/MXLLogManager.cjs.map +1 -1
  21. package/dist/managers/MXLLogManager/MXLLogManager.d.cts.map +1 -1
  22. package/dist/managers/MXLLogManager/MXLLogManager.d.ts.map +1 -1
  23. package/dist/managers/MXLLogManager/MXLLogManager.js +4 -2
  24. package/dist/managers/MXLLogManager/MXLLogManager.js.map +1 -1
  25. package/dist/mxl-web-sdk.js +3 -38
  26. package/dist/mxl-web-sdk.js.map +1 -1
  27. package/dist/resources/constants/index.cjs +1 -1
  28. package/dist/resources/constants/index.cjs.map +1 -1
  29. package/dist/resources/constants/index.d.cts +1 -1
  30. package/dist/resources/constants/index.d.ts +1 -1
  31. package/dist/resources/constants/index.js +1 -1
  32. package/dist/resources/constants/index.js.map +1 -1
  33. package/dist/sdk/initSDK.cjs +14 -12
  34. package/dist/sdk/initSDK.cjs.map +1 -1
  35. package/dist/sdk/initSDK.d.cts.map +1 -1
  36. package/dist/sdk/initSDK.d.ts.map +1 -1
  37. package/dist/sdk/initSDK.js +14 -12
  38. package/dist/sdk/initSDK.js.map +1 -1
  39. package/dist/sdk/noopSessionRecording.cjs +10 -0
  40. package/dist/sdk/noopSessionRecording.cjs.map +1 -0
  41. package/dist/sdk/noopSessionRecording.d.cts +7 -0
  42. package/dist/sdk/noopSessionRecording.d.cts.map +1 -0
  43. package/dist/sdk/noopSessionRecording.d.ts +7 -0
  44. package/dist/sdk/noopSessionRecording.d.ts.map +1 -0
  45. package/dist/sdk/noopSessionRecording.js +9 -0
  46. package/dist/sdk/noopSessionRecording.js.map +1 -0
  47. package/dist/sdk/setupSessionRecorder.cjs +64 -22
  48. package/dist/sdk/setupSessionRecorder.cjs.map +1 -1
  49. package/dist/sdk/setupSessionRecorder.d.cts +16 -7
  50. package/dist/sdk/setupSessionRecorder.d.cts.map +1 -1
  51. package/dist/sdk/setupSessionRecorder.d.ts +16 -7
  52. package/dist/sdk/setupSessionRecorder.d.ts.map +1 -1
  53. package/dist/sdk/setupSessionRecorder.js +62 -21
  54. package/dist/sdk/setupSessionRecorder.js.map +1 -1
  55. package/package.json +2 -2
@@ -1,21 +1,30 @@
1
1
  import { SessionRecorderUserConfig, SessionRecordingControl } from "./types.cjs";
2
+ import { DiagLogger } from "@opentelemetry/api";
2
3
  import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
3
4
  import { Resource } from "@opentelemetry/resources";
5
+ import * as _$_safaricom_mxl_session_recorder0 from "@safaricom-mxl/session-recorder";
4
6
 
5
7
  //#region src/sdk/setupSessionRecorder.d.ts
6
- declare const noopSessionRecording: SessionRecordingControl;
7
- declare function createSessionRecordingControl(args: {
8
+ type SessionRecorderModule = typeof _$_safaricom_mxl_session_recorder0;
9
+ declare function loadSessionRecorderModule(): Promise<SessionRecorderModule>;
10
+ declare function resetSessionRecorderModuleCache(): void;
11
+ declare function setSessionRecorderModuleLoaderForTests(loader: (() => Promise<SessionRecorderModule>) | undefined): void;
12
+ interface SpanSessionManagerForRecorder {
13
+ getSessionId: () => string | null;
14
+ addSessionStartedListener: (listener: () => void) => () => void;
15
+ }
16
+ interface CreateSessionRecordingControlArgs {
8
17
  resource: Resource;
9
- spanSessionManager: {
10
- getSessionId: () => string | null;
11
- };
18
+ spanSessionManager: SpanSessionManagerForRecorder;
12
19
  tracerProvider: WebTracerProvider;
13
20
  appID: string;
14
21
  userID: string;
15
22
  mxlDataURL?: string;
16
23
  recordUserSessions: boolean;
17
24
  sessionRecorder?: SessionRecorderUserConfig;
18
- }): SessionRecordingControl;
25
+ diagLogger: DiagLogger;
26
+ }
27
+ declare function createSessionRecordingControl(args: CreateSessionRecordingControlArgs): SessionRecordingControl;
19
28
  //#endregion
20
- export { createSessionRecordingControl, noopSessionRecording };
29
+ export { createSessionRecordingControl, loadSessionRecorderModule, resetSessionRecorderModuleCache, setSessionRecorderModuleLoaderForTests };
21
30
  //# sourceMappingURL=setupSessionRecorder.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupSessionRecorder.d.cts","names":[],"sources":["../../src/sdk/setupSessionRecorder.ts"],"mappings":";;;;;cAca,oBAAA,EAAsB,uBAAA;AAAA,iBAsCnB,6BAAA,CAA8B,IAAA;EAC5C,QAAA,EAAU,QAAA;EACV,kBAAA;IAAsB,YAAA;EAAA;EACtB,cAAA,EAAgB,iBAAA;EAChB,KAAA;EACA,MAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA,GAAkB,yBAAA;AAAA,IAChB,uBAAA"}
1
+ {"version":3,"file":"setupSessionRecorder.d.cts","names":[],"sources":["../../src/sdk/setupSessionRecorder.ts"],"mappings":";;;;;;;KAWK,qBAAA,UAAqB,kCAAA;AAAA,iBAOV,yBAAA,CAAA,GAA6B,OAAA,CAAQ,qBAAA;AAAA,iBASrC,+BAAA,CAAA;AAAA,iBAKA,sCAAA,CACd,MAAA,SAAe,OAAA,CAAQ,qBAAA;AAAA,UAMf,6BAAA;EACR,YAAA;EACA,yBAAA,GAA4B,QAAA;AAAA;AAAA,UAGpB,iCAAA;EACR,QAAA,EAAU,QAAA;EACV,kBAAA,EAAoB,6BAAA;EACpB,cAAA,EAAgB,iBAAA;EAChB,KAAA;EACA,MAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA,GAAkB,yBAAA;EAClB,UAAA,EAAY,UAAA;AAAA;AAAA,iBA6BE,6BAAA,CACd,IAAA,EAAM,iCAAA,GACL,uBAAA"}
@@ -1,21 +1,30 @@
1
1
  import { SessionRecorderUserConfig, SessionRecordingControl } from "./types.js";
2
+ import { DiagLogger } from "@opentelemetry/api";
2
3
  import { Resource } from "@opentelemetry/resources";
3
4
  import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
5
+ import * as _$_safaricom_mxl_session_recorder0 from "@safaricom-mxl/session-recorder";
4
6
 
5
7
  //#region src/sdk/setupSessionRecorder.d.ts
6
- declare const noopSessionRecording: SessionRecordingControl;
7
- declare function createSessionRecordingControl(args: {
8
+ type SessionRecorderModule = typeof _$_safaricom_mxl_session_recorder0;
9
+ declare function loadSessionRecorderModule(): Promise<SessionRecorderModule>;
10
+ declare function resetSessionRecorderModuleCache(): void;
11
+ declare function setSessionRecorderModuleLoaderForTests(loader: (() => Promise<SessionRecorderModule>) | undefined): void;
12
+ interface SpanSessionManagerForRecorder {
13
+ getSessionId: () => string | null;
14
+ addSessionStartedListener: (listener: () => void) => () => void;
15
+ }
16
+ interface CreateSessionRecordingControlArgs {
8
17
  resource: Resource;
9
- spanSessionManager: {
10
- getSessionId: () => string | null;
11
- };
18
+ spanSessionManager: SpanSessionManagerForRecorder;
12
19
  tracerProvider: WebTracerProvider;
13
20
  appID: string;
14
21
  userID: string;
15
22
  mxlDataURL?: string;
16
23
  recordUserSessions: boolean;
17
24
  sessionRecorder?: SessionRecorderUserConfig;
18
- }): SessionRecordingControl;
25
+ diagLogger: DiagLogger;
26
+ }
27
+ declare function createSessionRecordingControl(args: CreateSessionRecordingControlArgs): SessionRecordingControl;
19
28
  //#endregion
20
- export { createSessionRecordingControl, noopSessionRecording };
29
+ export { createSessionRecordingControl, loadSessionRecorderModule, resetSessionRecorderModuleCache, setSessionRecorderModuleLoaderForTests };
21
30
  //# sourceMappingURL=setupSessionRecorder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupSessionRecorder.d.ts","names":[],"sources":["../../src/sdk/setupSessionRecorder.ts"],"mappings":";;;;;cAca,oBAAA,EAAsB,uBAAA;AAAA,iBAsCnB,6BAAA,CAA8B,IAAA;EAC5C,QAAA,EAAU,QAAA;EACV,kBAAA;IAAsB,YAAA;EAAA;EACtB,cAAA,EAAgB,iBAAA;EAChB,KAAA;EACA,MAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA,GAAkB,yBAAA;AAAA,IAChB,uBAAA"}
1
+ {"version":3,"file":"setupSessionRecorder.d.ts","names":[],"sources":["../../src/sdk/setupSessionRecorder.ts"],"mappings":";;;;;;;KAWK,qBAAA,UAAqB,kCAAA;AAAA,iBAOV,yBAAA,CAAA,GAA6B,OAAA,CAAQ,qBAAA;AAAA,iBASrC,+BAAA,CAAA;AAAA,iBAKA,sCAAA,CACd,MAAA,SAAe,OAAA,CAAQ,qBAAA;AAAA,UAMf,6BAAA;EACR,YAAA;EACA,yBAAA,GAA4B,QAAA;AAAA;AAAA,UAGpB,iCAAA;EACR,QAAA,EAAU,QAAA;EACV,kBAAA,EAAoB,6BAAA;EACpB,cAAA,EAAgB,iBAAA;EAChB,KAAA;EACA,MAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA,GAAkB,yBAAA;EAClB,UAAA,EAAY,UAAA;AAAA;AAAA,iBA6BE,6BAAA,CACd,IAAA,EAAM,iCAAA,GACL,uBAAA"}
@@ -1,42 +1,83 @@
1
1
  import { getMXLHeaders } from "../exporters/utils.js";
2
2
  import { getLogEndpoint } from "../exporters/MXLLogExporter/utils.js";
3
- import { SessionRecorder, VERSION } from "@safaricom-mxl/session-recorder";
4
3
  //#region src/sdk/setupSessionRecorder.ts
5
- const noopSessionRecording = {
6
- isRecording: () => false,
7
- setEnabled: () => {}
8
- };
9
- function buildInitConfig({ resource, spanSessionManager, tracerProvider, appID, userID, mxlDataURL, sessionRecorder: userOptions }) {
4
+ let sessionRecorderModulePromise;
5
+ let sessionRecorderModuleLoaderOverride;
6
+ function loadSessionRecorderModule() {
7
+ if (sessionRecorderModuleLoaderOverride) return sessionRecorderModuleLoaderOverride();
8
+ sessionRecorderModulePromise ??= import("@safaricom-mxl/session-recorder");
9
+ return sessionRecorderModulePromise;
10
+ }
11
+ function resetSessionRecorderModuleCache() {
12
+ sessionRecorderModulePromise = void 0;
13
+ sessionRecorderModuleLoaderOverride = void 0;
14
+ }
15
+ function setSessionRecorderModuleLoaderForTests(loader) {
16
+ sessionRecorderModuleLoaderOverride = loader;
17
+ sessionRecorderModulePromise = void 0;
18
+ }
19
+ function buildInitConfig({ resource, spanSessionManager, tracerProvider, appID, userID, mxlDataURL, sessionRecorder: userOptions }, sessionRecorderVersion) {
10
20
  return {
11
21
  resource,
12
22
  getSessionId: () => spanSessionManager.getSessionId(),
13
- tracer: tracerProvider.getTracer("mxl.session-recorder", VERSION),
23
+ tracer: tracerProvider.getTracer("mxl.session-recorder", sessionRecorderVersion),
14
24
  url: getLogEndpoint(appID, mxlDataURL),
15
25
  headers: getMXLHeaders(appID, userID),
16
26
  ...userOptions
17
27
  };
18
28
  }
19
29
  function createSessionRecordingControl(args) {
20
- const initConfig = () => buildInitConfig(args);
21
- if (args.recordUserSessions) {
22
- SessionRecorder.init(initConfig());
23
- return {
24
- isRecording: () => SessionRecorder.isRecording(),
25
- setEnabled: (enabled) => {
26
- SessionRecorder.setEnabled(enabled);
30
+ let sessionRecorderModule;
31
+ let initStarted = false;
32
+ let initComplete = false;
33
+ let initFailed = false;
34
+ let pendingInit;
35
+ const getSessionRecorder = () => sessionRecorderModule?.SessionRecorder;
36
+ const waitForSessionStart = () => new Promise((resolve) => {
37
+ const removeListener = args.spanSessionManager.addSessionStartedListener(() => {
38
+ removeListener();
39
+ resolve();
40
+ });
41
+ });
42
+ const initSessionRecorderWhenReady = () => {
43
+ if (initComplete || initFailed) return Promise.resolve();
44
+ pendingInit ??= (async () => {
45
+ if (args.spanSessionManager.getSessionId() === null) await waitForSessionStart();
46
+ if (initComplete || initFailed || initStarted) return;
47
+ initStarted = true;
48
+ try {
49
+ sessionRecorderModule = await loadSessionRecorderModule();
50
+ const config = buildInitConfig(args, sessionRecorderModule.VERSION);
51
+ sessionRecorderModule.SessionRecorder.init(config);
52
+ initComplete = true;
53
+ } catch (error) {
54
+ initFailed = true;
55
+ args.diagLogger.error("Failed to initialize session recorder", error);
56
+ } finally {
57
+ pendingInit = void 0;
27
58
  }
28
- };
29
- }
59
+ })();
60
+ return pendingInit;
61
+ };
62
+ if (args.recordUserSessions) initSessionRecorderWhenReady();
30
63
  return {
31
- isRecording: () => SessionRecorder.isRecording(),
64
+ isRecording: () => Boolean(getSessionRecorder()?.isRecording()),
32
65
  setEnabled: (enabled) => {
33
- if (enabled) if (!SessionRecorder.inited) SessionRecorder.init(initConfig());
34
- else SessionRecorder.resume();
35
- else if (SessionRecorder.inited) SessionRecorder.stop();
66
+ if (enabled) {
67
+ if (initComplete) {
68
+ getSessionRecorder()?.setEnabled(true);
69
+ return;
70
+ }
71
+ initSessionRecorderWhenReady().then(() => {
72
+ if (initComplete) getSessionRecorder()?.setEnabled(true);
73
+ });
74
+ return;
75
+ }
76
+ if (initComplete) getSessionRecorder()?.setEnabled(false);
36
77
  }
37
78
  };
38
79
  }
39
80
  //#endregion
40
- export { createSessionRecordingControl, noopSessionRecording };
81
+ export { createSessionRecordingControl, loadSessionRecorderModule, resetSessionRecorderModuleCache, setSessionRecorderModuleLoaderForTests };
41
82
 
42
83
  //# sourceMappingURL=setupSessionRecorder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupSessionRecorder.js","names":["SESSION_RECORDER_VERSION"],"sources":["../../src/sdk/setupSessionRecorder.ts"],"sourcesContent":["import type { Resource } from '@opentelemetry/resources';\nimport type { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport type { SessionRecorderConfig } from '@safaricom-mxl/session-recorder';\nimport {\n VERSION as SESSION_RECORDER_VERSION,\n SessionRecorder,\n} from '@safaricom-mxl/session-recorder';\nimport { getLogEndpoint } from '../exporters/MXLLogExporter/utils';\nimport { getMXLHeaders } from '../exporters';\nimport type {\n SessionRecorderUserConfig,\n SessionRecordingControl,\n} from './types';\n\nexport const noopSessionRecording: SessionRecordingControl = {\n isRecording: () => false,\n setEnabled: () => {\n // Session recording is only available when using MXL (appID + user ID).\n },\n};\n\nfunction buildInitConfig({\n resource,\n spanSessionManager,\n tracerProvider,\n appID,\n userID,\n mxlDataURL,\n sessionRecorder: userOptions,\n}: {\n resource: Resource;\n spanSessionManager: { getSessionId: () => string | null };\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n sessionRecorder?: SessionRecorderUserConfig;\n}): SessionRecorderConfig {\n const tracer = tracerProvider.getTracer(\n 'mxl.session-recorder',\n SESSION_RECORDER_VERSION,\n );\n return {\n resource,\n getSessionId: () => spanSessionManager.getSessionId(),\n tracer,\n url: getLogEndpoint(appID, mxlDataURL),\n headers: getMXLHeaders(appID, userID),\n ...userOptions,\n } as SessionRecorderConfig;\n}\n\nexport function createSessionRecordingControl(args: {\n resource: Resource;\n spanSessionManager: { getSessionId: () => string | null };\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n recordUserSessions: boolean;\n sessionRecorder?: SessionRecorderUserConfig;\n}): SessionRecordingControl {\n const initConfig = () => buildInitConfig(args);\n\n if (args.recordUserSessions) {\n SessionRecorder.init(initConfig());\n return {\n isRecording: () => SessionRecorder.isRecording(),\n setEnabled: (enabled: boolean) => {\n SessionRecorder.setEnabled(enabled);\n },\n };\n }\n\n // Defer rrweb + OTLP until the app calls setEnabled(true) (lazy start).\n return {\n isRecording: () => SessionRecorder.isRecording(),\n setEnabled: (enabled: boolean) => {\n if (enabled) {\n if (!SessionRecorder.inited) {\n SessionRecorder.init(initConfig());\n } else {\n SessionRecorder.resume();\n }\n } else if (SessionRecorder.inited) {\n SessionRecorder.stop();\n }\n },\n };\n}\n"],"mappings":";;;;AAcA,MAAa,uBAAgD;CAC3D,mBAAmB;CACnB,kBAAkB;CAGnB;AAED,SAAS,gBAAgB,EACvB,UACA,oBACA,gBACA,OACA,QACA,YACA,iBAAiB,eASO;AAKxB,QAAO;EACL;EACA,oBAAoB,mBAAmB,cAAc;EACrD,QAPa,eAAe,UAC5B,wBACAA,QAKM;EACN,KAAK,eAAe,OAAO,WAAW;EACtC,SAAS,cAAc,OAAO,OAAO;EACrC,GAAG;EACJ;;AAGH,SAAgB,8BAA8B,MASlB;CAC1B,MAAM,mBAAmB,gBAAgB,KAAK;AAE9C,KAAI,KAAK,oBAAoB;AAC3B,kBAAgB,KAAK,YAAY,CAAC;AAClC,SAAO;GACL,mBAAmB,gBAAgB,aAAa;GAChD,aAAa,YAAqB;AAChC,oBAAgB,WAAW,QAAQ;;GAEtC;;AAIH,QAAO;EACL,mBAAmB,gBAAgB,aAAa;EAChD,aAAa,YAAqB;AAChC,OAAI,QACF,KAAI,CAAC,gBAAgB,OACnB,iBAAgB,KAAK,YAAY,CAAC;OAElC,iBAAgB,QAAQ;YAEjB,gBAAgB,OACzB,iBAAgB,MAAM;;EAG3B"}
1
+ {"version":3,"file":"setupSessionRecorder.js","names":[],"sources":["../../src/sdk/setupSessionRecorder.ts"],"sourcesContent":["import type { DiagLogger } from '@opentelemetry/api';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport type { SessionRecorderConfig } from '@safaricom-mxl/session-recorder';\nimport { getLogEndpoint } from '../exporters/MXLLogExporter/utils';\nimport { getMXLHeaders } from '../exporters/utils';\nimport type {\n SessionRecorderUserConfig,\n SessionRecordingControl,\n} from './types';\n\ntype SessionRecorderModule = typeof import('@safaricom-mxl/session-recorder');\n\nlet sessionRecorderModulePromise: Promise<SessionRecorderModule> | undefined;\nlet sessionRecorderModuleLoaderOverride:\n | (() => Promise<SessionRecorderModule>)\n | undefined;\n\nexport function loadSessionRecorderModule(): Promise<SessionRecorderModule> {\n if (sessionRecorderModuleLoaderOverride) {\n return sessionRecorderModuleLoaderOverride();\n }\n\n sessionRecorderModulePromise ??= import('@safaricom-mxl/session-recorder');\n return sessionRecorderModulePromise;\n}\n\nexport function resetSessionRecorderModuleCache(): void {\n sessionRecorderModulePromise = undefined;\n sessionRecorderModuleLoaderOverride = undefined;\n}\n\nexport function setSessionRecorderModuleLoaderForTests(\n loader: (() => Promise<SessionRecorderModule>) | undefined,\n): void {\n sessionRecorderModuleLoaderOverride = loader;\n sessionRecorderModulePromise = undefined;\n}\n\ninterface SpanSessionManagerForRecorder {\n getSessionId: () => string | null;\n addSessionStartedListener: (listener: () => void) => () => void;\n}\n\ninterface CreateSessionRecordingControlArgs {\n resource: Resource;\n spanSessionManager: SpanSessionManagerForRecorder;\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n recordUserSessions: boolean;\n sessionRecorder?: SessionRecorderUserConfig;\n diagLogger: DiagLogger;\n}\n\nfunction buildInitConfig(\n {\n resource,\n spanSessionManager,\n tracerProvider,\n appID,\n userID,\n mxlDataURL,\n sessionRecorder: userOptions,\n }: CreateSessionRecordingControlArgs,\n sessionRecorderVersion: string,\n): SessionRecorderConfig {\n const tracer = tracerProvider.getTracer(\n 'mxl.session-recorder',\n sessionRecorderVersion,\n );\n return {\n resource,\n getSessionId: () => spanSessionManager.getSessionId(),\n tracer,\n url: getLogEndpoint(appID, mxlDataURL),\n headers: getMXLHeaders(appID, userID),\n ...userOptions,\n } as SessionRecorderConfig;\n}\n\nexport function createSessionRecordingControl(\n args: CreateSessionRecordingControlArgs,\n): SessionRecordingControl {\n let sessionRecorderModule: SessionRecorderModule | undefined;\n let initStarted = false;\n let initComplete = false;\n let initFailed = false;\n let pendingInit: Promise<void> | undefined;\n\n const getSessionRecorder = ():\n | SessionRecorderModule['SessionRecorder']\n | undefined => sessionRecorderModule?.SessionRecorder;\n\n const waitForSessionStart = (): Promise<void> =>\n new Promise((resolve) => {\n const removeListener = args.spanSessionManager.addSessionStartedListener(\n () => {\n removeListener();\n resolve();\n },\n );\n });\n\n const initSessionRecorderWhenReady = (): Promise<void> => {\n if (initComplete || initFailed) {\n return Promise.resolve();\n }\n\n pendingInit ??= (async () => {\n if (args.spanSessionManager.getSessionId() === null) {\n await waitForSessionStart();\n }\n\n if (initComplete || initFailed || initStarted) {\n return;\n }\n initStarted = true;\n\n try {\n sessionRecorderModule = await loadSessionRecorderModule();\n const config = buildInitConfig(args, sessionRecorderModule.VERSION);\n sessionRecorderModule.SessionRecorder.init(config);\n initComplete = true;\n } catch (error) {\n initFailed = true;\n args.diagLogger.error('Failed to initialize session recorder', error);\n } finally {\n pendingInit = undefined;\n }\n })();\n\n return pendingInit;\n };\n\n if (args.recordUserSessions) {\n void initSessionRecorderWhenReady();\n }\n\n return {\n isRecording: () => Boolean(getSessionRecorder()?.isRecording()),\n setEnabled: (enabled: boolean) => {\n if (enabled) {\n if (initComplete) {\n getSessionRecorder()?.setEnabled(true);\n return;\n }\n void initSessionRecorderWhenReady().then(() => {\n if (initComplete) {\n getSessionRecorder()?.setEnabled(true);\n }\n });\n return;\n }\n\n if (initComplete) {\n getSessionRecorder()?.setEnabled(false);\n }\n },\n };\n}\n"],"mappings":";;;AAaA,IAAI;AACJ,IAAI;AAIJ,SAAgB,4BAA4D;AAC1E,KAAI,oCACF,QAAO,qCAAqC;AAG9C,kCAAiC,OAAO;AACxC,QAAO;;AAGT,SAAgB,kCAAwC;AACtD,gCAA+B,KAAA;AAC/B,uCAAsC,KAAA;;AAGxC,SAAgB,uCACd,QACM;AACN,uCAAsC;AACtC,gCAA+B,KAAA;;AAoBjC,SAAS,gBACP,EACE,UACA,oBACA,gBACA,OACA,QACA,YACA,iBAAiB,eAEnB,wBACuB;AAKvB,QAAO;EACL;EACA,oBAAoB,mBAAmB,cAAc;EACrD,QAPa,eAAe,UAC5B,wBACA,uBAKM;EACN,KAAK,eAAe,OAAO,WAAW;EACtC,SAAS,cAAc,OAAO,OAAO;EACrC,GAAG;EACJ;;AAGH,SAAgB,8BACd,MACyB;CACzB,IAAI;CACJ,IAAI,cAAc;CAClB,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,IAAI;CAEJ,MAAM,2BAEW,uBAAuB;CAExC,MAAM,4BACJ,IAAI,SAAS,YAAY;EACvB,MAAM,iBAAiB,KAAK,mBAAmB,gCACvC;AACJ,mBAAgB;AAChB,YAAS;IAEZ;GACD;CAEJ,MAAM,qCAAoD;AACxD,MAAI,gBAAgB,WAClB,QAAO,QAAQ,SAAS;AAG1B,mBAAiB,YAAY;AAC3B,OAAI,KAAK,mBAAmB,cAAc,KAAK,KAC7C,OAAM,qBAAqB;AAG7B,OAAI,gBAAgB,cAAc,YAChC;AAEF,iBAAc;AAEd,OAAI;AACF,4BAAwB,MAAM,2BAA2B;IACzD,MAAM,SAAS,gBAAgB,MAAM,sBAAsB,QAAQ;AACnE,0BAAsB,gBAAgB,KAAK,OAAO;AAClD,mBAAe;YACR,OAAO;AACd,iBAAa;AACb,SAAK,WAAW,MAAM,yCAAyC,MAAM;aAC7D;AACR,kBAAc,KAAA;;MAEd;AAEJ,SAAO;;AAGT,KAAI,KAAK,mBACF,+BAA8B;AAGrC,QAAO;EACL,mBAAmB,QAAQ,oBAAoB,EAAE,aAAa,CAAC;EAC/D,aAAa,YAAqB;AAChC,OAAI,SAAS;AACX,QAAI,cAAc;AAChB,yBAAoB,EAAE,WAAW,KAAK;AACtC;;AAEG,kCAA8B,CAAC,WAAW;AAC7C,SAAI,aACF,qBAAoB,EAAE,WAAW,KAAK;MAExC;AACF;;AAGF,OAAI,aACF,qBAAoB,EAAE,WAAW,MAAM;;EAG5C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@safaricom-mxl/web-sdk",
3
- "version": "0.0.15",
3
+ "version": "0.0.16",
4
4
  "description": "MXL Web SDK",
5
5
  "type": "module",
6
6
  "imports": {
@@ -91,7 +91,7 @@
91
91
  "@opentelemetry/sdk-trace-web": "^2.7.1",
92
92
  "@opentelemetry/semantic-conventions": "^1.41.1",
93
93
  "@opentelemetry/web-common": "^0.218.0",
94
- "@safaricom-mxl/session-recorder": "0.0.12",
94
+ "@safaricom-mxl/session-recorder": "0.0.16",
95
95
  "hoist-non-react-statics": "^3.3.2",
96
96
  "web-vitals": "^5.2.0"
97
97
  },