@corbado/observe 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/analysis/client.mjs +37 -1605
  2. package/dist/analysis/config.mjs +1 -4
  3. package/dist/analysis/default-tracker.mjs +16 -0
  4. package/dist/analysis/device.mjs +0 -79
  5. package/dist/analysis/index.mjs +29 -41
  6. package/dist/analysis/low-events/grouped-input-tracker.mjs +2 -3
  7. package/dist/analysis/low-events/input-change-recorder.mjs +35 -12
  8. package/dist/analysis/low-events/input-tracker.mjs +0 -58
  9. package/dist/analysis/plugins/cookie-storage.mjs +11 -0
  10. package/dist/analysis/plugins/cross-origin-session.mjs +171 -0
  11. package/dist/analysis/plugins/probes.mjs +69 -0
  12. package/dist/analysis/plugins/raw-errors.mjs +8 -0
  13. package/dist/analysis/probe-lane.mjs +175 -0
  14. package/dist/analysis/queue.mjs +18 -141
  15. package/dist/analysis/readers/network.mjs +5 -0
  16. package/dist/analysis/session-keys.mjs +11 -0
  17. package/dist/analysis/tracker-core.mjs +1352 -0
  18. package/dist/analysis/tracker-features.mjs +80 -0
  19. package/dist/analysis/tracker-functions.mjs +103 -0
  20. package/dist/analysis/transports/fetch.mjs +16 -1
  21. package/dist/analysis/utils/appconfirmation-operation-full.mjs +5 -1
  22. package/dist/analysis/utils/captcha-operation-full.mjs +5 -1
  23. package/dist/analysis/utils/email-link-operation-full.mjs +9 -1
  24. package/dist/analysis/utils/email-otp-operation-full.mjs +5 -1
  25. package/dist/analysis/utils/form-operation-full.mjs +5 -1
  26. package/dist/analysis/utils/key-operation-full.mjs +9 -1
  27. package/dist/analysis/utils/operation-full-provide-identifier-with-cui.mjs +8 -1
  28. package/dist/analysis/utils/operation-full.mjs +4 -3
  29. package/dist/analysis/utils/passkey-deletion-operation-full.mjs +5 -1
  30. package/dist/analysis/utils/passkey-enrollment-operation-full.mjs +5 -1
  31. package/dist/analysis/utils/passkey-login-operation-full.mjs +5 -1
  32. package/dist/analysis/utils/password-enrollment-operation-full.mjs +5 -1
  33. package/dist/analysis/utils/password-login-operation-full.mjs +5 -1
  34. package/dist/analysis/utils/provide-data-operation-full.mjs +5 -1
  35. package/dist/analysis/utils/sms-otp-operation-full.mjs +5 -1
  36. package/dist/analysis/utils/social-operation-login.mjs +5 -1
  37. package/dist/analysis/utils/sso-operation-login.mjs +5 -1
  38. package/dist/analysis/utils/totp-operation-full.mjs +5 -1
  39. package/dist/analysis/utils/trusted-device-operation-full.mjs +9 -1
  40. package/dist/analysis/version.mjs +1 -1
  41. package/dist/cdn/script.global.js +4 -4
  42. package/dist/index.d.mts +1349 -888
  43. package/dist/index.d.ts +1349 -888
  44. package/dist/index.js +4 -4
  45. package/dist/index.mjs +4 -4
  46. package/package.json +1 -1
  47. package/dist/analysis/readers/password-manager-dom.mjs +0 -112
