@grafana/faro-web-sdk 1.2.2 → 1.2.4

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 (104) hide show
  1. package/dist/bundle/faro-web-sdk.iife.js +1 -1
  2. package/dist/bundle/types/index.d.ts +1 -1
  3. package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
  4. package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
  5. package/dist/bundle/types/instrumentations/session/index.d.ts +1 -1
  6. package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +2 -2
  7. package/dist/bundle/types/instrumentations/session/sessionManager/PersistentSessionsManager.d.ts +12 -0
  8. package/dist/bundle/types/instrumentations/session/sessionManager/VolatileSessionManager.d.ts +12 -0
  9. package/dist/bundle/types/instrumentations/session/sessionManager/index.d.ts +3 -0
  10. package/dist/bundle/types/instrumentations/session/sessionManager/sessionManagerUtils.d.ts +16 -0
  11. package/dist/bundle/types/instrumentations/session/sessionManager/types.d.ts +7 -0
  12. package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
  13. package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  14. package/dist/bundle/types/metas/index.d.ts +1 -0
  15. package/dist/bundle/types/metas/sdk/index.d.ts +1 -0
  16. package/dist/bundle/types/metas/sdk/meta.d.ts +2 -0
  17. package/dist/bundle/types/transports/console/transport.d.ts +1 -1
  18. package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
  19. package/dist/bundle/types/utils/webStorage.d.ts +30 -4
  20. package/dist/cjs/config/makeCoreConfig.js +22 -7
  21. package/dist/cjs/config/makeCoreConfig.js.map +1 -1
  22. package/dist/cjs/index.js +3 -2
  23. package/dist/cjs/index.js.map +1 -1
  24. package/dist/cjs/instrumentations/session/index.js +1 -1
  25. package/dist/cjs/instrumentations/session/index.js.map +1 -1
  26. package/dist/cjs/instrumentations/session/instrumentation.js +20 -9
  27. package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
  28. package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js +66 -0
  29. package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -0
  30. package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js +55 -0
  31. package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -0
  32. package/dist/cjs/instrumentations/session/sessionManager/index.js +8 -0
  33. package/dist/cjs/instrumentations/session/sessionManager/index.js.map +1 -0
  34. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +77 -0
  35. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -0
  36. package/dist/cjs/instrumentations/session/sessionManager/types.js +3 -0
  37. package/dist/cjs/instrumentations/session/sessionManager/types.js.map +1 -0
  38. package/dist/cjs/metas/index.js +3 -1
  39. package/dist/cjs/metas/index.js.map +1 -1
  40. package/dist/cjs/metas/k6/meta.js +3 -1
  41. package/dist/cjs/metas/k6/meta.js.map +1 -1
  42. package/dist/cjs/metas/sdk/index.js +6 -0
  43. package/dist/cjs/metas/sdk/index.js.map +1 -0
  44. package/dist/cjs/metas/sdk/meta.js +16 -0
  45. package/dist/cjs/metas/sdk/meta.js.map +1 -0
  46. package/dist/cjs/transports/fetch/transport.js +1 -1
  47. package/dist/cjs/transports/fetch/transport.js.map +1 -1
  48. package/dist/cjs/utils/webStorage.js +47 -11
  49. package/dist/cjs/utils/webStorage.js.map +1 -1
  50. package/dist/esm/config/makeCoreConfig.js +23 -8
  51. package/dist/esm/config/makeCoreConfig.js.map +1 -1
  52. package/dist/esm/index.js +1 -1
  53. package/dist/esm/index.js.map +1 -1
  54. package/dist/esm/instrumentations/session/index.js +1 -1
  55. package/dist/esm/instrumentations/session/index.js.map +1 -1
  56. package/dist/esm/instrumentations/session/instrumentation.js +20 -8
  57. package/dist/esm/instrumentations/session/instrumentation.js.map +1 -1
  58. package/dist/esm/instrumentations/session/sessionManager/PersistentSessionsManager.js +59 -0
  59. package/dist/esm/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -0
  60. package/dist/esm/instrumentations/session/sessionManager/VolatileSessionManager.js +48 -0
  61. package/dist/esm/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -0
  62. package/dist/esm/instrumentations/session/sessionManager/index.js +3 -0
  63. package/dist/esm/instrumentations/session/sessionManager/index.js.map +1 -0
  64. package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js +58 -0
  65. package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -0
  66. package/dist/esm/instrumentations/session/sessionManager/types.js +2 -0
  67. package/dist/esm/instrumentations/session/sessionManager/types.js.map +1 -0
  68. package/dist/esm/metas/index.js +1 -0
  69. package/dist/esm/metas/index.js.map +1 -1
  70. package/dist/esm/metas/k6/meta.js +3 -1
  71. package/dist/esm/metas/k6/meta.js.map +1 -1
  72. package/dist/esm/metas/sdk/index.js +2 -0
  73. package/dist/esm/metas/sdk/index.js.map +1 -0
  74. package/dist/esm/metas/sdk/meta.js +9 -0
  75. package/dist/esm/metas/sdk/meta.js.map +1 -0
  76. package/dist/esm/transports/fetch/transport.js +1 -1
  77. package/dist/esm/transports/fetch/transport.js.map +1 -1
  78. package/dist/esm/utils/webStorage.js +46 -10
  79. package/dist/esm/utils/webStorage.js.map +1 -1
  80. package/dist/types/index.d.ts +1 -1
  81. package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
  82. package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
  83. package/dist/types/instrumentations/session/index.d.ts +1 -1
  84. package/dist/types/instrumentations/session/instrumentation.d.ts +2 -2
  85. package/dist/types/instrumentations/session/sessionManager/PersistentSessionsManager.d.ts +12 -0
  86. package/dist/types/instrumentations/session/sessionManager/VolatileSessionManager.d.ts +12 -0
  87. package/dist/types/instrumentations/session/sessionManager/index.d.ts +3 -0
  88. package/dist/types/instrumentations/session/sessionManager/sessionManagerUtils.d.ts +16 -0
  89. package/dist/types/instrumentations/session/sessionManager/types.d.ts +7 -0
  90. package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
  91. package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  92. package/dist/types/metas/index.d.ts +1 -0
  93. package/dist/types/metas/sdk/index.d.ts +1 -0
  94. package/dist/types/metas/sdk/meta.d.ts +2 -0
  95. package/dist/types/transports/console/transport.d.ts +1 -1
  96. package/dist/types/transports/fetch/transport.d.ts +1 -1
  97. package/dist/types/utils/webStorage.d.ts +30 -4
  98. package/package.json +3 -3
  99. package/dist/bundle/types/instrumentations/session/sessionHandler.d.ts +0 -22
  100. package/dist/cjs/instrumentations/session/sessionHandler.js +0 -170
  101. package/dist/cjs/instrumentations/session/sessionHandler.js.map +0 -1
  102. package/dist/esm/instrumentations/session/sessionHandler.js +0 -148
  103. package/dist/esm/instrumentations/session/sessionHandler.js.map +0 -1
  104. package/dist/types/instrumentations/session/sessionHandler.d.ts +0 -22
