@corbado/observe 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -144,6 +144,15 @@ type StepOptions = {
144
144
  type SubflowTrigger = {
145
145
  actor: "system" | "user";
146
146
  explicitSpecType?: string;
147
+ /**
148
+ * Declares this subflow_started / subflow_trigger as not user-driven, excluding it from
149
+ * interaction-evidence calculations on the backend: a started subflow that produces no step
150
+ * afterwards is classified as a "no-followup" error unless this flag is set. Set it when the
151
+ * integration fires the start programmatically (e.g. an automatic passkey attempt after
152
+ * identifier lookup) and an abandoned attempt is expected rather than an error signal.
153
+ * Optional; absent/false means the event counts (legacy behavior).
154
+ */
155
+ ignoreAsInteraction?: boolean;
147
156
  };
148
157
  interface PredefinedEvent extends BaseEvent {
149
158
  type: "predefined";
@@ -486,6 +495,11 @@ declare abstract class OperationFull {
486
495
  private tracker;
487
496
  private operationName;
488
497
  constructor(tracker: CorbadoTracker, operationName: SubflowType);
498
+ /**
499
+ * Emits subflow_started. `data` supports the SubflowTrigger fields (`actor`,
500
+ * `explicitSpecType`, `ignoreAsInteraction`) plus free-form extras; see SubflowTrigger for when
501
+ * to set `ignoreAsInteraction` on programmatic starts.
502
+ */
489
503
  subflowStart(data: any, options?: StepOptions): void;
490
504
  trigger(data: SubflowTrigger, options?: StepOptions): void;
491
505
  customStep<TStart = {}, TFinished = {}>(stepName: string): StepHelper<TStart, TFinished>;
@@ -598,7 +612,18 @@ declare class EmailLinkOperationFull extends OperationFull {
598
612
  constructor(tracker: CorbadoTracker);
599
613
  }
600
614
 
601
- type PasskeyOperationEnrollmentExplicitSpecType = "conditional-auto-manual" | "auto-manual" | "manual";
615
+ /**
616
+ * Passkey-enrollment spec types. Two vocabularies coexist:
617
+ *
618
+ * - ATTEMPT-scoped (preferred): one subflow per attempt KIND — `"conditional"` (silent conditional
619
+ * create), `"auto"` (automatic required-mediation prompt fired by the integration) or `"manual"`
620
+ * (fired by the user's button). Create a NEW operation for every attempt; the backend opens a new
621
+ * subflow whenever the spec changes, so "auto prompt dismissed, then completed via the button" is two
622
+ * subflows and stays distinguishable from "completed by the auto prompt".
623
+ * - OFFER-scoped (legacy): one subflow per offer — `"conditional-auto-manual"` / `"auto-manual"` name
624
+ * the offer mode, and the completing ceremony's `mediation` tells the completion variants apart.
625
+ */
626
+ type PasskeyOperationEnrollmentExplicitSpecType = "conditional" | "auto" | "manual" | "conditional-auto-manual" | "auto-manual";
602
627
  type PasskeyEnrollmentGetOptionsStart = {
603
628
  explicitSpecType?: PasskeyOperationEnrollmentExplicitSpecType;
604
629
  };
@@ -627,6 +652,13 @@ type PasskeyEnrollmentPostResponseStart = {
627
652
  };
628
653
  type PasskeyEnrollmentOperationConfig = {
629
654
  explicitSpecType?: PasskeyOperationEnrollmentExplicitSpecType;
655
+ /**
656
+ * Marks the auto-emitted `subflow_started` as not user-driven (see SubflowTrigger.ignoreAsInteraction).
657
+ * Set it for attempts the integration fires without a user gesture and without a visible surface —
658
+ * e.g. a `"conditional"` attempt — so a start that never produced a step is not read as a user asking
659
+ * to enroll.
660
+ */
661
+ ignoreAsInteraction?: boolean;
630
662
  };
631
663
  declare class PasskeyEnrollmentOperationFull extends OperationFull {
632
664
  readonly getOptions: StepHelper<PasskeyEnrollmentGetOptionsStart, PasskeyEnrollmentGetOptionsFinished>;
@@ -838,6 +870,7 @@ declare class ProvideDataOperationFull extends OperationFull {
838
870
  }
839
871
 
840
872
  interface TrackerOptions {
873
+ /** All persisted SDK state and cross-tab locks are isolated by this project id. */
841
874
  projectId: string;
842
875
  apiBaseUrl: string;
843
876
  apiEventPath?: string;
@@ -878,6 +911,8 @@ declare class CorbadoTracker {
878
911
  private sessionStorage;
879
912
  /** Dedicated localStorage engine for reliability state (config cache, outbox, continuity session, seq). */
880
913
  private persistentStorage;
914
+ /** Seq/continuity Web Lock name; project-scoped together with the storage keys it guards. */
915
+ private readonly seqLockName;
881
916
  /**
882
917
  * Reliability config for this load. A boot with a cached server config is a snapshot (immutable
883
918
  * mid-load); a boot on the built-in defaults upgrades once to the first server-returned config
@@ -966,12 +1001,15 @@ declare class CorbadoTracker {
966
1001
  * same browser. Rotates after `config.sessionInactivityMs` of inactivity (server-controlled,
967
1002
  * boot-snapshot like the rest of the config), resetting the seq counter.
968
1003
  *
969
- * This is the ONLY place an inactivity rotation happens. Rotating here is safe because the load
970
- * that triggers it also re-announces its flow (an integration emits `flow_started` on page load),
971
- * so the fresh session id gets a classifiable flow. Mid-page there is no such re-announcement:
972
- * rotating between two tracked events would leave the started flow unfinished in the old session
973
- * and the remaining events without a flow start in the new one one gap counted as a drop-off,
974
- * one completion counted as nothing. `nextSeq` therefore never rotates on inactivity.
1004
+ * Inactivity rotation happens at boot only, here and on the per-tab path {@link resolveSessionId}
1005
+ * takes without continuity. Boot is chosen on an assumption, not a guarantee: that a load
1006
+ * re-announces its flow, so the fresh session id gets a classifiable flow. That holds where a
1007
+ * flow is opened per load. Where one is opened once and carried across loads it does not, and a
1008
+ * boot rotation splits that flow such a project needs a window long enough to span the journey.
1009
+ * Mid-page the assumption is not even available: nothing re-announces between two tracked events,
1010
+ * so rotating there would leave the started flow unfinished in the old session and the remaining
1011
+ * events without a flow start in the new one — one gap counted as a drop-off, one completion
1012
+ * counted as nothing. `nextSeq` therefore never rotates on inactivity, on either path.
975
1013
  */
976
1014
  private getContinuitySessionId;
977
1015
  /**
@@ -979,6 +1017,24 @@ declare class CorbadoTracker {
979
1017
  * section measures from the last write that actually happened — whoever made it.
980
1018
  */
981
1019
  private persistContinuitySession;
1020
+ /**
1021
+ * Read the per-tab session record. A bare string is the format that predates dating: it carries no
1022
+ * `lastActiveAt`, so its window can only start on the load that reads it. That load rewrites it in
1023
+ * the dated shape, so a tab converts once and ages normally from then on, and the case drains as
1024
+ * the rollout replaces the bundles that write it.
1025
+ */
1026
+ private readPerTabSession;
1027
+ /**
1028
+ * Persist the per-tab record and remember when, sharing the throttle bookkeeping with the
1029
+ * continuity record — a load resolves its session on one path or the other, never both.
1030
+ *
1031
+ * Only a load that received a server config stamps the window; any other carries forward what the
1032
+ * tab already knows. So a defaults boot never downgrades a tab that has already learned the
1033
+ * project's threshold to the built-in one, and the window survives a rotation within the tab.
1034
+ */
1035
+ private persistPerTabSession;
1036
+ /** The window this tab measures against: what a configured load recorded, else this load's own. */
1037
+ private perTabInactivityMs;
982
1038
  /**
983
1039
  * Return the next sequence number. With session continuity the counter is persisted so ordering
984
1040
  * survives reloads/redirects; the read-increment-write runs under a cross-tab Web Lock
@@ -1028,6 +1084,9 @@ declare class CorbadoTracker {
1028
1084
  *
1029
1085
  * @param data - Flow metadata, including one flow (`flowName`) or multiple candidates (`flowNames`).
1030
1086
  * @param tags - Optional key-value tags for filtering and segmentation.
1087
+ * @param experiments - Optional per-call experiment overrides.
1088
+ * @param contexts - Optional structured event context (e.g. technical metadata that is not an
1089
+ * analytical dimension). Written to the event's `contexts` field verbatim.
1031
1090
  *
1032
1091
  * @example
1033
1092
  * ```typescript
@@ -1038,7 +1097,7 @@ declare class CorbadoTracker {
1038
1097
  * });
1039
1098
  * ```
1040
1099
  */
1041
- flowStarted(data: FlowStarted | MultiFlowStarted, tags?: Record<string, string>, experiments?: Record<string, string>): void;
1100
+ flowStarted(data: FlowStarted | MultiFlowStarted, tags?: Record<string, string>, experiments?: Record<string, string>, contexts?: Record<string, unknown>): void;
1042
1101
  /**
1043
1102
  * Track when the user commits to a specific flow.
1044
1103
  *
@@ -1303,6 +1362,28 @@ interface StorageEngine {
1303
1362
  setItem<T>(key: string, value: T): void;
1304
1363
  removeItem(key: string): void;
1305
1364
  }
1365
+ /**
1366
+ * Suffix a storage key or cross-tab lock name with a namespace. One shared helper so keys and the
1367
+ * Web Lock names guarding them can never disagree on the derived name.
1368
+ */
1369
+ declare function namespacedKey(key: string, namespace: string): string;
1370
+ /**
1371
+ * Wraps a storage engine so every key is suffixed with a fixed namespace (see {@link namespacedKey}).
1372
+ *
1373
+ * @remarks
1374
+ * All trackers use their project id as the namespace: all SDK state flows through the engines
1375
+ * created in the tracker constructor, so wrapping them scopes every persisted key (session, seq,
1376
+ * outbox, config cache, experiments, tab id, client-env handle, debug dumps) in one place. Lock
1377
+ * names are not storage keys and must be scoped separately by the call sites that own them.
1378
+ */
1379
+ declare class NamespacedStorage implements StorageEngine {
1380
+ private readonly engine;
1381
+ private readonly namespace;
1382
+ constructor(engine: StorageEngine, namespace: string);
1383
+ getItem<T>(key: string): T | null;
1384
+ setItem<T>(key: string, value: T): void;
1385
+ removeItem(key: string): void;
1386
+ }
1306
1387
  declare class LocalStorage implements StorageEngine {
1307
1388
  private logger;
1308
1389
  constructor(logger: Logger);
@@ -1402,6 +1483,11 @@ interface QueueOptions {
1402
1483
  onConfigReceived?: (config: SdkReliabilityConfig) => void;
1403
1484
  /** Whether to send the opt-in config header on the first flush of this load. Defaults to true. */
1404
1485
  requestConfig?: boolean;
1486
+ /**
1487
+ * Web Lock name for the durable outbox, scoped alongside the storage engine's keys (see
1488
+ * {@link EventStore}). Defaults to the shared {@link OUTBOX_LOCK_NAME}.
1489
+ */
1490
+ outboxLockName?: string;
1405
1491
  }
1406
1492
  /**
1407
1493
  * @remarks When `window` is defined, `visibilitychange` (when the document becomes hidden) and `pagehide`
@@ -1464,6 +1550,8 @@ declare class RequestQueue {
1464
1550
  * (config.flushOnFlowTypeFinished).
1465
1551
  */
1466
1552
  private priorityFlowTypes;
1553
+ /** Scoped Web Lock name for the durable outbox; undefined = EventStore's shared default. */
1554
+ private outboxLockName?;
1467
1555
  private store?;
1468
1556
  /**
1469
1557
  * Once the server has answered the config request with a 2xx (200 = fresh config cached for the
@@ -1696,7 +1784,7 @@ declare const DEFAULT_MAX_SERIALIZED_LENGTH: number;
1696
1784
  *
1697
1785
  * @remarks
1698
1786
  * Every mutation is a read-merge-write against storage, executed under a cross-tab Web Lock
1699
- * ({@link OUTBOX_LOCK_NAME}) so concurrent tabs sharing the same localStorage cannot interleave
1787
+ * (default {@link OUTBOX_LOCK_NAME}) so concurrent tabs sharing the same localStorage cannot interleave
1700
1788
  * between the read and the write (which would silently drop the other tab's entries). Where the
1701
1789
  * Web Locks API is unavailable the mutation runs unlocked, matching the historical best-effort
1702
1790
  * behavior. Mutations never reject; failures are logged.
@@ -1707,10 +1795,22 @@ declare class EventStore {
1707
1795
  private readonly logger;
1708
1796
  private readonly maxEntries;
1709
1797
  private readonly maxSerializedLength;
1798
+ /**
1799
+ * Web Lock name guarding mutations. Must be scoped together with the storage the engine writes
1800
+ * to: a project-scoped outbox key guarded by the shared lock would serialize unrelated trackers,
1801
+ * and a shared key guarded by scoped locks would lose the cross-tab atomicity guarantee.
1802
+ */
1803
+ private readonly lockName;
1710
1804
  private entries;
1711
1805
  /** Malformed entries are dropped on every read; report only once per instance to avoid log spam. */
1712
1806
  private reportedMalformed;
1713
- constructor(storage: StorageEngine, logger: Logger, maxEntries?: number, maxSerializedLength?: number);
1807
+ constructor(storage: StorageEngine, logger: Logger, maxEntries?: number, maxSerializedLength?: number,
1808
+ /**
1809
+ * Web Lock name guarding mutations. Must be scoped together with the storage the engine writes
1810
+ * to: a project-scoped outbox key guarded by the shared lock would serialize unrelated trackers,
1811
+ * and a shared key guarded by scoped locks would lose the cross-tab atomicity guarantee.
1812
+ */
1813
+ lockName?: string);
1714
1814
  private read;
1715
1815
  private mutate;
1716
1816
  /** Evict oldest entries until the serialized outbox fits {@link maxSerializedLength}. */
@@ -1728,7 +1828,13 @@ declare class EventStore {
1728
1828
  size(): number;
1729
1829
  }
1730
1830
 
1831
+ /**
1832
+ * Create a tracker and make it the default for all package-level helpers.
1833
+ * Each call replaces the default. For multiple projects, retain the returned instances and call
1834
+ * their methods, or construct {@link CorbadoTracker} instances directly without changing the default.
1835
+ */
1731
1836
  declare function init(options: TrackerOptions): CorbadoTracker;
1837
+ /** Return the default tracker from the most recent {@link init} call. */
1732
1838
  declare function getTracker(): CorbadoTracker | undefined;
1733
1839
  declare function resetSession(): string | undefined;
1734
1840
  /**
@@ -1746,4 +1852,4 @@ declare function logInfo(message: string): void;
1746
1852
  declare function logError(message: string): void;
1747
1853
  declare function destroy(): Promise<void>;
1748
1854
 
1749
- export { type AppConfirmationOperationCeremonyTypedError, AppConfirmationOperationFull, type AppConfirmationOperationRetryReason, type AppConfirmationOperationSpecType, type AppConfirmationOperationStart, type AuthDecisionFinished, type AuthDecisionStarted, AuthEventName, type AuthMethodDecisionFinished, type AuthMethodDecisionStarted, type AuthMethodType, type BaseEvent, CEREMONY_LOW_EVENT_TAIL_MS, CONFIG_BOUNDS, CONFIG_REQUEST_HEADER, CONFIG_STORAGE_KEY, type CaptchaOperationConfig, CaptchaOperationFull, type CaptchaOperationSpecType, type ClientCapabilities, type ClientEnvHandleMeta, type ClientEnvHandleMetaSource, type Conversion, CookieStorage, CorbadoTracker, type CreateLoggerOptions, type CustomEvent, DEFAULT_DEVICE_INFO_COLLECTOR_TIMEOUT_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_ENTRIES, DEFAULT_MAX_SERIALIZED_LENGTH, DEFAULT_RELIABILITY_CONFIG, DEFAULT_SEQ_LOCK_TIMEOUT_MS, DEFAULT_SESSION_INACTIVITY_MS, type DeviceInfo, type DeviceInfoCollectionError, type DeviceInfoDataWeb, type DeviceType, EmailLinkOperationFull, type EmailLinkOperationPostResponseStart, type EmailLinkOperationSendStart, type EmailLinkOperationSpecType, type EmailOTPOperationConfig, type EmailOTPOperationPostResponseStart, type EmailOTPOperationSendOTPStart, type EmailOTPOperationSpecType, EmailOtpOperationFull, type Event, type EventBatch, type EventBatchMeta, type EventMeta, EventStore, type EventType, type FlowAutoFinished, type FlowDecided, type FlowFinished, type FlowReset, type FlowStarted, type FlowType, type FlushReason, type JavaScriptHighEntropy, LocalStorage, type Logger, type LowEvent, type MultiFlowReset, type MultiFlowStarted, type NormalizedError, OUTBOX_LOCK_NAME, OUTBOX_STORAGE_KEY, type ObserveSdkConfigSnapshot, OperationFull, OperationFullProvideIdentifierWithCUI, type OperationFullProvideIdentifierWithCUIConfig, type OutboxEntry, type PasskeyEnrollmentCeremonyFinished, type PasskeyEnrollmentCeremonyStart, type PasskeyEnrollmentGetOptionsFinished, type PasskeyEnrollmentGetOptionsStart, type PasskeyEnrollmentOperationConfig, PasskeyEnrollmentOperationFull, type PasskeyEnrollmentPostResponseStart, type PasskeyLoginCUIGetOptionsFinished, type PasskeyLoginCUIGetOptionsStart, type PasskeyLoginCUISpecType, type PasskeyLoginCeremonyFinished, type PasskeyLoginCeremonyStart, type PasskeyLoginClientError, type PasskeyLoginFinish, type PasskeyLoginGetOptionsFinished, type PasskeyLoginGetOptionsStart, PasskeyLoginOperationFull, type PasskeyLoginPostResponseStart, type PasskeyLoginStartable, type PasskeyLoginSubmitted, type PasskeyOperationEnrollmentExplicitSpecType, type PasskeyOperationLoginExplicitSpecType, type PasswordEnrollmentAutoTrackConfig, PasswordEnrollmentOperationFull, type PasswordEnrollmentTypedError, type PasswordLoginAutoTrackConfig, type PasswordLoginCUICeremonyStart, type PasswordLoginCUIGetOptionsFinished, type PasswordLoginCUIGetOptionsStart, type PasswordLoginCUISpecType, type PasswordLoginCUITypedError, PasswordLoginOperationFull, type PasswordLoginTypedError, type PredefinedEvent, type ProvideDataOperationConfig, ProvideDataOperationFull, type ProvideDataOperationPostResponseStart, type ProvideDataOperationSpecType, type ProvideDataOperationStart, type ProvideIdentifierError, type ProvideIdentifierFinish, type ProvideIdentifierPostResponseStart, type ProvideIdentifierSpecType, type ProvideIdentifierStart, type QueueOptions, RequestQueue, SDK_NAME, SDK_VERSION, type SdkInfo, type SdkReliabilityConfig, type SdkRetryConfig, SessionStorage, type SmsOTPOperationConfig, type SmsOTPOperationPostResponseStart, type SmsOTPOperationSpecType, SmsOtpOperationFull, type SocialLoginExchangeCodeFinished, type SocialLoginExchangeCodeStart, type SocialLoginGetRedirectUrlFinished, type SocialLoginGetRedirectUrlStart, SocialLoginOperationFull, type SocialLoginProviderType, type SocialLoginSpecType, type StepHelper, type StepOptions, type StorageEngine, type SubflowTrigger, type SubflowType, type TelemetryEntry, type TelemetryLevel, type TelemetrySink, type TrackerOptions, type Transport, type TransportMakeRequestResponse, type TransportOptions, type UserReference, cacheConfig, clearExperiment, clearExperiments, createLogger, destroy, getExperiments, getSessionId, getTracker, init, loadCachedConfig, logError, logInfo, parseReliabilityConfig, resetSession, setExperiment, setExperiments, telemetry };
1855
+ export { type AppConfirmationOperationCeremonyTypedError, AppConfirmationOperationFull, type AppConfirmationOperationRetryReason, type AppConfirmationOperationSpecType, type AppConfirmationOperationStart, type AuthDecisionFinished, type AuthDecisionStarted, AuthEventName, type AuthMethodDecisionFinished, type AuthMethodDecisionStarted, type AuthMethodType, type BaseEvent, CEREMONY_LOW_EVENT_TAIL_MS, CONFIG_BOUNDS, CONFIG_REQUEST_HEADER, CONFIG_STORAGE_KEY, type CaptchaOperationConfig, CaptchaOperationFull, type CaptchaOperationSpecType, type ClientCapabilities, type ClientEnvHandleMeta, type ClientEnvHandleMetaSource, type Conversion, CookieStorage, CorbadoTracker, type CreateLoggerOptions, type CustomEvent, DEFAULT_DEVICE_INFO_COLLECTOR_TIMEOUT_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_ENTRIES, DEFAULT_MAX_SERIALIZED_LENGTH, DEFAULT_RELIABILITY_CONFIG, DEFAULT_SEQ_LOCK_TIMEOUT_MS, DEFAULT_SESSION_INACTIVITY_MS, type DeviceInfo, type DeviceInfoCollectionError, type DeviceInfoDataWeb, type DeviceType, EmailLinkOperationFull, type EmailLinkOperationPostResponseStart, type EmailLinkOperationSendStart, type EmailLinkOperationSpecType, type EmailOTPOperationConfig, type EmailOTPOperationPostResponseStart, type EmailOTPOperationSendOTPStart, type EmailOTPOperationSpecType, EmailOtpOperationFull, type Event, type EventBatch, type EventBatchMeta, type EventMeta, EventStore, type EventType, type FlowAutoFinished, type FlowDecided, type FlowFinished, type FlowReset, type FlowStarted, type FlowType, type FlushReason, type JavaScriptHighEntropy, LocalStorage, type Logger, type LowEvent, type MultiFlowReset, type MultiFlowStarted, NamespacedStorage, type NormalizedError, OUTBOX_LOCK_NAME, OUTBOX_STORAGE_KEY, type ObserveSdkConfigSnapshot, OperationFull, OperationFullProvideIdentifierWithCUI, type OperationFullProvideIdentifierWithCUIConfig, type OutboxEntry, type PasskeyEnrollmentCeremonyFinished, type PasskeyEnrollmentCeremonyStart, type PasskeyEnrollmentGetOptionsFinished, type PasskeyEnrollmentGetOptionsStart, type PasskeyEnrollmentOperationConfig, PasskeyEnrollmentOperationFull, type PasskeyEnrollmentPostResponseStart, type PasskeyLoginCUIGetOptionsFinished, type PasskeyLoginCUIGetOptionsStart, type PasskeyLoginCUISpecType, type PasskeyLoginCeremonyFinished, type PasskeyLoginCeremonyStart, type PasskeyLoginClientError, type PasskeyLoginFinish, type PasskeyLoginGetOptionsFinished, type PasskeyLoginGetOptionsStart, PasskeyLoginOperationFull, type PasskeyLoginPostResponseStart, type PasskeyLoginStartable, type PasskeyLoginSubmitted, type PasskeyOperationEnrollmentExplicitSpecType, type PasskeyOperationLoginExplicitSpecType, type PasswordEnrollmentAutoTrackConfig, PasswordEnrollmentOperationFull, type PasswordEnrollmentTypedError, type PasswordLoginAutoTrackConfig, type PasswordLoginCUICeremonyStart, type PasswordLoginCUIGetOptionsFinished, type PasswordLoginCUIGetOptionsStart, type PasswordLoginCUISpecType, type PasswordLoginCUITypedError, PasswordLoginOperationFull, type PasswordLoginTypedError, type PredefinedEvent, type ProvideDataOperationConfig, ProvideDataOperationFull, type ProvideDataOperationPostResponseStart, type ProvideDataOperationSpecType, type ProvideDataOperationStart, type ProvideIdentifierError, type ProvideIdentifierFinish, type ProvideIdentifierPostResponseStart, type ProvideIdentifierSpecType, type ProvideIdentifierStart, type QueueOptions, RequestQueue, SDK_NAME, SDK_VERSION, type SdkInfo, type SdkReliabilityConfig, type SdkRetryConfig, SessionStorage, type SmsOTPOperationConfig, type SmsOTPOperationPostResponseStart, type SmsOTPOperationSpecType, SmsOtpOperationFull, type SocialLoginExchangeCodeFinished, type SocialLoginExchangeCodeStart, type SocialLoginGetRedirectUrlFinished, type SocialLoginGetRedirectUrlStart, SocialLoginOperationFull, type SocialLoginProviderType, type SocialLoginSpecType, type StepHelper, type StepOptions, type StorageEngine, type SubflowTrigger, type SubflowType, type TelemetryEntry, type TelemetryLevel, type TelemetrySink, type TrackerOptions, type Transport, type TransportMakeRequestResponse, type TransportOptions, type UserReference, cacheConfig, clearExperiment, clearExperiments, createLogger, destroy, getExperiments, getSessionId, getTracker, init, loadCachedConfig, logError, logInfo, namespacedKey, parseReliabilityConfig, resetSession, setExperiment, setExperiments, telemetry };
package/dist/index.d.ts CHANGED
@@ -144,6 +144,15 @@ type StepOptions = {
144
144
  type SubflowTrigger = {
145
145
  actor: "system" | "user";
146
146
  explicitSpecType?: string;
147
+ /**
148
+ * Declares this subflow_started / subflow_trigger as not user-driven, excluding it from
149
+ * interaction-evidence calculations on the backend: a started subflow that produces no step
150
+ * afterwards is classified as a "no-followup" error unless this flag is set. Set it when the
151
+ * integration fires the start programmatically (e.g. an automatic passkey attempt after
152
+ * identifier lookup) and an abandoned attempt is expected rather than an error signal.
153
+ * Optional; absent/false means the event counts (legacy behavior).
154
+ */
155
+ ignoreAsInteraction?: boolean;
147
156
  };
148
157
  interface PredefinedEvent extends BaseEvent {
149
158
  type: "predefined";
@@ -486,6 +495,11 @@ declare abstract class OperationFull {
486
495
  private tracker;
487
496
  private operationName;
488
497
  constructor(tracker: CorbadoTracker, operationName: SubflowType);
498
+ /**
499
+ * Emits subflow_started. `data` supports the SubflowTrigger fields (`actor`,
500
+ * `explicitSpecType`, `ignoreAsInteraction`) plus free-form extras; see SubflowTrigger for when
501
+ * to set `ignoreAsInteraction` on programmatic starts.
502
+ */
489
503
  subflowStart(data: any, options?: StepOptions): void;
490
504
  trigger(data: SubflowTrigger, options?: StepOptions): void;
491
505
  customStep<TStart = {}, TFinished = {}>(stepName: string): StepHelper<TStart, TFinished>;
@@ -598,7 +612,18 @@ declare class EmailLinkOperationFull extends OperationFull {
598
612
  constructor(tracker: CorbadoTracker);
599
613
  }
600
614
 
601
- type PasskeyOperationEnrollmentExplicitSpecType = "conditional-auto-manual" | "auto-manual" | "manual";
615
+ /**
616
+ * Passkey-enrollment spec types. Two vocabularies coexist:
617
+ *
618
+ * - ATTEMPT-scoped (preferred): one subflow per attempt KIND — `"conditional"` (silent conditional
619
+ * create), `"auto"` (automatic required-mediation prompt fired by the integration) or `"manual"`
620
+ * (fired by the user's button). Create a NEW operation for every attempt; the backend opens a new
621
+ * subflow whenever the spec changes, so "auto prompt dismissed, then completed via the button" is two
622
+ * subflows and stays distinguishable from "completed by the auto prompt".
623
+ * - OFFER-scoped (legacy): one subflow per offer — `"conditional-auto-manual"` / `"auto-manual"` name
624
+ * the offer mode, and the completing ceremony's `mediation` tells the completion variants apart.
625
+ */
626
+ type PasskeyOperationEnrollmentExplicitSpecType = "conditional" | "auto" | "manual" | "conditional-auto-manual" | "auto-manual";
602
627
  type PasskeyEnrollmentGetOptionsStart = {
603
628
  explicitSpecType?: PasskeyOperationEnrollmentExplicitSpecType;
604
629
  };
@@ -627,6 +652,13 @@ type PasskeyEnrollmentPostResponseStart = {
627
652
  };
628
653
  type PasskeyEnrollmentOperationConfig = {
629
654
  explicitSpecType?: PasskeyOperationEnrollmentExplicitSpecType;
655
+ /**
656
+ * Marks the auto-emitted `subflow_started` as not user-driven (see SubflowTrigger.ignoreAsInteraction).
657
+ * Set it for attempts the integration fires without a user gesture and without a visible surface —
658
+ * e.g. a `"conditional"` attempt — so a start that never produced a step is not read as a user asking
659
+ * to enroll.
660
+ */
661
+ ignoreAsInteraction?: boolean;
630
662
  };
631
663
  declare class PasskeyEnrollmentOperationFull extends OperationFull {
632
664
  readonly getOptions: StepHelper<PasskeyEnrollmentGetOptionsStart, PasskeyEnrollmentGetOptionsFinished>;
@@ -838,6 +870,7 @@ declare class ProvideDataOperationFull extends OperationFull {
838
870
  }
839
871
 
840
872
  interface TrackerOptions {
873
+ /** All persisted SDK state and cross-tab locks are isolated by this project id. */
841
874
  projectId: string;
842
875
  apiBaseUrl: string;
843
876
  apiEventPath?: string;
@@ -878,6 +911,8 @@ declare class CorbadoTracker {
878
911
  private sessionStorage;
879
912
  /** Dedicated localStorage engine for reliability state (config cache, outbox, continuity session, seq). */
880
913
  private persistentStorage;
914
+ /** Seq/continuity Web Lock name; project-scoped together with the storage keys it guards. */
915
+ private readonly seqLockName;
881
916
  /**
882
917
  * Reliability config for this load. A boot with a cached server config is a snapshot (immutable
883
918
  * mid-load); a boot on the built-in defaults upgrades once to the first server-returned config
@@ -966,12 +1001,15 @@ declare class CorbadoTracker {
966
1001
  * same browser. Rotates after `config.sessionInactivityMs` of inactivity (server-controlled,
967
1002
  * boot-snapshot like the rest of the config), resetting the seq counter.
968
1003
  *
969
- * This is the ONLY place an inactivity rotation happens. Rotating here is safe because the load
970
- * that triggers it also re-announces its flow (an integration emits `flow_started` on page load),
971
- * so the fresh session id gets a classifiable flow. Mid-page there is no such re-announcement:
972
- * rotating between two tracked events would leave the started flow unfinished in the old session
973
- * and the remaining events without a flow start in the new one one gap counted as a drop-off,
974
- * one completion counted as nothing. `nextSeq` therefore never rotates on inactivity.
1004
+ * Inactivity rotation happens at boot only, here and on the per-tab path {@link resolveSessionId}
1005
+ * takes without continuity. Boot is chosen on an assumption, not a guarantee: that a load
1006
+ * re-announces its flow, so the fresh session id gets a classifiable flow. That holds where a
1007
+ * flow is opened per load. Where one is opened once and carried across loads it does not, and a
1008
+ * boot rotation splits that flow such a project needs a window long enough to span the journey.
1009
+ * Mid-page the assumption is not even available: nothing re-announces between two tracked events,
1010
+ * so rotating there would leave the started flow unfinished in the old session and the remaining
1011
+ * events without a flow start in the new one — one gap counted as a drop-off, one completion
1012
+ * counted as nothing. `nextSeq` therefore never rotates on inactivity, on either path.
975
1013
  */
976
1014
  private getContinuitySessionId;
977
1015
  /**
@@ -979,6 +1017,24 @@ declare class CorbadoTracker {
979
1017
  * section measures from the last write that actually happened — whoever made it.
980
1018
  */
981
1019
  private persistContinuitySession;
1020
+ /**
1021
+ * Read the per-tab session record. A bare string is the format that predates dating: it carries no
1022
+ * `lastActiveAt`, so its window can only start on the load that reads it. That load rewrites it in
1023
+ * the dated shape, so a tab converts once and ages normally from then on, and the case drains as
1024
+ * the rollout replaces the bundles that write it.
1025
+ */
1026
+ private readPerTabSession;
1027
+ /**
1028
+ * Persist the per-tab record and remember when, sharing the throttle bookkeeping with the
1029
+ * continuity record — a load resolves its session on one path or the other, never both.
1030
+ *
1031
+ * Only a load that received a server config stamps the window; any other carries forward what the
1032
+ * tab already knows. So a defaults boot never downgrades a tab that has already learned the
1033
+ * project's threshold to the built-in one, and the window survives a rotation within the tab.
1034
+ */
1035
+ private persistPerTabSession;
1036
+ /** The window this tab measures against: what a configured load recorded, else this load's own. */
1037
+ private perTabInactivityMs;
982
1038
  /**
983
1039
  * Return the next sequence number. With session continuity the counter is persisted so ordering
984
1040
  * survives reloads/redirects; the read-increment-write runs under a cross-tab Web Lock
@@ -1028,6 +1084,9 @@ declare class CorbadoTracker {
1028
1084
  *
1029
1085
  * @param data - Flow metadata, including one flow (`flowName`) or multiple candidates (`flowNames`).
1030
1086
  * @param tags - Optional key-value tags for filtering and segmentation.
1087
+ * @param experiments - Optional per-call experiment overrides.
1088
+ * @param contexts - Optional structured event context (e.g. technical metadata that is not an
1089
+ * analytical dimension). Written to the event's `contexts` field verbatim.
1031
1090
  *
1032
1091
  * @example
1033
1092
  * ```typescript
@@ -1038,7 +1097,7 @@ declare class CorbadoTracker {
1038
1097
  * });
1039
1098
  * ```
1040
1099
  */
1041
- flowStarted(data: FlowStarted | MultiFlowStarted, tags?: Record<string, string>, experiments?: Record<string, string>): void;
1100
+ flowStarted(data: FlowStarted | MultiFlowStarted, tags?: Record<string, string>, experiments?: Record<string, string>, contexts?: Record<string, unknown>): void;
1042
1101
  /**
1043
1102
  * Track when the user commits to a specific flow.
1044
1103
  *
@@ -1303,6 +1362,28 @@ interface StorageEngine {
1303
1362
  setItem<T>(key: string, value: T): void;
1304
1363
  removeItem(key: string): void;
1305
1364
  }
1365
+ /**
1366
+ * Suffix a storage key or cross-tab lock name with a namespace. One shared helper so keys and the
1367
+ * Web Lock names guarding them can never disagree on the derived name.
1368
+ */
1369
+ declare function namespacedKey(key: string, namespace: string): string;
1370
+ /**
1371
+ * Wraps a storage engine so every key is suffixed with a fixed namespace (see {@link namespacedKey}).
1372
+ *
1373
+ * @remarks
1374
+ * All trackers use their project id as the namespace: all SDK state flows through the engines
1375
+ * created in the tracker constructor, so wrapping them scopes every persisted key (session, seq,
1376
+ * outbox, config cache, experiments, tab id, client-env handle, debug dumps) in one place. Lock
1377
+ * names are not storage keys and must be scoped separately by the call sites that own them.
1378
+ */
1379
+ declare class NamespacedStorage implements StorageEngine {
1380
+ private readonly engine;
1381
+ private readonly namespace;
1382
+ constructor(engine: StorageEngine, namespace: string);
1383
+ getItem<T>(key: string): T | null;
1384
+ setItem<T>(key: string, value: T): void;
1385
+ removeItem(key: string): void;
1386
+ }
1306
1387
  declare class LocalStorage implements StorageEngine {
1307
1388
  private logger;
1308
1389
  constructor(logger: Logger);
@@ -1402,6 +1483,11 @@ interface QueueOptions {
1402
1483
  onConfigReceived?: (config: SdkReliabilityConfig) => void;
1403
1484
  /** Whether to send the opt-in config header on the first flush of this load. Defaults to true. */
1404
1485
  requestConfig?: boolean;
1486
+ /**
1487
+ * Web Lock name for the durable outbox, scoped alongside the storage engine's keys (see
1488
+ * {@link EventStore}). Defaults to the shared {@link OUTBOX_LOCK_NAME}.
1489
+ */
1490
+ outboxLockName?: string;
1405
1491
  }
1406
1492
  /**
1407
1493
  * @remarks When `window` is defined, `visibilitychange` (when the document becomes hidden) and `pagehide`
@@ -1464,6 +1550,8 @@ declare class RequestQueue {
1464
1550
  * (config.flushOnFlowTypeFinished).
1465
1551
  */
1466
1552
  private priorityFlowTypes;
1553
+ /** Scoped Web Lock name for the durable outbox; undefined = EventStore's shared default. */
1554
+ private outboxLockName?;
1467
1555
  private store?;
1468
1556
  /**
1469
1557
  * Once the server has answered the config request with a 2xx (200 = fresh config cached for the
@@ -1696,7 +1784,7 @@ declare const DEFAULT_MAX_SERIALIZED_LENGTH: number;
1696
1784
  *
1697
1785
  * @remarks
1698
1786
  * Every mutation is a read-merge-write against storage, executed under a cross-tab Web Lock
1699
- * ({@link OUTBOX_LOCK_NAME}) so concurrent tabs sharing the same localStorage cannot interleave
1787
+ * (default {@link OUTBOX_LOCK_NAME}) so concurrent tabs sharing the same localStorage cannot interleave
1700
1788
  * between the read and the write (which would silently drop the other tab's entries). Where the
1701
1789
  * Web Locks API is unavailable the mutation runs unlocked, matching the historical best-effort
1702
1790
  * behavior. Mutations never reject; failures are logged.
@@ -1707,10 +1795,22 @@ declare class EventStore {
1707
1795
  private readonly logger;
1708
1796
  private readonly maxEntries;
1709
1797
  private readonly maxSerializedLength;
1798
+ /**
1799
+ * Web Lock name guarding mutations. Must be scoped together with the storage the engine writes
1800
+ * to: a project-scoped outbox key guarded by the shared lock would serialize unrelated trackers,
1801
+ * and a shared key guarded by scoped locks would lose the cross-tab atomicity guarantee.
1802
+ */
1803
+ private readonly lockName;
1710
1804
  private entries;
1711
1805
  /** Malformed entries are dropped on every read; report only once per instance to avoid log spam. */
1712
1806
  private reportedMalformed;
1713
- constructor(storage: StorageEngine, logger: Logger, maxEntries?: number, maxSerializedLength?: number);
1807
+ constructor(storage: StorageEngine, logger: Logger, maxEntries?: number, maxSerializedLength?: number,
1808
+ /**
1809
+ * Web Lock name guarding mutations. Must be scoped together with the storage the engine writes
1810
+ * to: a project-scoped outbox key guarded by the shared lock would serialize unrelated trackers,
1811
+ * and a shared key guarded by scoped locks would lose the cross-tab atomicity guarantee.
1812
+ */
1813
+ lockName?: string);
1714
1814
  private read;
1715
1815
  private mutate;
1716
1816
  /** Evict oldest entries until the serialized outbox fits {@link maxSerializedLength}. */
@@ -1728,7 +1828,13 @@ declare class EventStore {
1728
1828
  size(): number;
1729
1829
  }
1730
1830
 
1831
+ /**
1832
+ * Create a tracker and make it the default for all package-level helpers.
1833
+ * Each call replaces the default. For multiple projects, retain the returned instances and call
1834
+ * their methods, or construct {@link CorbadoTracker} instances directly without changing the default.
1835
+ */
1731
1836
  declare function init(options: TrackerOptions): CorbadoTracker;
1837
+ /** Return the default tracker from the most recent {@link init} call. */
1732
1838
  declare function getTracker(): CorbadoTracker | undefined;
1733
1839
  declare function resetSession(): string | undefined;
1734
1840
  /**
@@ -1746,4 +1852,4 @@ declare function logInfo(message: string): void;
1746
1852
  declare function logError(message: string): void;
1747
1853
  declare function destroy(): Promise<void>;
1748
1854
 
1749
- export { type AppConfirmationOperationCeremonyTypedError, AppConfirmationOperationFull, type AppConfirmationOperationRetryReason, type AppConfirmationOperationSpecType, type AppConfirmationOperationStart, type AuthDecisionFinished, type AuthDecisionStarted, AuthEventName, type AuthMethodDecisionFinished, type AuthMethodDecisionStarted, type AuthMethodType, type BaseEvent, CEREMONY_LOW_EVENT_TAIL_MS, CONFIG_BOUNDS, CONFIG_REQUEST_HEADER, CONFIG_STORAGE_KEY, type CaptchaOperationConfig, CaptchaOperationFull, type CaptchaOperationSpecType, type ClientCapabilities, type ClientEnvHandleMeta, type ClientEnvHandleMetaSource, type Conversion, CookieStorage, CorbadoTracker, type CreateLoggerOptions, type CustomEvent, DEFAULT_DEVICE_INFO_COLLECTOR_TIMEOUT_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_ENTRIES, DEFAULT_MAX_SERIALIZED_LENGTH, DEFAULT_RELIABILITY_CONFIG, DEFAULT_SEQ_LOCK_TIMEOUT_MS, DEFAULT_SESSION_INACTIVITY_MS, type DeviceInfo, type DeviceInfoCollectionError, type DeviceInfoDataWeb, type DeviceType, EmailLinkOperationFull, type EmailLinkOperationPostResponseStart, type EmailLinkOperationSendStart, type EmailLinkOperationSpecType, type EmailOTPOperationConfig, type EmailOTPOperationPostResponseStart, type EmailOTPOperationSendOTPStart, type EmailOTPOperationSpecType, EmailOtpOperationFull, type Event, type EventBatch, type EventBatchMeta, type EventMeta, EventStore, type EventType, type FlowAutoFinished, type FlowDecided, type FlowFinished, type FlowReset, type FlowStarted, type FlowType, type FlushReason, type JavaScriptHighEntropy, LocalStorage, type Logger, type LowEvent, type MultiFlowReset, type MultiFlowStarted, type NormalizedError, OUTBOX_LOCK_NAME, OUTBOX_STORAGE_KEY, type ObserveSdkConfigSnapshot, OperationFull, OperationFullProvideIdentifierWithCUI, type OperationFullProvideIdentifierWithCUIConfig, type OutboxEntry, type PasskeyEnrollmentCeremonyFinished, type PasskeyEnrollmentCeremonyStart, type PasskeyEnrollmentGetOptionsFinished, type PasskeyEnrollmentGetOptionsStart, type PasskeyEnrollmentOperationConfig, PasskeyEnrollmentOperationFull, type PasskeyEnrollmentPostResponseStart, type PasskeyLoginCUIGetOptionsFinished, type PasskeyLoginCUIGetOptionsStart, type PasskeyLoginCUISpecType, type PasskeyLoginCeremonyFinished, type PasskeyLoginCeremonyStart, type PasskeyLoginClientError, type PasskeyLoginFinish, type PasskeyLoginGetOptionsFinished, type PasskeyLoginGetOptionsStart, PasskeyLoginOperationFull, type PasskeyLoginPostResponseStart, type PasskeyLoginStartable, type PasskeyLoginSubmitted, type PasskeyOperationEnrollmentExplicitSpecType, type PasskeyOperationLoginExplicitSpecType, type PasswordEnrollmentAutoTrackConfig, PasswordEnrollmentOperationFull, type PasswordEnrollmentTypedError, type PasswordLoginAutoTrackConfig, type PasswordLoginCUICeremonyStart, type PasswordLoginCUIGetOptionsFinished, type PasswordLoginCUIGetOptionsStart, type PasswordLoginCUISpecType, type PasswordLoginCUITypedError, PasswordLoginOperationFull, type PasswordLoginTypedError, type PredefinedEvent, type ProvideDataOperationConfig, ProvideDataOperationFull, type ProvideDataOperationPostResponseStart, type ProvideDataOperationSpecType, type ProvideDataOperationStart, type ProvideIdentifierError, type ProvideIdentifierFinish, type ProvideIdentifierPostResponseStart, type ProvideIdentifierSpecType, type ProvideIdentifierStart, type QueueOptions, RequestQueue, SDK_NAME, SDK_VERSION, type SdkInfo, type SdkReliabilityConfig, type SdkRetryConfig, SessionStorage, type SmsOTPOperationConfig, type SmsOTPOperationPostResponseStart, type SmsOTPOperationSpecType, SmsOtpOperationFull, type SocialLoginExchangeCodeFinished, type SocialLoginExchangeCodeStart, type SocialLoginGetRedirectUrlFinished, type SocialLoginGetRedirectUrlStart, SocialLoginOperationFull, type SocialLoginProviderType, type SocialLoginSpecType, type StepHelper, type StepOptions, type StorageEngine, type SubflowTrigger, type SubflowType, type TelemetryEntry, type TelemetryLevel, type TelemetrySink, type TrackerOptions, type Transport, type TransportMakeRequestResponse, type TransportOptions, type UserReference, cacheConfig, clearExperiment, clearExperiments, createLogger, destroy, getExperiments, getSessionId, getTracker, init, loadCachedConfig, logError, logInfo, parseReliabilityConfig, resetSession, setExperiment, setExperiments, telemetry };
1855
+ export { type AppConfirmationOperationCeremonyTypedError, AppConfirmationOperationFull, type AppConfirmationOperationRetryReason, type AppConfirmationOperationSpecType, type AppConfirmationOperationStart, type AuthDecisionFinished, type AuthDecisionStarted, AuthEventName, type AuthMethodDecisionFinished, type AuthMethodDecisionStarted, type AuthMethodType, type BaseEvent, CEREMONY_LOW_EVENT_TAIL_MS, CONFIG_BOUNDS, CONFIG_REQUEST_HEADER, CONFIG_STORAGE_KEY, type CaptchaOperationConfig, CaptchaOperationFull, type CaptchaOperationSpecType, type ClientCapabilities, type ClientEnvHandleMeta, type ClientEnvHandleMetaSource, type Conversion, CookieStorage, CorbadoTracker, type CreateLoggerOptions, type CustomEvent, DEFAULT_DEVICE_INFO_COLLECTOR_TIMEOUT_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_ENTRIES, DEFAULT_MAX_SERIALIZED_LENGTH, DEFAULT_RELIABILITY_CONFIG, DEFAULT_SEQ_LOCK_TIMEOUT_MS, DEFAULT_SESSION_INACTIVITY_MS, type DeviceInfo, type DeviceInfoCollectionError, type DeviceInfoDataWeb, type DeviceType, EmailLinkOperationFull, type EmailLinkOperationPostResponseStart, type EmailLinkOperationSendStart, type EmailLinkOperationSpecType, type EmailOTPOperationConfig, type EmailOTPOperationPostResponseStart, type EmailOTPOperationSendOTPStart, type EmailOTPOperationSpecType, EmailOtpOperationFull, type Event, type EventBatch, type EventBatchMeta, type EventMeta, EventStore, type EventType, type FlowAutoFinished, type FlowDecided, type FlowFinished, type FlowReset, type FlowStarted, type FlowType, type FlushReason, type JavaScriptHighEntropy, LocalStorage, type Logger, type LowEvent, type MultiFlowReset, type MultiFlowStarted, NamespacedStorage, type NormalizedError, OUTBOX_LOCK_NAME, OUTBOX_STORAGE_KEY, type ObserveSdkConfigSnapshot, OperationFull, OperationFullProvideIdentifierWithCUI, type OperationFullProvideIdentifierWithCUIConfig, type OutboxEntry, type PasskeyEnrollmentCeremonyFinished, type PasskeyEnrollmentCeremonyStart, type PasskeyEnrollmentGetOptionsFinished, type PasskeyEnrollmentGetOptionsStart, type PasskeyEnrollmentOperationConfig, PasskeyEnrollmentOperationFull, type PasskeyEnrollmentPostResponseStart, type PasskeyLoginCUIGetOptionsFinished, type PasskeyLoginCUIGetOptionsStart, type PasskeyLoginCUISpecType, type PasskeyLoginCeremonyFinished, type PasskeyLoginCeremonyStart, type PasskeyLoginClientError, type PasskeyLoginFinish, type PasskeyLoginGetOptionsFinished, type PasskeyLoginGetOptionsStart, PasskeyLoginOperationFull, type PasskeyLoginPostResponseStart, type PasskeyLoginStartable, type PasskeyLoginSubmitted, type PasskeyOperationEnrollmentExplicitSpecType, type PasskeyOperationLoginExplicitSpecType, type PasswordEnrollmentAutoTrackConfig, PasswordEnrollmentOperationFull, type PasswordEnrollmentTypedError, type PasswordLoginAutoTrackConfig, type PasswordLoginCUICeremonyStart, type PasswordLoginCUIGetOptionsFinished, type PasswordLoginCUIGetOptionsStart, type PasswordLoginCUISpecType, type PasswordLoginCUITypedError, PasswordLoginOperationFull, type PasswordLoginTypedError, type PredefinedEvent, type ProvideDataOperationConfig, ProvideDataOperationFull, type ProvideDataOperationPostResponseStart, type ProvideDataOperationSpecType, type ProvideDataOperationStart, type ProvideIdentifierError, type ProvideIdentifierFinish, type ProvideIdentifierPostResponseStart, type ProvideIdentifierSpecType, type ProvideIdentifierStart, type QueueOptions, RequestQueue, SDK_NAME, SDK_VERSION, type SdkInfo, type SdkReliabilityConfig, type SdkRetryConfig, SessionStorage, type SmsOTPOperationConfig, type SmsOTPOperationPostResponseStart, type SmsOTPOperationSpecType, SmsOtpOperationFull, type SocialLoginExchangeCodeFinished, type SocialLoginExchangeCodeStart, type SocialLoginGetRedirectUrlFinished, type SocialLoginGetRedirectUrlStart, SocialLoginOperationFull, type SocialLoginProviderType, type SocialLoginSpecType, type StepHelper, type StepOptions, type StorageEngine, type SubflowTrigger, type SubflowType, type TelemetryEntry, type TelemetryLevel, type TelemetrySink, type TrackerOptions, type Transport, type TransportMakeRequestResponse, type TransportOptions, type UserReference, cacheConfig, clearExperiment, clearExperiments, createLogger, destroy, getExperiments, getSessionId, getTracker, init, loadCachedConfig, logError, logInfo, namespacedKey, parseReliabilityConfig, resetSession, setExperiment, setExperiments, telemetry };