@@ -0,0 +1,80 @@
1
+ // src/tracker-features.ts
2
+ import { v7 as uuidv7 } from "uuid";
3
+ import { AuthEventName } from "./types.mjs";
4
+ import { SEQ_STORAGE_KEY } from "./session-keys.mjs";
5
+ function resetSessionOn(tracker) {
6
+ const newSessionId = uuidv7();
7
+ if (tracker["config"].sessionContinuity) {
8
+ tracker["persistContinuitySession"](newSessionId, Date.now());
9
+ tracker["persistentStorage"].setItem(SEQ_STORAGE_KEY, 0);
10
+ } else {
11
+ tracker["persistPerTabSession"](newSessionId, Date.now());
12
+ }
13
+ tracker["sessionId"] = newSessionId;
14
+ tracker["seq"] = 0;
15
+ tracker["queue"].setSessionId(newSessionId);
16
+ tracker["bridge"]?.reset(newSessionId);
17
+ tracker.getLogger().debug(`Session reset: ${newSessionId}`);
18
+ return newSessionId;
19
+ }
20
+ function setUserOn(tracker, user) {
21
+ void tracker.track(AuthEventName.FlowEnriched, { match: { flowType: "*", at: "during" }, expFol: true }, { ...user });
22
+ }
23
+ function setFlowTagsOn(tracker, tags, options) {
24
+ const logger = tracker.getLogger();
25
+ try {
26
+ if (!tags || typeof tags !== "object") {
27
+ logger.warn("setFlowTags: ignoring non-object tags");
28
+ return;
29
+ }
30
+ const valid = {};
31
+ for (const [key, value] of Object.entries(tags)) {
32
+ if (key === "" || typeof value !== "string") {
33
+ logger.warn(`setFlowTags: ignoring invalid tag "${key}"`);
34
+ continue;
35
+ }
36
+ valid[key] = value;
37
+ }
38
+ if (Object.keys(valid).length === 0) {
39
+ return;
40
+ }
41
+ const data = { match: { flowType: options?.flowType ?? "*", at: "during" } };
42
+ if (options?.expandToChildren !== void 0) {
43
+ data.expCh = options.expandToChildren;
44
+ }
45
+ if (options?.expandToFollowing !== void 0) {
46
+ data.expFol = options.expandToFollowing;
47
+ }
48
+ void tracker.track(AuthEventName.FlowEnriched, data, void 0, valid);
49
+ } catch (error) {
50
+ logger.warn("Failed to set flow tags", error);
51
+ }
52
+ }
53
+ function clearExperimentOn(tracker, key) {
54
+ try {
55
+ if (Object.prototype.hasOwnProperty.call(tracker["experiments"], key)) {
56
+ delete tracker["experiments"][key];
57
+ tracker["persistExperiments"]();
58
+ }
59
+ } catch (error) {
60
+ tracker.getLogger().error("Failed to clear experiment", error);
61
+ }
62
+ }
63
+ function clearExperimentsOn(tracker) {
64
+ try {
65
+ if (Object.keys(tracker["experiments"]).length === 0) {
66
+ return;
67
+ }
68
+ tracker["experiments"] = {};
69
+ tracker["persistExperiments"]();
70
+ } catch (error) {
71
+ tracker.getLogger().error("Failed to clear experiments", error);
72
+ }
73
+ }
74
+ export {
75
+ clearExperimentOn,
76
+ clearExperimentsOn,
77
+ resetSessionOn,
78
+ setFlowTagsOn,
79
+ setUserOn
80
+ };
@@ -0,0 +1,103 @@
1
+ // src/tracker-functions.ts
2
+ import { getDefaultTracker, isTracker } from "./default-tracker.mjs";
3
+ import {
4
+ AuthEventName
5
+ } from "./types.mjs";
6
+ import { clearExperimentOn, clearExperimentsOn, resetSessionOn, setFlowTagsOn, setUserOn } from "./tracker-features.mjs";
7
+ function resetSession(tracker) {
8
+ const target = isTracker(tracker) ? tracker : getDefaultTracker();
9
+ return target ? resetSessionOn(target) : void 0;
10
+ }
11
+ function setUser(first, second) {
12
+ const [tracker, user] = isTracker(first) ? [first, second] : [getDefaultTracker(), first];
13
+ if (tracker) setUserOn(tracker, user);
14
+ }
15
+ function setFlowTags(first, second, third) {
16
+ const explicit = isTracker(first);
17
+ const tracker = explicit ? first : getDefaultTracker();
18
+ if (!tracker) {
19
+ return;
20
+ }
21
+ setFlowTagsOn(
22
+ tracker,
23
+ explicit ? second : first,
24
+ explicit ? third : second
25
+ );
26
+ }
27
+ function setExperiment(first, second, third) {
28
+ if (isTracker(first)) {
29
+ first.setExperiments({ [second]: third });
30
+ } else {
31
+ getDefaultTracker()?.setExperiments({ [first]: second });
32
+ }
33
+ }
34
+ function clearExperiment(first, second) {
35
+ const [tracker, key] = isTracker(first) ? [first, second] : [getDefaultTracker(), first];
36
+ if (tracker) clearExperimentOn(tracker, key);
37
+ }
38
+ function clearExperiments(tracker) {
39
+ const target = isTracker(tracker) ? tracker : getDefaultTracker();
40
+ if (target) clearExperimentsOn(target);
41
+ }
42
+ function logInfo(first, second) {
43
+ if (isTracker(first)) first.telemetry("info", second);
44
+ else getDefaultTracker()?.telemetry("info", first);
45
+ }
46
+ function logError(first, second) {
47
+ if (isTracker(first)) first.telemetry("error", second);
48
+ else getDefaultTracker()?.telemetry("error", first);
49
+ }
50
+ function conversion(tracker, data, tags, experiments) {
51
+ const { userId, identifier, crossEnvironmentTransactionID, ...dataOut } = data;
52
+ const userReference = { userId, identifier, crossEnvironmentTransactionID };
53
+ const effectiveTags = { ...tracker["options"].defaultTags, ...tracker["applicationTag"](), ...tags };
54
+ void tracker.track(
55
+ AuthEventName.Conversion,
56
+ dataOut,
57
+ userReference,
58
+ effectiveTags,
59
+ void 0,
60
+ void 0,
61
+ experiments
62
+ );
63
+ }
64
+ function authDecisionStarted(tracker, data, tags, experiments) {
65
+ void tracker.track(AuthEventName.AuthDecisionStarted, data, void 0, tags, void 0, void 0, experiments);
66
+ }
67
+ function authDecisionFinished(tracker, data, tags, experiments) {
68
+ void tracker.track(AuthEventName.AuthDecisionFinished, data, void 0, tags, void 0, void 0, experiments);
69
+ }
70
+ function trackSubflowError(tracker, subflowType, data, options) {
71
+ const wrappedData = {
72
+ subflowType,
73
+ stepData: data
74
+ };
75
+ void tracker.track(
76
+ AuthEventName.SubflowError,
77
+ wrappedData,
78
+ options?.userReference,
79
+ void 0,
80
+ void 0,
81
+ options?.explicitTimestamp,
82
+ options?.experiments,
83
+ {
84
+ subflowStartEventId: options?.subflowStartEventId,
85
+ sessionId: options?.captureSessionId,
86
+ initiator: options?.initiator
87
+ }
88
+ );
89
+ }
90
+ export {
91
+ authDecisionFinished,
92
+ authDecisionStarted,
93
+ clearExperiment,
94
+ clearExperiments,
95
+ conversion,
96
+ logError,
97
+ logInfo,
98
+ resetSession,
99
+ setExperiment,
100
+ setFlowTags,
101
+ setUser,
102
+ trackSubflowError
103
+ };
@@ -1,11 +1,26 @@
1
1
  // src/transports/fetch.ts