@@ -1 +1 @@
1
- {"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":";;;AAAA,gDAA0C;AAI1C,SAAgB,qBAAqB,CAAC,IAAsB;;IAC1D,IAAI;QACF,IAAI,OAAO,SAAA,CAAC;QACZ,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,sBAAsB;QACtB,MAAA,gBAAI,CAAC,cAAc,0CAAE,IAAI,CAAC,8BAAuB,IAAI,wCAA8B,KAAK,CAAE,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAdD,sDAcC;AAEY,QAAA,uBAAuB,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;AAE7E,SAAgB,OAAO,CAAC,GAAW;IACjC,IAAI,+BAAuB,EAAE;QAC3B,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KAClC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAND,0BAMC;AAED,SAAgB,OAAO,CAAC,GAAW,EAAE,KAAa;IAChD,IAAI,+BAAuB,EAAE;QAC3B,IAAI;YACF,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAClC;QAAC,OAAO,KAAK,EAAE;YACd,aAAa;SACd;KACF;AACH,CAAC;AARD,0BAQC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,IAAI,+BAAuB,EAAE;QAC3B,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;KAC9B;AACH,CAAC;AAJD,gCAIC","sourcesContent":["import { faro } from '@grafana/faro-core';\n\ntype StorageMechanism = 'sessionStorage' | 'localStorage';\n\nexport function isWebStorageAvailable(type: StorageMechanism): boolean {\n try {\n let storage;\n storage = window[type];\n\n const testItem = '__faro_storage_test__';\n storage.setItem(testItem, testItem);\n storage.removeItem(testItem);\n return true;\n } catch (error) {\n // the above can throw\n faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`);\n return false;\n }\n}\n\nexport const isLocalStorageAvailable = isWebStorageAvailable('localStorage');\n\nexport function getItem(key: string): string | null {\n if (isLocalStorageAvailable) {\n return localStorage.getItem(key);\n }\n\n return null;\n}\n\nexport function setItem(key: string, value: string): void {\n if (isLocalStorageAvailable) {\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n // do nothing\n }\n }\n}\n\nexport function removeItem(key: string): void {\n if (isLocalStorageAvailable) {\n localStorage.removeItem(key);\n }\n}\n"]}
1
+ {"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":";;;AAAA,gDAA0C;AAE7B,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,cAAc;CACb,CAAC;AAIX,sDAAsD;AAEtD;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,IAAsB;;IAC1D,IAAI;QACF,IAAI,OAAO,SAAA,CAAC;QACZ,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,sBAAsB;QACtB,MAAA,gBAAI,CAAC,cAAc,0CAAE,IAAI,CAAC,8BAAuB,IAAI,wCAA8B,KAAK,CAAE,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAdD,sDAcC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,mBAAqC;IACxE,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE;QAClD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KACjD;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAND,0BAMC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,mBAAqC;IACvF,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE;QAClD,IAAI;YACF,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SACjD;QAAC,OAAO,KAAK,EAAE;YACd,aAAa;SACd;KACF;AACH,CAAC;AARD,0BAQC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,GAAW,EAAE,mBAAqC;IAC3E,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE;QAClD,MAAM,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;KAC7C;AACH,CAAC;AAJD,gCAIC;AAEY,QAAA,uBAAuB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,yBAAyB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,OAAO,CAAC,CAAC;AAEvF,SAAS,yBAAyB,CAAC,mBAAqC;IACtE,IAAI,mBAAmB,KAAK,sBAAc,CAAC,KAAK,EAAE;QAChD,OAAO,+BAAuB,CAAC;KAChC;IAED,IAAI,mBAAmB,KAAK,sBAAc,CAAC,OAAO,EAAE;QAClD,OAAO,iCAAyB,CAAC;KAClC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { faro } from '@grafana/faro-core';\n\nexport const webStorageType = {\n session: 'sessionStorage',\n local: 'localStorage',\n} as const;\n\ntype StorageMechanism = (typeof webStorageType)[keyof typeof webStorageType];\n\n// TODO: remove default storage type from all function\n\n/**\n * Check if selected web storage mechanism is available.\n * @param type storage mechanism to test availability for.\n * @returns\n */\nexport function isWebStorageAvailable(type: StorageMechanism): boolean {\n try {\n let storage;\n storage = window[type];\n\n const testItem = '__faro_storage_test__';\n storage.setItem(testItem, testItem);\n storage.removeItem(testItem);\n return true;\n } catch (error) {\n // the above can throw\n faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`);\n return false;\n }\n}\n\n/**\n * Get item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function getItem(key: string, webStorageMechanism: StorageMechanism): string | null {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n return window[webStorageMechanism].getItem(key);\n }\n\n return null;\n}\n\n/**\n * Store item in SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param value: the item data.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function setItem(key: string, value: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n try {\n window[webStorageMechanism].setItem(key, value);\n } catch (error) {\n // do nothing\n }\n }\n}\n\n/**\n * Remove item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function removeItem(key: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n window[webStorageMechanism].removeItem(key);\n }\n}\n\nexport const isLocalStorageAvailable = isWebStorageAvailable(webStorageType.local);\nexport const isSessionStorageAvailable = isWebStorageAvailable(webStorageType.session);\n\nfunction isWebStorageTypeAvailable(webStorageMechanism: StorageMechanism) {\n if (webStorageMechanism === webStorageType.local) {\n return isLocalStorageAvailable;\n }\n\n if (webStorageMechanism === webStorageType.session) {\n return isSessionStorageAvailable;\n }\n\n return false;\n}\n"]}
@@ -1,11 +1,17 @@
1
- import { createInternalLogger, defaultBatchingConfig, defaultGlobalObjectKey, defaultInternalLoggerLevel, defaultUnpatchedConsole, isObject, } from '@grafana/faro-core';
1
+ import { createInternalLogger, dateNow, defaultBatchingConfig, defaultGlobalObjectKey, defaultInternalLoggerLevel, defaultUnpatchedConsole, isObject, } from '@grafana/faro-core';
2
2
  import { defaultEventDomain } from '../consts';
3
3
  import { parseStacktrace } from '../instrumentations';
4
- import { fetchUserSession, isUserSessionValid } from '../instrumentations/session';
4
+ import { PersistentSessionsManager } from '../instrumentations/session/sessionManager';
5
+ import { isUserSessionValid, MAX_SESSION_PERSISTENCE_TIME, } from '../instrumentations/session/sessionManager/sessionManagerUtils';
5
6
  import { createSession, defaultMetas, defaultViewMeta } from '../metas';
6
7
  import { k6Meta } from '../metas/k6';
7
8
  import { FetchTransport } from '../transports';
8
9
  import { getWebInstrumentations } from './getWebInstrumentations';
10
+ const defaultSessionPersistenceConfig = {
11
+ // enabled: true; // TODO: uncomment once we switch
12
+ persistent: false,
13
+ maxSessionPersistenceTime: MAX_SESSION_PERSISTENCE_TIME,
14
+ };
9
15
  export function makeCoreConfig(browserConfig) {
10
16
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
11
17
  const transports = [];
@@ -54,20 +60,29 @@ export function makeCoreConfig(browserConfig) {
54
60
  eventDomain: (_h = browserConfig.eventDomain) !== null && _h !== void 0 ? _h : defaultEventDomain,
55
61
  ignoreErrors: browserConfig.ignoreErrors,
56
62
  // The new session management feature is a PoC and still under development and IS NOT READY for any production use!
57
- experimentalSessions: Object.assign({
63
+ experimentalSessions: Object.assign(Object.assign(Object.assign({
58
64
  // TODO: will be true on release
59
- enabled: false, persistent: false, session: createSessionMeta() }, browserConfig.experimentalSessions),
65
+ enabled: false }, defaultSessionPersistenceConfig), { session: createSessionMeta(browserConfig.experimentalSessions) }), browserConfig.experimentalSessions),
60
66
  // TODO: deprecate/remove old init code or maybe rename to legacy_session?
61
67
  session: (_j = browserConfig.session) !== null && _j !== void 0 ? _j : createSession(),
62
68
  user: browserConfig.user,
63
69
  view: (_k = browserConfig.view) !== null && _k !== void 0 ? _k : defaultViewMeta,
64
70
  };
65
71
  }
