@rocapine/rocalytics-sdk 0.0.0-stage → 0.3.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 +86 -0
  2. package/LICENSE +21 -0
  3. package/README.md +449 -2
  4. package/client/package.json +1 -0
  5. package/core/package.json +4 -0
  6. package/dist/client/client.d.ts +146 -0
  7. package/dist/client/client.d.ts.map +1 -0
  8. package/dist/client/client.js +376 -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 +417 -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,180 @@
1
+ /**
2
+ * Event names `track` accepts. The union of every name the copied clients
3
+ * allowed; the API rejects a name it does not know. Any other name goes
4
+ * through `trackCustomEvent`, which the API forwards instead of storing.
5
+ */
6
+ export type TrackEventName = "install" | "onboarding_completed" | "purchase" | "subscription_started" | "trial_started";
7
+ /** Adjust attribution, as the Adjust SDK reports it. */
8
+ export type AdjustAttribution = {
9
+ trackerToken?: string | null;
10
+ trackerName?: string | null;
11
+ network?: string | null;
12
+ campaign?: string | null;
13
+ adgroup?: string | null;
14
+ creative?: string | null;
15
+ clickLabel?: string | null;
16
+ adid?: string | null;
17
+ costType?: string | null;
18
+ costAmount?: number | null;
19
+ costCurrency?: string | null;
20
+ fbInstallReferrer?: string | null;
21
+ };
22
+ /** Identifiers for `identify`. Null and undefined values are dropped before sending. */
23
+ export type IdentifyParams = {
24
+ revenue_cat_id?: string | null;
25
+ qonversion_id?: string | null;
26
+ adjust_id?: string | null;
27
+ adjust_attribution?: AdjustAttribution | null;
28
+ user_id?: string | null;
29
+ email?: string | null;
30
+ amplitude_device_id?: string | null;
31
+ idfa?: string | null;
32
+ idfv?: string | null;
33
+ android_id?: string | null;
34
+ customerio_id?: string | null;
35
+ segment_id?: string | null;
36
+ gaid?: string | null;
37
+ /** BCP 47 tag of the language the app is shown in. */
38
+ locale?: string | null;
39
+ };
40
+ /**
41
+ * A store product, from any purchase SDK. Forwarded whole under
42
+ * `experimental.product`; its `productIdentifier` is the product id when
43
+ * `productId` is not given.
44
+ */
45
+ export type PurchaseProduct = object;
46
+ /** A store transaction, from any purchase SDK. Forwarded whole under `experimental.transaction`. */
47
+ export type PurchaseTransaction = object;
48
+ export type TrackPurchaseParams = {
49
+ isTrial: boolean;
50
+ /** The price charged: 0 for a free trial. */
51
+ value: number;
52
+ /** ISO 4217 code. */
53
+ currency: string;
54
+ /** Links renewals to the first purchase, and keys the event's deduplication id. */
55
+ originalTransactionIdentifier: string;
56
+ /** The store product id. Defaults to `product.productIdentifier`. */
57
+ productId?: string;
58
+ product?: PurchaseProduct;
59
+ transaction?: PurchaseTransaction;
60
+ /** A web-checkout redemption result, for a purchase made outside the store. Forwarded under `experimental.redemption_result`. */
61
+ redemptionResult?: unknown;
62
+ };
63
+ /** Answers given on one onboarding step, by question or element id. */
64
+ export type OnboardingStepAnswers = Record<string, unknown>;
65
+ /** Free-form context about which onboarding was shown, e.g. `onboarding_id`, `audience_id`, `deployment_id`. */
66
+ export type OnboardingMetadata = Record<string, unknown>;
67
+ export type OnboardingStepResponse = {
68
+ step_id: string;
69
+ entered_at: string;
70
+ /** Null while the user is still on the step. */
71
+ exited_at: string | null;
72
+ answers: OnboardingStepAnswers;
73
+ };
74
+ /** The body of `/onboarding-response`: every step seen so far, resent whole on each call. */
75
+ export type OnboardingResponsePayload = {
76
+ onboarding_metadata?: OnboardingMetadata;
77
+ /** When the snapshot was produced. The API ignores a snapshot older than the one it has. */
78
+ sent_at: string;
79
+ responses: OnboardingStepResponse[];
80
+ };
81
+ /** Device facts sent with every tracked event. */
82
+ export type DeviceContext = {
83
+ ip: string | null;
84
+ user_agent: string;
85
+ device_model: string | null;
86
+ device_brand: string | null;
87
+ device_manufacturer: string | null;
88
+ os_name: string | null;
89
+ os_version: string | null;
90
+ screen_width: number;
91
+ screen_height: number;
92
+ screen_scale: number;
93
+ timezone: string;
94
+ locale: string;
95
+ app_version: string | null;
96
+ app_build: string | null;
97
+ };
98
+ /**
99
+ * Optional client-side signals for the demand score. Anything omitted falls
100
+ * back server-side or drops out of the score, so send only what the app has;
101
+ * never invent a value.
102
+ */
103
+ export type DemandScoreSignals = {
104
+ /** Native model identifier, e.g. `iPhone15,3`. */
105
+ device_model?: string;
106
+ /** Hardware release year. */
107
+ device_release_year?: number;
108
+ /** OS version, e.g. `17.4`. Only the major number is read. */
109
+ os_version?: string;
110
+ connection_type?: "wifi" | "cellular" | "other";
111
+ /** Two-letter storefront country, e.g. `US`. */
112
+ store_country?: string;
113
+ app_open_count?: number;
114
+ /** Send 0 only for a real zero: the server reads its own 0 as "not tracked". */
115
+ paywall_view_count?: number;
116
+ /** BCP 47 locale, e.g. `en-US`. */
117
+ locale?: string;
118
+ };
119
+ export type DemandScoreSignalScore = {
120
+ signal: string;
121
+ /** Normalized 0 to 1 sub-score; null when the signal was unavailable. */
122
+ value: number | null;
123
+ weight: number;
124
+ /** Contribution to the final score after weight renormalization. */
125
+ weighted: number;
126
+ };
127
+ /** Scoring models the endpoint computes. */
128
+ export type DemandScoreVersion = "v1" | "v2";
129
+ /** v1: a weighted-signal model over behavioural history and device context. */
130
+ export type DemandScoreV1 = {
131
+ /** Integer 1 to 100. */
132
+ score: number;
133
+ /** True when the identity has no event history yet. */
134
+ coldStart: boolean;
135
+ signals: DemandScoreSignalScore[];
136
+ };
137
+ export type DemandScoreV2Signal = {
138
+ signal: string;
139
+ /** The level looked up, after normalization. */
140
+ level: string;
141
+ /** Smoothed conversion rate for that level. */
142
+ rate: number;
143
+ /** Contribution to the total, in log-odds. */
144
+ logOdds: number;
145
+ /** False when the level was absent from the rates table and the fallback was used. */
146
+ matched: boolean;
147
+ };
148
+ /** v2: a learned-rates scorecard, calibrated to a percentile. */
149
+ export type DemandScoreV2 = {
150
+ /** Integer 1 to 100. */
151
+ score: number;
152
+ /** Raw additive score before calibration. */
153
+ logOdds: number;
154
+ /** How many scorecard fields resolved to a known level. */
155
+ matchedSignals: number;
156
+ /** `app` when scored with this app's own rates, `portfolio` when it fell back to the pooled table. */
157
+ ratesSource: "app" | "portfolio";
158
+ signals: DemandScoreV2Signal[];
159
+ };
160
+ /**
161
+ * The demand score response. `selectedVersion` and `versions` are optional,
162
+ * and `signals` is kept, so a response from before the score was versioned
163
+ * still fits.
164
+ */
165
+ export type DemandScoreResult = {
166
+ /** Integer 1 to 100: the likelihood this install converts to a paying customer. Mirrors `versions[selectedVersion].score`. */
167
+ demandScore: number;
168
+ /** Which version `demandScore` mirrors: a server-side setting. */
169
+ selectedVersion?: DemandScoreVersion;
170
+ /** True when the identity has no event history yet. */
171
+ coldStart: boolean;
172
+ versions?: {
173
+ v1: DemandScoreV1;
174
+ /** Absent when no rates table exists for the app or the portfolio. */
175
+ v2?: DemandScoreV2;
176
+ };
177
+ /** The unversioned response's breakdown. */
178
+ signals?: DemandScoreSignalScore[];
179
+ };
180
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Wire types of the Rocalytics API, as the client sends and reads them.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":";AAAA,wEAAwE"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Device and app facts for a run, supplied by the host (the core reads no
3
+ * platform API). Captured once when a run starts.
4
+ */
5
+ export interface RunContextInput {
6
+ /** Marketing version, e.g. `2.4.0`. */
7
+ appVersion: string;
8
+ /** Build number, or null on a platform with none. */
9
+ build: string | null;
10
+ platform: "ios" | "android" | "web";
11
+ /** OS version, or null when the platform cannot report one. */
12
+ osVersion: string | null;
13
+ /** BCP 47 tag of the language the flow is shown in, e.g. `fr-FR`. */
14
+ locale: string;
15
+ /** IANA time zone, e.g. `Europe/Paris`. */
16
+ timezone: string;
17
+ }
18
+ /** The context in its wire form. Country is deliberately absent: the server derives it. */
19
+ export interface WireRunContext {
20
+ app_version: string;
21
+ build: string | null;
22
+ platform: "ios" | "android" | "web";
23
+ os_version: string | null;
24
+ locale: string;
25
+ timezone: string;
26
+ library_version?: string;
27
+ }
28
+ /**
29
+ * Maps the host's context to its wire form, copying only the known fields.
30
+ * Returns the list of problems instead when a field would fail the schema.
31
+ */
32
+ export declare function captureRunContext(input: RunContextInput, libraryVersion: string): {
33
+ ok: true;
34
+ context: WireRunContext;
35
+ } | {
36
+ ok: false;
37
+ errors: string[];
38
+ };
39
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IACpC,+DAA+D;IAC/D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,2FAA2F;AAC3F,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,cAAc,EAAE,MAAM,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA0BzE"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.captureRunContext = captureRunContext;
4
+ const text_1 = require("./text");
5
+ const LOCALE = /^[A-Za-z]{2,3}(-[A-Za-z0-9]{1,8})*$/;
6
+ const TIMEZONE = /^[A-Za-z][A-Za-z0-9_+-]*(\/[A-Za-z0-9_+-]+)*$/;
7
+ const shortText = (v) => typeof v === "string" && (0, text_1.codePointLength)(v) >= 1 && (0, text_1.codePointLength)(v) <= 32;
8
+ /**
9
+ * Maps the host's context to its wire form, copying only the known fields.
10
+ * Returns the list of problems instead when a field would fail the schema.
11
+ */
12
+ function captureRunContext(input, libraryVersion) {
13
+ const errors = [];
14
+ if (!input || typeof input !== "object")
15
+ return { ok: false, errors: ["context is not an object"] };
16
+ if (!shortText(input.appVersion))
17
+ errors.push("appVersion must be 1 to 32 characters");
18
+ if (input.build !== null && !shortText(input.build))
19
+ errors.push("build must be null or 1 to 32 characters");
20
+ if (input.platform !== "ios" && input.platform !== "android" && input.platform !== "web") {
21
+ errors.push("platform must be ios, android or web");
22
+ }
23
+ if (input.osVersion !== null && !shortText(input.osVersion))
24
+ errors.push("osVersion must be null or 1 to 32 characters");
25
+ if (typeof input.locale !== "string" || !LOCALE.test(input.locale))
26
+ errors.push("locale must be a BCP 47 tag");
27
+ if (typeof input.timezone !== "string" || input.timezone.length > 64 || !TIMEZONE.test(input.timezone)) {
28
+ errors.push("timezone must be an IANA name of at most 64 characters");
29
+ }
30
+ if (errors.length)
31
+ return { ok: false, errors };
32
+ return {
33
+ ok: true,
34
+ context: {
35
+ app_version: input.appVersion,
36
+ build: input.build,
37
+ platform: input.platform,
38
+ os_version: input.osVersion,
39
+ locale: input.locale,
40
+ timezone: input.timezone,
41
+ library_version: libraryVersion,
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":";;AAuCA,8CA6BC;AApED,iCAAyC;AA+BzC,MAAM,MAAM,GAAG,qCAAqC,CAAC;AACrD,MAAM,QAAQ,GAAG,+CAA+C,CAAC;AACjE,MAAM,SAAS,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,EAAE,CAAC;AAE/G;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,KAAsB,EACtB,cAAsB;IAEtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC;IACpG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvF,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC7G,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACzH,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC/G,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvG,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE;YACP,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,KAAK,CAAC,SAAS;YAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,eAAe,EAAE,cAAc;SAChC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { type Sink, type SinkResult } from "./sink";
2
+ import type { Timers } from "./time";
3
+ /** One send: a full snapshot and the `seq` it carries. A retry reuses both, unchanged. */
4
+ export interface Outbound<T> {
5
+ seq: number;
6
+ body: T;
7
+ }
8
+ export interface RetryPolicy {
9
+ /** Delay before the first retry. Default 1,000 ms. */
10
+ initialDelayMs?: number;
11
+ /** Multiplier per further retry. Default 2. */
12
+ factor?: number;
13
+ /** Ceiling on the delay. Default 60,000 ms. */
14
+ maxDelayMs?: number;
15
+ }
16
+ export interface DeliveryOptions<T> {
17
+ sink: Sink<T>;
18
+ timers: Timers;
19
+ retry?: RetryPolicy;
20
+ /** A send that has not answered after this long counts as transient. Default 30,000 ms. */
21
+ attemptTimeoutMs?: number;
22
+ /** Called once a snapshot is settled for good: accepted, ignored or rejected. */
23
+ onSettled?(item: Outbound<T>, result: SinkResult): void;
24
+ /** Called whenever the pending snapshot changes, so it can be persisted. */
25
+ onPendingChange?(pending: Outbound<T> | null): void;
26
+ }
27
+ export interface Delivery<T> {
28
+ /**
29
+ * Hands over a snapshot. It replaces any pending one with a lower `seq`: full
30
+ * snapshots supersede each other, so only the latest needs to arrive.
31
+ */
32
+ enqueue(item: Outbound<T>): void;
33
+ /** Sends the pending snapshot now, without waiting out a backoff. */
34
+ flush(): void;
35
+ /** The snapshot not yet settled, if any. */
36
+ pending(): Outbound<T> | null;
37
+ /** Stops all timers. The pending snapshot is kept. */
38
+ stop(): void;
39
+ /**
40
+ * Winds down: skips any backoff to give the pending snapshot (and any
41
+ * handed over later) one last attempt each, and never schedules a retry.
42
+ * A snapshot that still fails stays pending, so it is not lost.
43
+ */
44
+ close(): void;
45
+ /**
46
+ * Resolves once no attempt is in flight. After `close()` nothing is retried,
47
+ * so this is when the last attempts are over, and `pending()` is what the
48
+ * sink did not take.
49
+ */
50
+ idle(): Promise<void>;
51
+ }
52
+ /**
53
+ * Delivers the latest snapshot of one run through a sink, one send at a time.
54
+ *
55
+ * - Only `accepted`, `ignored` and `rejected` settle a snapshot. Everything
56
+ * else (a throw, a timeout, a result without an outcome) is transient and
57
+ * the same snapshot is sent again after an exponential backoff.
58
+ * - A settled `seq` is never sent again, so a rejected snapshot is never
59
+ * resent unchanged.
60
+ * - Nothing here throws into the caller.
61
+ */
62
+ export declare function createDelivery<T>(options: DeliveryOptions<T>): Delivery<T>;
63
+ //# sourceMappingURL=delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/core/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,0FAA0F;AAC1F,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACxD,4EAA4E;IAC5E,eAAe,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjC,qEAAqE;IACrE,KAAK,IAAI,IAAI,CAAC;IACd,4CAA4C;IAC5C,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9B,sDAAsD;IACtD,IAAI,IAAI,IAAI,CAAC;IACb;;;;OAIG;IACH,KAAK,IAAI,IAAI,CAAC;IACd;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAkH1E"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDelivery = createDelivery;
4
+ const sink_1 = require("./sink");
5
+ /**
6
+ * Delivers the latest snapshot of one run through a sink, one send at a time.
7
+ *
8
+ * - Only `accepted`, `ignored` and `rejected` settle a snapshot. Everything
9
+ * else (a throw, a timeout, a result without an outcome) is transient and
10
+ * the same snapshot is sent again after an exponential backoff.
11
+ * - A settled `seq` is never sent again, so a rejected snapshot is never
12
+ * resent unchanged.
13
+ * - Nothing here throws into the caller.
14
+ */
15
+ function createDelivery(options) {
16
+ var _a, _b, _c, _d, _e, _f, _g;
17
+ const { sink, timers } = options;
18
+ const initial = (_b = (_a = options.retry) === null || _a === void 0 ? void 0 : _a.initialDelayMs) !== null && _b !== void 0 ? _b : 1000;
19
+ const factor = (_d = (_c = options.retry) === null || _c === void 0 ? void 0 : _c.factor) !== null && _d !== void 0 ? _d : 2;
20
+ const max = (_f = (_e = options.retry) === null || _e === void 0 ? void 0 : _e.maxDelayMs) !== null && _f !== void 0 ? _f : 60000;
21
+ const timeoutMs = (_g = options.attemptTimeoutMs) !== null && _g !== void 0 ? _g : 30000;
22
+ let pending = null;
23
+ let inFlight = null;
24
+ let settledSeq = 0;
25
+ let failures = 0;
26
+ let retryTimer = null;
27
+ let stopped = false;
28
+ let closed = false;
29
+ let idleWaiters = [];
30
+ const safe = (fn) => {
31
+ try {
32
+ fn();
33
+ }
34
+ catch {
35
+ // A host callback that throws must not break delivery.
36
+ }
37
+ };
38
+ const setPending = (next) => {
39
+ pending = next;
40
+ safe(() => { var _a; return (_a = options.onPendingChange) === null || _a === void 0 ? void 0 : _a.call(options, next); });
41
+ };
42
+ const clearRetry = () => {
43
+ if (retryTimer !== null)
44
+ timers.clearTimeout(retryTimer);
45
+ retryTimer = null;
46
+ };
47
+ const callSink = (item) => new Promise((resolve) => {
48
+ const timer = timers.setTimeout(() => resolve({ outcome: "transient", reason: "timeout" }), timeoutMs);
49
+ const done = (r) => {
50
+ timers.clearTimeout(timer);
51
+ resolve(r);
52
+ };
53
+ try {
54
+ Promise.resolve(sink.send(item.body)).then((value) => done((0, sink_1.normalizeResult)(value)), (error) => done({ outcome: "transient", reason: String(error) }));
55
+ }
56
+ catch (error) {
57
+ done({ outcome: "transient", reason: String(error) });
58
+ }
59
+ });
60
+ const wakeIdle = () => {
61
+ if (inFlight)
62
+ return;
63
+ const waiters = idleWaiters;
64
+ idleWaiters = [];
65
+ for (const resolve of waiters)
66
+ resolve();
67
+ };
68
+ const attempt = () => {
69
+ if (stopped || inFlight || !pending)
70
+ return;
71
+ clearRetry();
72
+ const item = pending;
73
+ inFlight = item;
74
+ void callSink(item).then((result) => {
75
+ inFlight = null;
76
+ if (result.outcome === "transient") {
77
+ if (closed) {
78
+ // No retry after close; a newer snapshot handed over meanwhile still gets its one attempt.
79
+ if (pending && pending.seq > item.seq)
80
+ attempt();
81
+ return wakeIdle();
82
+ }
83
+ failures += 1;
84
+ const delay = Math.min(max, initial * Math.pow(factor, failures - 1));
85
+ if (!stopped)
86
+ retryTimer = timers.setTimeout(() => {
87
+ retryTimer = null;
88
+ attempt();
89
+ }, delay);
90
+ return wakeIdle();
91
+ }
92
+ failures = 0;
93
+ settledSeq = Math.max(settledSeq, item.seq);
94
+ if (pending && pending.seq <= item.seq)
95
+ setPending(null);
96
+ safe(() => { var _a; return (_a = options.onSettled) === null || _a === void 0 ? void 0 : _a.call(options, item, result); });
97
+ attempt(); // a newer snapshot may have arrived meanwhile
98
+ wakeIdle();
99
+ });
100
+ };
101
+ return {
102
+ enqueue(item) {
103
+ if (item.seq <= settledSeq)
104
+ return;
105
+ if (pending && item.seq <= pending.seq)
106
+ return;
107
+ setPending(item);
108
+ if (retryTimer === null)
109
+ attempt();
110
+ },
111
+ flush() {
112
+ clearRetry();
113
+ attempt();
114
+ },
115
+ pending: () => pending,
116
+ stop() {
117
+ stopped = true;
118
+ clearRetry();
119
+ },
120
+ close() {
121
+ if (closed)
122
+ return;
123
+ closed = true;
124
+ clearRetry();
125
+ attempt();
126
+ },
127
+ idle: () => new Promise((resolve) => {
128
+ idleWaiters.push(resolve);
129
+ wakeIdle();
130
+ }),
131
+ };
132
+ }
133
+ //# sourceMappingURL=delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/core/delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Something the SDK chose not to do, or could not do, reported instead of
3
+ * thrown: tracking must never break the app it runs in.
4
+ */
5
+ export interface Diagnostic {
6
+ /** Stable machine-readable code, e.g. `unknown-step`, `rejected`, `truncated`. */
7
+ code: string;
8
+ message: string;
9
+ runId?: string;
10
+ }
11
+ export type DiagnosticHandler = (diagnostic: Diagnostic) => void;
12
+ /** The default handler: a console warning, when a console exists. */
13
+ export declare const consoleDiagnostics: DiagnosticHandler;
14
+ /** Wraps a host handler so that a handler which throws cannot break the caller. */
15
+ export declare function safeDiagnostics(handler: DiagnosticHandler | undefined): DiagnosticHandler;
16
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/core/diagnostics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;AAEjE,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,EAAE,iBAGhC,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,iBAAiB,CASzF"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.consoleDiagnostics = void 0;
4
+ exports.safeDiagnostics = safeDiagnostics;
5
+ /** The default handler: a console warning, when a console exists. */
6
+ const consoleDiagnostics = (d) => {
7
+ var _a;
8
+ const c = globalThis.console;
9
+ (_a = c === null || c === void 0 ? void 0 : c.warn) === null || _a === void 0 ? void 0 : _a.call(c, `[rocalytics-sdk] ${d.code}: ${d.message}`);
10
+ };
11
+ exports.consoleDiagnostics = consoleDiagnostics;
12
+ /** Wraps a host handler so that a handler which throws cannot break the caller. */
13
+ function safeDiagnostics(handler) {
14
+ const h = handler !== null && handler !== void 0 ? handler : exports.consoleDiagnostics;
15
+ return (d) => {
16
+ try {
17
+ h(d);
18
+ }
19
+ catch {
20
+ // ignored on purpose
21
+ }
22
+ };
23
+ }
24
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/core/diagnostics.ts"],"names":[],"mappings":";;;AAoBA,0CASC;AAhBD,qEAAqE;AAC9D,MAAM,kBAAkB,GAAsB,CAAC,CAAC,EAAE,EAAE;;IACzD,MAAM,CAAC,GAAI,UAAiE,CAAC,OAAO,CAAC;IACrF,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,kDAAG,oBAAoB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC,CAAC;AAHW,QAAA,kBAAkB,sBAG7B;AAEF,mFAAmF;AACnF,SAAgB,eAAe,CAAC,OAAsC;IACpE,MAAM,CAAC,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,0BAAkB,CAAC;IACxC,OAAO,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,CAAC;YACH,CAAC,CAAC,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type Sink } from "./sink";
2
+ type Headers = Record<string, string>;
3
+ export interface HttpSinkOptions {
4
+ /** The collector endpoint. Each payload is POSTed to it as JSON. */
5
+ url: string;
6
+ /** Extra request headers, such as an authorization token. A function is called for every send. */
7
+ headers?: Headers | (() => Headers | Promise<Headers>);
8
+ /** Defaults to the global `fetch`. */
9
+ fetch?: (url: string, init: {
10
+ method: string;
11
+ headers: Headers;
12
+ body: string;
13
+ signal?: unknown;
14
+ }) => Promise<{
15
+ text(): Promise<string>;
16
+ }>;
17
+ /** Gives up on a request after this long; the send is then transient. Default 15,000 ms. */
18
+ timeoutMs?: number;
19
+ }
20
+ /**
21
+ * A sink that POSTs each payload to an HTTP collector.
22
+ *
23
+ * The outcome comes from the response BODY only: `{"outcome": "accepted" |
24
+ * "ignored" | "rejected"}`. The status code is not read, because a proxy or
25
+ * gateway can answer 401, 404 or 413 without having looked at the payload, so
26
+ * any response without an outcome, and no response at all, is transient.
27
+ * It never throws.
28
+ *
29
+ * Its `destination` is `url`, marked ` (custom fetch)` when a `fetch` is
30
+ * passed: that one may never reach `url` (a test double), so it never counts
31
+ * as the same destination as the real one. Headers are not part of it.
32
+ */
33
+ export declare function createHttpSink(options: HttpSinkOptions): Sink<unknown>;
34
+ export {};
35
+ //# sourceMappingURL=httpSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpSink.d.ts","sourceRoot":"","sources":["../../src/core/httpSink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,IAAI,EAAmB,MAAM,QAAQ,CAAC;AAErE,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,sCAAsC;IACtC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC;QAC3G,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;IACH,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,CAuCtE"}