2
2
  import { parseReliabilityConfig } from "../config.mjs";
3
- import { beaconSender, sendFetch } from "../readers/network.mjs";
3
+ import { beaconSender, declareBrowserRequestData, sendFetch } from "../readers/network.mjs";
4
4
  var MAX_KEEPALIVE_BODY_BYTES = 6e4;
5
5
  var FETCH_TIMEOUT_MS = 6e4;
6
6
  var FetchTransport = class {
7
7
  constructor(options) {
8
8
  this.options = options;
9
+ declareBrowserRequestData({
10
+ key: "browser-api:device.user-agent",
11
+ title: "Browser and operating system",
12
+ accessNote: "User-Agent header the browser sends with every request to the Observe ingestion API (the SDK does not read it); Corbado stores it and derives browser and operating system name and version",
13
+ group: "Device information",
14
+ origin: "observe-external",
15
+ fields: [
16
+ {
17
+ path: "request.header.user-agent",
18
+ label: "Browser and operating system identifier",
19
+ exposure: "raw",
20
+ transform: { note: "full User-Agent string, sent by the browser" }
21
+ }
22
+ ]
23
+ });
9
24
  }
10
25
  /**
11
26
  * Error situations:
@@ -14,6 +14,10 @@ var AppConfirmationOperationFull = class extends OperationFull {
14
14
  void this.subflowStart({ explicitSpecType: config.explicitSpecType });
15
15
  }
16
16
  };
17
+ function appConfirmationOperationFull(tracker, config) {
18
+ return new AppConfirmationOperationFull(tracker, config);
19
+ }
17
20
  export {
18
- AppConfirmationOperationFull
21
+ AppConfirmationOperationFull,
22
+ appConfirmationOperationFull
19
23
  };
@@ -12,6 +12,10 @@ var CaptchaOperationFull = class extends OperationFull {
12
12
  void this.subflowStart({ explicitSpecType: config.explicitSpecType });
13
13
  }
14
14
  };
15
+ function captchaOperationFull(tracker, config) {
16
+ return new CaptchaOperationFull(tracker, config);
17
+ }
15
18
  export {
16
- CaptchaOperationFull
19
+ CaptchaOperationFull,
20
+ captchaOperationFull
17
21
  };
@@ -156,7 +156,15 @@ var EmailLinkContinuationOperation = class extends OperationFull {
156
156
  };
157
157
  }
158
158
  };
159
+ function emailLinkOperationFull(tracker, config) {
160
+ return new EmailLinkOperationFull(tracker, config);
161
+ }
162
+ function continueEmailLinkOperation(tracker, config) {
163
+ return new EmailLinkContinuationOperation(tracker, config);
164
+ }
159
165
  export {
160
166
  EmailLinkContinuationOperation,
161
- EmailLinkOperationFull
167
+ EmailLinkOperationFull,
168
+ continueEmailLinkOperation,
169
+ emailLinkOperationFull
162
170
  };
@@ -33,6 +33,10 @@ var EmailOtpOperationFull = class extends OperationFull {
33
33
  this.lowEventTracker?.destroy();
34
34
  }
35
35
  };
36
+ function emailOtpOperationFull(tracker, config) {
37
+ return new EmailOtpOperationFull(tracker, config);
38
+ }
36
39
  export {
37
- EmailOtpOperationFull
40
+ EmailOtpOperationFull,
41
+ emailOtpOperationFull
38
42
  };
@@ -75,6 +75,10 @@ function warn(tracker, message) {
75
75
  } catch {
76
76
  }
77
77
  }
78
+ function formOperationFull(tracker, config) {
79
+ return new FormOperationFull(tracker, config);
80
+ }
78
81
  export {
79
- FormOperationFull
82
+ FormOperationFull,
83
+ formOperationFull
80
84
  };
@@ -32,7 +32,15 @@ var KeyRegistrationOperationFull = class extends OperationFull {
32
32
  void this.subflowStart({ actor: "system", explicitSpecType: specType(tracker, config) });
33
33
  }
34
34
  };
35
+ function keySigningOperationFull(tracker, config) {
36
+ return new KeySigningOperationFull(tracker, config);
37
+ }
38
+ function keyRegistrationOperationFull(tracker, config) {
39
+ return new KeyRegistrationOperationFull(tracker, config);
40
+ }
35
41
  export {
36
42
  KeyRegistrationOperationFull,
37
- KeySigningOperationFull
43
+ KeySigningOperationFull,
44
+ keyRegistrationOperationFull,
45
+ keySigningOperationFull
38
46
  };
@@ -41,6 +41,13 @@ var OperationFullProvideIdentifierWithCUI = class extends OperationFull {
41
41
  this.lowEventTracker?.destroy();
42
42
  }
43
43
  };
44
+ function provideIdentifierOperationFull(tracker, config) {
45
+ return new OperationFullProvideIdentifierWithCUI(
46
+ tracker,
47
+ config
48
+ );
49
+ }
44
50
  export {
45
- OperationFullProvideIdentifierWithCUI
51
+ OperationFullProvideIdentifierWithCUI,
52
+ provideIdentifierOperationFull
46
53
  };
@@ -3,7 +3,6 @@ import { reserveCaptureSeq } from "../low-events/capture-sequence.mjs";
3
3
  import { inferCeremonyInitiator } from "../low-events/ceremony-initiator.mjs";
4
4
  import { v7 as uuidv7 } from "uuid";
5
5
  import { normalizeError } from "./normalize-error.mjs";
6
- import { serializeRawError } from "./serialize-raw-error.mjs";
7
6
  var CEREMONY_LOW_EVENT_TAIL_MS = 1500;
8
7
  var OperationFull = class {
9
8
  constructor(tracker, operationName) {
@@ -30,7 +29,6 @@ var OperationFull = class {
30
29
  this.captureSessionId
31
30
  ),
32
31
  flushKeepalive: () => this.tracker.lowEventFlushKeepalive(),
33
- passwordManagerDomScan: () => this.tracker.isPasswordManagerDomScanEnabled(),
34
32
  registerInputs: (fields, flush) => this.tracker.getWindowObserver().registerInputs(
35
33
  fields,
36
34
  () => ({
@@ -163,7 +161,10 @@ var OperationFull = class {
163
161
  let payload = data;
164
162
  try {
165
163
  const rawError = this.tracker.getSdkConfig().rawErrors ? options?.rawError : void 0;
166
- if (rawError !== void 0) payload = { ...data, rawError: serializeRawError(rawError, options?.rawErrorLimits) };
164
+ if (rawError !== void 0) {
165
+ const serialize = this.tracker["rawErrors"];
166
+ if (serialize) payload = { ...data, rawError: serialize(rawError, options?.rawErrorLimits) };
167
+ }
167
168
  } catch {
168
169
  }
169
170
  void this.tracker.trackSubflowStepError(this.operationName, stepName, payload, this.captureOptions(options));
@@ -12,6 +12,10 @@ var PasskeyDeletionOperationFull = class extends OperationFull {
12
12
  void this.subflowStart({});
13
13
  }
14
14
  };
15
+ function passkeyDeletionOperationFull(tracker, config) {
16
+ return new PasskeyDeletionOperationFull(tracker, config);
17
+ }
15
18
  export {
16
- PasskeyDeletionOperationFull
19
+ PasskeyDeletionOperationFull,
20
+ passkeyDeletionOperationFull
17
21
  };
@@ -30,6 +30,10 @@ var PasskeyEnrollmentOperationFull = class extends OperationFull {
30
30
  this.lowEventTracker.destroy();
31
31
  }
32
32
  };
33
+ function passkeyEnrollmentFullOperation(tracker, config) {
34
+ return new PasskeyEnrollmentOperationFull(tracker, config);
35
+ }
33
36
  export {
34
- PasskeyEnrollmentOperationFull
37
+ PasskeyEnrollmentOperationFull,
38
+ passkeyEnrollmentFullOperation
35
39
  };
@@ -34,6 +34,10 @@ var PasskeyLoginOperationFull = class extends OperationFull {
34
34
  this.lowEventTracker.destroy();
35
35
  }
36
36
  };
37
+ function passkeyLoginFullOperation(tracker, config) {
38
+ return new PasskeyLoginOperationFull(tracker, config);
39
+ }
37
40
  export {
38
- PasskeyLoginOperationFull
41
+ PasskeyLoginOperationFull,
42
+ passkeyLoginFullOperation
39
43
  };
@@ -22,6 +22,10 @@ var PasswordEnrollmentOperationFull = class extends OperationFull {
22
22
  this.lowEventTracker?.destroy();
23
23
  }
24
24
  };
25
+ function passwordEnrollmentFullOperation(tracker, config) {
26
+ return new PasswordEnrollmentOperationFull(tracker, config);
27
+ }
25
28
  export {
26
- PasswordEnrollmentOperationFull
29
+ PasswordEnrollmentOperationFull,
30
+ passwordEnrollmentFullOperation
27
31
  };
@@ -60,6 +60,10 @@ var PasswordLoginOperationFull = class extends OperationFull {
60
60
  this.identifierLowEventTracker?.destroy();
61
61
  }
62
62
  };
63
+ function passwordLoginFullOperation(tracker, config) {
64
+ return new PasswordLoginOperationFull(tracker, config);
65
+ }
63
66
  export {
64
- PasswordLoginOperationFull
67
+ PasswordLoginOperationFull,
68
+ passwordLoginFullOperation
65
69
  };
@@ -23,6 +23,10 @@ var ProvideDataOperationFull = class extends OperationFull {
23
23
  this.lowEventTracker?.destroy();
24
24
  }
25
25
  };
26
+ function provideDataOperationFull(tracker, config) {
27
+ return new ProvideDataOperationFull(tracker, config);
28
+ }
26
29
  export {
27
- ProvideDataOperationFull
30
+ ProvideDataOperationFull,
31
+ provideDataOperationFull
28
32
  };
@@ -33,6 +33,10 @@ var SmsOtpOperationFull = class extends OperationFull {
33
33
  this.lowEventTracker?.destroy();
34
34
  }
35
35
  };
36
+ function smsOtpOperationFull(tracker, config) {
37
+ return new SmsOtpOperationFull(tracker, config);
38
+ }
36
39
  export {
37
- SmsOtpOperationFull
40
+ SmsOtpOperationFull,
41
+ smsOtpOperationFull
38
42
  };
@@ -12,6 +12,10 @@ var SocialLoginOperationFull = class extends OperationFull {
12
12
  void this.subflowStart({ explicitSpecType: config.explicitSpecType, entry: config.entry });
13
13
  }
14
14
  };
15
+ function socialLoginOperationFull(tracker, config) {
16
+ return new SocialLoginOperationFull(tracker, config);
17
+ }
15
18
  export {
16
- SocialLoginOperationFull
19
+ SocialLoginOperationFull,
20
+ socialLoginOperationFull
17
21
  };
@@ -32,6 +32,10 @@ function validateConfig(config, tracker) {
32
32
  }
33
33
  return result;
34
34
  }
35
+ function ssoLoginOperationFull(tracker, config) {
36
+ return new SsoLoginOperationFull(tracker, config);
37
+ }
35
38
  export {
36
- SsoLoginOperationFull
39
+ SsoLoginOperationFull,
40
+ ssoLoginOperationFull
37
41
  };
@@ -29,6 +29,10 @@ var TotpOperationFull = class extends OperationFull {
29
29
  this.lowEventTracker?.destroy();
30
30
  }
31
31
  };
32
+ function totpOperationFull(tracker, config) {
33
+ return new TotpOperationFull(tracker, config);
34
+ }
32
35
  export {
33
- TotpOperationFull
36
+ TotpOperationFull,
37
+ totpOperationFull
34
38
  };
@@ -94,7 +94,15 @@ function validateConfig(config, tracker) {
94
94
  }
95
95
  return result;
96
96
  }
97
+ function trustedDeviceCheckOperationFull(tracker, config) {
98
+ return new TrustedDeviceCheckOperationFull(tracker, config);
99
+ }
100
+ function trustedDeviceEnrollmentOperationFull(tracker, config) {
101
+ return new TrustedDeviceEnrollmentOperationFull(tracker, config);
102
+ }
97
103
  export {
98
104
  TrustedDeviceCheckOperationFull,
99
- TrustedDeviceEnrollmentOperationFull
105
+ TrustedDeviceEnrollmentOperationFull,
106
+ trustedDeviceCheckOperationFull,
107
+ trustedDeviceEnrollmentOperationFull
100
108
  };
@@ -1,6 +1,6 @@
1
1
  // src/version.ts
2
2
  var SDK_NAME = "@corbado/observe";
3
- var SDK_VERSION = true ? "1.10.0" : "0.0.0-dev";
3
+ var SDK_VERSION = true ? "1.11.0" : "0.0.0-dev";
4
4
  export {
5
5
  SDK_NAME,
6
6
  SDK_VERSION