66
- function createSessionMeta() {
67
- const userSession = fetchUserSession();
68
- const sessionId = isUserSessionValid(userSession) ? userSession === null || userSession === void 0 ? void 0 : userSession.sessionId : createSession().id;
72
+ function createSessionMeta(sessionsConfig) {
73
+ const _sessionsConfig = Object.assign(Object.assign({}, defaultSessionPersistenceConfig), sessionsConfig);
74
+ let sessionId;
75
+ if (_sessionsConfig.persistent) {
76
+ const userSession = PersistentSessionsManager.fetchUserSession();
77
+ const now = dateNow();
78
+ const shouldClearPersistentSession = userSession && userSession.lastActivity < now - _sessionsConfig.maxSessionPersistenceTime;
79
+ if (shouldClearPersistentSession) {
80
+ PersistentSessionsManager.removeUserSession();
81
+ }
82
+ sessionId = isUserSessionValid(userSession) ? userSession === null || userSession === void 0 ? void 0 : userSession.sessionId : createSession().id;
83
+ }
69
84
  return {
70
- id: sessionId,
85
+ id: sessionId !== null && sessionId !== void 0 ? sessionId : createSession().id,
71
86
  };
72
87
  }
73
88
  //# sourceMappingURL=makeCoreConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createInternalLogger,\n defaultBatchingConfig,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultUnpatchedConsole,\n isObject,\n} from '@grafana/faro-core';\nimport type { Config, MetaSession, Transport } from '@grafana/faro-core';\n\nimport type { MetaItem } from '..';\nimport { defaultEventDomain } from '../consts';\nimport { parseStacktrace } from '../instrumentations';\nimport { fetchUserSession, isUserSessionValid } from '../instrumentations/session';\nimport { createSession, defaultMetas, defaultViewMeta } from '../metas';\nimport { k6Meta } from '../metas/k6';\nimport { FetchTransport } from '../transports';\n\nimport { getWebInstrumentations } from './getWebInstrumentations';\nimport type { BrowserConfig } from './types';\n\nexport function makeCoreConfig(browserConfig: BrowserConfig): Config | undefined {\n const transports: Transport[] = [];\n\n const internalLogger = createInternalLogger(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);\n\n if (browserConfig.transports) {\n if (browserConfig.url || browserConfig.apiKey) {\n internalLogger.error('if \"transports\" is defined, \"url\" and \"apiKey\" should not be defined');\n }\n\n transports.push(...browserConfig.transports);\n } else if (browserConfig.url) {\n transports.push(\n new FetchTransport({\n url: browserConfig.url,\n apiKey: browserConfig.apiKey,\n })\n );\n } else {\n internalLogger.error('either \"url\" or \"transports\" must be defined');\n }\n\n function createMetas(): MetaItem[] {\n const initialMetas = defaultMetas;\n\n if (browserConfig.metas) {\n initialMetas.push(...browserConfig.metas);\n }\n\n const isK6BrowserSession = isObject((window as any).k6);\n\n if (isK6BrowserSession) {\n return [...initialMetas, k6Meta];\n }\n\n return initialMetas;\n }\n\n return {\n app: browserConfig.app,\n batching: {\n ...defaultBatchingConfig,\n ...browserConfig.batching,\n },\n dedupe: browserConfig.dedupe ?? true,\n globalObjectKey: browserConfig.globalObjectKey || defaultGlobalObjectKey,\n instrumentations: browserConfig.instrumentations ?? getWebInstrumentations(),\n internalLoggerLevel: browserConfig.internalLoggerLevel ?? defaultInternalLoggerLevel,\n isolate: browserConfig.isolate ?? false,\n metas: createMetas(),\n parseStacktrace,\n paused: browserConfig.paused ?? false,\n preventGlobalExposure: browserConfig.preventGlobalExposure ?? false,\n transports,\n unpatchedConsole: browserConfig.unpatchedConsole ?? defaultUnpatchedConsole,\n\n beforeSend: browserConfig.beforeSend,\n eventDomain: browserConfig.eventDomain ?? defaultEventDomain,\n ignoreErrors: browserConfig.ignoreErrors,\n\n // The new session management feature is a PoC and still under development and IS NOT READY for any production use!\n experimentalSessions: {\n // TODO: will be true on release\n enabled: false,\n persistent: false,\n session: createSessionMeta(),\n ...browserConfig.experimentalSessions,\n },\n\n // TODO: deprecate/remove old init code or maybe rename to legacy_session?\n session: browserConfig.session ?? createSession(),\n\n user: browserConfig.user,\n view: browserConfig.view ?? defaultViewMeta,\n };\n}\n\nfunction createSessionMeta(): MetaSession {\n const userSession = fetchUserSession();\n const sessionId = isUserSessionValid(userSession) ? userSession?.sessionId : createSession().id;\n\n return {\n id: sessionId,\n };\n}\n"]}
1
+ {"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createInternalLogger,\n dateNow,\n defaultBatchingConfig,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultUnpatchedConsole,\n isObject,\n} from '@grafana/faro-core';\nimport type { Config, MetaSession, Transport } from '@grafana/faro-core';\n\nimport type { MetaItem } from '..';\nimport { defaultEventDomain } from '../consts';\nimport { parseStacktrace } from '../instrumentations';\nimport { PersistentSessionsManager } from '../instrumentations/session/sessionManager';\nimport {\n isUserSessionValid,\n MAX_SESSION_PERSISTENCE_TIME,\n} from '../instrumentations/session/sessionManager/sessionManagerUtils';\nimport { createSession, defaultMetas, defaultViewMeta } from '../metas';\nimport { k6Meta } from '../metas/k6';\nimport { FetchTransport } from '../transports';\n\nimport { getWebInstrumentations } from './getWebInstrumentations';\nimport type { BrowserConfig } from './types';\n\nconst defaultSessionPersistenceConfig = {\n // enabled: true; // TODO: uncomment once we switch\n persistent: false,\n maxSessionPersistenceTime: MAX_SESSION_PERSISTENCE_TIME,\n} as const;\n\nexport function makeCoreConfig(browserConfig: BrowserConfig): Config | undefined {\n const transports: Transport[] = [];\n\n const internalLogger = createInternalLogger(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);\n\n if (browserConfig.transports) {\n if (browserConfig.url || browserConfig.apiKey) {\n internalLogger.error('if \"transports\" is defined, \"url\" and \"apiKey\" should not be defined');\n }\n\n transports.push(...browserConfig.transports);\n } else if (browserConfig.url) {\n transports.push(\n new FetchTransport({\n url: browserConfig.url,\n apiKey: browserConfig.apiKey,\n })\n );\n } else {\n internalLogger.error('either \"url\" or \"transports\" must be defined');\n }\n\n function createMetas(): MetaItem[] {\n const initialMetas = defaultMetas;\n\n if (browserConfig.metas) {\n initialMetas.push(...browserConfig.metas);\n }\n\n const isK6BrowserSession = isObject((window as any).k6);\n\n if (isK6BrowserSession) {\n return [...initialMetas, k6Meta];\n }\n\n return initialMetas;\n }\n\n return {\n app: browserConfig.app,\n batching: {\n ...defaultBatchingConfig,\n ...browserConfig.batching,\n },\n dedupe: browserConfig.dedupe ?? true,\n globalObjectKey: browserConfig.globalObjectKey || defaultGlobalObjectKey,\n instrumentations: browserConfig.instrumentations ?? getWebInstrumentations(),\n internalLoggerLevel: browserConfig.internalLoggerLevel ?? defaultInternalLoggerLevel,\n isolate: browserConfig.isolate ?? false,\n metas: createMetas(),\n parseStacktrace,\n paused: browserConfig.paused ?? false,\n preventGlobalExposure: browserConfig.preventGlobalExposure ?? false,\n transports,\n unpatchedConsole: browserConfig.unpatchedConsole ?? defaultUnpatchedConsole,\n\n beforeSend: browserConfig.beforeSend,\n eventDomain: browserConfig.eventDomain ?? defaultEventDomain,\n ignoreErrors: browserConfig.ignoreErrors,\n\n // The new session management feature is a PoC and still under development and IS NOT READY for any production use!\n experimentalSessions: {\n // TODO: will be true on release\n enabled: false,\n ...defaultSessionPersistenceConfig,\n session: createSessionMeta(browserConfig.experimentalSessions),\n ...browserConfig.experimentalSessions,\n },\n\n // TODO: deprecate/remove old init code or maybe rename to legacy_session?\n session: browserConfig.session ?? createSession(),\n\n user: browserConfig.user,\n view: browserConfig.view ?? defaultViewMeta,\n };\n}\n\nfunction createSessionMeta(sessionsConfig: Config['experimentalSessions']): MetaSession {\n const _sessionsConfig = { ...defaultSessionPersistenceConfig, ...sessionsConfig };\n\n let sessionId;\n\n if (_sessionsConfig.persistent) {\n const userSession = PersistentSessionsManager.fetchUserSession();\n const now = dateNow();\n\n const shouldClearPersistentSession =\n userSession && userSession.lastActivity < now - _sessionsConfig.maxSessionPersistenceTime!;\n\n if (shouldClearPersistentSession) {\n PersistentSessionsManager.removeUserSession();\n }\n\n sessionId = isUserSessionValid(userSession) ? userSession?.sessionId : createSession().id;\n }\n\n return {\n id: sessionId ?? createSession().id,\n };\n}\n"]}
package/dist/esm/index.js CHANGED
@@ -2,7 +2,7 @@ export { getWebInstrumentations, makeCoreConfig } from './config';
2
2
  export { defaultEventDomain } from './consts';
3
3
  export { initializeFaro } from './initialize';
4
4
  export { buildStackFrame, ConsoleInstrumentation, ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, } from './instrumentations';
5
- export { browserMeta, createSession, defaultMetas, defaultViewMeta, pageMeta } from './metas';
5
+ export { browserMeta, createSession, defaultMetas, defaultViewMeta, pageMeta, sdkMeta } from './metas';
6
6
  export { ConsoleTransport, FetchTransport } from './transports';
7
7
  export { faro, allLogLevels, BaseExtension, BaseInstrumentation, BaseTransport, Conventions, createInternalLogger, createPromiseBuffer, deepEqual, defaultExceptionType, defaultGlobalObjectKey, defaultInternalLoggerLevel, defaultLogLevel, genShortID, getCurrentTimestamp, getInternalFaroFromGlobalObject, getTransportBody, globalObject, internalGlobalObjectKey, isArray, isBoolean, isDomError, isDomException, isElement, isElementDefined, isError, isErrorDefined, isErrorEvent, isEvent, isEventDefined, isFunction, isInstanceOf, isInt, isInternalFaroOnGlobalObject, isMap, isMapDefined, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isSymbol, isSyntheticEvent, isThenable, isToString, isTypeof, isUndefined, InternalLoggerLevel, LogLevel, noop, setInternalFaroOnGlobalObject, TransportItemType, transportItemTypeToBodyKey, VERSION, } from '@grafana/faro-core';
