@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.
- package/CHANGELOG.md +79 -0
- package/LICENSE +21 -0
- package/README.md +447 -2
- package/client/package.json +1 -0
- package/core/package.json +4 -0
- package/dist/client/client.d.ts +136 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +373 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +13 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +35 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/native.d.ts +68 -0
- package/dist/client/native.d.ts.map +1 -0
- package/dist/client/native.js +64 -0
- package/dist/client/native.js.map +1 -0
- package/dist/client/onboardingSink.d.ts +63 -0
- package/dist/client/onboardingSink.d.ts.map +1 -0
- package/dist/client/onboardingSink.js +126 -0
- package/dist/client/onboardingSink.js.map +1 -0
- package/dist/client/paywallSink.d.ts +13 -0
- package/dist/client/paywallSink.d.ts.map +1 -0
- package/dist/client/paywallSink.js +26 -0
- package/dist/client/paywallSink.js.map +1 -0
- package/dist/client/requests.d.ts +66 -0
- package/dist/client/requests.d.ts.map +1 -0
- package/dist/client/requests.js +90 -0
- package/dist/client/requests.js.map +1 -0
- package/dist/client/types.d.ts +180 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +4 -0
- package/dist/client/types.js.map +1 -0
- package/dist/core/context.d.ts +39 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +45 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/delivery.d.ts +63 -0
- package/dist/core/delivery.d.ts.map +1 -0
- package/dist/core/delivery.js +133 -0
- package/dist/core/delivery.js.map +1 -0
- package/dist/core/diagnostics.d.ts +16 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +24 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/httpSink.d.ts +35 -0
- package/dist/core/httpSink.d.ts.map +1 -0
- package/dist/core/httpSink.js +65 -0
- package/dist/core/httpSink.js.map +1 -0
- package/dist/core/ids.d.ts +16 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +51 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +32 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/sink.d.ts +39 -0
- package/dist/core/sink.d.ts.map +1 -0
- package/dist/core/sink.js +16 -0
- package/dist/core/sink.js.map +1 -0
- package/dist/core/storage.d.ts +52 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/storage.js +79 -0
- package/dist/core/storage.js.map +1 -0
- package/dist/core/text.d.ts +9 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +47 -0
- package/dist/core/text.js.map +1 -0
- package/dist/core/time.d.ts +18 -0
- package/dist/core/time.d.ts.map +1 -0
- package/dist/core/time.js +18 -0
- package/dist/core/time.js.map +1 -0
- package/dist/onboarding/contract.d.ts +138 -0
- package/dist/onboarding/contract.d.ts.map +1 -0
- package/dist/onboarding/contract.js +11 -0
- package/dist/onboarding/contract.js.map +1 -0
- package/dist/onboarding/index.d.ts +15 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +22 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/input.d.ts +102 -0
- package/dist/onboarding/input.d.ts.map +1 -0
- package/dist/onboarding/input.js +216 -0
- package/dist/onboarding/input.js.map +1 -0
- package/dist/onboarding/persisted.d.ts +20 -0
- package/dist/onboarding/persisted.d.ts.map +1 -0
- package/dist/onboarding/persisted.js +75 -0
- package/dist/onboarding/persisted.js.map +1 -0
- package/dist/onboarding/state.d.ts +65 -0
- package/dist/onboarding/state.d.ts.map +1 -0
- package/dist/onboarding/state.js +207 -0
- package/dist/onboarding/state.js.map +1 -0
- package/dist/onboarding/tracker.d.ts +135 -0
- package/dist/onboarding/tracker.d.ts.map +1 -0
- package/dist/onboarding/tracker.js +734 -0
- package/dist/onboarding/tracker.js.map +1 -0
- package/dist/paywall/contract.d.ts +67 -0
- package/dist/paywall/contract.d.ts.map +1 -0
- package/dist/paywall/contract.js +3 -0
- package/dist/paywall/contract.js.map +1 -0
- package/dist/paywall/index.d.ts +14 -0
- package/dist/paywall/index.d.ts.map +1 -0
- package/dist/paywall/index.js +19 -0
- package/dist/paywall/index.js.map +1 -0
- package/dist/paywall/observer.d.ts +38 -0
- package/dist/paywall/observer.d.ts.map +1 -0
- package/dist/paywall/observer.js +6 -0
- package/dist/paywall/observer.js.map +1 -0
- package/dist/paywall/state.d.ts +26 -0
- package/dist/paywall/state.d.ts.map +1 -0
- package/dist/paywall/state.js +132 -0
- package/dist/paywall/state.js.map +1 -0
- package/dist/paywall/tracker.d.ts +36 -0
- package/dist/paywall/tracker.d.ts.map +1 -0
- package/dist/paywall/tracker.js +180 -0
- package/dist/paywall/tracker.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/docs/onboarding-run-contract.md +1013 -0
- package/docs/onboarding-run.examples.ts +306 -0
- package/docs/onboarding-run.schema.json +224 -0
- package/docs/onboarding-run.types.ts +144 -0
- package/docs/paywall-presentation-contract.md +139 -0
- package/docs/paywall-presentation.examples.ts +42 -0
- package/docs/paywall-presentation.schema.json +268 -0
- package/docs/paywall-presentation.types.ts +73 -0
- package/onboarding/package.json +4 -0
- package/package.json +120 -4
- package/paywall/package.json +1 -0
- package/src/client/client.ts +405 -0
- package/src/client/index.ts +54 -0
- package/src/client/native.ts +109 -0
- package/src/client/onboardingSink.ts +121 -0
- package/src/client/paywallSink.ts +25 -0
- package/src/client/requests.ts +126 -0
- package/src/client/types.ts +198 -0
- package/src/core/context.ts +69 -0
- package/src/core/delivery.ts +181 -0
- package/src/core/diagnostics.ts +30 -0
- package/src/core/httpSink.ts +70 -0
- package/src/core/ids.ts +46 -0
- package/src/core/index.ts +20 -0
- package/src/core/sink.ts +46 -0
- package/src/core/storage.ts +112 -0
- package/src/core/text.ts +37 -0
- package/src/core/time.ts +26 -0
- package/src/onboarding/contract.ts +144 -0
- package/src/onboarding/index.ts +39 -0
- package/src/onboarding/input.ts +246 -0
- package/src/onboarding/persisted.ts +93 -0
- package/src/onboarding/state.ts +233 -0
- package/src/onboarding/tracker.ts +855 -0
- package/src/paywall/contract.ts +73 -0
- package/src/paywall/index.ts +36 -0
- package/src/paywall/observer.ts +43 -0
- package/src/paywall/state.ts +125 -0
- package/src/paywall/tracker.ts +200 -0
- package/src/version.ts +2 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { type DiagnosticHandler } from "../core/diagnostics";
|
|
2
|
+
import type { SinkResult } from "../core/sink";
|
|
3
|
+
import { type Clock } from "../core/time";
|
|
4
|
+
import type { OnboardingRunSnapshot } from "../onboarding/contract";
|
|
5
|
+
import type { PaywallPresentationSnapshot } from "../paywall/contract";
|
|
6
|
+
import { type RocalyticsModules } from "./native";
|
|
7
|
+
import { type FetchLike } from "./requests";
|
|
8
|
+
import type { DemandScoreResult, DemandScoreSignals, IdentifyParams, OnboardingMetadata, OnboardingStepAnswers, TrackEventName, TrackPurchaseParams } from "./types";
|
|
9
|
+
/** SecureStore key of the device's roca id. */
|
|
10
|
+
export declare const ROCA_ID_KEY = "rocalytics-roca-id";
|
|
11
|
+
/**
|
|
12
|
+
* The misspelled key the copied clients stored the id under. Read when the
|
|
13
|
+
* corrected key is empty, copied to it, and never deleted.
|
|
14
|
+
*/
|
|
15
|
+
export declare const LEGACY_ROCA_ID_KEY = "rocalitics-roca-id";
|
|
16
|
+
/** SecureStore key that records the install event was sent. */
|
|
17
|
+
export declare const INSTALL_TRACKED_KEY = "rocadata-install-tracked";
|
|
18
|
+
/** A second install key one copied client used. Holding it also counts as "install already sent". */
|
|
19
|
+
export declare const LEGACY_INSTALL_TRACKED_KEYS: string[];
|
|
20
|
+
export interface RocalyticsClientOptions {
|
|
21
|
+
/**
|
|
22
|
+
* The native modules. By default the Expo modules and react-native are
|
|
23
|
+
* loaded lazily when the client starts; when one is missing the client is
|
|
24
|
+
* inert. Pass `null` to run inert on purpose, or your own implementation
|
|
25
|
+
* (tests, a non-Expo host).
|
|
26
|
+
*/
|
|
27
|
+
modules?: RocalyticsModules | null;
|
|
28
|
+
/** Defaults to the global `fetch`, read on each request. */
|
|
29
|
+
fetch?: FetchLike;
|
|
30
|
+
/** Defaults to `https://rocalytics-api.rocapine.io`. */
|
|
31
|
+
baseUrl?: string;
|
|
32
|
+
clock?: Clock;
|
|
33
|
+
/** Receives why the client went inert, or why its start-up failed. Default: `console.warn`. */
|
|
34
|
+
onDiagnostic?: DiagnosticHandler;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The Rocalytics client. Create one per app, at startup: the constructor
|
|
38
|
+
* starts it (reads or mints the device's roca id, identifies the device,
|
|
39
|
+
* sends `install` once per device), and every method waits for that.
|
|
40
|
+
*
|
|
41
|
+
* Inert when it cannot run: a native module is missing from the binary, or
|
|
42
|
+
* the stored id cannot be read. `ready` still resolves, `rocaId` stays null,
|
|
43
|
+
* and every method resolves without sending anything, except
|
|
44
|
+
* `getDemandScore`, which rejects because it has no value to return.
|
|
45
|
+
*
|
|
46
|
+
* A method whose request gets a non-2xx answer rejects with
|
|
47
|
+
* `[ROCALYTICS] <endpoint> failed: <status>`. No request, response or
|
|
48
|
+
* purchase property is ever logged; only start-up problems are reported, to
|
|
49
|
+
* `onDiagnostic` (default `console.warn`).
|
|
50
|
+
*/
|
|
51
|
+
export declare class RocalyticsClient {
|
|
52
|
+
private readonly options;
|
|
53
|
+
/** The device's id, once `ready` resolves. Null while starting, and when inert. */
|
|
54
|
+
rocaId: string | null;
|
|
55
|
+
/** Resolves once the client has started, or has gone inert. Never rejects. */
|
|
56
|
+
readonly ready: Promise<void>;
|
|
57
|
+
private native;
|
|
58
|
+
private deviceContext;
|
|
59
|
+
private onboardingMetadata;
|
|
60
|
+
private onboardingResponses;
|
|
61
|
+
/** Runs whose `onboarding_completed` event was sent this session. */
|
|
62
|
+
private readonly completionSent;
|
|
63
|
+
private readonly clock;
|
|
64
|
+
private readonly report;
|
|
65
|
+
constructor(options?: RocalyticsClientOptions);
|
|
66
|
+
/**
|
|
67
|
+
* Where `sendOnboardingRun` delivers: the `/onboarding-response` endpoint of
|
|
68
|
+
* `baseUrl`, marked ` (custom fetch)` when a `fetch` is passed, which may
|
|
69
|
+
* never reach it, so that it never counts as the real endpoint.
|
|
70
|
+
*/
|
|
71
|
+
get onboardingRunDestination(): string;
|
|
72
|
+
/** Where `sendPaywallPresentation` delivers, marked ` (custom fetch)` like `onboardingRunDestination`. */
|
|
73
|
+
get paywallPresentationDestination(): string;
|
|
74
|
+
/** Sends one paywall presentation snapshot. The send of `createRocalyticsPaywallSink`; it never throws. */
|
|
75
|
+
sendPaywallPresentation(snapshot: PaywallPresentationSnapshot): Promise<SinkResult>;
|
|
76
|
+
/** Sends a named analytics event. */
|
|
77
|
+
track(name: TrackEventName, properties?: Record<string, unknown>): Promise<void>;
|
|
78
|
+
/** The same as `track`. */
|
|
79
|
+
trackEvent(name: TrackEventName, properties?: Record<string, unknown>): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Sends a custom event with any name. It is not stored as an analytics
|
|
82
|
+
* event: the API passes it on to drive automations, with
|
|
83
|
+
* `properties` as template variables. Deduplicated on `${rocaId}-${name}`,
|
|
84
|
+
* so a once-ever event can be re-fired safely; pass `dedupSuffix` (a date,
|
|
85
|
+
* say) to keep each occurrence of a recurring event distinct.
|
|
86
|
+
*/
|
|
87
|
+
trackCustomEvent(name: string, properties?: Record<string, unknown>, dedupSuffix?: string): Promise<void>;
|
|
88
|
+
/** Sends `purchase`, deduplicated per original transaction. */
|
|
89
|
+
trackPurchase(params: TrackPurchaseParams): Promise<void>;
|
|
90
|
+
/** Attaches identifiers to the device's identity. Null and undefined values are dropped. */
|
|
91
|
+
identify(identifiers: IdentifyParams): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Call on every onboarding navigation change: entering a step, answering on
|
|
94
|
+
* it, or moving on. Sends every step seen so far; the API keeps the latest
|
|
95
|
+
* snapshot per roca id, so calls need no batching or debouncing.
|
|
96
|
+
*
|
|
97
|
+
* The same `stepId` as the current step merges `answers` into it. A
|
|
98
|
+
* different one closes the current step and opens a new one, so returning
|
|
99
|
+
* to an earlier step appends it again. `metadata` is merged into what was
|
|
100
|
+
* sent before.
|
|
101
|
+
*/
|
|
102
|
+
trackOnboarding(stepId: string, answers?: OnboardingStepAnswers, metadata?: OnboardingMetadata): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* The server-computed demand score (1 to 100) for this install. Waits for
|
|
105
|
+
* `ready` on purpose: the endpoint answers 404 until `/identify` has created
|
|
106
|
+
* the identity, and computes the score from it.
|
|
107
|
+
*/
|
|
108
|
+
getDemandScore(signals?: DemandScoreSignals): Promise<DemandScoreResult>;
|
|
109
|
+
/**
|
|
110
|
+
* Delivers one onboarding run snapshot as the pre-v1 onboarding payload,
|
|
111
|
+
* then, for an accepted completed snapshot, sends `onboarding_completed`
|
|
112
|
+
* once per run. Its deduplication id is run-scoped,
|
|
113
|
+
* `${rocaId}-onboarding_completed-${run_id}` (the API only requires the
|
|
114
|
+
* `${rocaId}-${name}` prefix), so each completed run on a device counts
|
|
115
|
+
* once, and a resend of the same run's completion is deduplicated. A failed
|
|
116
|
+
* completion event makes the send transient, so a retry sends it. This is
|
|
117
|
+
* the send of `createRocalyticsOnboardingSink`; it never throws.
|
|
118
|
+
*/
|
|
119
|
+
sendOnboardingRun(snapshot: OnboardingRunSnapshot): Promise<SinkResult>;
|
|
120
|
+
private init;
|
|
121
|
+
private loadModules;
|
|
122
|
+
/**
|
|
123
|
+
* The corrected key's id; else the legacy key's id, copied to the corrected
|
|
124
|
+
* key; else a new id, written under both keys. A read that fails throws, so
|
|
125
|
+
* no id is ever minted while a key may still hold one.
|
|
126
|
+
*/
|
|
127
|
+
private readOrMintRocaId;
|
|
128
|
+
private readDeviceContext;
|
|
129
|
+
/** Only called once `rocaId` and the modules are set. */
|
|
130
|
+
private context;
|
|
131
|
+
private fetchFn;
|
|
132
|
+
private send;
|
|
133
|
+
private sendIdentify;
|
|
134
|
+
private sendTrack;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RocalyticsClient = exports.LEGACY_INSTALL_TRACKED_KEYS = exports.INSTALL_TRACKED_KEY = exports.LEGACY_ROCA_ID_KEY = exports.ROCA_ID_KEY = void 0;
|
|
4
|
+
const diagnostics_1 = require("../core/diagnostics");
|
|
5
|
+
const time_1 = require("../core/time");
|
|
6
|
+
const paywallSink_1 = require("./paywallSink");
|
|
7
|
+
const native_1 = require("./native");
|
|
8
|
+
const onboardingSink_1 = require("./onboardingSink");
|
|
9
|
+
const requests_1 = require("./requests");
|
|
10
|
+
/** SecureStore key of the device's roca id. */
|
|
11
|
+
exports.ROCA_ID_KEY = "rocalytics-roca-id";
|
|
12
|
+
/**
|
|
13
|
+
* The misspelled key the copied clients stored the id under. Read when the
|
|
14
|
+
* corrected key is empty, copied to it, and never deleted.
|
|
15
|
+
*/
|
|
16
|
+
exports.LEGACY_ROCA_ID_KEY = "rocalitics-roca-id";
|
|
17
|
+
/** SecureStore key that records the install event was sent. */
|
|
18
|
+
exports.INSTALL_TRACKED_KEY = "rocadata-install-tracked";
|
|
19
|
+
/** A second install key one copied client used. Holding it also counts as "install already sent". */
|
|
20
|
+
exports.LEGACY_INSTALL_TRACKED_KEYS = ["rocadata-install-tracked-4"];
|
|
21
|
+
const intlOptions = () => Intl.DateTimeFormat().resolvedOptions();
|
|
22
|
+
const message = (error) => (error instanceof Error ? error.message : String(error));
|
|
23
|
+
/**
|
|
24
|
+
* The Rocalytics client. Create one per app, at startup: the constructor
|
|
25
|
+
* starts it (reads or mints the device's roca id, identifies the device,
|
|
26
|
+
* sends `install` once per device), and every method waits for that.
|
|
27
|
+
*
|
|
28
|
+
* Inert when it cannot run: a native module is missing from the binary, or
|
|
29
|
+
* the stored id cannot be read. `ready` still resolves, `rocaId` stays null,
|
|
30
|
+
* and every method resolves without sending anything, except
|
|
31
|
+
* `getDemandScore`, which rejects because it has no value to return.
|
|
32
|
+
*
|
|
33
|
+
* A method whose request gets a non-2xx answer rejects with
|
|
34
|
+
* `[ROCALYTICS] <endpoint> failed: <status>`. No request, response or
|
|
35
|
+
* purchase property is ever logged; only start-up problems are reported, to
|
|
36
|
+
* `onDiagnostic` (default `console.warn`).
|
|
37
|
+
*/
|
|
38
|
+
class RocalyticsClient {
|
|
39
|
+
constructor(options = {}) {
|
|
40
|
+
var _a;
|
|
41
|
+
this.options = options;
|
|
42
|
+
/** The device's id, once `ready` resolves. Null while starting, and when inert. */
|
|
43
|
+
this.rocaId = null;
|
|
44
|
+
this.native = null;
|
|
45
|
+
this.deviceContext = null;
|
|
46
|
+
this.onboardingMetadata = null;
|
|
47
|
+
this.onboardingResponses = [];
|
|
48
|
+
/** Runs whose `onboarding_completed` event was sent this session. */
|
|
49
|
+
this.completionSent = new Set();
|
|
50
|
+
this.clock = (_a = options.clock) !== null && _a !== void 0 ? _a : time_1.systemClock;
|
|
51
|
+
this.report = (0, diagnostics_1.safeDiagnostics)(options.onDiagnostic);
|
|
52
|
+
this.ready = this.init().catch(() => undefined);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Where `sendOnboardingRun` delivers: the `/onboarding-response` endpoint of
|
|
56
|
+
* `baseUrl`, marked ` (custom fetch)` when a `fetch` is passed, which may
|
|
57
|
+
* never reach it, so that it never counts as the real endpoint.
|
|
58
|
+
*/
|
|
59
|
+
get onboardingRunDestination() {
|
|
60
|
+
var _a;
|
|
61
|
+
const url = `${(_a = this.options.baseUrl) !== null && _a !== void 0 ? _a : requests_1.ROCALYTICS_API_BASE}/functions/v1/onboarding-response`;
|
|
62
|
+
return this.options.fetch ? `${url} (custom fetch)` : url;
|
|
63
|
+
}
|
|
64
|
+
/** Where `sendPaywallPresentation` delivers, marked ` (custom fetch)` like `onboardingRunDestination`. */
|
|
65
|
+
get paywallPresentationDestination() {
|
|
66
|
+
var _a;
|
|
67
|
+
const url = `${(_a = this.options.baseUrl) !== null && _a !== void 0 ? _a : requests_1.ROCALYTICS_API_BASE}/functions/v1/paywall-presentations`;
|
|
68
|
+
return this.options.fetch ? `${url} (custom fetch)` : url;
|
|
69
|
+
}
|
|
70
|
+
/** Sends one paywall presentation snapshot. The send of `createRocalyticsPaywallSink`; it never throws. */
|
|
71
|
+
async sendPaywallPresentation(snapshot) {
|
|
72
|
+
await this.ready;
|
|
73
|
+
if (!this.rocaId)
|
|
74
|
+
return { outcome: "transient", reason: "the Rocalytics client is inert" };
|
|
75
|
+
const fetch = this.fetchFn();
|
|
76
|
+
if (!fetch)
|
|
77
|
+
return { outcome: "transient", reason: "no fetch available" };
|
|
78
|
+
try {
|
|
79
|
+
const request = (0, requests_1.buildPaywallPresentationRequest)(this.context(), snapshot);
|
|
80
|
+
const response = await fetch(request.url, request.init);
|
|
81
|
+
const body = await response.json().catch(() => undefined);
|
|
82
|
+
return (0, paywallSink_1.paywallIngestOutcome)(response.status, body);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return { outcome: "transient", reason: String(error) };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Sends a named analytics event. */
|
|
89
|
+
async track(name, properties) {
|
|
90
|
+
await this.ready;
|
|
91
|
+
if (!this.rocaId)
|
|
92
|
+
return;
|
|
93
|
+
await this.sendTrack(name, properties || {});
|
|
94
|
+
}
|
|
95
|
+
/** The same as `track`. */
|
|
96
|
+
async trackEvent(name, properties) {
|
|
97
|
+
await this.track(name, properties);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Sends a custom event with any name. It is not stored as an analytics
|
|
101
|
+
* event: the API passes it on to drive automations, with
|
|
102
|
+
* `properties` as template variables. Deduplicated on `${rocaId}-${name}`,
|
|
103
|
+
* so a once-ever event can be re-fired safely; pass `dedupSuffix` (a date,
|
|
104
|
+
* say) to keep each occurrence of a recurring event distinct.
|
|
105
|
+
*/
|
|
106
|
+
async trackCustomEvent(name, properties, dedupSuffix) {
|
|
107
|
+
await this.ready;
|
|
108
|
+
if (!this.rocaId)
|
|
109
|
+
return;
|
|
110
|
+
await this.sendTrack(name, properties || {}, `${this.rocaId}-${name}${dedupSuffix ? `-${dedupSuffix}` : ""}`, true);
|
|
111
|
+
}
|
|
112
|
+
/** Sends `purchase`, deduplicated per original transaction. */
|
|
113
|
+
async trackPurchase(params) {
|
|
114
|
+
var _a;
|
|
115
|
+
await this.ready;
|
|
116
|
+
if (!this.rocaId)
|
|
117
|
+
return;
|
|
118
|
+
const { isTrial, value, currency, originalTransactionIdentifier, product, transaction, redemptionResult } = params;
|
|
119
|
+
const productIdentifier = product === null || product === void 0 ? void 0 : product.productIdentifier;
|
|
120
|
+
const experimental = {};
|
|
121
|
+
if (product !== undefined)
|
|
122
|
+
experimental.product = product;
|
|
123
|
+
if (transaction !== undefined)
|
|
124
|
+
experimental.transaction = transaction;
|
|
125
|
+
if (redemptionResult !== undefined)
|
|
126
|
+
experimental.redemption_result = redemptionResult;
|
|
127
|
+
const properties = {
|
|
128
|
+
is_trial: isTrial,
|
|
129
|
+
original_transaction_identifier: originalTransactionIdentifier,
|
|
130
|
+
product_id: (_a = params.productId) !== null && _a !== void 0 ? _a : (typeof productIdentifier === "string" ? productIdentifier : undefined),
|
|
131
|
+
price: value,
|
|
132
|
+
currency_code: currency,
|
|
133
|
+
// Omitted when empty: the raw purchase objects, forwarded as given.
|
|
134
|
+
...(Object.keys(experimental).length > 0 ? { experimental } : {}),
|
|
135
|
+
};
|
|
136
|
+
await this.sendTrack("purchase", properties, `${this.rocaId}-purchase-${originalTransactionIdentifier}`);
|
|
137
|
+
}
|
|
138
|
+
/** Attaches identifiers to the device's identity. Null and undefined values are dropped. */
|
|
139
|
+
async identify(identifiers) {
|
|
140
|
+
await this.ready;
|
|
141
|
+
if (!this.rocaId)
|
|
142
|
+
return;
|
|
143
|
+
await this.sendIdentify(identifiers);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Call on every onboarding navigation change: entering a step, answering on
|
|
147
|
+
* it, or moving on. Sends every step seen so far; the API keeps the latest
|
|
148
|
+
* snapshot per roca id, so calls need no batching or debouncing.
|
|
149
|
+
*
|
|
150
|
+
* The same `stepId` as the current step merges `answers` into it. A
|
|
151
|
+
* different one closes the current step and opens a new one, so returning
|
|
152
|
+
* to an earlier step appends it again. `metadata` is merged into what was
|
|
153
|
+
* sent before.
|
|
154
|
+
*/
|
|
155
|
+
async trackOnboarding(stepId, answers, metadata) {
|
|
156
|
+
var _a;
|
|
157
|
+
await this.ready;
|
|
158
|
+
if (!this.rocaId)
|
|
159
|
+
return;
|
|
160
|
+
if (metadata)
|
|
161
|
+
this.onboardingMetadata = { ...this.onboardingMetadata, ...metadata };
|
|
162
|
+
const now = new Date(this.clock.now()).toISOString();
|
|
163
|
+
const current = this.onboardingResponses[this.onboardingResponses.length - 1];
|
|
164
|
+
if (current && current.step_id === stepId) {
|
|
165
|
+
if (answers)
|
|
166
|
+
current.answers = { ...current.answers, ...answers };
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
if (current && current.exited_at === null)
|
|
170
|
+
current.exited_at = now;
|
|
171
|
+
this.onboardingResponses.push({ step_id: stepId, entered_at: now, exited_at: null, answers: answers !== null && answers !== void 0 ? answers : {} });
|
|
172
|
+
}
|
|
173
|
+
await this.send((0, requests_1.buildOnboardingResponseRequest)(this.context(), {
|
|
174
|
+
onboarding_metadata: (_a = this.onboardingMetadata) !== null && _a !== void 0 ? _a : undefined,
|
|
175
|
+
sent_at: now,
|
|
176
|
+
responses: this.onboardingResponses,
|
|
177
|
+
}), "onboarding-response");
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* The server-computed demand score (1 to 100) for this install. Waits for
|
|
181
|
+
* `ready` on purpose: the endpoint answers 404 until `/identify` has created
|
|
182
|
+
* the identity, and computes the score from it.
|
|
183
|
+
*/
|
|
184
|
+
async getDemandScore(signals) {
|
|
185
|
+
await this.ready;
|
|
186
|
+
if (!this.rocaId)
|
|
187
|
+
throw new Error("[ROCALYTICS] demand-score unavailable: client failed to initialize");
|
|
188
|
+
const response = await this.send((0, requests_1.buildDemandScoreRequest)(this.context(), signals), "demand-score");
|
|
189
|
+
return (await response.json());
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Delivers one onboarding run snapshot as the pre-v1 onboarding payload,
|
|
193
|
+
* then, for an accepted completed snapshot, sends `onboarding_completed`
|
|
194
|
+
* once per run. Its deduplication id is run-scoped,
|
|
195
|
+
* `${rocaId}-onboarding_completed-${run_id}` (the API only requires the
|
|
196
|
+
* `${rocaId}-${name}` prefix), so each completed run on a device counts
|
|
197
|
+
* once, and a resend of the same run's completion is deduplicated. A failed
|
|
198
|
+
* completion event makes the send transient, so a retry sends it. This is
|
|
199
|
+
* the send of `createRocalyticsOnboardingSink`; it never throws.
|
|
200
|
+
*/
|
|
201
|
+
async sendOnboardingRun(snapshot) {
|
|
202
|
+
await this.ready;
|
|
203
|
+
if (!this.rocaId)
|
|
204
|
+
return { outcome: "transient", reason: "the Rocalytics client is inert" };
|
|
205
|
+
const fetch = this.fetchFn();
|
|
206
|
+
if (!fetch)
|
|
207
|
+
return { outcome: "transient", reason: "no fetch available" };
|
|
208
|
+
try {
|
|
209
|
+
const request = (0, requests_1.buildOnboardingResponseRequest)(this.context(), (0, onboardingSink_1.toOnboardingResponsePayload)(snapshot));
|
|
210
|
+
const response = await fetch(request.url, request.init);
|
|
211
|
+
const body = response.ok ? undefined : await response.json().catch(() => undefined);
|
|
212
|
+
const result = (0, onboardingSink_1.rocalyticsOutcome)(response.status, body);
|
|
213
|
+
if (result.outcome === "accepted" && snapshot.status === "completed" && !this.completionSent.has(snapshot.run_id)) {
|
|
214
|
+
await this.sendTrack("onboarding_completed", {}, `${this.rocaId}-onboarding_completed-${snapshot.run_id}`);
|
|
215
|
+
this.completionSent.add(snapshot.run_id);
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return { outcome: "transient", reason: String(error) };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// --- internals --------------------------------------------------------------
|
|
224
|
+
async init() {
|
|
225
|
+
const native = this.loadModules();
|
|
226
|
+
if (!native)
|
|
227
|
+
return;
|
|
228
|
+
const store = native.secureStore;
|
|
229
|
+
try {
|
|
230
|
+
this.rocaId = await this.readOrMintRocaId(native);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
this.report({ code: "identity-unavailable", message: `the stored roca id could not be read, so none is minted: ${message(error)}` });
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
this.native = native;
|
|
237
|
+
try {
|
|
238
|
+
const idfv = native.platform.OS === "ios" ? await native.application.getIosIdForVendorAsync() : null;
|
|
239
|
+
const androidId = native.platform.OS === "android" ? native.application.getAndroidId() : null;
|
|
240
|
+
await this.sendIdentify({ idfv, android_id: androidId, locale: intlOptions().locale });
|
|
241
|
+
this.deviceContext = await this.readDeviceContext(native);
|
|
242
|
+
let tracked = await store.getItemAsync(exports.INSTALL_TRACKED_KEY);
|
|
243
|
+
for (const key of exports.LEGACY_INSTALL_TRACKED_KEYS)
|
|
244
|
+
tracked = tracked || (await store.getItemAsync(key));
|
|
245
|
+
if (!tracked) {
|
|
246
|
+
const installTime = await native.application.getInstallationTimeAsync();
|
|
247
|
+
await this.sendTrack("install", { install_time: installTime });
|
|
248
|
+
await store.setItemAsync(exports.INSTALL_TRACKED_KEY, "true");
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
this.report({ code: "init-failed", message: message(error) });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
loadModules() {
|
|
256
|
+
const injected = this.options.modules;
|
|
257
|
+
if (injected)
|
|
258
|
+
return injected;
|
|
259
|
+
let reason = "no native modules were provided";
|
|
260
|
+
if (injected === undefined) {
|
|
261
|
+
const result = (0, native_1.loadExpoModules)();
|
|
262
|
+
if (result.ok)
|
|
263
|
+
return result.modules;
|
|
264
|
+
reason = result.reason;
|
|
265
|
+
}
|
|
266
|
+
this.report({ code: "native-modules-unavailable", message: `Rocalytics is disabled for this session: ${reason}` });
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* The corrected key's id; else the legacy key's id, copied to the corrected
|
|
271
|
+
* key; else a new id, written under both keys. A read that fails throws, so
|
|
272
|
+
* no id is ever minted while a key may still hold one.
|
|
273
|
+
*/
|
|
274
|
+
async readOrMintRocaId(native) {
|
|
275
|
+
const store = native.secureStore;
|
|
276
|
+
const current = await store.getItemAsync(exports.ROCA_ID_KEY);
|
|
277
|
+
if (current)
|
|
278
|
+
return current;
|
|
279
|
+
const legacy = await store.getItemAsync(exports.LEGACY_ROCA_ID_KEY);
|
|
280
|
+
if (legacy) {
|
|
281
|
+
try {
|
|
282
|
+
await store.setItemAsync(exports.ROCA_ID_KEY, legacy);
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
this.report({ code: "identity-migration-failed", message: `the roca id was kept but not copied to ${exports.ROCA_ID_KEY}: ${message(error)}` });
|
|
286
|
+
}
|
|
287
|
+
return legacy;
|
|
288
|
+
}
|
|
289
|
+
const id = native.crypto.randomUUID();
|
|
290
|
+
await store.setItemAsync(exports.ROCA_ID_KEY, id);
|
|
291
|
+
// Also under the legacy key: if a later over-the-air rollback brings back
|
|
292
|
+
// a bundle with a copied client, which reads only that key, it finds this
|
|
293
|
+
// id instead of minting a second identity for the same device.
|
|
294
|
+
try {
|
|
295
|
+
await store.setItemAsync(exports.LEGACY_ROCA_ID_KEY, id);
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
this.report({ code: "identity-legacy-write-failed", message: `the roca id was not also written to ${exports.LEGACY_ROCA_ID_KEY}: ${message(error)}` });
|
|
299
|
+
}
|
|
300
|
+
return id;
|
|
301
|
+
}
|
|
302
|
+
async readDeviceContext(native) {
|
|
303
|
+
var _a, _b, _c, _d, _e, _f;
|
|
304
|
+
const { application: app, device, platform } = native;
|
|
305
|
+
const { width, height, scale } = native.dimensions.get("screen");
|
|
306
|
+
let ip = null;
|
|
307
|
+
try {
|
|
308
|
+
const result = await native.network.getIpAddressAsync();
|
|
309
|
+
if (result && result !== "0.0.0.0")
|
|
310
|
+
ip = result;
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
// The ip is best-effort.
|
|
314
|
+
}
|
|
315
|
+
const { locale, timeZone } = intlOptions();
|
|
316
|
+
const brand = (_a = device.brand) !== null && _a !== void 0 ? _a : platform.OS;
|
|
317
|
+
const model = (_b = device.modelName) !== null && _b !== void 0 ? _b : "Unknown";
|
|
318
|
+
const osName = (_c = device.osName) !== null && _c !== void 0 ? _c : platform.OS;
|
|
319
|
+
const osVersion = (_d = device.osVersion) !== null && _d !== void 0 ? _d : String(platform.Version);
|
|
320
|
+
return {
|
|
321
|
+
ip,
|
|
322
|
+
user_agent: `${(_e = app.applicationName) !== null && _e !== void 0 ? _e : "App"}/${(_f = app.nativeApplicationVersion) !== null && _f !== void 0 ? _f : "1.0"} (${brand} ${model}; ${osName} ${osVersion}; ${locale})`,
|
|
323
|
+
device_model: device.modelName,
|
|
324
|
+
device_brand: device.brand,
|
|
325
|
+
device_manufacturer: device.manufacturer,
|
|
326
|
+
os_name: device.osName,
|
|
327
|
+
os_version: device.osVersion,
|
|
328
|
+
screen_width: width,
|
|
329
|
+
screen_height: height,
|
|
330
|
+
screen_scale: scale,
|
|
331
|
+
timezone: timeZone,
|
|
332
|
+
locale,
|
|
333
|
+
app_version: app.nativeApplicationVersion,
|
|
334
|
+
app_build: app.nativeBuildVersion,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/** Only called once `rocaId` and the modules are set. */
|
|
338
|
+
context() {
|
|
339
|
+
var _a, _b, _c, _d;
|
|
340
|
+
return {
|
|
341
|
+
rocaId: this.rocaId,
|
|
342
|
+
applicationId: (_b = (_a = this.native) === null || _a === void 0 ? void 0 : _a.application.applicationId) !== null && _b !== void 0 ? _b : null,
|
|
343
|
+
platform: (_d = (_c = this.native) === null || _c === void 0 ? void 0 : _c.platform.OS) !== null && _d !== void 0 ? _d : "unknown",
|
|
344
|
+
baseUrl: this.options.baseUrl,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
fetchFn() {
|
|
348
|
+
var _a;
|
|
349
|
+
return (_a = this.options.fetch) !== null && _a !== void 0 ? _a : globalThis.fetch;
|
|
350
|
+
}
|
|
351
|
+
send(request, endpoint, detail) {
|
|
352
|
+
const fetch = this.fetchFn();
|
|
353
|
+
if (!fetch)
|
|
354
|
+
return Promise.reject(new Error(`[ROCALYTICS] ${endpoint} failed: no fetch available`));
|
|
355
|
+
return (0, requests_1.sendRocalyticsRequest)(fetch, request, endpoint, detail);
|
|
356
|
+
}
|
|
357
|
+
async sendIdentify(identifiers) {
|
|
358
|
+
const payload = Object.fromEntries(Object.entries(identifiers).filter(([, v]) => v != null));
|
|
359
|
+
await this.send((0, requests_1.buildIdentifyRequest)(this.context(), payload), "identify");
|
|
360
|
+
}
|
|
361
|
+
async sendTrack(name, properties, deduplicationId, customEvent) {
|
|
362
|
+
const request = (0, requests_1.buildTrackRequest)(this.context(), {
|
|
363
|
+
name,
|
|
364
|
+
properties,
|
|
365
|
+
deviceContext: this.deviceContext,
|
|
366
|
+
deduplicationId,
|
|
367
|
+
customEvent,
|
|
368
|
+
});
|
|
369
|
+
await this.send(request, "track", name);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
exports.RocalyticsClient = RocalyticsClient;
|
|
373
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { INSTALL_TRACKED_KEY, LEGACY_INSTALL_TRACKED_KEYS, LEGACY_ROCA_ID_KEY, ROCA_ID_KEY, RocalyticsClient, } from "./client";
|
|
2
|
+
export type { RocalyticsClientOptions } from "./client";
|
|
3
|
+
export { createRocalyticsOnboardingSink, rocalyticsOutcome, toOnboardingResponsePayload } from "./onboardingSink";
|
|
4
|
+
export { createRocalyticsPaywallSink, paywallIngestOutcome } from "./paywallSink";
|
|
5
|
+
export { loadExpoModules } from "./native";
|
|
6
|
+
export type { ApplicationModule, ExpoModuleLoaders, LoadResult, RocalyticsModules } from "./native";
|
|
7
|
+
export { ROCALYTICS_API_BASE, buildDemandScoreRequest, buildIdentifyRequest, buildOnboardingResponseRequest, buildPaywallPresentationRequest, buildTrackRequest, getEventId, rocalyticsHeaders, sendRocalyticsRequest, } from "./requests";
|
|
8
|
+
export type { FetchLike, FetchResponseLike, RequestContext, RocalyticsRequest, TrackRequestInput } from "./requests";
|
|
9
|
+
export type { AdjustAttribution, DemandScoreResult, DemandScoreSignalScore, DemandScoreSignals, DemandScoreV1, DemandScoreV2, DemandScoreV2Signal, DemandScoreVersion, DeviceContext, IdentifyParams, OnboardingMetadata, OnboardingResponsePayload, OnboardingStepAnswers, OnboardingStepResponse, PurchaseProduct, PurchaseTransaction, TrackEventName, TrackPurchaseParams, } from "./types";
|
|
10
|
+
export type { Diagnostic, DiagnosticHandler } from "../core/diagnostics";
|
|
11
|
+
export type { Sink, SinkResult } from "../core/sink";
|
|
12
|
+
export type { Clock } from "../core/time";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAClH,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACpG,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,8BAA8B,EAC9B,+BAA+B,EAC/B,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACrH,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @rocapine/rocalytics-sdk/client: the Rocalytics client.
|
|
3
|
+
//
|
|
4
|
+
// Sends installs, purchases, identities, onboarding progress and custom events
|
|
5
|
+
// to the Rocalytics API, and reads the demand score. The Expo native modules
|
|
6
|
+
// it needs are optional peer dependencies, loaded lazily when the client
|
|
7
|
+
// starts (see native.ts): importing this subpath loads none of them.
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.sendRocalyticsRequest = exports.rocalyticsHeaders = exports.getEventId = exports.buildTrackRequest = exports.buildPaywallPresentationRequest = exports.buildOnboardingResponseRequest = exports.buildIdentifyRequest = exports.buildDemandScoreRequest = exports.ROCALYTICS_API_BASE = exports.loadExpoModules = exports.paywallIngestOutcome = exports.createRocalyticsPaywallSink = exports.toOnboardingResponsePayload = exports.rocalyticsOutcome = exports.createRocalyticsOnboardingSink = exports.RocalyticsClient = exports.ROCA_ID_KEY = exports.LEGACY_ROCA_ID_KEY = exports.LEGACY_INSTALL_TRACKED_KEYS = exports.INSTALL_TRACKED_KEY = void 0;
|
|
10
|
+
var client_1 = require("./client");
|
|
11
|
+
Object.defineProperty(exports, "INSTALL_TRACKED_KEY", { enumerable: true, get: function () { return client_1.INSTALL_TRACKED_KEY; } });
|
|
12
|
+
Object.defineProperty(exports, "LEGACY_INSTALL_TRACKED_KEYS", { enumerable: true, get: function () { return client_1.LEGACY_INSTALL_TRACKED_KEYS; } });
|
|
13
|
+
Object.defineProperty(exports, "LEGACY_ROCA_ID_KEY", { enumerable: true, get: function () { return client_1.LEGACY_ROCA_ID_KEY; } });
|
|
14
|
+
Object.defineProperty(exports, "ROCA_ID_KEY", { enumerable: true, get: function () { return client_1.ROCA_ID_KEY; } });
|
|
15
|
+
Object.defineProperty(exports, "RocalyticsClient", { enumerable: true, get: function () { return client_1.RocalyticsClient; } });
|
|
16
|
+
var onboardingSink_1 = require("./onboardingSink");
|
|
17
|
+
Object.defineProperty(exports, "createRocalyticsOnboardingSink", { enumerable: true, get: function () { return onboardingSink_1.createRocalyticsOnboardingSink; } });
|
|
18
|
+
Object.defineProperty(exports, "rocalyticsOutcome", { enumerable: true, get: function () { return onboardingSink_1.rocalyticsOutcome; } });
|
|
19
|
+
Object.defineProperty(exports, "toOnboardingResponsePayload", { enumerable: true, get: function () { return onboardingSink_1.toOnboardingResponsePayload; } });
|
|
20
|
+
var paywallSink_1 = require("./paywallSink");
|
|
21
|
+
Object.defineProperty(exports, "createRocalyticsPaywallSink", { enumerable: true, get: function () { return paywallSink_1.createRocalyticsPaywallSink; } });
|
|
22
|
+
Object.defineProperty(exports, "paywallIngestOutcome", { enumerable: true, get: function () { return paywallSink_1.paywallIngestOutcome; } });
|
|
23
|
+
var native_1 = require("./native");
|
|
24
|
+
Object.defineProperty(exports, "loadExpoModules", { enumerable: true, get: function () { return native_1.loadExpoModules; } });
|
|
25
|
+
var requests_1 = require("./requests");
|
|
26
|
+
Object.defineProperty(exports, "ROCALYTICS_API_BASE", { enumerable: true, get: function () { return requests_1.ROCALYTICS_API_BASE; } });
|
|
27
|
+
Object.defineProperty(exports, "buildDemandScoreRequest", { enumerable: true, get: function () { return requests_1.buildDemandScoreRequest; } });
|
|
28
|
+
Object.defineProperty(exports, "buildIdentifyRequest", { enumerable: true, get: function () { return requests_1.buildIdentifyRequest; } });
|
|
29
|
+
Object.defineProperty(exports, "buildOnboardingResponseRequest", { enumerable: true, get: function () { return requests_1.buildOnboardingResponseRequest; } });
|
|
30
|
+
Object.defineProperty(exports, "buildPaywallPresentationRequest", { enumerable: true, get: function () { return requests_1.buildPaywallPresentationRequest; } });
|
|
31
|
+
Object.defineProperty(exports, "buildTrackRequest", { enumerable: true, get: function () { return requests_1.buildTrackRequest; } });
|
|
32
|
+
Object.defineProperty(exports, "getEventId", { enumerable: true, get: function () { return requests_1.getEventId; } });
|
|
33
|
+
Object.defineProperty(exports, "rocalyticsHeaders", { enumerable: true, get: function () { return requests_1.rocalyticsHeaders; } });
|
|
34
|
+
Object.defineProperty(exports, "sendRocalyticsRequest", { enumerable: true, get: function () { return requests_1.sendRocalyticsRequest; } });
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,yEAAyE;AACzE,qEAAqE;;;AAErE,mCAMkB;AALhB,6GAAA,mBAAmB,OAAA;AACnB,qHAAA,2BAA2B,OAAA;AAC3B,4GAAA,kBAAkB,OAAA;AAClB,qGAAA,WAAW,OAAA;AACX,0GAAA,gBAAgB,OAAA;AAGlB,mDAAkH;AAAzG,gIAAA,8BAA8B,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAAE,6HAAA,2BAA2B,OAAA;AACvF,6CAAkF;AAAzE,0HAAA,2BAA2B,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAC1D,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAExB,uCAUoB;AATlB,+GAAA,mBAAmB,OAAA;AACnB,mHAAA,uBAAuB,OAAA;AACvB,gHAAA,oBAAoB,OAAA;AACpB,0HAAA,8BAA8B,OAAA;AAC9B,2HAAA,+BAA+B,OAAA;AAC/B,6GAAA,iBAAiB,OAAA;AACjB,sGAAA,UAAU,OAAA;AACV,6GAAA,iBAAiB,OAAA;AACjB,iHAAA,qBAAqB,OAAA"}
|