@apex-inc/capacitor-plugin 2.4.0 → 2.5.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 (63) hide show
  1. package/README.md +41 -4
  2. package/android/src/main/java/inc/apex/capacitor/ApexCapacitorPlugin.kt +80 -5
  3. package/android/src/main/java/inc/apex/capacitor/ApexEvents.kt +43 -5
  4. package/android/src/main/java/inc/apex/capacitor/DeepLinkManager.kt +27 -0
  5. package/dist/deferred-link.d.ts +73 -0
  6. package/dist/deferred-link.d.ts.map +1 -0
  7. package/dist/deferred-link.js +71 -0
  8. package/dist/deferred-link.js.map +1 -0
  9. package/dist/definitions.d.ts +76 -4
  10. package/dist/definitions.d.ts.map +1 -1
  11. package/dist/esm/deferred-link.d.ts +73 -0
  12. package/dist/esm/deferred-link.d.ts.map +1 -0
  13. package/dist/esm/deferred-link.js +68 -0
  14. package/dist/esm/deferred-link.js.map +1 -0
  15. package/dist/esm/definitions.d.ts +76 -4
  16. package/dist/esm/definitions.d.ts.map +1 -1
  17. package/dist/esm/events.d.ts +33 -1
  18. package/dist/esm/events.d.ts.map +1 -1
  19. package/dist/esm/events.js +35 -1
  20. package/dist/esm/events.js.map +1 -1
  21. package/dist/esm/index.d.ts +9 -0
  22. package/dist/esm/index.d.ts.map +1 -1
  23. package/dist/esm/index.js +157 -1
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/referrer-link.d.ts +36 -0
  26. package/dist/esm/referrer-link.d.ts.map +1 -0
  27. package/dist/esm/referrer-link.js +103 -0
  28. package/dist/esm/referrer-link.js.map +1 -0
  29. package/dist/esm/skan-conversion-values.d.ts +175 -0
  30. package/dist/esm/skan-conversion-values.d.ts.map +1 -0
  31. package/dist/esm/skan-conversion-values.js +323 -0
  32. package/dist/esm/skan-conversion-values.js.map +1 -0
  33. package/dist/esm/web.d.ts +6 -1
  34. package/dist/esm/web.d.ts.map +1 -1
  35. package/dist/esm/web.js +32 -4
  36. package/dist/esm/web.js.map +1 -1
  37. package/dist/events.d.ts +33 -1
  38. package/dist/events.d.ts.map +1 -1
  39. package/dist/events.js +35 -1
  40. package/dist/events.js.map +1 -1
  41. package/dist/index.d.ts +9 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +166 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/referrer-link.d.ts +36 -0
  46. package/dist/referrer-link.d.ts.map +1 -0
  47. package/dist/referrer-link.js +107 -0
  48. package/dist/referrer-link.js.map +1 -0
  49. package/dist/skan-conversion-values.d.ts +175 -0
  50. package/dist/skan-conversion-values.d.ts.map +1 -0
  51. package/dist/skan-conversion-values.js +331 -0
  52. package/dist/skan-conversion-values.js.map +1 -0
  53. package/dist/web.d.ts +6 -1
  54. package/dist/web.d.ts.map +1 -1
  55. package/dist/web.js +32 -4
  56. package/dist/web.js.map +1 -1
  57. package/ios/Sources/ApexCapacitorPlugin/ApexEvents.swift +43 -5
  58. package/ios/Sources/ApexCapacitorPlugin/DeepLinkManager.swift +16 -2
  59. package/ios/Sources/ApexCapacitorPlugin/SkanManager.swift +18 -4
  60. package/ios/Sources/ApexCapacitorPluginBridge/ApexCapacitorPlugin.swift +22 -6
  61. package/ios/Tests/ApexCapacitorPluginTests/DeepLinkManagerTests.swift +26 -0
  62. package/ios/Tests/ApexCapacitorPluginTests/SkanManagerTests.swift +22 -1
  63. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,17 @@