8
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQhE,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,EACZ,KAAK,EACL,4BAA4B,EAC5B,KAAK,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,6BAA6B,EAC7B,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,GACR,MAAM,oBAAoB,CAAC","sourcesContent":["export { getWebInstrumentations, makeCoreConfig } from './config';\nexport type { BrowserConfig } from './config';\n\nexport { defaultEventDomain } from './consts';\n\nexport { initializeFaro } from './initialize';\n\nexport {\n buildStackFrame,\n ConsoleInstrumentation,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n ViewInstrumentation,\n WebVitalsInstrumentation,\n SessionInstrumentation,\n} from './instrumentations';\nexport type { ConsoleInstrumentationOptions, ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations';\n\nexport { browserMeta, createSession, defaultMetas, defaultViewMeta, pageMeta } from './metas';\n\nexport { ConsoleTransport, FetchTransport } from './transports';\nexport type {\n ClockFn,\n ConsoleTransportOptions,\n FetchTransportOptions,\n FetchTransportRequestOptions,\n} from './transports';\n\nexport {\n faro,\n allLogLevels,\n BaseExtension,\n BaseInstrumentation,\n BaseTransport,\n Conventions,\n createInternalLogger,\n createPromiseBuffer,\n deepEqual,\n defaultExceptionType,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogLevel,\n genShortID,\n getCurrentTimestamp,\n getInternalFaroFromGlobalObject,\n getTransportBody,\n globalObject,\n internalGlobalObjectKey,\n isArray,\n isBoolean,\n isDomError,\n isDomException,\n isElement,\n isElementDefined,\n isError,\n isErrorDefined,\n isErrorEvent,\n isEvent,\n isEventDefined,\n isFunction,\n isInstanceOf,\n isInt,\n isInternalFaroOnGlobalObject,\n isMap,\n isMapDefined,\n isNull,\n isNumber,\n isObject,\n isPrimitive,\n isRegExp,\n isString,\n isSymbol,\n isSyntheticEvent,\n isThenable,\n isToString,\n isTypeof,\n isUndefined,\n InternalLoggerLevel,\n LogLevel,\n noop,\n setInternalFaroOnGlobalObject,\n TransportItemType,\n transportItemTypeToBodyKey,\n VERSION,\n} from '@grafana/faro-core';\n\nexport type {\n Faro,\n API,\n APIEvent,\n BaseObject,\n BaseObjectKey,\n BaseObjectPrimitiveValue,\n BaseObjectValue,\n BeforeSendHook,\n BufferItem,\n Config,\n EventAttributes,\n EventEvent,\n EventsAPI,\n ExceptionEvent,\n ExceptionStackFrame,\n ExceptionsAPI,\n ExtendedError,\n Extension,\n GlobalObject,\n Instrumentation,\n Instrumentations,\n InternalLogger,\n LogContext,\n LogEvent,\n LogsAPI,\n MeasurementEvent,\n MeasurementsAPI,\n Meta,\n MetaAPI,\n MetaApp,\n MetaAttributes,\n MetaBrowser,\n MetaGetter,\n MetaItem,\n MetaPage,\n Metas,\n MetaSDK,\n MetaSDKIntegration,\n MetaSession,\n MetaUser,\n MetaView,\n OTELApi,\n Patterns,\n PromiseBuffer,\n PromiseBufferOptions,\n PromiseProducer,\n PushErrorOptions,\n PushLogOptions,\n PushMeasurementOptions,\n Stacktrace,\n StacktraceParser,\n TraceContext,\n TraceEvent,\n TracesAPI,\n Transport,\n TransportBody,\n TransportItem,\n TransportItemPayload,\n Transports,\n UnpatchedConsole,\n} from '@grafana/faro-core';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvG,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQhE,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,EACZ,KAAK,EACL,4BAA4B,EAC5B,KAAK,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,6BAA6B,EAC7B,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,GACR,MAAM,oBAAoB,CAAC","sourcesContent":["export { getWebInstrumentations, makeCoreConfig } from './config';\nexport type { BrowserConfig } from './config';\n\nexport { defaultEventDomain } from './consts';\n\nexport { initializeFaro } from './initialize';\n\nexport {\n buildStackFrame,\n ConsoleInstrumentation,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n ViewInstrumentation,\n WebVitalsInstrumentation,\n SessionInstrumentation,\n} from './instrumentations';\nexport type { ConsoleInstrumentationOptions, ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations';\n\nexport { browserMeta, createSession, defaultMetas, defaultViewMeta, pageMeta, sdkMeta } from './metas';\n\nexport { ConsoleTransport, FetchTransport } from './transports';\nexport type {\n ClockFn,\n ConsoleTransportOptions,\n FetchTransportOptions,\n FetchTransportRequestOptions,\n} from './transports';\n\nexport {\n faro,\n allLogLevels,\n BaseExtension,\n BaseInstrumentation,\n BaseTransport,\n Conventions,\n createInternalLogger,\n createPromiseBuffer,\n deepEqual,\n defaultExceptionType,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogLevel,\n genShortID,\n getCurrentTimestamp,\n getInternalFaroFromGlobalObject,\n getTransportBody,\n globalObject,\n internalGlobalObjectKey,\n isArray,\n isBoolean,\n isDomError,\n isDomException,\n isElement,\n isElementDefined,\n isError,\n isErrorDefined,\n isErrorEvent,\n isEvent,\n isEventDefined,\n isFunction,\n isInstanceOf,\n isInt,\n isInternalFaroOnGlobalObject,\n isMap,\n isMapDefined,\n isNull,\n isNumber,\n isObject,\n isPrimitive,\n isRegExp,\n isString,\n isSymbol,\n isSyntheticEvent,\n isThenable,\n isToString,\n isTypeof,\n isUndefined,\n InternalLoggerLevel,\n LogLevel,\n noop,\n setInternalFaroOnGlobalObject,\n TransportItemType,\n transportItemTypeToBodyKey,\n VERSION,\n} from '@grafana/faro-core';\n\nexport type {\n Faro,\n API,\n APIEvent,\n BaseObject,\n BaseObjectKey,\n BaseObjectPrimitiveValue,\n BaseObjectValue,\n BeforeSendHook,\n BufferItem,\n Config,\n EventAttributes,\n EventEvent,\n EventsAPI,\n ExceptionEvent,\n ExceptionStackFrame,\n ExceptionsAPI,\n ExtendedError,\n Extension,\n GlobalObject,\n Instrumentation,\n Instrumentations,\n InternalLogger,\n LogContext,\n LogEvent,\n LogsAPI,\n MeasurementEvent,\n MeasurementsAPI,\n Meta,\n MetaAPI,\n MetaApp,\n MetaAttributes,\n MetaBrowser,\n MetaGetter,\n MetaItem,\n MetaPage,\n Metas,\n MetaSDK,\n MetaSDKIntegration,\n MetaSession,\n MetaUser,\n MetaView,\n OTELApi,\n Patterns,\n PromiseBuffer,\n PromiseBufferOptions,\n PromiseProducer,\n PushErrorOptions,\n PushLogOptions,\n PushMeasurementOptions,\n Stacktrace,\n StacktraceParser,\n TraceContext,\n TraceEvent,\n TracesAPI,\n Transport,\n TransportBody,\n TransportItem,\n TransportItemPayload,\n Transports,\n UnpatchedConsole,\n} from '@grafana/faro-core';\n"]}
@@ -1,3 +1,3 @@
1
1
  export { SessionInstrumentation } from './instrumentation';
2
- export * from './sessionHandler';
2
+ export * from './sessionManager';
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,cAAc,kBAAkB,CAAC","sourcesContent":["export { SessionInstrumentation } from './instrumentation';\n\nexport * from './sessionHandler';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,cAAc,kBAAkB,CAAC","sourcesContent":["export { SessionInstrumentation } from './instrumentation';\n\nexport * from './sessionManager';\n"]}
@@ -1,5 +1,7 @@
1
1
  import { BaseInstrumentation, Conventions, VERSION } from '@grafana/faro-core';
2
- import { getSessionUpdater } from './sessionHandler';
2
+ import { isLocalStorageAvailable, isSessionStorageAvailable } from '../../utils/webStorage';
3
+ import { PersistentSessionsManager } from './sessionManager/PersistentSessionsManager';
4
+ import { VolatileSessionsManager } from './sessionManager/VolatileSessionManager';
3
5
  export class SessionInstrumentation extends BaseInstrumentation {
4
6
  constructor() {
5
7
  super(...arguments);
@@ -16,19 +18,29 @@ export class SessionInstrumentation extends BaseInstrumentation {
16
18
  this.api.pushEvent(Conventions.EventNames.SESSION_START, {}, undefined, { skipDedupe: true });
17
19
  }
18
20
  }
21
+ getSessionManagerInstanceByConfiguredStrategy(initialSessionId) {
22
+ var _a;
23
+ if (((_a = this.config.experimentalSessions) === null || _a === void 0 ? void 0 : _a.persistent) && isLocalStorageAvailable) {
24
+ return new PersistentSessionsManager(initialSessionId);
25
+ }
26
+ if (isSessionStorageAvailable) {
27
+ return new VolatileSessionsManager(initialSessionId);
28
+ }
29
+ return null;
30
+ }
19
31
  initialize() {
20
32
  var _a, _b, _c;
21
33
  this.logDebug('init session instrumentation');
22
34
  this.sendSessionStartEvent(this.metas.value);
23
35
  this.metas.addListener(this.sendSessionStartEvent.bind(this));
24
36
  if ((_a = this.config.experimentalSessions) === null || _a === void 0 ? void 0 : _a.enabled) {
25
- this.sessionUpdater = getSessionUpdater((_b = this.metas.value.session) === null || _b === void 0 ? void 0 : _b.id);
26
- this.sessionUpdater.init();
27
- (_c = this.transports) === null || _c === void 0 ? void 0 : _c.addBeforeSendHooks(...this.transports.getBeforeSendHooks(), (item) => {
28
- var _a;
29
- (_a = this.sessionUpdater) === null || _a === void 0 ? void 0 : _a.handleUpdate();
30
- return item;
31
- });
37
+ const sessionManager = this.getSessionManagerInstanceByConfiguredStrategy((_b = this.metas.value.session) === null || _b === void 0 ? void 0 : _b.id);
38
+ if (sessionManager != null) {
39
+ (_c = this.transports) === null || _c === void 0 ? void 0 : _c.addBeforeSendHooks(...this.transports.getBeforeSendHooks(), (item) => {
40
+ sessionManager === null || sessionManager === void 0 ? void 0 : sessionManager.updateSession();
41
+ return item;
42
+ });
43
+ }
32
44
  }
33
45
  }
34
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAqB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElG,OAAO,EAAE,iBAAiB,EAAsB,MAAM,kBAAkB,CAAC;AAEzE,MAAM,OAAO,sBAAuB,SAAQ,mBAAmB;IAA/D;;QACW,SAAI,GAAG,+CAA+C,CAAC;QACvD,YAAO,GAAG,OAAO,CAAC;IAoC7B,CAAC;IA5BS,qBAAqB,CAAC,IAAU;;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,MAAK,MAAA,IAAI,CAAC,eAAe,0CAAE,EAAE,CAAA,EAAE;YACtD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;YAE/B,8EAA8E;YAC9E,gBAAgB;YAChB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;SAC/F;IACH,CAAC;IAED,UAAU;;QACR,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;QAE9C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9D,IAAI,MAAA,IAAI,CAAC,MAAM,CAAC,oBAAoB,0CAAE,OAAO,EAAE;YAC7C,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC,MAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,0CAAE,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAE3B,MAAA,IAAI,CAAC,UAAU,0CAAE,kBAAkB,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC,IAAS,EAAE,EAAE;;gBACzF,MAAA,IAAI,CAAC,cAAc,0CAAE,YAAY,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;CACF","sourcesContent":["import { BaseInstrumentation, Conventions, Meta, MetaSession, VERSION } from '@grafana/faro-core';\n\nimport { getSessionUpdater, UserSessionUpdater } from './sessionHandler';\n\nexport class SessionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-session';\n readonly version = VERSION;\n\n // previously notified session, to ensure we don't send session start\n // event twice for the same session\n private notifiedSession: MetaSession | undefined;\n\n private sessionUpdater: UserSessionUpdater | undefined;\n\n private sendSessionStartEvent(meta: Meta): void {\n const session = meta.session;\n\n if (session && session.id !== this.notifiedSession?.id) {\n this.notifiedSession = session;\n\n // no need to add attributes and session id, they are included as part of meta\n // automatically\n this.api.pushEvent(Conventions.EventNames.SESSION_START, {}, undefined, { skipDedupe: true });\n }\n }\n\n initialize() {\n this.logDebug('init session instrumentation');\n\n this.sendSessionStartEvent(this.metas.value);\n this.metas.addListener(this.sendSessionStartEvent.bind(this));\n\n if (this.config.experimentalSessions?.enabled) {\n this.sessionUpdater = getSessionUpdater(this.metas.value.session?.id);\n this.sessionUpdater.init();\n\n this.transports?.addBeforeSendHooks(...this.transports.getBeforeSendHooks(), (item: any) => {\n this.sessionUpdater?.handleUpdate();\n return item;\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/session/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAqB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElG,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAE5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,MAAM,OAAO,sBAAuB,SAAQ,mBAAmB;IAA/D;;QACW,SAAI,GAAG,+CAA+C,CAAC;QACvD,YAAO,GAAG,OAAO,CAAC;IAiD7B,CAAC;IA3CS,qBAAqB,CAAC,IAAU;;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,MAAK,MAAA,IAAI,CAAC,eAAe,0CAAE,EAAE,CAAA,EAAE;YACtD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;YAE/B,8EAA8E;YAC9E,gBAAgB;YAChB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;SAC/F;IACH,CAAC;IAEO,6CAA6C,CACnD,gBAAyB;;QAEzB,IAAI,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,oBAAoB,0CAAE,UAAU,KAAI,uBAAuB,EAAE;YAC3E,OAAO,IAAI,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;SACxD;QAED,IAAI,yBAAyB,EAAE;YAC7B,OAAO,IAAI,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;SACtD;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU;;QACR,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;QAE9C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9D,IAAI,MAAA,IAAI,CAAC,MAAM,CAAC,oBAAoB,0CAAE,OAAO,EAAE;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,6CAA6C,CAAC,MAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,0CAAE,EAAE,CAAC,CAAC;YAExG,IAAI,cAAc,IAAI,IAAI,EAAE;gBAC1B,MAAA,IAAI,CAAC,UAAU,0CAAE,kBAAkB,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC,IAAS,EAAE,EAAE;oBACzF,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,aAAa,EAAE,CAAC;oBAChC,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;aACJ;SACF;IACH,CAAC;CACF","sourcesContent":["import { BaseInstrumentation, Conventions, Meta, MetaSession, VERSION } from '@grafana/faro-core';\n\nimport { isLocalStorageAvailable, isSessionStorageAvailable } from '../../utils/webStorage';\n\nimport { PersistentSessionsManager } from './sessionManager/PersistentSessionsManager';\nimport { VolatileSessionsManager } from './sessionManager/VolatileSessionManager';\n\nexport class SessionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-session';\n readonly version = VERSION;\n\n // previously notified session, to ensure we don't send session start\n // event twice for the same session\n private notifiedSession: MetaSession | undefined;\n\n private sendSessionStartEvent(meta: Meta): void {\n const session = meta.session;\n\n if (session && session.id !== this.notifiedSession?.id) {\n this.notifiedSession = session;\n\n // no need to add attributes and session id, they are included as part of meta\n // automatically\n this.api.pushEvent(Conventions.EventNames.SESSION_START, {}, undefined, { skipDedupe: true });\n }\n }\n\n private getSessionManagerInstanceByConfiguredStrategy(\n initialSessionId?: string\n ): PersistentSessionsManager | VolatileSessionsManager | null {\n if (this.config.experimentalSessions?.persistent && isLocalStorageAvailable) {\n return new PersistentSessionsManager(initialSessionId);\n }\n\n if (isSessionStorageAvailable) {\n return new VolatileSessionsManager(initialSessionId);\n }\n\n return null;\n }\n\n initialize() {\n this.logDebug('init session instrumentation');\n\n this.sendSessionStartEvent(this.metas.value);\n this.metas.addListener(this.sendSessionStartEvent.bind(this));\n\n if (this.config.experimentalSessions?.enabled) {\n const sessionManager = this.getSessionManagerInstanceByConfiguredStrategy(this.metas.value.session?.id);\n\n if (sessionManager != null) {\n this.transports?.addBeforeSendHooks(...this.transports.getBeforeSendHooks(), (item: any) => {\n sessionManager?.updateSession();\n return item;\n });\n }\n }\n }\n}\n"]}
@@ -0,0 +1,59 @@
1
+ import { faro } from '@grafana/faro-core';
2
+ import { throttle } from '../../../utils';
3
+ import { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage';
4
+ import { addSessionMetadataToNextSession, createUserSessionObject, getUserSessionUpdater, STORAGE_KEY, STORAGE_UPDATE_DELAY, } from './sessionManagerUtils';
5
+ export class PersistentSessionsManager {
6
+ constructor(initialSessionId) {
7
+ this.initialSessionId = initialSessionId;
8
+ this.updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY);
9
+ this.updateUserSession = getUserSessionUpdater({
10
+ fetchUserSession: PersistentSessionsManager.fetchUserSession,
11
+ storeUserSession: PersistentSessionsManager.storeUserSession,
12
+ });
13
+ this.init();
14
+ }
15
+ static removeUserSession() {
16
+ removeItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);
17
+ }
18
+ static storeUserSession(session) {
19
+ setItem(STORAGE_KEY, JSON.stringify(session), PersistentSessionsManager.storageTypeLocal);
20
+ }
21
+ static fetchUserSession() {
22
+ const storedSession = getItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);
23
+ if (storedSession) {
24
+ return JSON.parse(storedSession);
25
+ }
26
+ return null;
27
+ }
28
+ init() {
29
+ PersistentSessionsManager.storeUserSession(createUserSessionObject(this.initialSessionId));
30
+ document.addEventListener('visibilitychange', () => {
31
+ if (document.visibilityState === 'visible') {
32
+ this.updateSession();
33
+ }
34
+ });
35
+ window.addEventListener('storage', (event) => {
36
+ var _a, _b, _c;
37
+ if (event.key !== STORAGE_KEY) {
38
+ return;
39
+ }
40
+ const newSession = JSON.parse((_a = event.newValue) !== null && _a !== void 0 ? _a : '');
41
+ const previousSession = JSON.parse((_b = event.oldValue) !== null && _b !== void 0 ? _b : '');
42
+ if (newSession.sessionId !== previousSession.sessionId) {
43
+ (_c = faro.api) === null || _c === void 0 ? void 0 : _c.setSession(newSession.sessionMeta);
44
+ }
45
+ });
46
+ // Users can call the setSession() method, so we need to sync this with the local storage session
47
+ faro.metas.addListener(function syncSessionIfChangedExternally(meta) {
48
+ const session = meta.session;
49
+ const sessionFromLocalStorage = PersistentSessionsManager.fetchUserSession();
50
+ if (session && session.id !== (sessionFromLocalStorage === null || sessionFromLocalStorage === void 0 ? void 0 : sessionFromLocalStorage.sessionId)) {
51
+ const userSession = addSessionMetadataToNextSession(createUserSessionObject(session.id), sessionFromLocalStorage);
52
+ PersistentSessionsManager.storeUserSession(userSession);
53
+ faro.api.setSession(userSession.sessionMeta);
54
+ }
55
+ });
56
+ }
57
+ }
58
+ PersistentSessionsManager.storageTypeLocal = webStorageType.local;
59
+ //# sourceMappingURL=PersistentSessionsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersistentSessionsManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/PersistentSessionsManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { faro } from '@grafana/faro-core';\nimport type { Meta } from '@grafana/faro-core';\n\nimport { throttle } from '../../../utils';\nimport { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage';\n\nimport {\n addSessionMetadataToNextSession,\n createUserSessionObject,\n getUserSessionUpdater,\n STORAGE_KEY,\n STORAGE_UPDATE_DELAY,\n} from './sessionManagerUtils';\nimport type { FaroUserSession } from './types';\n\nexport class PersistentSessionsManager {\n private static storageTypeLocal = webStorageType.local;\n private updateUserSession: ReturnType<typeof getUserSessionUpdater>;\n\n constructor(private initialSessionId?: string) {\n this.updateUserSession = getUserSessionUpdater({\n fetchUserSession: PersistentSessionsManager.fetchUserSession,\n storeUserSession: PersistentSessionsManager.storeUserSession,\n });\n\n this.init();\n }\n\n static removeUserSession() {\n removeItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);\n }\n\n static storeUserSession(session: FaroUserSession): void {\n setItem(STORAGE_KEY, JSON.stringify(session), PersistentSessionsManager.storageTypeLocal);\n }\n\n static fetchUserSession(): FaroUserSession | null {\n const storedSession = getItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal);\n\n if (storedSession) {\n return JSON.parse(storedSession) as FaroUserSession;\n }\n\n return null;\n }\n\n updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY);\n\n private init(): void {\n PersistentSessionsManager.storeUserSession(createUserSessionObject(this.initialSessionId));\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.updateSession();\n }\n });\n\n window.addEventListener('storage', (event: StorageEvent) => {\n if (event.key !== STORAGE_KEY) {\n return;\n }\n\n const newSession: FaroUserSession = JSON.parse(event.newValue ?? '');\n const previousSession: FaroUserSession = JSON.parse(event.oldValue ?? '');\n\n if (newSession.sessionId !== previousSession.sessionId) {\n faro.api?.setSession(newSession.sessionMeta);\n }\n });\n\n // Users can call the setSession() method, so we need to sync this with the local storage session\n faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) {\n const session = meta.session;\n const sessionFromLocalStorage = PersistentSessionsManager.fetchUserSession();\n\n if (session && session.id !== sessionFromLocalStorage?.sessionId) {\n const userSession = addSessionMetadataToNextSession(\n createUserSessionObject(session.id),\n sessionFromLocalStorage\n );\n\n PersistentSessionsManager.storeUserSession(userSession);\n faro.api.setSession(userSession.sessionMeta);\n }\n });\n }\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import { faro } from '@grafana/faro-core';
2
+ import { throttle } from '../../../utils';
3
+ import { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage';
4
+ import { addSessionMetadataToNextSession, createUserSessionObject, getUserSessionUpdater, STORAGE_KEY, STORAGE_UPDATE_DELAY, } from './sessionManagerUtils';
5
+ export class VolatileSessionsManager {
6
+ constructor(initialSessionId) {
7
+ this.initialSessionId = initialSessionId;
8
+ this.updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY);
9
+ this.updateUserSession = getUserSessionUpdater({
10
+ fetchUserSession: VolatileSessionsManager.fetchUserSession,
11
+ storeUserSession: VolatileSessionsManager.storeUserSession,
12
+ });
13
+ this.init();
14
+ }
15
+ static removeUserSession() {
16
+ removeItem(STORAGE_KEY, VolatileSessionsManager.storageTypeSession);
17
+ }
18
+ static storeUserSession(session) {
19
+ setItem(STORAGE_KEY, JSON.stringify(session), VolatileSessionsManager.storageTypeSession);
20
+ }
21
+ static fetchUserSession() {
22
+ const storedSession = getItem(STORAGE_KEY, VolatileSessionsManager.storageTypeSession);
23
+ if (storedSession) {
24
+ return JSON.parse(storedSession);
25
+ }
26
+ return null;
27
+ }
28
+ init() {
29
+ VolatileSessionsManager.storeUserSession(createUserSessionObject(this.initialSessionId));
30
+ document.addEventListener('visibilitychange', () => {
31
+ if (document.visibilityState === 'visible') {
32
+ this.updateSession();
33
+ }
34
+ });
35
+ // Users can call the setSession() method, so we need to sync this with the local storage session
36
+ faro.metas.addListener(function syncSessionIfChangedExternally(meta) {
37
+ const session = meta.session;
38
+ const sessionFromSessionStorage = VolatileSessionsManager.fetchUserSession();
39
+ if (session && session.id !== (sessionFromSessionStorage === null || sessionFromSessionStorage === void 0 ? void 0 : sessionFromSessionStorage.sessionId)) {
40
+ const userSession = addSessionMetadataToNextSession(createUserSessionObject(session.id), sessionFromSessionStorage);
41
+ VolatileSessionsManager.storeUserSession(userSession);
42
+ faro.api.setSession(userSession.sessionMeta);
43
+ }
44
+ });
45
+ }
46
+ }
47
+ VolatileSessionsManager.storageTypeSession = webStorageType.session;
48
+ //# sourceMappingURL=VolatileSessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolatileSessionManager.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/VolatileSessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEzF,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACX,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,OAAO,uBAAuB;IAIlC,YAAoB,gBAAyB;QAAzB,qBAAgB,GAAhB,gBAAgB,CAAS;QA2B7C,kBAAa,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,oBAAoB,CAAC,CAAC;QA1B7E,IAAI,CAAC,iBAAiB,GAAG,qBAAqB,CAAC;YAC7C,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;YAC1D,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;SAC3D,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,MAAM,CAAC,iBAAiB;QACtB,UAAU,CAAC,WAAW,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAwB;QAC9C,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;QAEvF,IAAI,aAAa,EAAE;YACjB,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAoB,CAAC;SACrD;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAIO,IAAI;QACV,uBAAuB,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAEzF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;YACjD,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE;gBAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;QACH,CAAC,CAAC,CAAC;QAEH,iGAAiG;QACjG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,8BAA8B,CAAC,IAAU;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,yBAAyB,GAAG,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;YAE7E,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,MAAK,yBAAyB,aAAzB,yBAAyB,uBAAzB,yBAAyB,CAAE,SAAS,CAAA,EAAE;gBAClE,MAAM,WAAW,GAAG,+BAA+B,CACjD,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC,EACnC,yBAAyB,CAC1B,CAAC;gBAEF,uBAAuB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBACtD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;aAC9C;QACH,CAAC,CAAC,CAAC;IACL,CAAC;;AAxDc,0CAAkB,GAAG,cAAc,CAAC,OAAO,CAAC","sourcesContent":["import { faro } from '@grafana/faro-core';\nimport type { Meta } from '@grafana/faro-core';\n\nimport { throttle } from '../../../utils';\nimport { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage';\n\nimport {\n addSessionMetadataToNextSession,\n createUserSessionObject,\n getUserSessionUpdater,\n STORAGE_KEY,\n STORAGE_UPDATE_DELAY,\n} from './sessionManagerUtils';\nimport type { FaroUserSession } from './types';\n\nexport class VolatileSessionsManager {\n private static storageTypeSession = webStorageType.session;\n private updateUserSession: ReturnType<typeof getUserSessionUpdater>;\n\n constructor(private initialSessionId?: string) {\n this.updateUserSession = getUserSessionUpdater({\n fetchUserSession: VolatileSessionsManager.fetchUserSession,\n storeUserSession: VolatileSessionsManager.storeUserSession,\n });\n\n this.init();\n }\n\n static removeUserSession() {\n removeItem(STORAGE_KEY, VolatileSessionsManager.storageTypeSession);\n }\n\n static storeUserSession(session: FaroUserSession): void {\n setItem(STORAGE_KEY, JSON.stringify(session), VolatileSessionsManager.storageTypeSession);\n }\n\n static fetchUserSession(): FaroUserSession | null {\n const storedSession = getItem(STORAGE_KEY, VolatileSessionsManager.storageTypeSession);\n\n if (storedSession) {\n return JSON.parse(storedSession) as FaroUserSession;\n }\n\n return null;\n }\n\n updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY);\n\n private init(): void {\n VolatileSessionsManager.storeUserSession(createUserSessionObject(this.initialSessionId));\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.updateSession();\n }\n });\n\n // Users can call the setSession() method, so we need to sync this with the local storage session\n faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) {\n const session = meta.session;\n const sessionFromSessionStorage = VolatileSessionsManager.fetchUserSession();\n\n if (session && session.id !== sessionFromSessionStorage?.sessionId) {\n const userSession = addSessionMetadataToNextSession(\n createUserSessionObject(session.id),\n sessionFromSessionStorage\n );\n\n VolatileSessionsManager.storeUserSession(userSession);\n faro.api.setSession(userSession.sessionMeta);\n }\n });\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { PersistentSessionsManager } from './PersistentSessionsManager';
2
+ export { VolatileSessionsManager } from './VolatileSessionManager';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["export { PersistentSessionsManager } from './PersistentSessionsManager';\nexport { VolatileSessionsManager } from './VolatileSessionManager';\nexport type { FaroUserSession } from './types';\n"]}
@@ -0,0 +1,58 @@
1
+ import { dateNow, faro, genShortID } from '@grafana/faro-core';
2
+ // TODO: add tests
3
+ export const STORAGE_KEY = '__FARO_SESSION__';
4
+ export const SESSION_EXPIRATION_TIME = 4 * 60 * 60 * 1000; // hrs
5
+ export const SESSION_INACTIVITY_TIME = 15 * 60 * 1000; // minutes
6
+ export const STORAGE_UPDATE_DELAY = 1 * 1000; // seconds
7
+ export const MAX_SESSION_PERSISTENCE_TIME_BUFFER = 5 * 60 * 1000;
8
+ export const MAX_SESSION_PERSISTENCE_TIME = SESSION_EXPIRATION_TIME + MAX_SESSION_PERSISTENCE_TIME_BUFFER;
9
+ export function createUserSessionObject(sessionId) {
10
+ const now = dateNow();
11
+ return {
12
+ sessionId: sessionId !== null && sessionId !== void 0 ? sessionId : genShortID(),
13
+ lastActivity: now,
14
+ started: now,
15
+ };
16
+ }
17
+ export function isUserSessionValid(session) {
18
+ if (session == null) {
19
+ return false;
20
+ }
21
+ const now = dateNow();
22
+ const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME;
23
+ if (!lifetimeValid) {
24
+ return false;
25
+ }
26
+ const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME;
27
+ return inactivityPeriodValid;
28
+ }
29
+ export function getUserSessionUpdater({ fetchUserSession, storeUserSession }) {
30
+ return function updateSession() {
31
+ var _a, _b, _c, _d;
32
+ if (!fetchUserSession || !storeUserSession) {
33
+ return;
34
+ }
35
+ const sessionFromStorage = fetchUserSession();
36
+ if (isUserSessionValid(sessionFromStorage)) {
37
+ storeUserSession(Object.assign(Object.assign({}, sessionFromStorage), { lastActivity: dateNow() }));
38
+ }
39
+ else {
40
+ let newSession = addSessionMetadataToNextSession(createUserSessionObject(), sessionFromStorage);
41
+ storeUserSession(newSession);
42
+ (_a = faro.api) === null || _a === void 0 ? void 0 : _a.setSession(newSession.sessionMeta);
43
+ (_c = (_b = faro.config.experimentalSessions) === null || _b === void 0 ? void 0 : _b.onSessionChange) === null || _c === void 0 ? void 0 : _c.call(_b, (_d = sessionFromStorage === null || sessionFromStorage === void 0 ? void 0 : sessionFromStorage.sessionMeta) !== null && _d !== void 0 ? _d : null, newSession.sessionMeta);
44
+ }
45
+ };
46
+ }
47
+ export function addSessionMetadataToNextSession(newSession, previousSession) {
48
+ var _a;
49
+ const sessionWithMeta = Object.assign(Object.assign({}, newSession), { sessionMeta: {
50
+ id: newSession.sessionId,
51
+ } });
52
+ const metaAttributes = (_a = faro.metas.value.session) === null || _a === void 0 ? void 0 : _a.attributes;
53
+ if (metaAttributes || previousSession != null) {
54
+ sessionWithMeta.sessionMeta.attributes = Object.assign(Object.assign({}, (metaAttributes !== null && metaAttributes !== void 0 ? metaAttributes : {})), (previousSession != null ? { previousSession: previousSession.sessionId } : {}));
55
+ }
56
+ return sessionWithMeta;
57
+ }
58
+ //# sourceMappingURL=sessionManagerUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionManagerUtils.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sessionManagerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dateNow, faro, genShortID } from '@grafana/faro-core';\n\nimport type { FaroUserSession } from './types';\n\n// TODO: add tests\n\nexport const STORAGE_KEY = '__FARO_SESSION__';\nexport const SESSION_EXPIRATION_TIME = 4 * 60 * 60 * 1000; // hrs\nexport const SESSION_INACTIVITY_TIME = 15 * 60 * 1000; // minutes\nexport const STORAGE_UPDATE_DELAY = 1 * 1000; // seconds\n\nexport const MAX_SESSION_PERSISTENCE_TIME_BUFFER = 5 * 60 * 1000;\nexport const MAX_SESSION_PERSISTENCE_TIME = SESSION_EXPIRATION_TIME + MAX_SESSION_PERSISTENCE_TIME_BUFFER;\n\nexport function createUserSessionObject(sessionId?: string): FaroUserSession {\n const now = dateNow();\n\n return {\n sessionId: sessionId ?? genShortID(),\n lastActivity: now,\n started: now,\n };\n}\n\nexport function isUserSessionValid(session: FaroUserSession | null): boolean {\n if (session == null) {\n return false;\n }\n\n const now = dateNow();\n const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME;\n\n if (!lifetimeValid) {\n return false;\n }\n\n const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME;\n return inactivityPeriodValid;\n}\n\ntype GetUserSessionUpdaterParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\nexport function getUserSessionUpdater({ fetchUserSession, storeUserSession }: GetUserSessionUpdaterParams): () => void {\n return function updateSession(): void {\n if (!fetchUserSession || !storeUserSession) {\n return;\n }\n\n const sessionFromStorage = fetchUserSession();\n\n if (isUserSessionValid(sessionFromStorage)) {\n storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() });\n } else {\n let newSession = addSessionMetadataToNextSession(createUserSessionObject(), sessionFromStorage);\n\n storeUserSession(newSession);\n\n faro.api?.setSession(newSession.sessionMeta);\n faro.config.experimentalSessions?.onSessionChange?.(\n sessionFromStorage?.sessionMeta ?? null,\n newSession.sessionMeta!\n );\n }\n };\n}\n\nexport function addSessionMetadataToNextSession(newSession: FaroUserSession, previousSession: FaroUserSession | null) {\n const sessionWithMeta: Required<FaroUserSession> = {\n ...newSession,\n sessionMeta: {\n id: newSession.sessionId,\n },\n };\n\n const metaAttributes = faro.metas.value.session?.attributes;\n if (metaAttributes || previousSession != null) {\n sessionWithMeta.sessionMeta.attributes = {\n ...(metaAttributes ?? {}),\n ...(previousSession != null ? { previousSession: previousSession.sessionId } : {}),\n };\n }\n\n return sessionWithMeta;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { MetaSession } from '@grafana/faro-core';\n\nexport interface FaroUserSession {\n sessionId: string;\n lastActivity: number;\n started: number;\n sessionMeta?: MetaSession;\n}\n"]}
@@ -3,4 +3,5 @@ export { defaultMetas } from './const';
3
3
  export { pageMeta } from './page';
