@rocapine/rocalytics-sdk 0.0.0-stage → 0.2.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 (161) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/LICENSE +21 -0
  3. package/README.md +447 -2
  4. package/client/package.json +1 -0
  5. package/core/package.json +4 -0
  6. package/dist/client/client.d.ts +136 -0
  7. package/dist/client/client.d.ts.map +1 -0
  8. package/dist/client/client.js +373 -0
  9. package/dist/client/client.js.map +1 -0
  10. package/dist/client/index.d.ts +13 -0
  11. package/dist/client/index.d.ts.map +1 -0
  12. package/dist/client/index.js +35 -0
  13. package/dist/client/index.js.map +1 -0
  14. package/dist/client/native.d.ts +68 -0
  15. package/dist/client/native.d.ts.map +1 -0
  16. package/dist/client/native.js +64 -0
  17. package/dist/client/native.js.map +1 -0
  18. package/dist/client/onboardingSink.d.ts +63 -0
  19. package/dist/client/onboardingSink.d.ts.map +1 -0
  20. package/dist/client/onboardingSink.js +126 -0
  21. package/dist/client/onboardingSink.js.map +1 -0
  22. package/dist/client/paywallSink.d.ts +13 -0
  23. package/dist/client/paywallSink.d.ts.map +1 -0
  24. package/dist/client/paywallSink.js +26 -0
  25. package/dist/client/paywallSink.js.map +1 -0
  26. package/dist/client/requests.d.ts +66 -0
  27. package/dist/client/requests.d.ts.map +1 -0
  28. package/dist/client/requests.js +90 -0
  29. package/dist/client/requests.js.map +1 -0
  30. package/dist/client/types.d.ts +180 -0
  31. package/dist/client/types.d.ts.map +1 -0
  32. package/dist/client/types.js +4 -0
  33. package/dist/client/types.js.map +1 -0
  34. package/dist/core/context.d.ts +39 -0
  35. package/dist/core/context.d.ts.map +1 -0
  36. package/dist/core/context.js +45 -0
  37. package/dist/core/context.js.map +1 -0
  38. package/dist/core/delivery.d.ts +63 -0
  39. package/dist/core/delivery.d.ts.map +1 -0
  40. package/dist/core/delivery.js +133 -0
  41. package/dist/core/delivery.js.map +1 -0
  42. package/dist/core/diagnostics.d.ts +16 -0
  43. package/dist/core/diagnostics.d.ts.map +1 -0
  44. package/dist/core/diagnostics.js +24 -0
  45. package/dist/core/diagnostics.js.map +1 -0
  46. package/dist/core/httpSink.d.ts +35 -0
  47. package/dist/core/httpSink.d.ts.map +1 -0
  48. package/dist/core/httpSink.js +65 -0
  49. package/dist/core/httpSink.js.map +1 -0
  50. package/dist/core/ids.d.ts +16 -0
  51. package/dist/core/ids.d.ts.map +1 -0
  52. package/dist/core/ids.js +51 -0
  53. package/dist/core/ids.js.map +1 -0
  54. package/dist/core/index.d.ts +17 -0
  55. package/dist/core/index.d.ts.map +1 -0
  56. package/dist/core/index.js +32 -0
  57. package/dist/core/index.js.map +1 -0
  58. package/dist/core/sink.d.ts +39 -0
  59. package/dist/core/sink.d.ts.map +1 -0
  60. package/dist/core/sink.js +16 -0
  61. package/dist/core/sink.js.map +1 -0
  62. package/dist/core/storage.d.ts +52 -0
  63. package/dist/core/storage.d.ts.map +1 -0
  64. package/dist/core/storage.js +79 -0
  65. package/dist/core/storage.js.map +1 -0
  66. package/dist/core/text.d.ts +9 -0
  67. package/dist/core/text.d.ts.map +1 -0
  68. package/dist/core/text.js +47 -0
  69. package/dist/core/text.js.map +1 -0
  70. package/dist/core/time.d.ts +18 -0
  71. package/dist/core/time.d.ts.map +1 -0
  72. package/dist/core/time.js +18 -0
  73. package/dist/core/time.js.map +1 -0
  74. package/dist/onboarding/contract.d.ts +138 -0
  75. package/dist/onboarding/contract.d.ts.map +1 -0
  76. package/dist/onboarding/contract.js +11 -0
  77. package/dist/onboarding/contract.js.map +1 -0
  78. package/dist/onboarding/index.d.ts +15 -0
  79. package/dist/onboarding/index.d.ts.map +1 -0
  80. package/dist/onboarding/index.js +22 -0
  81. package/dist/onboarding/index.js.map +1 -0
  82. package/dist/onboarding/input.d.ts +102 -0
  83. package/dist/onboarding/input.d.ts.map +1 -0
  84. package/dist/onboarding/input.js +216 -0
  85. package/dist/onboarding/input.js.map +1 -0
  86. package/dist/onboarding/persisted.d.ts +20 -0
  87. package/dist/onboarding/persisted.d.ts.map +1 -0
  88. package/dist/onboarding/persisted.js +75 -0
  89. package/dist/onboarding/persisted.js.map +1 -0
  90. package/dist/onboarding/state.d.ts +65 -0
  91. package/dist/onboarding/state.d.ts.map +1 -0
  92. package/dist/onboarding/state.js +207 -0
  93. package/dist/onboarding/state.js.map +1 -0
  94. package/dist/onboarding/tracker.d.ts +135 -0
  95. package/dist/onboarding/tracker.d.ts.map +1 -0
  96. package/dist/onboarding/tracker.js +734 -0
  97. package/dist/onboarding/tracker.js.map +1 -0
  98. package/dist/paywall/contract.d.ts +67 -0
  99. package/dist/paywall/contract.d.ts.map +1 -0
  100. package/dist/paywall/contract.js +3 -0
  101. package/dist/paywall/contract.js.map +1 -0
  102. package/dist/paywall/index.d.ts +14 -0
  103. package/dist/paywall/index.d.ts.map +1 -0
  104. package/dist/paywall/index.js +19 -0
  105. package/dist/paywall/index.js.map +1 -0
  106. package/dist/paywall/observer.d.ts +38 -0
  107. package/dist/paywall/observer.d.ts.map +1 -0
  108. package/dist/paywall/observer.js +6 -0
  109. package/dist/paywall/observer.js.map +1 -0
  110. package/dist/paywall/state.d.ts +26 -0
  111. package/dist/paywall/state.d.ts.map +1 -0
  112. package/dist/paywall/state.js +132 -0
  113. package/dist/paywall/state.js.map +1 -0
  114. package/dist/paywall/tracker.d.ts +36 -0
  115. package/dist/paywall/tracker.d.ts.map +1 -0
  116. package/dist/paywall/tracker.js +180 -0
  117. package/dist/paywall/tracker.js.map +1 -0
  118. package/dist/version.d.ts +3 -0
  119. package/dist/version.d.ts.map +1 -0
  120. package/dist/version.js +6 -0
  121. package/dist/version.js.map +1 -0
  122. package/docs/onboarding-run-contract.md +1013 -0
  123. package/docs/onboarding-run.examples.ts +306 -0
  124. package/docs/onboarding-run.schema.json +224 -0
  125. package/docs/onboarding-run.types.ts +144 -0
  126. package/docs/paywall-presentation-contract.md +139 -0
  127. package/docs/paywall-presentation.examples.ts +42 -0
  128. package/docs/paywall-presentation.schema.json +268 -0
  129. package/docs/paywall-presentation.types.ts +73 -0
  130. package/onboarding/package.json +4 -0
  131. package/package.json +120 -4
  132. package/paywall/package.json +1 -0
  133. package/src/client/client.ts +405 -0
  134. package/src/client/index.ts +54 -0
  135. package/src/client/native.ts +109 -0
  136. package/src/client/onboardingSink.ts +121 -0
  137. package/src/client/paywallSink.ts +25 -0
  138. package/src/client/requests.ts +126 -0
  139. package/src/client/types.ts +198 -0
  140. package/src/core/context.ts +69 -0
  141. package/src/core/delivery.ts +181 -0
  142. package/src/core/diagnostics.ts +30 -0
  143. package/src/core/httpSink.ts +70 -0
  144. package/src/core/ids.ts +46 -0
  145. package/src/core/index.ts +20 -0
  146. package/src/core/sink.ts +46 -0
  147. package/src/core/storage.ts +112 -0
  148. package/src/core/text.ts +37 -0
  149. package/src/core/time.ts +26 -0
  150. package/src/onboarding/contract.ts +144 -0
  151. package/src/onboarding/index.ts +39 -0
  152. package/src/onboarding/input.ts +246 -0
  153. package/src/onboarding/persisted.ts +93 -0
  154. package/src/onboarding/state.ts +233 -0
  155. package/src/onboarding/tracker.ts +855 -0
  156. package/src/paywall/contract.ts +73 -0
  157. package/src/paywall/index.ts +36 -0
  158. package/src/paywall/observer.ts +43 -0
  159. package/src/paywall/state.ts +125 -0
  160. package/src/paywall/tracker.ts +200 -0
  161. package/src/version.ts +2 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * RFC 3339 timestamp in UTC with exactly three fractional digits and a `Z`
