@descope/sdk-mixins 0.26.0 → 0.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/mixins/telemetryMixin/telemetryMixin.js +34 -8
- package/dist/cjs/mixins/telemetryMixin/telemetryMixin.js.map +1 -1
- package/dist/esm/mixins/telemetryMixin/telemetryMixin.js +34 -8
- package/dist/esm/mixins/telemetryMixin/telemetryMixin.js.map +1 -1
- package/dist/index.d.ts +288 -288
- package/dist/types/mixins/componentsConditionsMixin/componentsConditionsMixin.d.ts +9 -9
- package/dist/types/mixins/configMixin/configMixin.d.ts +14 -14
- package/dist/types/mixins/createStateManagementMixin.d.ts +2 -2
- package/dist/types/mixins/createValidateAttributesMixin/createValidateAttributesMixin.d.ts +5 -5
- package/dist/types/mixins/cspNonceMixin.d.ts +5 -5
- package/dist/types/mixins/debuggerMixin/debugger-wc.d.ts +5 -5
- package/dist/types/mixins/debuggerMixin/debuggerMixin.d.ts +8 -8
- package/dist/types/mixins/descopeUiMixin/descopeUiMixin.d.ts +19 -19
- package/dist/types/mixins/fetchWidgetPagesMixin/createFetchWidgetPagesMixin.d.ts +15 -15
- package/dist/types/mixins/flowIdMixin.d.ts +5 -5
- package/dist/types/mixins/flowInputMixin/flowInputMixin.d.ts +41 -41
- package/dist/types/mixins/formMixin.d.ts +2 -2
- package/dist/types/mixins/initElementMixin.d.ts +5 -5
- package/dist/types/mixins/initLifecycleMixin.d.ts +1 -1
- package/dist/types/mixins/injectNpmLibMixin/injectNpmLibMixin.d.ts +2 -2
- package/dist/types/mixins/injectStyleMixin.d.ts +5 -5
- package/dist/types/mixins/loggerMixin/loggerMixin.d.ts +2 -2
- package/dist/types/mixins/modalMixin/modalMixin.d.ts +23 -23
- package/dist/types/mixins/notificationsMixin/notificationsMixin.d.ts +23 -23
- package/dist/types/mixins/observeAttributesMixin/observeAttributesMixin.d.ts +4 -4
- package/dist/types/mixins/projectIdMixin.d.ts +5 -5
- package/dist/types/mixins/resetMixin.d.ts +6 -6
- package/dist/types/mixins/staticResourcesMixin/staticResourcesMixin.d.ts +10 -10
- package/dist/types/mixins/telemetryMixin/telemetryMixin.d.ts +24 -24
- package/dist/types/mixins/tenantIdMixin.d.ts +5 -5
- package/dist/types/mixins/themeMixin/themeMixin.d.ts +40 -40
- package/dist/types/mixins/widgetConfigMixin/widgetConfigMixin.d.ts +14 -14
- package/dist/types/mixins/widgetIdMixin.d.ts +5 -5
- package/package.json +1 -1
|
@@ -200,14 +200,40 @@ const telemetryMixin = sdkHelpers.createSingletonMixin((superclass) => {
|
|
|
200
200
|
// The backend ships telemetry nested under `projectConfig` in config.json.
|
|
201
201
|
const resolvedConfig = await this.config;
|
|
202
202
|
const beTelemetry = (_b = resolvedConfig === null || resolvedConfig === void 0 ? void 0 : resolvedConfig.projectConfig) === null || _b === void 0 ? void 0 : _b.telemetry;
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
203
|
+
// The DESCOPE_TELEMETRY_* reads below are build-time env tokens: the WC
|
|
204
|
+
// app build substitutes them from .env (rollup.config.app.mjs) and the
|
|
205
|
+
// WC lib build strips them to "" (stubEnvInProd). But @descope/sdk-mixins
|
|
206
|
+
// ships its own dist with these tokens RAW, so a non-WC consumer that
|
|
207
|
+
// bundles this file for the browser hits a bare `process`, which is
|
|
208
|
+
// undefined there -> "ReferenceError: process is not defined".
|
|
209
|
+
// Wrap the reads in try/catch: this keeps the literal `process.env.*`
|
|
210
|
+
// tokens intact (so the WC build-time replace/strip still match them),
|
|
211
|
+
// while falling back to an empty config wherever `process` doesn't
|
|
212
|
+
// exist. Real config comes from the backend (projectConfig.telemetry).
|
|
213
|
+
let fallback;
|
|
214
|
+
try {
|
|
215
|
+
const sampleRate = Number(process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE);
|
|
216
|
+
fallback = {
|
|
217
|
+
enabled: (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===
|
|
218
|
+
'true',
|
|
219
|
+
rumConfig: Object.assign({ applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '', identityPoolId: process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '', region: process.env.DESCOPE_TELEMETRY_REGION || '', sessionSampleRate: Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1 }, (process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {
|
|
220
|
+
guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,
|
|
221
|
+
})),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
catch (_c) {
|
|
225
|
+
// `process` is not defined (browser, no build-time replacement).
|
|
226
|
+
// No .env fallback here - rely on the backend telemetry config.
|
|
227
|
+
fallback = {
|
|
228
|
+
enabled: false,
|
|
229
|
+
rumConfig: {
|
|
230
|
+
applicationId: '',
|
|
231
|
+
identityPoolId: '',
|
|
232
|
+
region: '',
|
|
233
|
+
sessionSampleRate: 1,
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
211
237
|
const cfg = Object.assign(Object.assign(Object.assign({}, fallback), beTelemetry), { rumConfig: Object.assign(Object.assign({}, fallback.rumConfig), beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.rumConfig), capture: tslib.__classPrivateFieldGet(this, _TelemetryMixinClass_instances, "m", _TelemetryMixinClass_resolveCapture).call(this, beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.capture) });
|
|
212
238
|
// If enabled but a required RUM credential is missing (empty from both
|
|
213
239
|
// the BE block and the .env fallback), disable rather than hand AwsRum
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetryMixin.js","sources":["../../../../src/mixins/telemetryMixin/telemetryMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { injectNpmLibMixin } from '../injectNpmLibMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport { TelemetryConfig } from '../configMixin/types';\nimport {\n DEBUG_LOGS_LIB_NAME,\n JS_FILE_PATH,\n LOCAL_STORAGE_OVERRIDE,\n} from './constants';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { configMixin } from '../configMixin';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { flowIdMixin } from '../flowIdMixin';\n\n// Human-readable delay formatter. Picks the largest unit that fits so logs\n// read as \"30 minutes\" / \"2 days\" instead of \"1800 seconds\" / \"172800 seconds\".\nfunction formatDelay(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s} seconds`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m} minutes`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h} hours`;\n return `${Math.floor(h / 24)} days`;\n}\n\n// Extend global window to include DescopeDebugLogs (UMD global)\ndeclare global {\n interface Window {\n DescopeDebugLogs?: new (config: any, context: any, logger?: any) => any;\n }\n}\n\nexport const telemetryMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n injectNpmLibMixin,\n loggerMixin,\n initLifecycleMixin,\n configMixin,\n projectIdMixin,\n flowIdMixin,\n )(superclass);\n\n return class TelemetryMixinClass extends BaseClass {\n #telemetryManager: any = null;\n #telemetryInitialized = false;\n #expirationTimeoutId: NodeJS.Timeout | null = null;\n\n async #initializeTelemetry(\n config: TelemetryConfig,\n context: {\n projectId: string;\n flowId?: string;\n sdkVersion?: string;\n },\n ) {\n if (!config?.enabled) {\n this.logger.debug('Telemetry is disabled, skipping initialization');\n return;\n }\n\n if (this.#telemetryInitialized) {\n this.logger.debug('Telemetry already initialized');\n return;\n }\n\n if (config.expiration && Date.now() >= config.expiration) {\n this.logger.info(\n `Telemetry expiration time has passed (${new Date(\n config.expiration,\n ).toISOString()}), skipping initialization`,\n );\n return;\n }\n\n try {\n this.logger.debug('Initializing telemetry...');\n const version = config.version || 'latest';\n\n await this.injectNpmLib(DEBUG_LOGS_LIB_NAME, version, JS_FILE_PATH, [\n LOCAL_STORAGE_OVERRIDE,\n ]);\n\n const TelemetryManager = window.DescopeDebugLogs;\n if (!TelemetryManager) {\n throw new Error(\n 'DescopeDebugLogs not found after loading @descope/debug-logs. ' +\n 'This likely means the UMD build failed to load from CDN.',\n );\n }\n\n this.#telemetryManager = new TelemetryManager(\n {\n enabled: true,\n rumConfig: config.rumConfig,\n capture: config.capture,\n },\n {\n projectId: context.projectId,\n flowId: context.flowId,\n version: context.sdkVersion || '1.0.0',\n },\n this.logger,\n );\n\n // The TelemetryManager constructor swallows RUM-client init errors\n // (it sets an internal failure flag instead of throwing). Confirm it\n // actually came up before flagging success - otherwise we'd log\n // \"initialized\" and, because #initializeTelemetry early-returns once\n // #telemetryInitialized is true, permanently block any retry.\n if (!this.#telemetryManager.isReady()) {\n this.logger.error(\n 'Telemetry manager failed to initialize (RUM client not ready)',\n );\n this.#telemetryManager = null;\n return;\n }\n\n this.#telemetryInitialized = true;\n\n this.logger.info('Telemetry initialized successfully');\n\n if (config.expiration) {\n this.#scheduleExpirationShutdown(config.expiration);\n }\n } catch (error) {\n this.logger.error('Failed to initialize telemetry:', error);\n this.#telemetryInitialized = false;\n }\n }\n\n /**\n * Schedule automatic telemetry shutdown at expiration time\n * @param expirationMs - Unix timestamp in milliseconds when telemetry should expire\n */\n #scheduleExpirationShutdown(expirationMs: number) {\n const now = Date.now();\n const timeUntilExpiration = expirationMs - now;\n\n if (timeUntilExpiration <= 0) {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n return;\n }\n\n // setTimeout's max safe delay is ~24.8 days; cap at 1 day so a\n // mis-set expiration far in the future doesn't underflow to 0.\n const MAX_TIMEOUT = 86400000;\n const delay = Math.min(timeUntilExpiration, MAX_TIMEOUT);\n\n if (timeUntilExpiration > MAX_TIMEOUT) {\n this.logger.warn(\n `Telemetry expiration is beyond maximum timeout (${formatDelay(\n timeUntilExpiration,\n )}). Setting to maximum.`,\n );\n }\n\n this.logger.info(\n `Telemetry will expire at ${new Date(\n expirationMs,\n ).toISOString()} (in ${formatDelay(delay)})`,\n );\n\n this.#expirationTimeoutId = setTimeout(() => {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n }, delay);\n }\n\n #shutdownTelemetry() {\n if (this.#expirationTimeoutId) {\n clearTimeout(this.#expirationTimeoutId);\n this.#expirationTimeoutId = null;\n }\n\n if (this.#telemetryManager) {\n try {\n this.logger.debug('Shutting down telemetry...');\n this.#telemetryManager.shutdown();\n this.#telemetryManager = null;\n this.#telemetryInitialized = false;\n this.logger.info('Telemetry shutdown complete');\n } catch (error) {\n this.logger.error('Error shutting down telemetry:', error);\n }\n }\n }\n\n /**\n * Get the telemetry manager instance (for advanced usage)\n */\n get telemetryManager() {\n return this.#telemetryManager;\n }\n\n // A RUM client needs applicationId, identityPoolId and region. If any is\n // missing, AwsRum either throws at construction or silently records\n // nothing, so we treat the config as unusable.\n #isRumConfigComplete(rumConfig?: TelemetryConfig['rumConfig']): boolean {\n return Boolean(\n rumConfig?.applicationId &&\n rumConfig?.identityPoolId &&\n rumConfig?.region,\n );\n }\n\n async #getTelemetryConfig(): Promise<TelemetryConfig> {\n // Prefer telemetry config shipped by the backend in the project's\n // config.json. Otherwise, fall back to values from\n // packages/sdks/web-component/.env (DESCOPE_TELEMETRY_* — substituted\n // at WC build time via rollup.config.app.mjs). We MERGE rather than\n // replace so the backend can override individual fields (e.g. just\n // expiration) without re-stating every credential.\n // The backend ships telemetry nested under `projectConfig` in config.json.\n const resolvedConfig = await this.config;\n const beTelemetry = resolvedConfig?.projectConfig?.telemetry;\n\n const sampleRate = Number(\n process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE,\n );\n\n const fallback: NonNullable<TelemetryConfig> = {\n enabled:\n (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===\n 'true',\n rumConfig: {\n applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '',\n identityPoolId:\n process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '',\n region: process.env.DESCOPE_TELEMETRY_REGION || '',\n sessionSampleRate:\n Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1,\n ...(process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {\n guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,\n }),\n },\n };\n\n const cfg: NonNullable<TelemetryConfig> = {\n ...fallback,\n ...beTelemetry,\n rumConfig: {\n ...fallback.rumConfig,\n ...beTelemetry?.rumConfig,\n },\n capture: this.#resolveCapture(beTelemetry?.capture),\n };\n\n // If enabled but a required RUM credential is missing (empty from both\n // the BE block and the .env fallback), disable rather than hand AwsRum\n // an empty applicationId/identityPoolId/region — that would either\n // throw at construction or silently no-op with no session recorded.\n if (cfg.enabled && !this.#isRumConfigComplete(cfg.rumConfig)) {\n this.logger.warn(\n 'Telemetry enabled but rumConfig is incomplete (applicationId/identityPoolId/region required). Skipping initialization.',\n );\n cfg.enabled = false;\n }\n\n // Safety cap: when no backend telemetry config is present at all,\n // end the session after 5 minutes so dev sessions don't leak. Once\n // the backend owns the config it controls expiration explicitly.\n if (!beTelemetry) {\n cfg.expiration = Date.now() + 5 * 60 * 1000;\n this.logger.debug(\n 'No backend telemetry config present; applying a 5-minute safety cap on the session.',\n );\n }\n\n return cfg;\n }\n\n /**\n * The backend can't serialize a DOM element reference, so we always\n * inject this.shadowRoot here. Respect an explicit `dom: false`.\n */\n #resolveCapture(\n beCapture: NonNullable<TelemetryConfig>['capture'],\n ): NonNullable<TelemetryConfig>['capture'] {\n // `network: true` = capture ALL network traffic. We used to default to\n // `{ urlFilter: [] }` but the two network paths had inverted semantics\n // for the empty array: the custom NetworkPlugin treated it as\n // \"capture everything\", while AWS RUM's built-in HTTP telemetry\n // treated it as \"capture nothing\". `true` is consistent — both paths\n // capture all by default. BE can override with a narrow filter later.\n const domSetting = beCapture?.dom;\n if (domSetting === false) {\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: false,\n };\n }\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: {\n throttleMs: 2000,\n ...(typeof domSetting === 'object' ? domSetting : {}),\n rootElement: this.shadowRoot as any,\n },\n };\n }\n\n updateTelemetryContext(context: Record<string, any>) {\n if (this.#telemetryManager) {\n try {\n this.#telemetryManager.updateContext(context);\n } catch (error) {\n // Fail silently - telemetry errors should never break the web-component\n this.logger.error('Error updating telemetry context:', error);\n }\n }\n }\n\n #telemetryReady: Promise<void> | null = null;\n\n async init() {\n // super.init() FIRST so downstream mixins finish setup and the\n // SDK's user-facing paint isn't blocked on our CDN load or the\n // `this.config` fetch. Kick off telemetry as its OWN promise chain\n // stored on the instance. NOT awaited here — tests using\n // jest.useFakeTimers can't advance the fetch chain, and blocking on\n // it would freeze the render. Failures are caught so telemetry\n // errors can never break the SDK's boot.\n await super.init?.();\n const sdkVersion = (this as any).sdkVersion || '1.0.0';\n this.#telemetryReady = this.#getTelemetryConfig()\n .then((config) =>\n this.#initializeTelemetry(config as any, {\n projectId: this.projectId,\n flowId: this.flowId,\n sdkVersion,\n }),\n )\n .catch((error) => {\n this.logger.error('Failed to start telemetry:', error);\n });\n }\n\n // Test hook: resolves once telemetry init has settled (success or\n // caught error). Not part of the public SDK contract.\n get telemetryReady(): Promise<void> {\n return this.#telemetryReady ?? Promise.resolve();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback?.();\n this.#shutdownTelemetry();\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","injectNpmLibMixin","loggerMixin","initLifecycleMixin","configMixin","projectIdMixin","flowIdMixin","__classPrivateFieldGet","__classPrivateFieldSet","DEBUG_LOGS_LIB_NAME","JS_FILE_PATH","LOCAL_STORAGE_OVERRIDE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telemetryMixin.js","sources":["../../../../src/mixins/telemetryMixin/telemetryMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { injectNpmLibMixin } from '../injectNpmLibMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport { TelemetryConfig } from '../configMixin/types';\nimport {\n DEBUG_LOGS_LIB_NAME,\n JS_FILE_PATH,\n LOCAL_STORAGE_OVERRIDE,\n} from './constants';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { configMixin } from '../configMixin';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { flowIdMixin } from '../flowIdMixin';\n\n// Human-readable delay formatter. Picks the largest unit that fits so logs\n// read as \"30 minutes\" / \"2 days\" instead of \"1800 seconds\" / \"172800 seconds\".\nfunction formatDelay(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s} seconds`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m} minutes`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h} hours`;\n return `${Math.floor(h / 24)} days`;\n}\n\n// Extend global window to include DescopeDebugLogs (UMD global)\ndeclare global {\n interface Window {\n DescopeDebugLogs?: new (config: any, context: any, logger?: any) => any;\n }\n}\n\nexport const telemetryMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n injectNpmLibMixin,\n loggerMixin,\n initLifecycleMixin,\n configMixin,\n projectIdMixin,\n flowIdMixin,\n )(superclass);\n\n return class TelemetryMixinClass extends BaseClass {\n #telemetryManager: any = null;\n #telemetryInitialized = false;\n #expirationTimeoutId: NodeJS.Timeout | null = null;\n\n async #initializeTelemetry(\n config: TelemetryConfig,\n context: {\n projectId: string;\n flowId?: string;\n sdkVersion?: string;\n },\n ) {\n if (!config?.enabled) {\n this.logger.debug('Telemetry is disabled, skipping initialization');\n return;\n }\n\n if (this.#telemetryInitialized) {\n this.logger.debug('Telemetry already initialized');\n return;\n }\n\n if (config.expiration && Date.now() >= config.expiration) {\n this.logger.info(\n `Telemetry expiration time has passed (${new Date(\n config.expiration,\n ).toISOString()}), skipping initialization`,\n );\n return;\n }\n\n try {\n this.logger.debug('Initializing telemetry...');\n const version = config.version || 'latest';\n\n await this.injectNpmLib(DEBUG_LOGS_LIB_NAME, version, JS_FILE_PATH, [\n LOCAL_STORAGE_OVERRIDE,\n ]);\n\n const TelemetryManager = window.DescopeDebugLogs;\n if (!TelemetryManager) {\n throw new Error(\n 'DescopeDebugLogs not found after loading @descope/debug-logs. ' +\n 'This likely means the UMD build failed to load from CDN.',\n );\n }\n\n this.#telemetryManager = new TelemetryManager(\n {\n enabled: true,\n rumConfig: config.rumConfig,\n capture: config.capture,\n },\n {\n projectId: context.projectId,\n flowId: context.flowId,\n version: context.sdkVersion || '1.0.0',\n },\n this.logger,\n );\n\n // The TelemetryManager constructor swallows RUM-client init errors\n // (it sets an internal failure flag instead of throwing). Confirm it\n // actually came up before flagging success - otherwise we'd log\n // \"initialized\" and, because #initializeTelemetry early-returns once\n // #telemetryInitialized is true, permanently block any retry.\n if (!this.#telemetryManager.isReady()) {\n this.logger.error(\n 'Telemetry manager failed to initialize (RUM client not ready)',\n );\n this.#telemetryManager = null;\n return;\n }\n\n this.#telemetryInitialized = true;\n\n this.logger.info('Telemetry initialized successfully');\n\n if (config.expiration) {\n this.#scheduleExpirationShutdown(config.expiration);\n }\n } catch (error) {\n this.logger.error('Failed to initialize telemetry:', error);\n this.#telemetryInitialized = false;\n }\n }\n\n /**\n * Schedule automatic telemetry shutdown at expiration time\n * @param expirationMs - Unix timestamp in milliseconds when telemetry should expire\n */\n #scheduleExpirationShutdown(expirationMs: number) {\n const now = Date.now();\n const timeUntilExpiration = expirationMs - now;\n\n if (timeUntilExpiration <= 0) {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n return;\n }\n\n // setTimeout's max safe delay is ~24.8 days; cap at 1 day so a\n // mis-set expiration far in the future doesn't underflow to 0.\n const MAX_TIMEOUT = 86400000;\n const delay = Math.min(timeUntilExpiration, MAX_TIMEOUT);\n\n if (timeUntilExpiration > MAX_TIMEOUT) {\n this.logger.warn(\n `Telemetry expiration is beyond maximum timeout (${formatDelay(\n timeUntilExpiration,\n )}). Setting to maximum.`,\n );\n }\n\n this.logger.info(\n `Telemetry will expire at ${new Date(\n expirationMs,\n ).toISOString()} (in ${formatDelay(delay)})`,\n );\n\n this.#expirationTimeoutId = setTimeout(() => {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n }, delay);\n }\n\n #shutdownTelemetry() {\n if (this.#expirationTimeoutId) {\n clearTimeout(this.#expirationTimeoutId);\n this.#expirationTimeoutId = null;\n }\n\n if (this.#telemetryManager) {\n try {\n this.logger.debug('Shutting down telemetry...');\n this.#telemetryManager.shutdown();\n this.#telemetryManager = null;\n this.#telemetryInitialized = false;\n this.logger.info('Telemetry shutdown complete');\n } catch (error) {\n this.logger.error('Error shutting down telemetry:', error);\n }\n }\n }\n\n /**\n * Get the telemetry manager instance (for advanced usage)\n */\n get telemetryManager() {\n return this.#telemetryManager;\n }\n\n // A RUM client needs applicationId, identityPoolId and region. If any is\n // missing, AwsRum either throws at construction or silently records\n // nothing, so we treat the config as unusable.\n #isRumConfigComplete(rumConfig?: TelemetryConfig['rumConfig']): boolean {\n return Boolean(\n rumConfig?.applicationId &&\n rumConfig?.identityPoolId &&\n rumConfig?.region,\n );\n }\n\n async #getTelemetryConfig(): Promise<TelemetryConfig> {\n // Prefer telemetry config shipped by the backend in the project's\n // config.json. Otherwise, fall back to values from\n // packages/sdks/web-component/.env (DESCOPE_TELEMETRY_* — substituted\n // at WC build time via rollup.config.app.mjs). We MERGE rather than\n // replace so the backend can override individual fields (e.g. just\n // expiration) without re-stating every credential.\n // The backend ships telemetry nested under `projectConfig` in config.json.\n const resolvedConfig = await this.config;\n const beTelemetry = resolvedConfig?.projectConfig?.telemetry;\n\n // The DESCOPE_TELEMETRY_* reads below are build-time env tokens: the WC\n // app build substitutes them from .env (rollup.config.app.mjs) and the\n // WC lib build strips them to \"\" (stubEnvInProd). But @descope/sdk-mixins\n // ships its own dist with these tokens RAW, so a non-WC consumer that\n // bundles this file for the browser hits a bare `process`, which is\n // undefined there -> \"ReferenceError: process is not defined\".\n // Wrap the reads in try/catch: this keeps the literal `process.env.*`\n // tokens intact (so the WC build-time replace/strip still match them),\n // while falling back to an empty config wherever `process` doesn't\n // exist. Real config comes from the backend (projectConfig.telemetry).\n let fallback: NonNullable<TelemetryConfig>;\n try {\n const sampleRate = Number(\n process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE,\n );\n\n fallback = {\n enabled:\n (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===\n 'true',\n rumConfig: {\n applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '',\n identityPoolId:\n process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '',\n region: process.env.DESCOPE_TELEMETRY_REGION || '',\n sessionSampleRate:\n Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1,\n ...(process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {\n guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,\n }),\n },\n };\n } catch {\n // `process` is not defined (browser, no build-time replacement).\n // No .env fallback here - rely on the backend telemetry config.\n fallback = {\n enabled: false,\n rumConfig: {\n applicationId: '',\n identityPoolId: '',\n region: '',\n sessionSampleRate: 1,\n },\n };\n }\n\n const cfg: NonNullable<TelemetryConfig> = {\n ...fallback,\n ...beTelemetry,\n rumConfig: {\n ...fallback.rumConfig,\n ...beTelemetry?.rumConfig,\n },\n capture: this.#resolveCapture(beTelemetry?.capture),\n };\n\n // If enabled but a required RUM credential is missing (empty from both\n // the BE block and the .env fallback), disable rather than hand AwsRum\n // an empty applicationId/identityPoolId/region — that would either\n // throw at construction or silently no-op with no session recorded.\n if (cfg.enabled && !this.#isRumConfigComplete(cfg.rumConfig)) {\n this.logger.warn(\n 'Telemetry enabled but rumConfig is incomplete (applicationId/identityPoolId/region required). Skipping initialization.',\n );\n cfg.enabled = false;\n }\n\n // Safety cap: when no backend telemetry config is present at all,\n // end the session after 5 minutes so dev sessions don't leak. Once\n // the backend owns the config it controls expiration explicitly.\n if (!beTelemetry) {\n cfg.expiration = Date.now() + 5 * 60 * 1000;\n this.logger.debug(\n 'No backend telemetry config present; applying a 5-minute safety cap on the session.',\n );\n }\n\n return cfg;\n }\n\n /**\n * The backend can't serialize a DOM element reference, so we always\n * inject this.shadowRoot here. Respect an explicit `dom: false`.\n */\n #resolveCapture(\n beCapture: NonNullable<TelemetryConfig>['capture'],\n ): NonNullable<TelemetryConfig>['capture'] {\n // `network: true` = capture ALL network traffic. We used to default to\n // `{ urlFilter: [] }` but the two network paths had inverted semantics\n // for the empty array: the custom NetworkPlugin treated it as\n // \"capture everything\", while AWS RUM's built-in HTTP telemetry\n // treated it as \"capture nothing\". `true` is consistent — both paths\n // capture all by default. BE can override with a narrow filter later.\n const domSetting = beCapture?.dom;\n if (domSetting === false) {\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: false,\n };\n }\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: {\n throttleMs: 2000,\n ...(typeof domSetting === 'object' ? domSetting : {}),\n rootElement: this.shadowRoot as any,\n },\n };\n }\n\n updateTelemetryContext(context: Record<string, any>) {\n if (this.#telemetryManager) {\n try {\n this.#telemetryManager.updateContext(context);\n } catch (error) {\n // Fail silently - telemetry errors should never break the web-component\n this.logger.error('Error updating telemetry context:', error);\n }\n }\n }\n\n #telemetryReady: Promise<void> | null = null;\n\n async init() {\n // super.init() FIRST so downstream mixins finish setup and the\n // SDK's user-facing paint isn't blocked on our CDN load or the\n // `this.config` fetch. Kick off telemetry as its OWN promise chain\n // stored on the instance. NOT awaited here — tests using\n // jest.useFakeTimers can't advance the fetch chain, and blocking on\n // it would freeze the render. Failures are caught so telemetry\n // errors can never break the SDK's boot.\n await super.init?.();\n const sdkVersion = (this as any).sdkVersion || '1.0.0';\n this.#telemetryReady = this.#getTelemetryConfig()\n .then((config) =>\n this.#initializeTelemetry(config as any, {\n projectId: this.projectId,\n flowId: this.flowId,\n sdkVersion,\n }),\n )\n .catch((error) => {\n this.logger.error('Failed to start telemetry:', error);\n });\n }\n\n // Test hook: resolves once telemetry init has settled (success or\n // caught error). Not part of the public SDK contract.\n get telemetryReady(): Promise<void> {\n return this.#telemetryReady ?? Promise.resolve();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback?.();\n this.#shutdownTelemetry();\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","injectNpmLibMixin","loggerMixin","initLifecycleMixin","configMixin","projectIdMixin","flowIdMixin","__classPrivateFieldGet","__classPrivateFieldSet","DEBUG_LOGS_LIB_NAME","JS_FILE_PATH","LOCAL_STORAGE_OVERRIDE"],"mappings":"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"}
|
|
@@ -198,14 +198,40 @@ const telemetryMixin = createSingletonMixin((superclass) => {
|
|
|
198
198
|
// The backend ships telemetry nested under `projectConfig` in config.json.
|
|
199
199
|
const resolvedConfig = await this.config;
|
|
200
200
|
const beTelemetry = (_b = resolvedConfig === null || resolvedConfig === void 0 ? void 0 : resolvedConfig.projectConfig) === null || _b === void 0 ? void 0 : _b.telemetry;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
201
|
+
// The DESCOPE_TELEMETRY_* reads below are build-time env tokens: the WC
|
|
202
|
+
// app build substitutes them from .env (rollup.config.app.mjs) and the
|
|
203
|
+
// WC lib build strips them to "" (stubEnvInProd). But @descope/sdk-mixins
|
|
204
|
+
// ships its own dist with these tokens RAW, so a non-WC consumer that
|
|
205
|
+
// bundles this file for the browser hits a bare `process`, which is
|
|
206
|
+
// undefined there -> "ReferenceError: process is not defined".
|
|
207
|
+
// Wrap the reads in try/catch: this keeps the literal `process.env.*`
|
|
208
|
+
// tokens intact (so the WC build-time replace/strip still match them),
|
|
209
|
+
// while falling back to an empty config wherever `process` doesn't
|
|
210
|
+
// exist. Real config comes from the backend (projectConfig.telemetry).
|
|
211
|
+
let fallback;
|
|
212
|
+
try {
|
|
213
|
+
const sampleRate = Number(process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE);
|
|
214
|
+
fallback = {
|
|
215
|
+
enabled: (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===
|
|
216
|
+
'true',
|
|
217
|
+
rumConfig: Object.assign({ applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '', identityPoolId: process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '', region: process.env.DESCOPE_TELEMETRY_REGION || '', sessionSampleRate: Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1 }, (process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {
|
|
218
|
+
guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,
|
|
219
|
+
})),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch (_c) {
|
|
223
|
+
// `process` is not defined (browser, no build-time replacement).
|
|
224
|
+
// No .env fallback here - rely on the backend telemetry config.
|
|
225
|
+
fallback = {
|
|
226
|
+
enabled: false,
|
|
227
|
+
rumConfig: {
|
|
228
|
+
applicationId: '',
|
|
229
|
+
identityPoolId: '',
|
|
230
|
+
region: '',
|
|
231
|
+
sessionSampleRate: 1,
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
209
235
|
const cfg = Object.assign(Object.assign(Object.assign({}, fallback), beTelemetry), { rumConfig: Object.assign(Object.assign({}, fallback.rumConfig), beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.rumConfig), capture: __classPrivateFieldGet(this, _TelemetryMixinClass_instances, "m", _TelemetryMixinClass_resolveCapture).call(this, beTelemetry === null || beTelemetry === void 0 ? void 0 : beTelemetry.capture) });
|
|
210
236
|
// If enabled but a required RUM credential is missing (empty from both
|
|
211
237
|
// the BE block and the .env fallback), disable rather than hand AwsRum
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetryMixin.js","sources":["../../../../src/mixins/telemetryMixin/telemetryMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { injectNpmLibMixin } from '../injectNpmLibMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport { TelemetryConfig } from '../configMixin/types';\nimport {\n DEBUG_LOGS_LIB_NAME,\n JS_FILE_PATH,\n LOCAL_STORAGE_OVERRIDE,\n} from './constants';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { configMixin } from '../configMixin';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { flowIdMixin } from '../flowIdMixin';\n\n// Human-readable delay formatter. Picks the largest unit that fits so logs\n// read as \"30 minutes\" / \"2 days\" instead of \"1800 seconds\" / \"172800 seconds\".\nfunction formatDelay(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s} seconds`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m} minutes`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h} hours`;\n return `${Math.floor(h / 24)} days`;\n}\n\n// Extend global window to include DescopeDebugLogs (UMD global)\ndeclare global {\n interface Window {\n DescopeDebugLogs?: new (config: any, context: any, logger?: any) => any;\n }\n}\n\nexport const telemetryMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n injectNpmLibMixin,\n loggerMixin,\n initLifecycleMixin,\n configMixin,\n projectIdMixin,\n flowIdMixin,\n )(superclass);\n\n return class TelemetryMixinClass extends BaseClass {\n #telemetryManager: any = null;\n #telemetryInitialized = false;\n #expirationTimeoutId: NodeJS.Timeout | null = null;\n\n async #initializeTelemetry(\n config: TelemetryConfig,\n context: {\n projectId: string;\n flowId?: string;\n sdkVersion?: string;\n },\n ) {\n if (!config?.enabled) {\n this.logger.debug('Telemetry is disabled, skipping initialization');\n return;\n }\n\n if (this.#telemetryInitialized) {\n this.logger.debug('Telemetry already initialized');\n return;\n }\n\n if (config.expiration && Date.now() >= config.expiration) {\n this.logger.info(\n `Telemetry expiration time has passed (${new Date(\n config.expiration,\n ).toISOString()}), skipping initialization`,\n );\n return;\n }\n\n try {\n this.logger.debug('Initializing telemetry...');\n const version = config.version || 'latest';\n\n await this.injectNpmLib(DEBUG_LOGS_LIB_NAME, version, JS_FILE_PATH, [\n LOCAL_STORAGE_OVERRIDE,\n ]);\n\n const TelemetryManager = window.DescopeDebugLogs;\n if (!TelemetryManager) {\n throw new Error(\n 'DescopeDebugLogs not found after loading @descope/debug-logs. ' +\n 'This likely means the UMD build failed to load from CDN.',\n );\n }\n\n this.#telemetryManager = new TelemetryManager(\n {\n enabled: true,\n rumConfig: config.rumConfig,\n capture: config.capture,\n },\n {\n projectId: context.projectId,\n flowId: context.flowId,\n version: context.sdkVersion || '1.0.0',\n },\n this.logger,\n );\n\n // The TelemetryManager constructor swallows RUM-client init errors\n // (it sets an internal failure flag instead of throwing). Confirm it\n // actually came up before flagging success - otherwise we'd log\n // \"initialized\" and, because #initializeTelemetry early-returns once\n // #telemetryInitialized is true, permanently block any retry.\n if (!this.#telemetryManager.isReady()) {\n this.logger.error(\n 'Telemetry manager failed to initialize (RUM client not ready)',\n );\n this.#telemetryManager = null;\n return;\n }\n\n this.#telemetryInitialized = true;\n\n this.logger.info('Telemetry initialized successfully');\n\n if (config.expiration) {\n this.#scheduleExpirationShutdown(config.expiration);\n }\n } catch (error) {\n this.logger.error('Failed to initialize telemetry:', error);\n this.#telemetryInitialized = false;\n }\n }\n\n /**\n * Schedule automatic telemetry shutdown at expiration time\n * @param expirationMs - Unix timestamp in milliseconds when telemetry should expire\n */\n #scheduleExpirationShutdown(expirationMs: number) {\n const now = Date.now();\n const timeUntilExpiration = expirationMs - now;\n\n if (timeUntilExpiration <= 0) {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n return;\n }\n\n // setTimeout's max safe delay is ~24.8 days; cap at 1 day so a\n // mis-set expiration far in the future doesn't underflow to 0.\n const MAX_TIMEOUT = 86400000;\n const delay = Math.min(timeUntilExpiration, MAX_TIMEOUT);\n\n if (timeUntilExpiration > MAX_TIMEOUT) {\n this.logger.warn(\n `Telemetry expiration is beyond maximum timeout (${formatDelay(\n timeUntilExpiration,\n )}). Setting to maximum.`,\n );\n }\n\n this.logger.info(\n `Telemetry will expire at ${new Date(\n expirationMs,\n ).toISOString()} (in ${formatDelay(delay)})`,\n );\n\n this.#expirationTimeoutId = setTimeout(() => {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n }, delay);\n }\n\n #shutdownTelemetry() {\n if (this.#expirationTimeoutId) {\n clearTimeout(this.#expirationTimeoutId);\n this.#expirationTimeoutId = null;\n }\n\n if (this.#telemetryManager) {\n try {\n this.logger.debug('Shutting down telemetry...');\n this.#telemetryManager.shutdown();\n this.#telemetryManager = null;\n this.#telemetryInitialized = false;\n this.logger.info('Telemetry shutdown complete');\n } catch (error) {\n this.logger.error('Error shutting down telemetry:', error);\n }\n }\n }\n\n /**\n * Get the telemetry manager instance (for advanced usage)\n */\n get telemetryManager() {\n return this.#telemetryManager;\n }\n\n // A RUM client needs applicationId, identityPoolId and region. If any is\n // missing, AwsRum either throws at construction or silently records\n // nothing, so we treat the config as unusable.\n #isRumConfigComplete(rumConfig?: TelemetryConfig['rumConfig']): boolean {\n return Boolean(\n rumConfig?.applicationId &&\n rumConfig?.identityPoolId &&\n rumConfig?.region,\n );\n }\n\n async #getTelemetryConfig(): Promise<TelemetryConfig> {\n // Prefer telemetry config shipped by the backend in the project's\n // config.json. Otherwise, fall back to values from\n // packages/sdks/web-component/.env (DESCOPE_TELEMETRY_* — substituted\n // at WC build time via rollup.config.app.mjs). We MERGE rather than\n // replace so the backend can override individual fields (e.g. just\n // expiration) without re-stating every credential.\n // The backend ships telemetry nested under `projectConfig` in config.json.\n const resolvedConfig = await this.config;\n const beTelemetry = resolvedConfig?.projectConfig?.telemetry;\n\n const sampleRate = Number(\n process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE,\n );\n\n const fallback: NonNullable<TelemetryConfig> = {\n enabled:\n (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===\n 'true',\n rumConfig: {\n applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '',\n identityPoolId:\n process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '',\n region: process.env.DESCOPE_TELEMETRY_REGION || '',\n sessionSampleRate:\n Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1,\n ...(process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {\n guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,\n }),\n },\n };\n\n const cfg: NonNullable<TelemetryConfig> = {\n ...fallback,\n ...beTelemetry,\n rumConfig: {\n ...fallback.rumConfig,\n ...beTelemetry?.rumConfig,\n },\n capture: this.#resolveCapture(beTelemetry?.capture),\n };\n\n // If enabled but a required RUM credential is missing (empty from both\n // the BE block and the .env fallback), disable rather than hand AwsRum\n // an empty applicationId/identityPoolId/region — that would either\n // throw at construction or silently no-op with no session recorded.\n if (cfg.enabled && !this.#isRumConfigComplete(cfg.rumConfig)) {\n this.logger.warn(\n 'Telemetry enabled but rumConfig is incomplete (applicationId/identityPoolId/region required). Skipping initialization.',\n );\n cfg.enabled = false;\n }\n\n // Safety cap: when no backend telemetry config is present at all,\n // end the session after 5 minutes so dev sessions don't leak. Once\n // the backend owns the config it controls expiration explicitly.\n if (!beTelemetry) {\n cfg.expiration = Date.now() + 5 * 60 * 1000;\n this.logger.debug(\n 'No backend telemetry config present; applying a 5-minute safety cap on the session.',\n );\n }\n\n return cfg;\n }\n\n /**\n * The backend can't serialize a DOM element reference, so we always\n * inject this.shadowRoot here. Respect an explicit `dom: false`.\n */\n #resolveCapture(\n beCapture: NonNullable<TelemetryConfig>['capture'],\n ): NonNullable<TelemetryConfig>['capture'] {\n // `network: true` = capture ALL network traffic. We used to default to\n // `{ urlFilter: [] }` but the two network paths had inverted semantics\n // for the empty array: the custom NetworkPlugin treated it as\n // \"capture everything\", while AWS RUM's built-in HTTP telemetry\n // treated it as \"capture nothing\". `true` is consistent — both paths\n // capture all by default. BE can override with a narrow filter later.\n const domSetting = beCapture?.dom;\n if (domSetting === false) {\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: false,\n };\n }\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: {\n throttleMs: 2000,\n ...(typeof domSetting === 'object' ? domSetting : {}),\n rootElement: this.shadowRoot as any,\n },\n };\n }\n\n updateTelemetryContext(context: Record<string, any>) {\n if (this.#telemetryManager) {\n try {\n this.#telemetryManager.updateContext(context);\n } catch (error) {\n // Fail silently - telemetry errors should never break the web-component\n this.logger.error('Error updating telemetry context:', error);\n }\n }\n }\n\n #telemetryReady: Promise<void> | null = null;\n\n async init() {\n // super.init() FIRST so downstream mixins finish setup and the\n // SDK's user-facing paint isn't blocked on our CDN load or the\n // `this.config` fetch. Kick off telemetry as its OWN promise chain\n // stored on the instance. NOT awaited here — tests using\n // jest.useFakeTimers can't advance the fetch chain, and blocking on\n // it would freeze the render. Failures are caught so telemetry\n // errors can never break the SDK's boot.\n await super.init?.();\n const sdkVersion = (this as any).sdkVersion || '1.0.0';\n this.#telemetryReady = this.#getTelemetryConfig()\n .then((config) =>\n this.#initializeTelemetry(config as any, {\n projectId: this.projectId,\n flowId: this.flowId,\n sdkVersion,\n }),\n )\n .catch((error) => {\n this.logger.error('Failed to start telemetry:', error);\n });\n }\n\n // Test hook: resolves once telemetry init has settled (success or\n // caught error). Not part of the public SDK contract.\n get telemetryReady(): Promise<void> {\n return this.#telemetryReady ?? Promise.resolve();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback?.();\n this.#shutdownTelemetry();\n }\n };\n },\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telemetryMixin.js","sources":["../../../../src/mixins/telemetryMixin/telemetryMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { injectNpmLibMixin } from '../injectNpmLibMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport { TelemetryConfig } from '../configMixin/types';\nimport {\n DEBUG_LOGS_LIB_NAME,\n JS_FILE_PATH,\n LOCAL_STORAGE_OVERRIDE,\n} from './constants';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { configMixin } from '../configMixin';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { flowIdMixin } from '../flowIdMixin';\n\n// Human-readable delay formatter. Picks the largest unit that fits so logs\n// read as \"30 minutes\" / \"2 days\" instead of \"1800 seconds\" / \"172800 seconds\".\nfunction formatDelay(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s} seconds`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m} minutes`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h} hours`;\n return `${Math.floor(h / 24)} days`;\n}\n\n// Extend global window to include DescopeDebugLogs (UMD global)\ndeclare global {\n interface Window {\n DescopeDebugLogs?: new (config: any, context: any, logger?: any) => any;\n }\n}\n\nexport const telemetryMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n injectNpmLibMixin,\n loggerMixin,\n initLifecycleMixin,\n configMixin,\n projectIdMixin,\n flowIdMixin,\n )(superclass);\n\n return class TelemetryMixinClass extends BaseClass {\n #telemetryManager: any = null;\n #telemetryInitialized = false;\n #expirationTimeoutId: NodeJS.Timeout | null = null;\n\n async #initializeTelemetry(\n config: TelemetryConfig,\n context: {\n projectId: string;\n flowId?: string;\n sdkVersion?: string;\n },\n ) {\n if (!config?.enabled) {\n this.logger.debug('Telemetry is disabled, skipping initialization');\n return;\n }\n\n if (this.#telemetryInitialized) {\n this.logger.debug('Telemetry already initialized');\n return;\n }\n\n if (config.expiration && Date.now() >= config.expiration) {\n this.logger.info(\n `Telemetry expiration time has passed (${new Date(\n config.expiration,\n ).toISOString()}), skipping initialization`,\n );\n return;\n }\n\n try {\n this.logger.debug('Initializing telemetry...');\n const version = config.version || 'latest';\n\n await this.injectNpmLib(DEBUG_LOGS_LIB_NAME, version, JS_FILE_PATH, [\n LOCAL_STORAGE_OVERRIDE,\n ]);\n\n const TelemetryManager = window.DescopeDebugLogs;\n if (!TelemetryManager) {\n throw new Error(\n 'DescopeDebugLogs not found after loading @descope/debug-logs. ' +\n 'This likely means the UMD build failed to load from CDN.',\n );\n }\n\n this.#telemetryManager = new TelemetryManager(\n {\n enabled: true,\n rumConfig: config.rumConfig,\n capture: config.capture,\n },\n {\n projectId: context.projectId,\n flowId: context.flowId,\n version: context.sdkVersion || '1.0.0',\n },\n this.logger,\n );\n\n // The TelemetryManager constructor swallows RUM-client init errors\n // (it sets an internal failure flag instead of throwing). Confirm it\n // actually came up before flagging success - otherwise we'd log\n // \"initialized\" and, because #initializeTelemetry early-returns once\n // #telemetryInitialized is true, permanently block any retry.\n if (!this.#telemetryManager.isReady()) {\n this.logger.error(\n 'Telemetry manager failed to initialize (RUM client not ready)',\n );\n this.#telemetryManager = null;\n return;\n }\n\n this.#telemetryInitialized = true;\n\n this.logger.info('Telemetry initialized successfully');\n\n if (config.expiration) {\n this.#scheduleExpirationShutdown(config.expiration);\n }\n } catch (error) {\n this.logger.error('Failed to initialize telemetry:', error);\n this.#telemetryInitialized = false;\n }\n }\n\n /**\n * Schedule automatic telemetry shutdown at expiration time\n * @param expirationMs - Unix timestamp in milliseconds when telemetry should expire\n */\n #scheduleExpirationShutdown(expirationMs: number) {\n const now = Date.now();\n const timeUntilExpiration = expirationMs - now;\n\n if (timeUntilExpiration <= 0) {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n return;\n }\n\n // setTimeout's max safe delay is ~24.8 days; cap at 1 day so a\n // mis-set expiration far in the future doesn't underflow to 0.\n const MAX_TIMEOUT = 86400000;\n const delay = Math.min(timeUntilExpiration, MAX_TIMEOUT);\n\n if (timeUntilExpiration > MAX_TIMEOUT) {\n this.logger.warn(\n `Telemetry expiration is beyond maximum timeout (${formatDelay(\n timeUntilExpiration,\n )}). Setting to maximum.`,\n );\n }\n\n this.logger.info(\n `Telemetry will expire at ${new Date(\n expirationMs,\n ).toISOString()} (in ${formatDelay(delay)})`,\n );\n\n this.#expirationTimeoutId = setTimeout(() => {\n this.logger.info('Telemetry expiration time reached, shutting down');\n this.#shutdownTelemetry();\n }, delay);\n }\n\n #shutdownTelemetry() {\n if (this.#expirationTimeoutId) {\n clearTimeout(this.#expirationTimeoutId);\n this.#expirationTimeoutId = null;\n }\n\n if (this.#telemetryManager) {\n try {\n this.logger.debug('Shutting down telemetry...');\n this.#telemetryManager.shutdown();\n this.#telemetryManager = null;\n this.#telemetryInitialized = false;\n this.logger.info('Telemetry shutdown complete');\n } catch (error) {\n this.logger.error('Error shutting down telemetry:', error);\n }\n }\n }\n\n /**\n * Get the telemetry manager instance (for advanced usage)\n */\n get telemetryManager() {\n return this.#telemetryManager;\n }\n\n // A RUM client needs applicationId, identityPoolId and region. If any is\n // missing, AwsRum either throws at construction or silently records\n // nothing, so we treat the config as unusable.\n #isRumConfigComplete(rumConfig?: TelemetryConfig['rumConfig']): boolean {\n return Boolean(\n rumConfig?.applicationId &&\n rumConfig?.identityPoolId &&\n rumConfig?.region,\n );\n }\n\n async #getTelemetryConfig(): Promise<TelemetryConfig> {\n // Prefer telemetry config shipped by the backend in the project's\n // config.json. Otherwise, fall back to values from\n // packages/sdks/web-component/.env (DESCOPE_TELEMETRY_* — substituted\n // at WC build time via rollup.config.app.mjs). We MERGE rather than\n // replace so the backend can override individual fields (e.g. just\n // expiration) without re-stating every credential.\n // The backend ships telemetry nested under `projectConfig` in config.json.\n const resolvedConfig = await this.config;\n const beTelemetry = resolvedConfig?.projectConfig?.telemetry;\n\n // The DESCOPE_TELEMETRY_* reads below are build-time env tokens: the WC\n // app build substitutes them from .env (rollup.config.app.mjs) and the\n // WC lib build strips them to \"\" (stubEnvInProd). But @descope/sdk-mixins\n // ships its own dist with these tokens RAW, so a non-WC consumer that\n // bundles this file for the browser hits a bare `process`, which is\n // undefined there -> \"ReferenceError: process is not defined\".\n // Wrap the reads in try/catch: this keeps the literal `process.env.*`\n // tokens intact (so the WC build-time replace/strip still match them),\n // while falling back to an empty config wherever `process` doesn't\n // exist. Real config comes from the backend (projectConfig.telemetry).\n let fallback: NonNullable<TelemetryConfig>;\n try {\n const sampleRate = Number(\n process.env.DESCOPE_TELEMETRY_SESSION_SAMPLE_RATE,\n );\n\n fallback = {\n enabled:\n (process.env.DESCOPE_TELEMETRY_ENABLED || '').toLowerCase() ===\n 'true',\n rumConfig: {\n applicationId: process.env.DESCOPE_TELEMETRY_APPLICATION_ID || '',\n identityPoolId:\n process.env.DESCOPE_TELEMETRY_IDENTITY_POOL_ID || '',\n region: process.env.DESCOPE_TELEMETRY_REGION || '',\n sessionSampleRate:\n Number.isFinite(sampleRate) && sampleRate > 0 ? sampleRate : 1,\n ...(process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN && {\n guestRoleArn: process.env.DESCOPE_TELEMETRY_GUEST_ROLE_ARN,\n }),\n },\n };\n } catch {\n // `process` is not defined (browser, no build-time replacement).\n // No .env fallback here - rely on the backend telemetry config.\n fallback = {\n enabled: false,\n rumConfig: {\n applicationId: '',\n identityPoolId: '',\n region: '',\n sessionSampleRate: 1,\n },\n };\n }\n\n const cfg: NonNullable<TelemetryConfig> = {\n ...fallback,\n ...beTelemetry,\n rumConfig: {\n ...fallback.rumConfig,\n ...beTelemetry?.rumConfig,\n },\n capture: this.#resolveCapture(beTelemetry?.capture),\n };\n\n // If enabled but a required RUM credential is missing (empty from both\n // the BE block and the .env fallback), disable rather than hand AwsRum\n // an empty applicationId/identityPoolId/region — that would either\n // throw at construction or silently no-op with no session recorded.\n if (cfg.enabled && !this.#isRumConfigComplete(cfg.rumConfig)) {\n this.logger.warn(\n 'Telemetry enabled but rumConfig is incomplete (applicationId/identityPoolId/region required). Skipping initialization.',\n );\n cfg.enabled = false;\n }\n\n // Safety cap: when no backend telemetry config is present at all,\n // end the session after 5 minutes so dev sessions don't leak. Once\n // the backend owns the config it controls expiration explicitly.\n if (!beTelemetry) {\n cfg.expiration = Date.now() + 5 * 60 * 1000;\n this.logger.debug(\n 'No backend telemetry config present; applying a 5-minute safety cap on the session.',\n );\n }\n\n return cfg;\n }\n\n /**\n * The backend can't serialize a DOM element reference, so we always\n * inject this.shadowRoot here. Respect an explicit `dom: false`.\n */\n #resolveCapture(\n beCapture: NonNullable<TelemetryConfig>['capture'],\n ): NonNullable<TelemetryConfig>['capture'] {\n // `network: true` = capture ALL network traffic. We used to default to\n // `{ urlFilter: [] }` but the two network paths had inverted semantics\n // for the empty array: the custom NetworkPlugin treated it as\n // \"capture everything\", while AWS RUM's built-in HTTP telemetry\n // treated it as \"capture nothing\". `true` is consistent — both paths\n // capture all by default. BE can override with a narrow filter later.\n const domSetting = beCapture?.dom;\n if (domSetting === false) {\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: false,\n };\n }\n return {\n console: true,\n network: true,\n navigation: true,\n ...beCapture,\n dom: {\n throttleMs: 2000,\n ...(typeof domSetting === 'object' ? domSetting : {}),\n rootElement: this.shadowRoot as any,\n },\n };\n }\n\n updateTelemetryContext(context: Record<string, any>) {\n if (this.#telemetryManager) {\n try {\n this.#telemetryManager.updateContext(context);\n } catch (error) {\n // Fail silently - telemetry errors should never break the web-component\n this.logger.error('Error updating telemetry context:', error);\n }\n }\n }\n\n #telemetryReady: Promise<void> | null = null;\n\n async init() {\n // super.init() FIRST so downstream mixins finish setup and the\n // SDK's user-facing paint isn't blocked on our CDN load or the\n // `this.config` fetch. Kick off telemetry as its OWN promise chain\n // stored on the instance. NOT awaited here — tests using\n // jest.useFakeTimers can't advance the fetch chain, and blocking on\n // it would freeze the render. Failures are caught so telemetry\n // errors can never break the SDK's boot.\n await super.init?.();\n const sdkVersion = (this as any).sdkVersion || '1.0.0';\n this.#telemetryReady = this.#getTelemetryConfig()\n .then((config) =>\n this.#initializeTelemetry(config as any, {\n projectId: this.projectId,\n flowId: this.flowId,\n sdkVersion,\n }),\n )\n .catch((error) => {\n this.logger.error('Failed to start telemetry:', error);\n });\n }\n\n // Test hook: resolves once telemetry init has settled (success or\n // caught error). Not part of the public SDK contract.\n get telemetryReady(): Promise<void> {\n return this.#telemetryReady ?? Promise.resolve();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback?.();\n this.#shutdownTelemetry();\n }\n };\n },\n);\n"],"names":[],"mappings":"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"}
|