4
4
  export { createSession } from './session';
5
5
  export { defaultViewMeta } from './view';
6
+ export { sdkMeta } from './sdk';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC","sourcesContent":["export { browserMeta } from './browser';\n\nexport { defaultMetas } from './const';\n\nexport { pageMeta } from './page';\n\nexport { createSession } from './session';\n\nexport { defaultViewMeta } from './view';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export { browserMeta } from './browser';\n\nexport { defaultMetas } from './const';\n\nexport { pageMeta } from './page';\n\nexport { createSession } from './session';\n\nexport { defaultViewMeta } from './view';\n\nexport { sdkMeta } from './sdk';\n"]}
@@ -1,6 +1,8 @@
1
1
  export const k6Meta = () => {
2
2
  return {
3
- k6: {},
3
+ k6: {
4
+ isK6Browser: true,
5
+ },
4
6
  };
5
7
  };
6
8
  //# sourceMappingURL=meta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/k6/meta.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAA+B,GAAG,EAAE;IACrD,OAAO;QACL,EAAE,EAAE,EAAE;KACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { Meta, MetaItem } from '@grafana/faro-core';\n\nexport const k6Meta: MetaItem<Pick<Meta, 'k6'>> = () => {\n return {\n k6: {},\n };\n};\n"]}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/k6/meta.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAA+B,GAAG,EAAE;IACrD,OAAO;QACL,EAAE,EAAE;YACF,WAAW,EAAE,IAAI;SAClB;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { Meta, MetaItem } from '@grafana/faro-core';\n\nexport const k6Meta: MetaItem<Pick<Meta, 'k6'>> = () => {\n return {\n k6: {\n isK6Browser: true,\n },\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { sdkMeta } from './meta';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/metas/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC","sourcesContent":["export { sdkMeta } from './meta';\n"]}