3
+ * suffix, e.g. `2026-01-10T09:00:00.000Z`.
4
+ */
5
+ export type Timestamp = string;
6
+ /**
7
+ * An identifier chosen by the app: 1 to 128 characters from `A-Z a-z 0-9 _ . : -`,
8
+ * starting with a letter or digit. Case-sensitive. Used for onboarding, step,
9
+ * question, option, slot and variant keys.
10
+ */
11
+ export type Key = string;
12
+ export interface OnboardingIdentity {
13
+ /**
14
+ * Stable key for one flow. Never reused for a different flow. Each
15
+ * Studio-served A/B arm is its own onboarding, so it has its own key.
16
+ */
17
+ key: Key;
18
+ /**
19
+ * Revision of the flow. 1 to 64 characters from `A-Z a-z 0-9 _ . : + -`,
20
+ * starting with a letter or digit. Must change whenever the manifest changes,
21
+ * except for the reserved version `draft`, which a Studio-served draft or
22
+ * preview must send because it has no deployment id.
23
+ */
24
+ version: string;
25
+ /**
26
+ * In-flow variant, for an app that runs one flow (one key) with its own
27
+ * variants. Not set for a Studio-served run. Absent or null otherwise.
28
+ */
29
+ variant_key?: Key | null;
30
+ }
31
+ /** Optional links to Studio records. Opaque strings of 1 to 128 characters; numeric ids are sent in decimal. */
32
+ export interface StudioLinks {
33
+ onboarding_id?: string | null;
34
+ deployment_id?: string | null;
35
+ audience_id?: string | null;
36
+ }
37
+ /** Captured once, at run start, and repeated unchanged in every snapshot. */
38
+ export interface RunContext {
39
+ /** Marketing version, e.g. `2.4.0`. 1 to 32 characters. */
40
+ app_version: string;
41
+ /** Build number, 1 to 32 characters, or null on a platform with no such concept. */
42
+ build: string | null;
43
+ platform: "ios" | "android" | "web";
44
+ /** OS version, 1 to 32 characters, or null when the platform cannot report one. */
45
+ os_version: string | null;
46
+ /** BCP 47 language tag the onboarding is shown in, e.g. `fr-FR`. */
47
+ locale: string;
48
+ /** IANA time zone, e.g. `Europe/Paris`. At most 64 characters. */
49
+ timezone: string;
50
+ /** Version of the tracking library that produced the payload. 1 to 32 characters. */
51
+ library_version?: string;
52
+ }
53
+ export interface ManifestStep {
54
+ step_key: Key;
55
+ /** Steps sharing a slot are alternatives shown at one position. Must be contiguous. */
56
+ slot?: Key;
57
+ }
58
+ /** Declared once, at run start, and repeated unchanged in every snapshot. */
59
+ export interface Manifest {
60
+ /** Every step the flow can show, in flow order. 1 to 200 entries. */
61
+ steps: ManifestStep[];
62
+ }
63
+ /** Run-level custom property value. Strings are at most 256 characters; numbers are finite. */
64
+ export type PropertyValue = string | number | boolean | null;
65
+ /** At most 20 keys, each matching `^[a-z][a-z0-9_]{0,39}$`. */
66
+ export type Properties = Record<string, PropertyValue>;
67
+ export type Answer = {
68
+ question_key: Key;
69
+ kind: "single";
70
+ value: Key;
71
+ }
72
+ /** At most 50 option keys, unique. */
73
+ | {
74
+ question_key: Key;
75
+ kind: "multi";
76
+ value: Key[];
77
+ } | {
78
+ question_key: Key;
79
+ kind: "numeric";
80
+ value: number;
81
+ unit?: Key;
82
+ }
83
+ /** At most 1,000 characters. Never aggregated. */
84
+ | {
85
+ question_key: Key;
86
+ kind: "text";
87
+ value: string;
88
+ };
89
+ /**
90
+ * One visit to a screen the user was shown. A step that was not shown has no
91
+ * entry; whether the run passed over it is derived from the manifest.
92
+ */
93
+ export interface StepEntry {
94
+ step_key: Key;
95
+ entered_at: Timestamp;
96
+ /**
97
+ * Null only on the last entry of an in_progress run. In a truncated run the
98
+ * last kept entry may already be closed, and keeps its own exit on completion.
99
+ */
100
+ exited_at: Timestamp | null;
101
+ /** At most 50. `question_key` is unique within an entry. */
102
+ answers: Answer[];
103
+ }
104
+ interface RunSnapshotBase {
105
+ schema_version: 1;
106
+ /** Client-minted, lowercase UUID. One per run. */
107
+ run_id: string;
108
+ /** Starts at 1 and increases with every send of this run. A retry reuses it. */
109
+ seq: number;
110
+ started_at: Timestamp;
111
+ /** Client clock when this snapshot was sent. Advisory only. */
112
+ sent_at: Timestamp;
113
+ onboarding: OnboardingIdentity;
114
+ studio?: StudioLinks;
115
+ context: RunContext;
116
+ manifest: Manifest;
117
+ properties?: Properties;
118
+ /**
119
+ * Present once the tracker has stopped recording (no new entries, answers or
120
+ * property changes) because recording more would break the 500-entry or
121
+ * 256 KiB limit. What was recorded is kept.
122
+ */
123
+ truncated?: true;
124
+ /** Every entry so far, in the order they happened. 1 to 500 entries. */
125
+ steps: StepEntry[];
126
+ }
127
+ export interface InProgressRunSnapshot extends RunSnapshotBase {
128
+ status: "in_progress";
129
+ completed_at: null;
130
+ }
131
+ export interface CompletedRunSnapshot extends RunSnapshotBase {
132
+ status: "completed";
133
+ completed_at: Timestamp;
134
+ }
135
+ /** One send. Each send replaces the run's previous snapshot. */
136
+ export type OnboardingRunSnapshot = InProgressRunSnapshot | CompletedRunSnapshot;
137
+ export {};
138
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/onboarding/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ // Onboarding run contract, schema_version 1: TypeScript types.
3
+ //
4
+ // The normative text is onboarding-run-contract.md; the machine-checkable shape
5
+ // is onboarding-run.schema.json. These types mirror the schema. Where a rule is
6
+ // a pattern or a limit (key characters, list lengths), the type says `string`
7
+ // or `T[]` and the comment names the rule; the schema enforces it.
8
+ //
9
+ // This file has no imports, so it can be copied into any TypeScript project.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/onboarding/contract.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,mEAAmE;AACnE,EAAE;AACF,6EAA6E"}
@@ -0,0 +1,15 @@
1
+ export { createOnboardingRunTracker, onboardingRun } from "./tracker";
2
+ export type { ExitOptions, OnboardingRun, OnboardingRunTracker, TrackerConfig } from "./tracker";
3
+ export type { AnswerInput, ManifestInput, OnboardingInput, StartOptions, StudioInput } from "./input";
4
+ export { MAX_ENTRIES, RECORDING_BUDGET } from "./state";
5
+ export { LIBRARY_VERSION } from "../version";
6
+ export { createHttpSink } from "../core/httpSink";
7
+ export type { HttpSinkOptions } from "../core/httpSink";
8
+ export { memoryStorage } from "../core/storage";
9
+ export type { KeyValueStorage } from "../core/storage";
10
+ export type { Sink, SinkOutcome, SinkResult } from "../core/sink";
11
+ export type { Clock, Timers } from "../core/time";
12
+ export type { RunContextInput } from "../core/context";
13
+ export type { Diagnostic, DiagnosticHandler } from "../core/diagnostics";
14
+ export type { Answer, CompletedRunSnapshot, InProgressRunSnapshot, Key, Manifest, ManifestStep, OnboardingIdentity, OnboardingRunSnapshot, Properties, PropertyValue, RunContext, StepEntry, StudioLinks, Timestamp, } from "./contract";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/onboarding/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACjG,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,YAAY,EACV,MAAM,EACN,oBAAoB,EACpB,qBAAqB,EACrB,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ // @rocapine/rocalytics-sdk/onboarding: the onboarding run tracker.
3
+ //
4
+ // Reports one run of an onboarding as snapshots in the shape of the onboarding
5
+ // run contract v1 (docs/onboarding-run-contract.md). Headless: no renderer,
6
+ // router or UI dependency, so a hand-coded onboarding uses it as is.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.memoryStorage = exports.createHttpSink = exports.LIBRARY_VERSION = exports.RECORDING_BUDGET = exports.MAX_ENTRIES = exports.onboardingRun = exports.createOnboardingRunTracker = void 0;
9
+ var tracker_1 = require("./tracker");
10
+ Object.defineProperty(exports, "createOnboardingRunTracker", { enumerable: true, get: function () { return tracker_1.createOnboardingRunTracker; } });
11
+ Object.defineProperty(exports, "onboardingRun", { enumerable: true, get: function () { return tracker_1.onboardingRun; } });
12
+ var state_1 = require("./state");
13
+ Object.defineProperty(exports, "MAX_ENTRIES", { enumerable: true, get: function () { return state_1.MAX_ENTRIES; } });
14
+ Object.defineProperty(exports, "RECORDING_BUDGET", { enumerable: true, get: function () { return state_1.RECORDING_BUDGET; } });
15
+ var version_1 = require("../version");
16
+ Object.defineProperty(exports, "LIBRARY_VERSION", { enumerable: true, get: function () { return version_1.LIBRARY_VERSION; } });
17
+ // Transport and environment pieces a host needs to configure the tracker.
18
+ var httpSink_1 = require("../core/httpSink");
19
+ Object.defineProperty(exports, "createHttpSink", { enumerable: true, get: function () { return httpSink_1.createHttpSink; } });
20
+ var storage_1 = require("../core/storage");
21
+ Object.defineProperty(exports, "memoryStorage", { enumerable: true, get: function () { return storage_1.memoryStorage; } });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/onboarding/index.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,qEAAqE;;;AAErE,qCAAsE;AAA7D,qHAAA,0BAA0B,OAAA;AAAE,wGAAA,aAAa,OAAA;AAGlD,iCAAwD;AAA/C,oGAAA,WAAW,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AACtC,sCAA6C;AAApC,0GAAA,eAAe,OAAA;AAExB,0EAA0E;AAC1E,6CAAkD;AAAzC,0GAAA,cAAc,OAAA;AAEvB,2CAAgD;AAAvC,wGAAA,aAAa,OAAA"}
@@ -0,0 +1,102 @@
1
+ import type { Answer, Manifest, OnboardingIdentity, Properties, StudioLinks } from "./contract";
2
+ export interface OnboardingInput {
3
+ /** A stable key for this flow. Never reused for a different flow. */
4
+ key: string;
5
+ /** The flow's revision. Must change whenever the manifest or a question's keys change. */
6
+ version: string;
7
+ /** An in-flow variant, for an app running one flow under one key with its own variants. */
8
+ variantKey?: string | null;
9
+ }
10
+ export interface ManifestInput {
11
+ /** Every step the flow can show, in flow order. Steps sharing a `slot` are alternatives at one position. */
12
+ steps: {
13
+ stepKey: string;
14
+ slot?: string;
15
+ }[];
16
+ }
17
+ /**
18
+ * Studio ids are strings. A number passed at run time (from untyped JSON, for
19
+ * example) is sent in decimal when it is a safe non-negative integer; any
20
+ * other number makes the start invalid.
21
+ */
22
+ export interface StudioInput {
23
+ /** Null and undefined both mean absent. */
24
+ onboardingId?: string | null;
25
+ /** Null and undefined both mean absent; a Studio-served run with none is a draft. */
26
+ deploymentId?: string | null;
27
+ audienceId?: string | null;
28
+ /** A Studio draft or preview: always sent as version `draft`. */
29
+ draft?: boolean;
30
+ }
31
+ interface StartBase {
32
+ manifest: ManifestInput;
33
+ /** Run-level scalar properties for slicing runs. No personal data. */
34
+ properties?: Properties;
35
+ }
36
+ /**
37
+ * Starts a run. Either the app declares `onboarding`, or a Studio-served flow
38
+ * passes `studio.onboardingId` and the identity defaults to the Studio
39
+ * onboarding id (key) and deployment id (version, `draft` without one).
40
+ */
41
+ export type StartOptions = (StartBase & {
42
+ onboarding: OnboardingInput;
43
+ studio?: StudioInput;
44
+ }) | (StartBase & {
45
+ onboarding?: undefined;
46
+ studio: StudioInput & {
47
+ onboardingId: string;
48
+ };
49
+ });
50
+ export type AnswerInput = {
51
+ questionKey: string;
52
+ kind: "single";
53
+ value: string;
54
+ } | {
55
+ questionKey: string;
56
+ kind: "multi";
57
+ value: string[];
58
+ } | {
59
+ questionKey: string;
60
+ kind: "numeric";
61
+ value: number;
62
+ unit?: string;
63
+ } | {
64
+ questionKey: string;
65
+ kind: "text";
66
+ value: string;
67
+ };
68
+ export declare const MAX_MANIFEST_STEPS = 200;
69
+ export declare const MAX_ANSWERS = 50;
70
+ export declare const MAX_PROPERTIES = 20;
71
+ export declare const isKey: (v: unknown) => v is string;
72
+ export interface ValidStart {
73
+ onboarding: OnboardingIdentity;
74
+ studio?: StudioLinks;
75
+ manifest: Manifest;
76
+ properties?: Properties;
77
+ /** Problems that were corrected rather than fatal: [code, message]. */
78
+ warnings: [string, string][];
79
+ }
80
+ export declare function validateStart(options: StartOptions): {
81
+ ok: true;
82
+ value: ValidStart;
83
+ } | {
84
+ ok: false;
85
+ errors: string[];
86
+ };
87
+ export declare function propertyProblem(key: string, value: unknown): string | null;
88
+ /** `base` with `patch` applied, keeping only valid entries and at most 20 keys. */
89
+ export declare function mergeProperties(base: Properties, patch: unknown): {
90
+ value: Properties;
91
+ problems: [string, string][];
92
+ };
93
+ /** One answer in wire form, or the reason it cannot be sent. */
94
+ export declare function toAnswer(input: unknown): {
95
+ ok: true;
96
+ answer: Answer;
97
+ } | {
98
+ ok: false;
99
+ error: string;
100
+ };
101
+ export {};
102
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/onboarding/input.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAiB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/G,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,4GAA4G;IAC5G,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,SAAS;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,sEAAsE;IACtE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GACpB,CAAC,SAAS,GAAG;IAAE,UAAU,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC,GACnE,CAAC,SAAS,GAAG;IAAE,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAAC;AAE7F,MAAM,MAAM,WAAW,GACnB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACvD;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAMzD,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,KAAK,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,MAA8C,CAAC;AAGvF,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,uEAAuE;IACvE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAC9B;AAKD,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAoGtH;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAM1E;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;CAAE,CAmBrH;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiCpG"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isKey = exports.MAX_PROPERTIES = exports.MAX_ANSWERS = exports.MAX_MANIFEST_STEPS = void 0;
4
+ exports.validateStart = validateStart;
5
+ exports.propertyProblem = propertyProblem;
6
+ exports.mergeProperties = mergeProperties;
7
+ exports.toAnswer = toAnswer;
8
+ // The tracker's public input types (camelCase, as an app writes them) and their
9
+ // validation against the contract. Anything that would make the ingest reject a
10
+ // snapshot is caught here, so the tracker never sends it.
11
+ const text_1 = require("../core/text");
12
+ const KEY = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/;
13
+ const VERSION = /^[A-Za-z0-9][A-Za-z0-9_.:+-]{0,63}$/;
14
+ const PROPERTY_KEY = /^[a-z][a-z0-9_]{0,39}$/;
15
+ exports.MAX_MANIFEST_STEPS = 200;
16
+ exports.MAX_ANSWERS = 50;
17
+ exports.MAX_PROPERTIES = 20;
18
+ const isKey = (v) => typeof v === "string" && KEY.test(v);
19
+ exports.isKey = isKey;
20
+ const isLink = (v) => typeof v === "string" && (0, text_1.codePointLength)(v) >= 1 && (0, text_1.codePointLength)(v) <= 128;
21
+ /** A Studio id that is a safe non-negative integer, in decimal (contract 3.1); anything else as it is. */
22
+ const decimalId = (v) => (typeof v === "number" && Number.isSafeInteger(v) && v >= 0 ? String(v) : v);
23
+ function validateStart(options) {
24
+ var _a;
25
+ const errors = [];
26
+ const warnings = [];
27
+ if (!options || typeof options !== "object")
28
+ return { ok: false, errors: ["start options are not an object"] };
29
+ // Studio links. Read once, with numeric ids converted, by both the links and the identity below.
30
+ const studioIn = options.studio && typeof options.studio === "object"
31
+ ? {
32
+ ...options.studio,
33
+ onboardingId: decimalId(options.studio.onboardingId),
34
+ deploymentId: decimalId(options.studio.deploymentId),
35
+ audienceId: decimalId(options.studio.audienceId),
36
+ }
37
+ : options.studio;
38
+ let studio;
39
+ if (studioIn !== undefined) {
40
+ if (!studioIn || typeof studioIn !== "object")
41
+ errors.push("studio is not an object");
42
+ else {
43
+ studio = {};
44
+ const links = [
45
+ ["onboarding_id", studioIn.onboardingId],
46
+ ["deployment_id", studioIn.deploymentId],
47
+ ["audience_id", studioIn.audienceId],
48
+ ];
49
+ for (const [field, value] of links) {
50
+ if (value === undefined || value === null)
51
+ continue;
52
+ if (!isLink(value))
53
+ errors.push(`studio.${field} must be 1 to 128 characters`);
54
+ else
55
+ studio[field] = value;
56
+ }
57
+ if (Object.keys(studio).length === 0)
58
+ studio = undefined;
59
+ }
60
+ }
61
+ const draft = !!(studioIn === null || studioIn === void 0 ? void 0 : studioIn.draft);
62
+ // Identity.
63
+ let onboarding;
64
+ if (options.onboarding) {
65
+ const { key, version, variantKey } = options.onboarding;
66
+ if (!(0, exports.isKey)(key))
67
+ errors.push("onboarding.key must be 1 to 128 characters from A-Z a-z 0-9 _ . : -");
68
+ if (!draft && (typeof version !== "string" || !VERSION.test(version))) {
69
+ errors.push("onboarding.version must be 1 to 64 characters from A-Z a-z 0-9 _ . : + -");
70
+ }
71
+ if (draft && version !== "draft")
72
+ warnings.push(["draft-version", `a Studio draft sends version "draft", not "${version}"`]);
73
+ onboarding = { key, version: draft ? "draft" : version };
74
+ if (variantKey !== undefined && variantKey !== null) {
75
+ // Studio-served means it carries a Studio link (or is a Studio draft), not that a `studio` object was passed.
76
+ if (studio || draft) {
77
+ warnings.push(["studio-variant-dropped", "a Studio-served run does not carry variant_key: each Studio arm is its own onboarding key"]);
78
+ }
79
+ else if (!(0, exports.isKey)(variantKey))
80
+ errors.push("onboarding.variantKey must be a key");
81
+ else
82
+ onboarding.variant_key = variantKey;
83
+ }
84
+ }
85
+ else if (studioIn && (0, exports.isKey)(studioIn.onboardingId)) {
86
+ // A null deployment id is absent, as it is for the links above: a Studio-served run with none is a draft (3.1).
87
+ const deployment = studioIn.deploymentId;
88
+ const version = draft || deployment === undefined || deployment === null ? "draft" : deployment;
89
+ if (typeof version !== "string" || !VERSION.test(version)) {
90
+ errors.push("studio.deploymentId cannot be used as onboarding.version");
91
+ }
92
+ else {
93
+ onboarding = { key: studioIn.onboardingId, version };
94
+ }
95
+ }
96
+ else {
97
+ errors.push("either onboarding { key, version } or studio.onboardingId is required");
98
+ }
99
+ // Manifest.
100
+ const manifest = { steps: [] };
101
+ const stepsIn = (_a = options.manifest) === null || _a === void 0 ? void 0 : _a.steps;
102
+ if (!Array.isArray(stepsIn) || stepsIn.length < 1 || stepsIn.length > exports.MAX_MANIFEST_STEPS) {
103
+ errors.push(`manifest.steps must hold 1 to ${exports.MAX_MANIFEST_STEPS} steps`);
104
+ }
105
+ else {
106
+ const seen = new Set();
107
+ const closedSlots = new Set();
108
+ stepsIn.forEach((s, i) => {
109
+ var _a;
110
+ const stepKey = s === null || s === void 0 ? void 0 : s.stepKey;
111
+ if (!(0, exports.isKey)(stepKey))
112
+ return void errors.push(`manifest.steps[${i}].stepKey is not a valid key`);
113
+ if (seen.has(stepKey))
114
+ errors.push(`manifest step "${stepKey}" is declared twice`);
115
+ seen.add(stepKey);
116
+ const slot = s.slot;
117
+ if (slot !== undefined) {
118
+ if (!(0, exports.isKey)(slot))
119
+ errors.push(`manifest.steps[${i}].slot is not a valid key`);
120
+ if (closedSlots.has(slot))
121
+ errors.push(`slot "${slot}" is not contiguous`);
122
+ if (((_a = stepsIn[i + 1]) === null || _a === void 0 ? void 0 : _a.slot) !== slot)
123
+ closedSlots.add(slot);
124
+ manifest.steps.push({ step_key: stepKey, slot });
125
+ }
126
+ else {
127
+ manifest.steps.push({ step_key: stepKey });
128
+ }
129
+ });
130
+ }
131
+ // Properties: invalid ones are dropped, not fatal.
132
+ let properties;
133
+ if (options.properties !== undefined) {
134
+ const { value, problems } = mergeProperties({}, options.properties);
135
+ problems.forEach((p) => warnings.push(p));
136
+ if (Object.keys(value).length)
137
+ properties = value;
138
+ }
139
+ if (errors.length || !onboarding)
140
+ return { ok: false, errors };
141
+ return { ok: true, value: { onboarding, studio, manifest, properties, warnings } };
142
+ }
143
+ function propertyProblem(key, value) {
144
+ if (!PROPERTY_KEY.test(key))
145
+ return `property key "${key}" must match ^[a-z][a-z0-9_]{0,39}$`;
146
+ if (value === null || typeof value === "boolean")
147
+ return null;
148
+ if (typeof value === "number")
149
+ return Number.isFinite(value) ? null : `property "${key}" is not a finite number`;
150
+ if (typeof value === "string")
151
+ return (0, text_1.codePointLength)(value) <= 256 ? null : `property "${key}" is longer than 256 characters`;
152
+ return `property "${key}" must be a string, number, boolean or null`;
153
+ }
154
+ /** `base` with `patch` applied, keeping only valid entries and at most 20 keys. */
155
+ function mergeProperties(base, patch) {
156
+ const value = { ...base };
157
+ const problems = [];
158
+ if (!patch || typeof patch !== "object" || Array.isArray(patch)) {
159
+ return { value, problems: [["invalid-property", "properties must be an object"]] };
160
+ }
161
+ for (const [k, v] of Object.entries(patch)) {
162
+ const problem = propertyProblem(k, v);
163
+ if (problem) {
164
+ problems.push(["invalid-property", problem]);
165
+ continue;
166
+ }
167
+ if (!Object.prototype.hasOwnProperty.call(value, k) && Object.keys(value).length >= exports.MAX_PROPERTIES) {
168
+ problems.push(["too-many-properties", `property "${k}" dropped: at most ${exports.MAX_PROPERTIES}`]);
169
+ continue;
170
+ }
171
+ value[k] = v;
172
+ }
173
+ return { value, problems };
174
+ }
175
+ /** One answer in wire form, or the reason it cannot be sent. */
176
+ function toAnswer(input) {
177
+ if (!input || typeof input !== "object")
178
+ return { ok: false, error: "an answer must be an object" };
179
+ const a = input;
180
+ const q = a.questionKey;
181
+ if (!(0, exports.isKey)(q))
182
+ return { ok: false, error: "questionKey is not a valid key" };
183
+ switch (a.kind) {
184
+ case "single":
185
+ return (0, exports.isKey)(a.value)
186
+ ? { ok: true, answer: { question_key: q, kind: "single", value: a.value } }
187
+ : { ok: false, error: `${q}: a single answer's value must be an option key` };
188
+ case "multi": {
189
+ if (!Array.isArray(a.value) || !a.value.every(exports.isKey))
190
+ return { ok: false, error: `${q}: a multi answer's value must be option keys` };
191
+ const unique = [...new Set(a.value)];
192
+ if (unique.length > exports.MAX_ANSWERS)
193
+ return { ok: false, error: `${q}: at most ${exports.MAX_ANSWERS} options` };
194
+ return { ok: true, answer: { question_key: q, kind: "multi", value: unique } };
195
+ }
196
+ case "numeric": {
197
+ if (typeof a.value !== "number" || !Number.isFinite(a.value))
198
+ return { ok: false, error: `${q}: a numeric answer must be a finite number` };
199
+ if (a.unit !== undefined && !(0, exports.isKey)(a.unit))
200
+ return { ok: false, error: `${q}: unit must be a key` };
201
+ return {
202
+ ok: true,
203
+ answer: a.unit === undefined
204
+ ? { question_key: q, kind: "numeric", value: a.value }
205
+ : { question_key: q, kind: "numeric", value: a.value, unit: a.unit },
206
+ };
207
+ }
208
+ case "text":
209
+ return typeof a.value === "string" && (0, text_1.codePointLength)(a.value) <= 1000
210
+ ? { ok: true, answer: { question_key: q, kind: "text", value: a.value } }
211
+ : { ok: false, error: `${q}: a text answer is at most 1,000 characters` };
212
+ default:
213
+ return { ok: false, error: `${q}: unknown answer kind ${JSON.stringify(a.kind)}` };
214
+ }
215
+ }
216
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/onboarding/input.ts"],"names":[],"mappings":";;;AA+EA,sCAoGC;AAED,0CAMC;AAGD,0CAmBC;AAGD,4BAiCC;AArPD,gFAAgF;AAChF,gFAAgF;AAChF,0DAA0D;AAC1D,uCAA+C;AAqD/C,MAAM,GAAG,GAAG,qCAAqC,CAAC;AAClD,MAAM,OAAO,GAAG,qCAAqC,CAAC;AACtD,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAEjC,QAAA,kBAAkB,GAAG,GAAG,CAAC;AACzB,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,KAAK,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAA1E,QAAA,KAAK,SAAqE;AACvF,MAAM,MAAM,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAA,sBAAe,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAA,sBAAe,EAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAW1H,0GAA0G;AAC1G,MAAM,SAAS,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAExH,SAAgB,aAAa,CAAC,OAAqB;;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,iCAAiC,CAAC,EAAE,CAAC;IAE/G,iGAAiG;IACjG,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;QAClD,CAAC,CAAC;YACE,GAAG,OAAO,CAAC,MAAM;YACjB,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAA8B;YACjF,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAA8B;YACjF,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAA8B;SAC9E;QACH,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACrB,IAAI,MAA+B,CAAC;IACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;aACjF,CAAC;YACJ,MAAM,GAAG,EAAE,CAAC;YACZ,MAAM,KAAK,GAAmC;gBAC5C,CAAC,eAAe,EAAE,QAAQ,CAAC,YAAY,CAAC;gBACxC,CAAC,eAAe,EAAE,QAAQ,CAAC,YAAY,CAAC;gBACxC,CAAC,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC;aACrC,CAAC;YACF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;gBACnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;oBAAE,SAAS;gBACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,8BAA8B,CAAC,CAAC;;oBAC1E,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7B,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,GAAG,SAAS,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,CAAA,CAAC;IAEhC,YAAY;IACZ,IAAI,UAA0C,CAAC;IAC/C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;QACxD,IAAI,CAAC,IAAA,aAAK,EAAC,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACpG,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,8CAA8C,OAAO,GAAG,CAAC,CAAC,CAAC;QAC7H,UAAU,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACzD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACpD,8GAA8G;YAC9G,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,2FAA2F,CAAC,CAAC,CAAC;YACzI,CAAC;iBAAM,IAAI,CAAC,IAAA,aAAK,EAAC,UAAU,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;;gBAC7E,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC;QAC3C,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,IAAI,IAAA,aAAK,EAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpD,gHAAgH;QAChH,MAAM,UAAU,GAAY,QAAQ,CAAC,YAAY,CAAC;QAClD,MAAM,OAAO,GAAG,KAAK,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;QAChG,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACvF,CAAC;IAED,YAAY;IACZ,MAAM,QAAQ,GAAa,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,QAAQ,0CAAE,KAAK,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,0BAAkB,EAAE,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,iCAAiC,0BAAkB,QAAQ,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;;YACvB,MAAM,OAAO,GAAG,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,CAAC;YAC3B,IAAI,CAAC,IAAA,aAAK,EAAC,OAAO,CAAC;gBAAE,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;YAChG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,qBAAqB,CAAC,CAAC;YACnF,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACpB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAA,aAAK,EAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC;gBAC9E,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,qBAAqB,CAAC,CAAC;gBAC3E,IAAI,CAAA,MAAA,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,0CAAE,IAAI,MAAK,IAAI;oBAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mDAAmD;IACnD,IAAI,UAAkC,CAAC;IACvC,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACpE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;YAAE,UAAU,GAAG,KAAK,CAAC;IACpD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;AACrF,CAAC;AAED,SAAgB,eAAe,CAAC,GAAW,EAAE,KAAc;IACzD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,iBAAiB,GAAG,qCAAqC,CAAC;IAC9F,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,GAAG,0BAA0B,CAAC;IACjH,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAA,sBAAe,EAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,GAAG,iCAAiC,CAAC;IAC/H,OAAO,aAAa,GAAG,6CAA6C,CAAC;AACvE,CAAC;AAED,mFAAmF;AACnF,SAAgB,eAAe,CAAC,IAAgB,EAAE,KAAc;IAC9D,MAAM,KAAK,GAAe,EAAE,GAAG,IAAI,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,kBAAkB,EAAE,8BAA8B,CAAC,CAAC,EAAE,CAAC;IACrF,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QACtE,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,sBAAc,EAAE,CAAC;YACnG,QAAQ,CAAC,IAAI,CAAC,CAAC,qBAAqB,EAAE,aAAa,CAAC,sBAAsB,sBAAc,EAAE,CAAC,CAAC,CAAC;YAC7F,SAAS;QACX,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAkB,CAAC;IAChC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,gEAAgE;AAChE,SAAgB,QAAQ,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;IACpG,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;IACxB,IAAI,CAAC,IAAA,aAAK,EAAC,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;IAC7E,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,IAAA,aAAK,EAAC,CAAC,CAAC,KAAK,CAAC;gBACnB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3E,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,iDAAiD,EAAE,CAAC;QAClF,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,aAAK,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,8CAA8C,EAAE,CAAC;YACtI,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAiB,CAAC,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,GAAG,mBAAW;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,aAAa,mBAAW,UAAU,EAAE,CAAC;YACrG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QACjF,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,4CAA4C,EAAE,CAAC;YAC5I,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAA,aAAK,EAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,sBAAsB,EAAE,CAAC;YACpG,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS;oBAC1B,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;oBACtD,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE;aACjF,CAAC;QACJ,CAAC;QACD,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAA,sBAAe,EAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI;gBACpE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;gBACzE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,6CAA6C,EAAE,CAAC;QAC9E;YACE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACvF,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Outbound } from "../core/delivery";
2
+ import type { OnboardingRunSnapshot } from "./contract";
3
+ import type { RunState } from "./state";
4
+ export interface Persisted {
5
+ format: 1;
6
+ /** The destination of the sink of the tracker that wrote it; absent when that sink had none. */
7
+ destination?: string;
8
+ current: RunState | null;
9
+ outboxes: Record<string, Outbound<OnboardingRunSnapshot>>;
10
+ }
11
+ export declare function isRunState(v: unknown): v is RunState;
12
+ /** An unsent snapshot of run `runId`: a positive seq and a body that is that run's snapshot at that seq. */
13
+ export declare function isOutbound(runId: string, v: unknown): v is Outbound<OnboardingRunSnapshot>;
14
+ /** The usable parts of a stored value, and what was dropped. */
15
+ export declare function parsePersisted(raw: unknown): {
16
+ current: RunState | null;
17
+ outboxes: [string, Outbound<OnboardingRunSnapshot>][];
18
+ problems: string[];
19
+ };
20
+ //# sourceMappingURL=persisted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persisted.d.ts","sourceRoot":"","sources":["../../src/onboarding/persisted.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,CAAC,CAAC;IACV,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;CAC3D;AAkBD,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAoBpD;AAED,4GAA4G;AAC5G,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAAC,qBAAqB,CAAC,CAU1F;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG;IAC5C,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC;IACtD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAoBA"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isRunState = isRunState;
4
+ exports.isOutbound = isOutbound;
5
+ exports.parsePersisted = parsePersisted;
6
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
7
+ const TIMESTAMP = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}Z$/;
8
+ const isObj = (v) => !!v && typeof v === "object" && !Array.isArray(v);
9
+ const isTimestamp = (v) => typeof v === "string" && TIMESTAMP.test(v);
10
+ const isSeq = (v) => typeof v === "number" && Number.isInteger(v) && v >= 1;
11
+ const isEntry = (e) => isObj(e) &&
12
+ typeof e.step_key === "string" &&
13
+ isTimestamp(e.entered_at) &&
14
+ (e.exited_at === null || isTimestamp(e.exited_at)) &&
15
+ Array.isArray(e.answers) &&
16
+ e.answers.every(isObj);
17
+ function isRunState(v) {
18
+ if (!isObj(v))
19
+ return false;
20
+ const { onboarding, context, manifest } = v;
21
+ return (typeof v.runId === "string" && UUID.test(v.runId) &&
22
+ typeof v.lastSeq === "number" && Number.isInteger(v.lastSeq) && v.lastSeq >= 0 &&
23
+ isObj(onboarding) && typeof onboarding.key === "string" && typeof onboarding.version === "string" &&
24
+ isObj(context) &&
25
+ isObj(manifest) && Array.isArray(manifest.steps) && manifest.steps.length > 0 &&
26
+ manifest.steps.every((s) => isObj(s) && typeof s.step_key === "string") &&
27
+ Array.isArray(v.steps) && v.steps.every(isEntry) &&
28
+ (v.studio === undefined || isObj(v.studio)) &&
29
+ (v.properties === undefined || isObj(v.properties)) &&
30
+ typeof v.provisionalExit === "boolean" &&
31
+ typeof v.truncated === "boolean" &&
32
+ (v.status === "in_progress" || v.status === "completed") &&
33
+ (v.completedAt === null || isTimestamp(v.completedAt)) &&
34
+ typeof v.lastActiveAt === "number" && Number.isFinite(v.lastActiveAt) &&
35
+ (v.dirty === undefined || typeof v.dirty === "boolean"));
36
+ }
37
+ /** An unsent snapshot of run `runId`: a positive seq and a body that is that run's snapshot at that seq. */
38
+ function isOutbound(runId, v) {
39
+ if (!isObj(v) || !isSeq(v.seq) || !isObj(v.body))
40
+ return false;
41
+ const b = v.body;
42
+ return (b.run_id === runId &&
43
+ b.seq === v.seq &&
44
+ (b.status === "in_progress" || b.status === "completed") &&
45
+ Array.isArray(b.steps) && b.steps.length > 0 &&
46
+ isObj(b.manifest) && isObj(b.onboarding) && isObj(b.context));
47
+ }
48
+ /** The usable parts of a stored value, and what was dropped. */
49
+ function parsePersisted(raw) {
50
+ const problems = [];
51
+ if (!isObj(raw) || raw.format !== 1) {
52
+ return { current: null, outboxes: [], problems: ["unrecognised stored state"] };
53
+ }
54
+ let current = null;
55
+ if (raw.current !== null && raw.current !== undefined) {
56
+ if (isRunState(raw.current))
57
+ current = raw.current;
58
+ else
59
+ problems.push("the stored run is malformed");
60
+ }
61
+ const outboxes = [];
62
+ if (isObj(raw.outboxes)) {
63
+ for (const [runId, item] of Object.entries(raw.outboxes)) {
64
+ if (isOutbound(runId, item))
65
+ outboxes.push([runId, item]);
66
+ else
67
+ problems.push(`the stored snapshot of run "${runId}" is malformed`);
68
+ }
69
+ }
70
+ else if (raw.outboxes !== undefined) {
71
+ problems.push("the stored snapshots are malformed");
72
+ }
73
+ return { current, outboxes, problems };
74
+ }
75
+ //# sourceMappingURL=persisted.js.map