12
12
  * ```
13
13
  */
14
14
  import type { ApexCapacitorPlugin } from "./definitions";
15
+ import { SkanAutoConversionValues } from "./skan-conversion-values";
16
+ /** Exposed for tests: the controller behind `autoConversionValues`. */
17
+ export declare function __getSkanAutoConversionValues(): SkanAutoConversionValues | null;
15
18
  export declare const Apex: ApexCapacitorPlugin;
16
19
  export * from "./definitions";
20
+ export { fetchDeferredDeepLink } from "./deferred-link";
21
+ export type { DeferredDeepLinkResult, FetchDeferredDeepLinkOptions, } from "./deferred-link";
22
+ export { deferredLinkFromReferrer, parseReferrer } from "./referrer-link";
23
+ export type { ReferrerLinkOptions } from "./referrer-link";
24
+ export { SkanAutoConversionValues, fetchSkanConversionSchema, pickConversionValue, skanWindowAt, SKAN_SCHEMA_MAX_AGE_MS, } from "./skan-conversion-values";
25
+ export type { ConversionValueUpdate, FetchSkanSchemaOptions, FetchSkanSchemaResult, SkanAutoConversionValuesOptions, SkanValueStore, } from "./skan-conversion-values";
17
26
  export { OfflineQueue, InMemoryStorage, IndexedDBStorage } from "./offline-queue";
18
27
  export type { OfflineQueueStorage, OfflineQueueOptions, QueuedEvent } from "./offline-queue";
19
28
  export { SessionManager } from "./session-manager";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,eAAe,CAAC;AAmCvB,eAAO,MAAM,IAAI,EAAE,mBAoBjB,CAAC;AAGH,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EACV,kBAAkB,EAClB,WAAW,IAAI,gBAAgB,EAC/B,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,QAAQ,GACd,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,wBAAwB,EAEzB,MAAM,0BAA0B,CAAC;AAwIlC,uEAAuE;AACvE,wBAAgB,6BAA6B,IAAI,wBAAwB,GAAG,IAAI,CAE/E;AAED,eAAO,MAAM,IAAI,EAAE,mBAkEjB,CAAC;AAGH,cAAc,eAAe,CAAC;AAI9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EACV,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,+BAA+B,EAC/B,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EACV,kBAAkB,EAClB,WAAW,IAAI,gBAAgB,EAC/B,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,QAAQ,GACd,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -11,8 +11,11 @@
11
11
  * await Apex.track({ type: "app_open" });
12
12
  * ```
13
13
  */
14
- import { registerPlugin } from "@capacitor/core";
14
+ import { Capacitor, registerPlugin } from "@capacitor/core";
15
15
  import { enableAutoScreenViews } from "./auto-screen-views";