@@ -0,0 +1,9 @@
1
+ import { faro, VERSION } from '@grafana/faro-core';
2
+ export const sdkMeta = () => ({
3
+ sdk: {
4
+ name: '@grafana/faro-core',
5
+ version: VERSION,
6
+ integrations: faro.config.instrumentations.map(({ name, version }) => ({ name, version })),
7
+ },
8
+ });
9
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/sdk/meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,CAAC,MAAM,OAAO,GAAgC,GAAG,EAAE,CAAC,CAAC;IACzD,GAAG,EAAE;QACH,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;KAC3F;CACF,CAAC,CAAC","sourcesContent":["import { faro, VERSION } from '@grafana/faro-core';\nimport type { Meta, MetaItem } from '@grafana/faro-core';\n\nexport const sdkMeta: MetaItem<Pick<Meta, 'sdk'>> = () => ({\n sdk: {\n name: '@grafana/faro-core',\n version: VERSION,\n integrations: faro.config.instrumentations.map(({ name, version }) => ({ name, version })),\n },\n});\n"]}
@@ -51,7 +51,7 @@ export class FetchTransport extends BaseTransport {
51
51
  const _d = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, { headers } = _d, restOfRequestOptions = __rest(_d, ["headers"]);
52
52
  return fetch(url, Object.assign({ method: 'POST', headers: Object.assign(Object.assign(Object.assign({ 'Content-Type': 'application/json' }, (headers !== null && headers !== void 0 ? headers : {})), (apiKey ? { 'x-api-key': apiKey } : {})), (((_a = this.config.experimentalSessions) === null || _a === void 0 ? void 0 : _a.enabled) && ((_b = this.metas.value.session) === null || _b === void 0 ? void 0 : _b.id)
53
53
  ? { 'x-faro-session-id': (_c = this.metas.value.session) === null || _c === void 0 ? void 0 : _c.id }
54
- : {})), body, keepalive: true }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
54
+ : {})), body, keepalive: body.length <= 60000 }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
55
55
  .then((response) => {
56
56
  if (response.status === 429) {
57
57
  this.disabledUntil = this.getRetryAfterDate(response);
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport, createPromiseBuffer, getTransportBody, noop, PromiseBuffer, VERSION } from '@grafana/faro-core';\nimport type { TransportItem } from '@grafana/faro-core';\n\nimport type { FetchTransportOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 30;\nconst DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17\nconst DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;\n\nexport class FetchTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-fetch';\n readonly version = VERSION;\n\n promiseBuffer: PromiseBuffer<Response | void>;\n\n private readonly rateLimitBackoffMs: number;\n private readonly getNow: () => number;\n private disabledUntil: Date = new Date();\n\n constructor(private options: FetchTransportOptions) {\n super();\n\n this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;\n this.getNow = options.getNow ?? (() => Date.now());\n\n this.promiseBuffer = createPromiseBuffer({\n size: options.bufferSize ?? DEFAULT_BUFFER_SIZE,\n concurrency: options.concurrency ?? DEFAULT_CONCURRENCY,\n });\n }\n\n async send(items: TransportItem[]): Promise<void> {\n try {\n if (this.disabledUntil > new Date(this.getNow())) {\n this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`);\n\n return Promise.resolve();\n }\n\n await this.promiseBuffer.add(() => {\n const body = JSON.stringify(getTransportBody(items));\n\n const { url, requestOptions, apiKey } = this.options;\n\n const { headers, ...restOfRequestOptions } = requestOptions ?? {};\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(headers ?? {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n ...(this.config.experimentalSessions?.enabled && this.metas.value.session?.id\n ? { 'x-faro-session-id': this.metas.value.session?.id }\n : {}),\n },\n body,\n keepalive: true,\n ...(restOfRequestOptions ?? {}),\n })\n .then((response) => {\n if (response.status === 429) {\n this.disabledUntil = this.getRetryAfterDate(response);\n this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);\n }\n // read the body so the connection can be closed\n response.text().catch(noop);\n\n return response;\n })\n .catch((err) => {\n this.logError('Failed sending payload to the receiver\\n', JSON.parse(body), err);\n });\n });\n } catch (err) {\n this.logError(err);\n }\n }\n\n override getIgnoreUrls(): Array<string | RegExp> {\n return [this.options.url];\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n private getRetryAfterDate(response: Response): Date {\n const now = this.getNow();\n const retryAfterHeader = response.headers.get('Retry-After');\n\n if (retryAfterHeader) {\n const delay = Number(retryAfterHeader);\n\n if (!isNaN(delay)) {\n return new Date(delay * 1000 + now);\n }\n\n const date = Date.parse(retryAfterHeader);\n\n if (!isNaN(date)) {\n return new Date(date);\n }\n }\n\n return new Date(now + this.rateLimitBackoffMs);\n }\n}\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport, createPromiseBuffer, getTransportBody, noop, PromiseBuffer, VERSION } from '@grafana/faro-core';\nimport type { TransportItem } from '@grafana/faro-core';\n\nimport type { FetchTransportOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 30;\nconst DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17\nconst DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;\n\nexport class FetchTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-fetch';\n readonly version = VERSION;\n\n promiseBuffer: PromiseBuffer<Response | void>;\n\n private readonly rateLimitBackoffMs: number;\n private readonly getNow: () => number;\n private disabledUntil: Date = new Date();\n\n constructor(private options: FetchTransportOptions) {\n super();\n\n this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;\n this.getNow = options.getNow ?? (() => Date.now());\n\n this.promiseBuffer = createPromiseBuffer({\n size: options.bufferSize ?? DEFAULT_BUFFER_SIZE,\n concurrency: options.concurrency ?? DEFAULT_CONCURRENCY,\n });\n }\n\n async send(items: TransportItem[]): Promise<void> {\n try {\n if (this.disabledUntil > new Date(this.getNow())) {\n this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`);\n\n return Promise.resolve();\n }\n\n await this.promiseBuffer.add(() => {\n const body = JSON.stringify(getTransportBody(items));\n\n const { url, requestOptions, apiKey } = this.options;\n\n const { headers, ...restOfRequestOptions } = requestOptions ?? {};\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(headers ?? {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n ...(this.config.experimentalSessions?.enabled && this.metas.value.session?.id\n ? { 'x-faro-session-id': this.metas.value.session?.id }\n : {}),\n },\n body,\n keepalive: body.length <= 60_000,\n ...(restOfRequestOptions ?? {}),\n })\n .then((response) => {\n if (response.status === 429) {\n this.disabledUntil = this.getRetryAfterDate(response);\n this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);\n }\n // read the body so the connection can be closed\n response.text().catch(noop);\n\n return response;\n })\n .catch((err) => {\n this.logError('Failed sending payload to the receiver\\n', JSON.parse(body), err);\n });\n });\n } catch (err) {\n this.logError(err);\n }\n }\n\n override getIgnoreUrls(): Array<string | RegExp> {\n return [this.options.url];\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n private getRetryAfterDate(response: Response): Date {\n const now = this.getNow();\n const retryAfterHeader = response.headers.get('Retry-After');\n\n if (retryAfterHeader) {\n const delay = Number(retryAfterHeader);\n\n if (!isNaN(delay)) {\n return new Date(delay * 1000 + now);\n }\n\n const date = Date.parse(retryAfterHeader);\n\n if (!isNaN(date)) {\n return new Date(date);\n }\n }\n\n return new Date(now + this.rateLimitBackoffMs);\n }\n}\n"]}