16
+ import { fetchDeferredDeepLink, } from "./deferred-link";
17
+ import { deferredLinkFromReferrer } from "./referrer-link";
18
+ import { SkanAutoConversionValues, } from "./skan-conversion-values";
16
19
  /**
17
20
  * Capacitor plugin proxy. In a native app, calls route through the bridge to
18
21
  * the iOS (Swift) or Android (Kotlin) implementation. In a web context
@@ -36,10 +39,114 @@ const ApexBridge = registerPlugin("ApexCapacitorPlugin", {
36
39
  // so the offline queue / batch sender paths are unchanged. Opt out
37
40
  // with `initialize({ autoTrackScreenViews: false })`.
38
41
  let disposeAutoScreenViews = null;
42
+ /**
43
+ * Init options retained at the proxy level so `getDeferredDeepLink` can
44
+ * address the API without a second round trip through the bridge. The
45
+ * native layers do not expose their config back to JS, and this is the
46
+ * only caller that needs it.
47
+ */
48
+ let initOptions = null;
49
+ /**
50
+ * Marks the deferred link as spent so a relaunch doesn't route the user
51
+ * again. The server path is one-shot by itself, but Play keeps the
52
+ * install referrer forever — without this, every cold start of an
53
+ * Android app would re-navigate to the screen from the original ad tap.
54
+ */
55
+ const CLAIMED_KEY = "apex_ddl_claimed";
56
+ function alreadyClaimed() {
57
+ try {
58
+ return globalThis.localStorage?.getItem(CLAIMED_KEY) === "1";
59
+ }
60
+ catch {
61
+ // Private mode / storage disabled. Falling through means at worst we
62
+ // resolve twice, which is better than never resolving at all.
63
+ return false;
64
+ }
65
+ }
66
+ function markClaimed() {
67
+ try {
68
+ globalThis.localStorage?.setItem(CLAIMED_KEY, "1");
69
+ }
70
+ catch {
71
+ /* see alreadyClaimed */
72
+ }
73
+ }
74
+ /**
75
+ * Resolve the link the user was headed for before they installed.
76
+ *
77
+ * Two mechanisms, tried in order of certainty:
78
+ *
79
+ * 1. **Play install referrer (Android, deterministic).** Google
80
+ * carries our routing payload across the install gap, so the app
81
+ * learns the exact link with no network round trip and no chance of
82
+ * matching the wrong person.
83
+ * 2. **Server fingerprint match (both platforms, probabilistic).** The
84
+ * fallback, and the only option on iOS, since the App Store
85
+ * forwards nothing.
86
+ *
87
+ * Lives at the proxy level rather than in each native bridge because
88
+ * step 2 is one HTTPS call with no platform APIs in it, and step 1 only
89
+ * needs the referrer string the bridge already returns.
90
+ */
91
+ async function getDeferredDeepLink() {
92
+ const platform = Capacitor.getPlatform();
93
+ // Web has no install gap to bridge; see the web fallback for why
94
+ // claiming a link there would be actively wrong.
95
+ if (platform !== "ios" && platform !== "android")
96
+ return null;
97
+ if (alreadyClaimed())
98
+ return null;
99
+ if (platform === "android") {
100
+ try {
101
+ const { referrer, clickTimestamp } = await ApexBridge.getInstallReferrer();
102
+ const fromReferrer = deferredLinkFromReferrer(referrer, {
103
+ clickTimestampSeconds: clickTimestamp,
104
+ });
105
+ if (fromReferrer) {
106
+ markClaimed();
107
+ return fromReferrer;
108
+ }
109
+ }
110
+ catch {
111
+ // An older native build without the awaiting referrer method, or a
112
+ // device with no Play services. Fall through to the server match.
113
+ }
114
+ }
115
+ const workspaceKey = initOptions?.workspaceKey ?? initOptions?.projectKey ?? "";
116
+ if (!workspaceKey)
117
+ return null;
118
+ const resolved = await fetchDeferredDeepLink({
119
+ apiUrl: initOptions?.apiUrl ?? "https://app.apex.inc",
120
+ workspaceKey,
121
+ platform,
122
+ apiKey: initOptions?.apiKey,
123
+ });
124
+ if (resolved)
125
+ markClaimed();
126
+ return resolved;
127
+ }
128
+ /**
129
+ * Mobile Measurement P2 — automatic SKAN conversion values. Lives at the
130
+ * proxy level for the same reason `screen_view` auto-tracking does: the
131
+ * decision ("does this event mean something to Apple?") is one HTTPS
132
+ * fetch plus a table lookup in webview JS, and the send goes through the
133
+ * bridge's existing `updateConversionValue`. Null when the option is off
134
+ * or the platform is not iOS.
135
+ */
136
+ let skanAuto = null;
137
+ function debugLog(options, message) {
138
+ if (options?.debug)
139
+ console.log(`[apex-capacitor] ${message}`);
140
+ }
141
+ /** Exposed for tests: the controller behind `autoConversionValues`. */
142
+ export function __getSkanAutoConversionValues() {
143
+ return skanAuto;
144
+ }
39
145
  export const Apex = new Proxy(ApexBridge, {
40
146
  get(target, prop, receiver) {
41
147
  if (prop === "initialize") {
42
148
  return async (options) => {
149
+ initOptions = options;
43
150
  await target.initialize(options);
44
151
  disposeAutoScreenViews?.();
45
152
  disposeAutoScreenViews = null;
@@ -52,6 +159,47 @@ export const Apex = new Proxy(ApexBridge, {
52
159
  },
53
160
  });
54
161
  }
162
+ skanAuto = null;
163
+ const workspaceKey = options?.workspaceKey ?? options?.projectKey ?? "";
164
+ if (options?.autoConversionValues !== false &&
165
+ Capacitor.getPlatform() === "ios" &&
166
+ workspaceKey) {
167
+ skanAuto = new SkanAutoConversionValues({
168
+ update: (value) => target.updateConversionValue(value),
169
+ log: (message) => debugLog(options, message),
170
+ });
171
+ await skanAuto.initialize({
172
+ apiUrl: options.apiUrl ?? "https://app.apex.inc",
173
+ workspaceKey,
174
+ mobileAppId: options.mobileAppId ?? null,
175
+ });
176
+ }
177
+ };
178
+ }
179
+ if (prop === "getDeferredDeepLink") {
180
+ return getDeferredDeepLink;
181
+ }
182
+ if (prop === "track") {
183
+ return async (event) => {
184
+ await target.track(event);
185
+ if (skanAuto && event?.type) {
186
+ void skanAuto.onTrack(event.type).catch(() => undefined);
187
+ }
188
+ };
189
+ }
190
+ if (prop === "updateConversionValue") {
191
+ return async (value) => {
192
+ skanAuto?.noteManualUpdate();
193
+ await target.updateConversionValue(value);
194
+ };
195
+ }
196
+ if (prop === "getConversionValueSchema") {
197
+ return async () => {
198
+ if (!skanAuto) {
199
+ return { schema: null, mobileAppId: null, etag: null, fetchedAt: 0 };
200
+ }
201
+ await skanAuto.whenReady();
202
+ return skanAuto.getSchema();
55
203
  };
56
204
  }
57
205
  return Reflect.get(target, prop, receiver);
@@ -59,6 +207,14 @@ export const Apex = new Proxy(ApexBridge, {
59
207
  });
60
208
  // Re-export types so consumers can import them cleanly.
61
209
  export * from "./definitions";
210
+ // Deferred deep linking — the resolver is exported for advanced use
211
+ // (e.g. a custom bootstrap that already knows its platform).
212
+ export { fetchDeferredDeepLink } from "./deferred-link";
213
+ export { deferredLinkFromReferrer, parseReferrer } from "./referrer-link";
214
+ // Mobile Measurement P2 — automatic SKAN conversion values. The pure
215
+ // pieces are exported for advanced use (a custom bootstrap that wants to
216
+ // read the table itself) and for tests.
217
+ export { SkanAutoConversionValues, fetchSkanConversionSchema, pickConversionValue, skanWindowAt, SKAN_SCHEMA_MAX_AGE_MS, } from "./skan-conversion-values";
62
218
  // Re-export core modules for advanced/test usage.
63
219
  export { OfflineQueue, InMemoryStorage, IndexedDBStorage } from "./offline-queue";
64
220
  export { SessionManager } from "./session-manager";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,IAAI,cAAc,GAA4B,IAAI,CAAC;AAEnD,MAAM,UAAU,GAAwB,cAAc,CACpD,qBAAqB,EACrB;IACE,GAAG,EAAE,GAAG,EAAE,CACR,CAAC,cAAc,KAAd,cAAc,GAAK,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAChC,EAAC;CACL,CACF,CAAC;AAEF,sEAAsE;AACtE,sEAAsE;AACtE,qEAAqE;AACrE,sEAAsE;AACtE,mEAAmE;AACnE,sDAAsD;AACtD,IAAI,sBAAsB,GAAwB,IAAI,CAAC;AAEvD,MAAM,CAAC,MAAM,IAAI,GAAwB,IAAI,KAAK,CAAC,UAAU,EAAE;IAC7D,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;QACxB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,OAAO,KAAK,EAAE,OAA0B,EAAiB,EAAE;gBACzD,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACjC,sBAAsB,EAAE,EAAE,CAAC;gBAC3B,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,IAAI,OAAO,EAAE,oBAAoB,KAAK,KAAK,EAAE,CAAC;oBAC5C,sBAAsB,GAAG,qBAAqB,CAAC;wBAC7C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;4BACf,KAAK,MAAM;iCACR,KAAK,CAAC,KAAkB,CAAC;iCACzB,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;wBAC5B,CAAC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC,CAAC;AAEH,wDAAwD;AACxD,cAAc,eAAe,CAAC;AAE9B,kDAAkD;AAClD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,8CAA8C;AAC9C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGzD,oEAAoE;AACpE,+DAA+D;AAC/D,kBAAkB;AAClB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,sBAAsB,GAEvB,MAAM,gBAAgB,CAAC;AAExB,uDAAuD;AACvD,kEAAkE;AAClE,4DAA4D;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,sEAAsE;AACtE,sEAAsE;AACtE,gEAAgE;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Deterministic deferred deep linking on Android, from the Play referrer.
3
+ *
4
+ * The server-side path (`./deferred-link.ts`) matches an install back to
5
+ * a tap using `hash(ip)#platform`, because that is all a browser tap and
6
+ * a fresh app install have in common. It works, and it is the only thing
7
+ * available on iOS, but it cannot tell two phones on the same office
8
+ * wifi apart — which is why it is one-shot and short-windowed.
9
+ *
10
+ * Android does not need to guess. Google Play carries one string across
11
+ * the install gap, the `referrer` param, and Apex packs the link's
12
+ * routing payload into it at redirect time (`links/play-referrer.ts` on
13
+ * the server). At first launch the Play Install Referrer API hands that
14
+ * exact string back, so the app learns precisely which link the user
15
+ * tapped: no IP, no fingerprint, no ambiguity, and no round trip.
16
+ *
17
+ * This module is the parsing half. It is pure so it can be tested
18
+ * without a device; the plugin proxy owns when to call it.
19
+ */
20
+ import type { DeferredDeepLinkResult } from "./deferred-link";
21
+ /** Parse a `k=v&k=v` referrer string. Play hands it over URL-encoded. */
22
+ export declare function parseReferrer(raw: string): Record<string, string>;
23
+ export interface ReferrerLinkOptions {
24
+ /** Unix seconds, from the Play Install Referrer API. 0 when unknown. */
25
+ clickTimestampSeconds?: number;
26
+ /** Injectable for tests. */
27
+ now?: number;
28
+ maxAgeMs?: number;
29
+ }
30
+ /**
31
+ * Turn a Play referrer into a deferred deep link, or null when it
32
+ * carries no Apex routing payload (an organic install, or a referrer
33
+ * written by another attribution provider).
34
+ */
35
+ export declare function deferredLinkFromReferrer(raw: string | null | undefined, options?: ReferrerLinkOptions): DeferredDeepLinkResult | null;
36
+ //# sourceMappingURL=referrer-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referrer-link.d.ts","sourceRoot":"","sources":["../../src/referrer-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAuB9D,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUjE;AAED,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9B,OAAO,GAAE,mBAAwB,GAChC,sBAAsB,GAAG,IAAI,CA4C/B"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Deterministic deferred deep linking on Android, from the Play referrer.
3
+ *
4
+ * The server-side path (`./deferred-link.ts`) matches an install back to
5
+ * a tap using `hash(ip)#platform`, because that is all a browser tap and
6
+ * a fresh app install have in common. It works, and it is the only thing
7
+ * available on iOS, but it cannot tell two phones on the same office
8
+ * wifi apart — which is why it is one-shot and short-windowed.
9
+ *
10
+ * Android does not need to guess. Google Play carries one string across
11
+ * the install gap, the `referrer` param, and Apex packs the link's
12
+ * routing payload into it at redirect time (`links/play-referrer.ts` on
13
+ * the server). At first launch the Play Install Referrer API hands that
14
+ * exact string back, so the app learns precisely which link the user
15
+ * tapped: no IP, no fingerprint, no ambiguity, and no round trip.
16
+ *
17
+ * This module is the parsing half. It is pure so it can be tested
18
+ * without a device; the plugin proxy owns when to call it.
19
+ */
20
+ /**
21
+ * How long a referrer stays worth honouring, matching the server's
22
+ * routing window. Play keeps the referrer forever, so without an age
23
+ * check an app reinstalled a year later would route the user to last
24
+ * year's promotion.
25
+ */
26
+ const MAX_REFERRER_AGE_MS = 2 * 60 * 60 * 1000;
27
+ /** Set by `play-referrer.ts` on the server. Keep the two in sync. */
28
+ const DEEP_LINK_KEY = "apex_dl";
29
+ const LINK_REF_KEY = "apex_link";
30
+ const DESTINATION_KEY = "apex_dest";
31
+ function decode(value) {
32
+ try {
33
+ return decodeURIComponent(value.replace(/\+/g, " "));
34
+ }
35
+ catch {
36
+ return value;
37
+ }
38
+ }
39
+ /** Parse a `k=v&k=v` referrer string. Play hands it over URL-encoded. */
40
+ export function parseReferrer(raw) {
41
+ const out = {};
42
+ for (const segment of raw.split("&")) {
43
+ const idx = segment.indexOf("=");
44
+ if (idx <= 0)
45
+ continue;
46
+ const key = decode(segment.slice(0, idx));
47
+ const value = decode(segment.slice(idx + 1));
48
+ if (key && value)
49
+ out[key] = value;
50
+ }
51
+ return out;
52
+ }
53
+ /**
54
+ * Turn a Play referrer into a deferred deep link, or null when it
55
+ * carries no Apex routing payload (an organic install, or a referrer
56
+ * written by another attribution provider).
57
+ */
58
+ export function deferredLinkFromReferrer(raw, options = {}) {
59
+ if (!raw)
60
+ return null;
61
+ const params = parseReferrer(raw);
62
+ const hint = params[DEEP_LINK_KEY] ?? null;
63
+ const destination = params[DESTINATION_KEY] ?? "";
64
+ const linkRef = params[LINK_REF_KEY];
65
+ // No routing payload means this referrer isn't ours to act on. UTMs
66
+ // alone don't qualify: they say which campaign paid for the install,
67
+ // not which screen the user was headed for, and routing on a campaign
68
+ // name would send people somewhere nobody asked for.
69
+ if (!hint && !destination)
70
+ return null;
71
+ const clickSeconds = options.clickTimestampSeconds ?? 0;
72
+ const clickedAtMs = clickSeconds > 0 ? clickSeconds * 1000 : 0;
73
+ if (clickedAtMs > 0) {
74
+ const age = (options.now ?? Date.now()) - clickedAtMs;
75
+ if (age > (options.maxAgeMs ?? MAX_REFERRER_AGE_MS))
76
+ return null;
77
+ }
78
+ // A namespaced partner link is stamped `handle/slug` — same shape the
79
+ // server's `linkRefValue` writes.
80
+ let slug;
81
+ let handle;
82
+ if (linkRef) {
83
+ const parts = linkRef.split("/").filter(Boolean);
84
+ if (parts.length === 2) {
85
+ handle = parts[0];
86
+ slug = parts[1];
87
+ }
88
+ else if (parts.length === 1) {
89
+ slug = parts[0];
90
+ }
91
+ }
92
+ return {
93
+ url: destination,
94
+ deepLinkHint: hint,
95
+ slug,
96
+ handle,
97
+ source: params.utm_source,
98
+ campaign: params.utm_campaign,
99
+ clickedAt: new Date(clickedAtMs > 0 ? clickedAtMs : Date.now()).toISOString(),
100
+ matchType: "deterministic",
101
+ };
102
+ }
103
+ //# sourceMappingURL=referrer-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referrer-link.js","sourceRoot":"","sources":["../../src/referrer-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Automatic SKAdNetwork conversion values.
3
+ *
4
+ * The shop answers one question in Set up Apex ("which event means an
5
+ * install was worth it?") and Apex turns it into a table of what Apple's
6
+ * 0–63 numbers mean for the app. This module reads that table and, every
7
+ * time the app tracks an event that appears in it, tells Apple the new
8
+ * value — so the shop never writes `updateConversionValue` by hand.
9
+ *
10
+ * Behaviour, in order of importance:
11
+ *
12
+ * - **Manual wins.** The first time the app calls
13
+ * `Apex.updateConversionValue` itself, automatic updates stop for
14
+ * that install. A shop that hand-rolls its ladder keeps its ladder.
15
+ * - **Values only go up.** Apple keeps the last value it was given, and
16
+ * every network reads the ladder as "higher means more". Within a
17
+ * postback window the plugin never sends a lower value than it has
18
+ * already sent.
19
+ * - **Never in the way.** The schema is fetched once per day and cached;
20
+ * a slow or unreachable Apex means the app runs with yesterday's
21
+ * table (or none), never a delayed first screen.
22
+ *
23
+ * SKAN 4 windows, counted from first launch: window 1 covers days 0–2,
24
+ * window 2 days 3–7, window 3 days 8–35. After day 35 Apple is no longer
25
+ * listening and nothing is sent.
26
+ *
27
+ * Pure TypeScript on purpose: one HTTPS call and a little arithmetic, no
28
+ * platform APIs, so it runs identically under the native iOS bridge and
29
+ * in browser preview (where the update itself is a no-op).
30
+ */
31
+ import type { SkanCoarseValue } from "./definitions";
32
+ export type SkanWindow = 1 | 2 | 3;
33
+ export interface SkanConversionValueEntry {
34
+ eventName: string;
35
+ fineValue: number;
36
+ coarseValue: SkanCoarseValue;
37
+ lockWindow?: boolean;
38
+ }
39
+ export interface SkanConversionWindow {
40
+ window: SkanWindow;
41
+ values: SkanConversionValueEntry[];
42
+ }
43
+ export interface SkanConversionSchema {
44
+ windows: SkanConversionWindow[];
45
+ updatedAt: string;
46
+ }
47
+ /** What {@link fetchSkanConversionSchema} and the cache carry. */
48
+ export interface SkanSchemaSnapshot {
49
+ schema: SkanConversionSchema | null;
50
+ mobileAppId: string | null;
51
+ /** Weak ETag from the server, replayed as `If-None-Match`. */
52
+ etag: string | null;
53
+ /** Epoch ms when this snapshot was confirmed fresh. */
54
+ fetchedAt: number;
55
+ }
56
+ export interface FetchSkanSchemaOptions {
57
+ apiUrl: string;
58
+ workspaceKey: string;
59
+ mobileAppId?: string | null;
60
+ /** Previous ETag; a matching server tag returns `not_modified`. */
61
+ etag?: string | null;
62
+ /** Abort after this many ms. Defaults to 5000. */
63
+ timeoutMs?: number;
64
+ fetch?: typeof fetch;
65
+ }
66
+ export type FetchSkanSchemaResult = {
67
+ status: "fresh";
68
+ snapshot: SkanSchemaSnapshot;
69
+ } | {
70
+ status: "not_modified";
71
+ } | {
72
+ status: "error";
73
+ };
74
+ export declare function fetchSkanConversionSchema(options: FetchSkanSchemaOptions, now?: () => number): Promise<FetchSkanSchemaResult>;
75
+ /**
76
+ * Keep only rungs the plugin can act on. The server validates on write,
77
+ * but a cached snapshot may outlive a schema change, so be strict here
78
+ * too: a bad rung is dropped, never sent to Apple.
79
+ */
80
+ export declare function normalizeSchema(raw: SkanConversionSchema | null | undefined): SkanConversionSchema | null;
81
+ /**
82
+ * Which SKAN 4 postback window a moment falls in, counted from first
83
+ * launch. Null once Apple has stopped listening (after day 35).
84
+ */
85
+ export declare function skanWindowAt(installedAt: number, now: number): SkanWindow | null;
86
+ /** What to tell Apple, when an event maps and is worth telling. */
87
+ export interface ConversionValueUpdate {
88
+ fineValue: number;
89
+ coarseValue: SkanCoarseValue;
90
+ lockWindow?: boolean;
91
+ window: SkanWindow;
92
+ }
93
+ /**
94
+ * Decide whether tracking `eventName` should change Apple's value.
95
+ * Returns null when the event has no meaning in the current window or
96
+ * when the mapped value would not move the ladder up.
97
+ */
98
+ export declare function pickConversionValue(schema: SkanConversionSchema | null, eventName: string, ctx: {
99
+ installedAt: number;
100
+ now: number;
101
+ highestSent: number | null;
102
+ }): ConversionValueUpdate | null;
103
+ /** Minimal key/value store; `localStorage` fits, so does a Map in tests. */
104
+ export interface SkanValueStore {
105
+ getItem(key: string): string | null;
106
+ setItem(key: string, value: string): void;
107
+ }
108
+ export declare const SKAN_STORAGE_KEYS: {
109
+ readonly snapshot: "apex_skan_schema_v1";
110
+ readonly installedAt: "apex_skan_installed_at";
111
+ readonly manual: "apex_skan_manual";
112
+ readonly highest: "apex_skan_highest_v1";
113
+ };
114
+ /** How long a cached schema is trusted before revalidating. */
115
+ export declare const SKAN_SCHEMA_MAX_AGE_MS: number;
116
+ export interface SkanAutoConversionValuesOptions {
117
+ /** Sends the value to Apple (the bridge's `updateConversionValue`). */
118
+ update: (value: {
119
+ fineValue: number;
120
+ coarseValue?: SkanCoarseValue;
121
+ lockWindow?: boolean;
122
+ }) => Promise<void>;
123
+ store?: SkanValueStore | null;
124
+ fetch?: typeof fetch;
125
+ now?: () => number;
126
+ /** Debug sink; receives one line per decision when set. */
127
+ log?: (message: string) => void;
128
+ }
129
+ /**
130
+ * Owns the cached schema and the "what have I already told Apple"
131
+ * bookkeeping for one install. Created by the plugin proxy on
132
+ * `initialize({ autoConversionValues: true })`; not something an app
133
+ * constructs itself.
134
+ */
135
+ export declare class SkanAutoConversionValues {
136
+ private readonly update;
137
+ private readonly store;
138
+ private readonly fetchImpl?;
139
+ private readonly now;
140
+ private readonly log?;
141
+ private snapshot;
142
+ private installedAt;
143
+ private manual;
144
+ private highest;
145
+ private ready;
146
+ private endpoint;
147
+ constructor(options: SkanAutoConversionValuesOptions);
148
+ /**
149
+ * Point at a workspace and refresh the schema if the cache is stale.
150
+ * Resolves as soon as the cache has been read; the network revalidate
151
+ * runs in the background and never blocks the caller.
152
+ */
153
+ initialize(endpoint: {
154
+ apiUrl: string;
155
+ workspaceKey: string;
156
+ mobileAppId?: string | null;
157
+ }): Promise<void>;
158
+ /** Force a network revalidation (ETag-aware). */
159
+ revalidate(): Promise<void>;
160
+ /** Wait for any in-flight revalidation (tests and debug UIs). */
161
+ whenReady(): Promise<void>;
162
+ /** The schema the plugin is acting on right now. */
163
+ getSchema(): SkanSchemaSnapshot;
164
+ /** True once the app has called `updateConversionValue` itself. */
165
+ get manualMode(): boolean;
166
+ /** Called when the app updates Apple's value by hand. Auto steps aside. */
167
+ noteManualUpdate(): void;
168
+ /**
169
+ * Called after every `track`. Sends the mapped value when the event has
170
+ * one in the current window and it moves the ladder up.
171
+ */
172
+ onTrack(eventName: string): Promise<ConversionValueUpdate | null>;
173
+ private readInstalledAt;
174
+ }
175
+ //# sourceMappingURL=skan-conversion-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skan-conversion-values.d.ts","sourceRoot":"","sources":["../../src/skan-conversion-values.ts"],"names":[],"mappings":"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"}