@goliapkg/sentori-react-native 5.7.1 → 6.0.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/lib/native.d.ts +173 -0
- package/lib/native.d.ts.map +1 -1
- package/lib/native.js +7 -0
- package/lib/native.js.map +1 -1
- package/lib/push.d.ts +45 -5
- package/lib/push.d.ts.map +1 -1
- package/lib/push.js +82 -37
- package/lib/push.js.map +1 -1
- package/lib/transport.js +1 -1
- package/package.json +2 -2
- package/src/__tests__/push.test.ts +204 -0
- package/src/native.ts +8 -0
- package/src/push.ts +130 -44
- package/src/transport.ts +1 -1
package/lib/native.d.ts
CHANGED
|
@@ -3,6 +3,178 @@
|
|
|
3
3
|
* No-op when not running in an Expo runtime that has the module installed —
|
|
4
4
|
* this keeps the SDK usable in pure-JS environments (jest, bun test, web).
|
|
5
5
|
*/
|
|
6
|
+
type SentoriNativeModule = {
|
|
7
|
+
drainPending: () => Promise<string[]>;
|
|
8
|
+
setConfig: (config: {
|
|
9
|
+
environment: string;
|
|
10
|
+
release: string;
|
|
11
|
+
token: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
/**
|
|
14
|
+
* v0.9.4 #1 — cold start measurement. iOS:
|
|
15
|
+
* `mach_absolute_time` from `applicationDidFinishLaunching` to first
|
|
16
|
+
* JS bridge ready. Android: `Process.getStartElapsedRealtime()`.
|
|
17
|
+
* Returns null when native side hasn't captured yet.
|
|
18
|
+
*/
|
|
19
|
+
getColdStartMs?: () => null | number;
|
|
20
|
+
isColdStartPrewarmed?: () => boolean;
|
|
21
|
+
/**
|
|
22
|
+
* v0.9.4 #1 — call once at JS init() to finalize the cold-start
|
|
23
|
+
* measurement. iOS subtracts from the app-delegate anchor;
|
|
24
|
+
* Android uses Process.getStartElapsedRealtime() so the call is
|
|
25
|
+
* idempotent if missed.
|
|
26
|
+
*/
|
|
27
|
+
markJsBridgeReady?: () => void;
|
|
28
|
+
/**
|
|
29
|
+
* v0.9.4 #1 — slow/frozen frame counters since the most recent
|
|
30
|
+
* navigation transition. Native side hooks `CADisplayLink` (iOS)
|
|
31
|
+
* / `Choreographer.FrameCallback` (Android). Frame > 16.67ms =
|
|
32
|
+
* slow; > 700ms = frozen.
|
|
33
|
+
*/
|
|
34
|
+
getFrameCounters?: () => null | {
|
|
35
|
+
frozen: number;
|
|
36
|
+
slow: number;
|
|
37
|
+
};
|
|
38
|
+
/** Reset counters on navigation transition (called by useTraceNavigation). */
|
|
39
|
+
resetFrameCounters?: () => void;
|
|
40
|
+
/**
|
|
41
|
+
* v0.9.5 #8 — read the most-recent native exception recorded by
|
|
42
|
+
* `SentoriNativeExceptionBridge` within the last 1 s. Used by the
|
|
43
|
+
* JS-side capture path to attach native stack info to a JSError
|
|
44
|
+
* that RN wrapped from a swallowed NSException / Java Exception.
|
|
45
|
+
*/
|
|
46
|
+
getRecentNativeException?: () => null | {
|
|
47
|
+
ageMs: number;
|
|
48
|
+
name: string;
|
|
49
|
+
reason: string;
|
|
50
|
+
stack: string[];
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* v0.7.3 — JS-triggered screenshot with consumer-supplied mask IDs.
|
|
54
|
+
* `maskedIds` are RN `nativeID` strings; native walks the view
|
|
55
|
+
* tree, finds each subview by identifier, and paints a black
|
|
56
|
+
* rectangle over its frame in the captured bitmap. Resolves to
|
|
57
|
+
* `null` if there's no key window / API < 24 (Android) / render
|
|
58
|
+
* timed out. Replaced the previous `react-native-view-shot`
|
|
59
|
+
* peer-dep path.
|
|
60
|
+
*/
|
|
61
|
+
captureScreenshotWithMask?: (maskedIds: string[]) => Promise<null | {
|
|
62
|
+
base64: string;
|
|
63
|
+
mediaType: string;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* v0.9.6 #2 — wireframe view-tree snapshot. iOS walks the
|
|
67
|
+
* UIView hierarchy, paints each node as a rect/text descriptor,
|
|
68
|
+
* intersects with masked nativeIDs. Returns an NDJSON-shaped
|
|
69
|
+
* snapshot string or null on failure.
|
|
70
|
+
*/
|
|
71
|
+
captureWireframe?: (maskedIds: string[]) => null | string;
|
|
72
|
+
/** v5.1 — low-bitrate replay frame; absent on older native builds. */
|
|
73
|
+
captureReplayFrame?: (maskedIds: string[], longEdgePx: number, quality: number) => Promise<null | {
|
|
74
|
+
base64: string;
|
|
75
|
+
mediaType: string;
|
|
76
|
+
w?: number;
|
|
77
|
+
h?: number;
|
|
78
|
+
}>;
|
|
79
|
+
/**
|
|
80
|
+
* v0.9.12 — diagnostic readout for the wireframe path. Cheap
|
|
81
|
+
* synchronous call that returns the path the last `captureWireframe`
|
|
82
|
+
* tick took plus scene/window counts at that moment. Used by the
|
|
83
|
+
* example app's debug button and the Insight verify flow to tell
|
|
84
|
+
* "no window resolvable" from "window walked but tree empty" without
|
|
85
|
+
* shipping a new pod.
|
|
86
|
+
*/
|
|
87
|
+
probeWireframe?: () => {
|
|
88
|
+
lastPath: string;
|
|
89
|
+
lastNodes: number;
|
|
90
|
+
sceneCount?: number;
|
|
91
|
+
windowCount?: number;
|
|
92
|
+
trackedSource?: string;
|
|
93
|
+
trackedActivity?: string;
|
|
94
|
+
decorViewFound?: boolean;
|
|
95
|
+
/** v1.0.0-rc.3: deepest descendant reached by the walker. If
|
|
96
|
+
* this is 2-3 the walker bailed early; if it matches the
|
|
97
|
+
* expected view-tree depth (~20-40 for RN apps) the capture
|
|
98
|
+
* is healthy. */
|
|
99
|
+
lastDepthMax?: number;
|
|
100
|
+
/** v1.0.0-rc.3: byte length of the last serialised payload. */
|
|
101
|
+
lastSizeBytes?: number;
|
|
102
|
+
/** v1.0.0-rc.3: lifetime counters — totalTicks is the number
|
|
103
|
+
* of times native captureWireframe ran; totalEmptyResultTicks
|
|
104
|
+
* is the subset that came back null or empty. Ratio surfaces
|
|
105
|
+
* intermittent failures (e.g. 200/240 ≈ 80% failure rate). */
|
|
106
|
+
totalTicks?: number;
|
|
107
|
+
totalEmptyResultTicks?: number;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* v1.0.0-rc.2 — diagnostic mirror of probeWireframe for the
|
|
111
|
+
* screenshot path. Returned shape is best-effort cross-platform —
|
|
112
|
+
* Android carries `trackedActivity` / `decorViewFound` / dims,
|
|
113
|
+
* iOS carries `windowFound` / `rootViewControllerFound` / `bounds*`.
|
|
114
|
+
* Callers should treat unknown keys as missing.
|
|
115
|
+
*/
|
|
116
|
+
probeScreenshot?: () => Record<string, unknown>;
|
|
117
|
+
/**
|
|
118
|
+
* Phase 22 sub-D / sub-E: cross-platform main-thread watchdog.
|
|
119
|
+
* Android: 5 s / 1 s defaults (matches the OS ANR threshold).
|
|
120
|
+
* iOS: 2 s / 1 s (more aggressive — iOS has no system-level
|
|
121
|
+
* watchdog signal we can lean on, so we surface stutter Apple's
|
|
122
|
+
* own runtime never flags).
|
|
123
|
+
* Reports a `kind = "anr"` event when the main thread is wedged.
|
|
124
|
+
*/
|
|
125
|
+
startAnrWatchdog?: (options?: {
|
|
126
|
+
force?: boolean;
|
|
127
|
+
intervalMs?: number;
|
|
128
|
+
timeoutMs?: number;
|
|
129
|
+
}) => void;
|
|
130
|
+
stopAnrWatchdog?: () => void;
|
|
131
|
+
/** Dev-only — example app uses this to verify the crash flow. */
|
|
132
|
+
triggerTestNativeCrash?: () => void;
|
|
133
|
+
/**
|
|
134
|
+
* v2.9 — current iOS push permission status without prompting.
|
|
135
|
+
* Returns `granted` / `denied` / `notDetermined` / `provisional`
|
|
136
|
+
* / `ephemeral` (iOS-specific) mirroring web `Notification.permission`.
|
|
137
|
+
*/
|
|
138
|
+
pushGetStatus?: () => Promise<string>;
|
|
139
|
+
/**
|
|
140
|
+
* v2.9 — triggers the OS permission prompt the first time, or
|
|
141
|
+
* returns the cached decision. Same return shape as
|
|
142
|
+
* `pushGetStatus`.
|
|
143
|
+
*/
|
|
144
|
+
pushRequestPermission?: () => Promise<string>;
|
|
145
|
+
/**
|
|
146
|
+
* v2.9 — kicks off `UIApplication.registerForRemoteNotifications`.
|
|
147
|
+
* The token comes back asynchronously via the AppDelegate swizzle
|
|
148
|
+
* and lands in the native buffer — JS retrieves it through
|
|
149
|
+
* `pushDrainState`.
|
|
150
|
+
*/
|
|
151
|
+
pushRegister?: () => void;
|
|
152
|
+
/**
|
|
153
|
+
* v2.9 — counterpart to `pushRegister`. Calls
|
|
154
|
+
* `UIApplication.unregisterForRemoteNotifications` + clears the
|
|
155
|
+
* cached token. The server-side DELETE is the JS layer's
|
|
156
|
+
* responsibility.
|
|
157
|
+
*/
|
|
158
|
+
pushUnregister?: () => void;
|
|
159
|
+
/**
|
|
160
|
+
* v2.9 — snapshot the buffered token, foreground notifications,
|
|
161
|
+
* and tap responses, and clear the buffers atomically. Returns
|
|
162
|
+
* { token?: string, error?: string, notifications: [...], taps: [...] }
|
|
163
|
+
* where each notification carries
|
|
164
|
+
* { id, title, body, subtitle?, category?, userInfo, receivedAt }.
|
|
165
|
+
*/
|
|
166
|
+
pushDrainState?: () => Promise<{
|
|
167
|
+
token?: string;
|
|
168
|
+
error?: string;
|
|
169
|
+
notifications: Array<Record<string, unknown>>;
|
|
170
|
+
taps: Array<Record<string, unknown>>;
|
|
171
|
+
}>;
|
|
172
|
+
};
|
|
173
|
+
/** Test-only: stand in for the native module so the paths that only
|
|
174
|
+
* exist when one is bound — a denied permission, a token that never
|
|
175
|
+
* arrives — can be exercised off-device. `undefined` restores real
|
|
176
|
+
* resolution. Production never calls this. */
|
|
177
|
+
export declare function __setNativeForTests(m: Partial<SentoriNativeModule> | null | undefined): void;
|
|
6
178
|
export declare function setNativeConfig(config: {
|
|
7
179
|
environment: string;
|
|
8
180
|
release: string;
|
|
@@ -163,4 +335,5 @@ export declare function probeNativeScreenshot(): {
|
|
|
163
335
|
lastPath: string;
|
|
164
336
|
raw: Record<string, unknown>;
|
|
165
337
|
};
|
|
338
|
+
export {};
|
|
166
339
|
//# sourceMappingURL=native.d.ts.map
|
package/lib/native.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
package/lib/native.js
CHANGED
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { logger } from '@goliapkg/sentori-core';
|
|
7
7
|
let _native;
|
|
8
|
+
/** Test-only: stand in for the native module so the paths that only
|
|
9
|
+
* exist when one is bound — a denied permission, a token that never
|
|
10
|
+
* arrives — can be exercised off-device. `undefined` restores real
|
|
11
|
+
* resolution. Production never calls this. */
|
|
12
|
+
export function __setNativeForTests(m) {
|
|
13
|
+
_native = m === undefined ? undefined : m;
|
|
14
|
+
}
|
|
8
15
|
function native() {
|
|
9
16
|
if (_native !== undefined)
|
|
10
17
|
return _native;
|
package/lib/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAwK/C,IAAI,OAA+C,CAAA;AAEnD;;;+CAG+C;AAC/C,MAAM,UAAU,mBAAmB,CAAC,CAAkD;IACpF,OAAO,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAgC,CAAA;AAC3E,CAAC;AAED,SAAS,MAAM;IACb,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAA;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAEvC,CAAA;QACD,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAsB,SAAS,CAAC,CAAA;QAClE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAClE,8DAA8D;YAC9D,8DAA8D;YAC9D,8DAA8D;YAC9D,4DAA4D;YAC5D,+BAA+B;YAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAiB,CAAC,CAAC,IAAI,EAAE,CAAA;YAClD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,wBAAwB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,IAAI,CAAA;QACd,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,sCAAsC,EAAE,CAAC,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAI/B;IACC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IACjB,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,sBAAsB,EAAE,EAAE,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAIhC;IACC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;AACH,CAAC;AAED,mEAAmE;AAEnE;gEACgE;AAChE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC,EAAE,aAAa;QAAE,OAAO,IAAI,CAAA;IAClC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,aAAa,EAAE,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;yCACyC;AACzC,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC,EAAE,qBAAqB;QAAE,OAAO,IAAI,CAAA;IAC1C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,qBAAqB,EAAE,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,YAAY,EAAE,EAAE,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AASD;8CAC8C;AAC9C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;QACvB,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IACxC,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,cAAc,EAAE,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,eAAe,EAAE,EAAE,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,iBAAiB,EAAE,EAAE,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,CAAA;QACtC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;4DAE4D;AAC5D,MAAM,UAAU,2BAA2B;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,oBAAoB,EAAE,EAAE,KAAK,IAAI,CAAA;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,sBAAsB;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,IAAI,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,kBAAkB,EAAE,EAAE,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED;;yBAEyB;AACzB,MAAM,UAAU,wBAAwB;IAMtC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,wBAAwB,EAAE,EAAE,IAAI,IAAI,CAAA;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH;;uEAEuE;AACvE,IAAI,mBAAmB,GAAG,KAAK,CAAA;AAC/B,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,SAAmB,EACnB,UAAkB,EAClB,OAAe;IAEf,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACnB,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,mBAAmB,GAAG,IAAI,CAAA;YAC1B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,uEAAuE,CAAC,CAAA;QAChG,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAA;IAC7E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAA;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,SAAmB;IAEnB,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,yDAAyD,CAAC,CAAA;QAChF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,8DAA8D,CAAC,CAAA;QACrF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QACtD,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,0DAA0D,CAAC,CAAA;QACpF,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;sEAEsE;AACtE,MAAM,UAAU,uBAAuB;IAKrC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,OAAO;QACL,KAAK,EAAE,CAAC,KAAK,IAAI;QACjB,mBAAmB,EAAE,OAAO,CAAC,CAAC,EAAE,gBAAgB,CAAC;QACjD,iBAAiB,EAAE,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC;KAC9C,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB;IAkBlC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QACjD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,oBAAoB;YAC9B,aAAa,EAAE,CAAC;YAChB,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,CAAC;YACb,qBAAqB,EAAE,CAAC;YACxB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;SACf,CAAA;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAA;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAA;QAChD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACtE,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7D,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAClE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACzE,GAAG;YACH,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChE,qBAAqB,EACnB,OAAO,CAAC,EAAE,qBAAqB,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC5E,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChE,WAAW,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SACpE,CAAA;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAA;QAChD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,cAAc;YACxB,aAAa,EAAE,CAAC;YAChB,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,CAAC;YACb,qBAAqB,EAAE,CAAC;YACxB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;SACf,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,qBAAqB;IAKnC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QAClD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IACtE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAA;QAC7B,MAAM,GAAG,GACP,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAA;QACvF,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC5E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAA;QACjD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IAChE,CAAC;AACH,CAAC"}
|
package/lib/push.d.ts
CHANGED
|
@@ -15,8 +15,9 @@ export type PushRegisterOptions = {
|
|
|
15
15
|
/** Token registration completed — useful when the host wants the
|
|
16
16
|
* ipt handle in real time without awaiting `register()`. */
|
|
17
17
|
onToken?: (ipt: string) => void;
|
|
18
|
-
/** Any failure in the registration flow.
|
|
19
|
-
*
|
|
18
|
+
/** Any failure in the registration flow. Convenience only — the
|
|
19
|
+
* promise resolves to `{ ok: false, reason }` either way and
|
|
20
|
+
* never rejects. */
|
|
20
21
|
onError?: (err: Error) => void;
|
|
21
22
|
/** Override the timeout when waiting for the native token to
|
|
22
23
|
* arrive after `registerForRemoteNotifications`. Defaults to
|
|
@@ -24,9 +25,37 @@ export type PushRegisterOptions = {
|
|
|
24
25
|
* delays. */
|
|
25
26
|
tokenTimeoutMs?: number;
|
|
26
27
|
};
|
|
28
|
+
/** Why a registration did not produce a device handle. Each value is
|
|
29
|
+
* a different thing for the host to do, which is the only reason to
|
|
30
|
+
* distinguish them:
|
|
31
|
+
*
|
|
32
|
+
* - `not-initialised` — `sentori.init()` has not run. A wiring bug.
|
|
33
|
+
* - `permission-denied` — the user said no. Not an error. Do not
|
|
34
|
+
* retry on a timer; offer it again from a settings screen.
|
|
35
|
+
* - `no-transport` — no native push module in this binary (Expo Go,
|
|
36
|
+
* a simulator without a push entitlement). Nothing to do at
|
|
37
|
+
* runtime.
|
|
38
|
+
* - `token-timeout` — the OS never handed back a token inside the
|
|
39
|
+
* window. Usually provisioning; retrying later is reasonable.
|
|
40
|
+
* - `server-rejected` — Sentori answered non-2xx. Settings ▸ Push
|
|
41
|
+
* is where to look.
|
|
42
|
+
*/
|
|
43
|
+
export type PushRegisterFailure = 'not-initialised' | 'no-transport' | 'permission-denied' | 'server-rejected' | 'token-timeout';
|
|
44
|
+
/** Registration outcome. `register()` never throws and there is no
|
|
45
|
+
* `catch` branch to forget: a denied permission is an ordinary
|
|
46
|
+
* answer, not an exception. An opt-in that throws inside someone's
|
|
47
|
+
* `useEffect` is precisely the failure this SDK's contract with its
|
|
48
|
+
* host app is written against. */
|
|
27
49
|
export type PushRegisterResult = {
|
|
28
|
-
|
|
50
|
+
ok: true;
|
|
51
|
+
/** Stable device handle: the `device_tokens` row id, a bare
|
|
52
|
+
* uuid. Named `ipt` for the handle format this once returned;
|
|
53
|
+
* the revoke and send routes take the uuid. */
|
|
29
54
|
ipt: string;
|
|
55
|
+
} | {
|
|
56
|
+
ok: false;
|
|
57
|
+
message: string;
|
|
58
|
+
reason: PushRegisterFailure;
|
|
30
59
|
};
|
|
31
60
|
export type PushNotificationPayload = {
|
|
32
61
|
id?: string;
|
|
@@ -38,8 +67,15 @@ export type PushNotificationPayload = {
|
|
|
38
67
|
receivedAt?: number;
|
|
39
68
|
};
|
|
40
69
|
/**
|
|
41
|
-
* Run the
|
|
42
|
-
*
|
|
70
|
+
* Run the push opt-in flow on either platform. Safe to call on every
|
|
71
|
+
* launch: the OS returns its cached permission decision without
|
|
72
|
+
* re-prompting, and the server upserts on
|
|
73
|
+
* `(project_id, provider, native_token)`. Use `getCachedIpt()` if you
|
|
74
|
+
* want the handle without a round trip.
|
|
75
|
+
*
|
|
76
|
+
* Never throws. Every way this can fail comes back as
|
|
77
|
+
* `{ ok: false, reason }` — see `PushRegisterFailure` for what each
|
|
78
|
+
* one asks the host to do.
|
|
43
79
|
*/
|
|
44
80
|
export declare function register(opts?: PushRegisterOptions): Promise<PushRegisterResult>;
|
|
45
81
|
/**
|
|
@@ -55,6 +91,10 @@ export { pushGetStatus as getStatus, pushRequestPermission as requestPermission
|
|
|
55
91
|
/** v2.26 — set the host's current session id so the next ack carries
|
|
56
92
|
* it. Useful for v2.27 correlation (push -> session -> events). */
|
|
57
93
|
export declare function setSessionContext(sessionId: null | string): void;
|
|
94
|
+
/** Test-only: drop the cached handle and stop both timers, so one
|
|
95
|
+
* test's successful registration does not leave an interval running
|
|
96
|
+
* into the next. Production code paths must not call this. */
|
|
97
|
+
export declare function __resetForTests(): void;
|
|
58
98
|
/** Test-only hook to override Platform.OS detection. Production
|
|
59
99
|
* code paths must not call this. */
|
|
60
100
|
export declare function __setPlatformForTests(p: 'ios' | 'android' | 'unknown' | null): void;
|
package/lib/push.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"AAqCA,OAAO,EAEL,aAAa,EAEb,qBAAqB,EAEtB,MAAM,aAAa,CAAA;AAqBpB,MAAM,MAAM,mBAAmB,GAAG;IAChC;;wEAEoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;sCACkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC;kDAC8C;IAC9C,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAA;IACtD,sDAAsD;IACtD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/B;iEAC6D;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B;;yBAEqB;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IAC9B;;;kBAGc;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,mBAAmB,GAC3B,iBAAiB,GACjB,cAAc,GACd,mBAAmB,GACnB,iBAAiB,GACjB,eAAe,CAAA;AAEnB;;;;mCAImC;AACnC,MAAM,MAAM,kBAAkB,GAC1B;IACE,EAAE,EAAE,IAAI,CAAA;IACR;;oDAEgD;IAChD,GAAG,EAAE,MAAM,CAAA;CACZ,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAA;AAE/D,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqC1F;AAyBD;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBhD;AAED;4DAC4D;AAC5D,wBAAgB,YAAY,IAAI,IAAI,GAAG,MAAM,CAE5C;AAED,sDAAsD;AACtD,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,qBAAqB,IAAI,iBAAiB,EAAE,CAAA;AA+MjF;oEACoE;AACpE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAEhE;AA+ED;;+DAE+D;AAC/D,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAID;qCACqC;AACrC,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAEnF"}
|
package/lib/push.js
CHANGED
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// Mirrors `@goliapkg/sentori-javascript`'s `registerWeb` ergonomics
|
|
4
|
-
// so a cross-platform host app reasons about both flows the same way.
|
|
1
|
+
// React Native push notification opt-in. Both platforms: iOS via
|
|
2
|
+
// APNs, Android via FCM.
|
|
5
3
|
//
|
|
6
4
|
// Flow:
|
|
7
5
|
// 1. `pushRequestPermission()` — OS prompt the first time, or
|
|
8
6
|
// returns the cached decision.
|
|
9
|
-
// 2. `pushRegister()` — kicks off
|
|
10
|
-
// `UIApplication.registerForRemoteNotifications
|
|
11
|
-
//
|
|
12
|
-
// in the native buffer.
|
|
7
|
+
// 2. `pushRegister()` — on iOS kicks off
|
|
8
|
+
// `UIApplication.registerForRemoteNotifications`; on Android
|
|
9
|
+
// asks FCM for the instance token. Either way the token arrives
|
|
10
|
+
// asynchronously and lands in the native buffer.
|
|
13
11
|
// 3. Poll `pushDrainState()` at 200 ms ticks for up to 8 s waiting
|
|
14
12
|
// for the token.
|
|
15
|
-
// 4. POST `/v1/push/tokens` with
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
13
|
+
// 4. POST `/v1/push/tokens` with `kind: 'apns' | 'fcm'` — the
|
|
14
|
+
// server's field name; sending `provider` here earned a 422 for
|
|
15
|
+
// every registration this SDK ever attempted — plus
|
|
16
|
+
// `nativeToken`, `userKey`, and `env` on iOS only (FCM is a
|
|
17
|
+
// single host and has no sandbox/production split).
|
|
18
|
+
// 5. Cache the returned device handle (AsyncStorage when
|
|
19
19
|
// available, otherwise module-scoped).
|
|
20
20
|
// 6. Start a 1 Hz drain loop that fires `onMessage` / `onTap` from
|
|
21
21
|
// buffered events while the app is foreground. Pauses on
|
|
22
22
|
// background, resumes on active, per the perf iron rule.
|
|
23
23
|
import { logger, pushSignal } from '@goliapkg/sentori-core';
|
|
24
|
+
import { currentUserKey } from './scope.js';
|
|
24
25
|
import { pushDrainState, pushGetStatus, pushRegister as nativePushRegister, pushRequestPermission, pushUnregister as nativePushUnregister, } from './native.js';
|
|
25
26
|
const STORAGE_KEY = 'sentori.push.ipt';
|
|
26
27
|
let _cachedIpt = null;
|
|
@@ -38,12 +39,22 @@ let _ackQueue = [];
|
|
|
38
39
|
let _ackFlushInterval = null;
|
|
39
40
|
let _sessionId = null;
|
|
40
41
|
/**
|
|
41
|
-
* Run the
|
|
42
|
-
*
|
|
42
|
+
* Run the push opt-in flow on either platform. Safe to call on every
|
|
43
|
+
* launch: the OS returns its cached permission decision without
|
|
44
|
+
* re-prompting, and the server upserts on
|
|
45
|
+
* `(project_id, provider, native_token)`. Use `getCachedIpt()` if you
|
|
46
|
+
* want the handle without a round trip.
|
|
47
|
+
*
|
|
48
|
+
* Never throws. Every way this can fail comes back as
|
|
49
|
+
* `{ ok: false, reason }` — see `PushRegisterFailure` for what each
|
|
50
|
+
* one asks the host to do.
|
|
43
51
|
*/
|
|
44
52
|
export async function register(opts = {}) {
|
|
45
53
|
try {
|
|
46
|
-
const cfg =
|
|
54
|
+
const cfg = tryGetRuntimeConfig();
|
|
55
|
+
if (!cfg) {
|
|
56
|
+
return fail(opts, 'not-initialised', 'sentori.init() has not run');
|
|
57
|
+
}
|
|
47
58
|
// Bind callbacks up front so the buffer drain inside
|
|
48
59
|
// waitForToken can fire onMessage / onTap for events that arrive
|
|
49
60
|
// alongside or before the device token (e.g. user taps a push
|
|
@@ -52,8 +63,15 @@ export async function register(opts = {}) {
|
|
|
52
63
|
_onMessage = opts.onMessage;
|
|
53
64
|
_onTap = opts.onTap;
|
|
54
65
|
const status = await pushRequestPermission();
|
|
66
|
+
// `null` means there is no native push module in this binary —
|
|
67
|
+
// a different thing from the user declining, and a different
|
|
68
|
+
// thing for the host to do about it. These were one branch and
|
|
69
|
+
// one message until now.
|
|
70
|
+
if (status == null) {
|
|
71
|
+
return fail(opts, 'no-transport', 'no native push module in this build');
|
|
72
|
+
}
|
|
55
73
|
if (status !== 'granted' && status !== 'provisional' && status !== 'ephemeral') {
|
|
56
|
-
|
|
74
|
+
return fail(opts, 'permission-denied', `push permission '${status}'`);
|
|
57
75
|
}
|
|
58
76
|
nativePushRegister();
|
|
59
77
|
const token = await waitForToken(opts.tokenTimeoutMs ?? 8000);
|
|
@@ -62,13 +80,29 @@ export async function register(opts = {}) {
|
|
|
62
80
|
void persistIpt(ipt);
|
|
63
81
|
opts.onToken?.(ipt);
|
|
64
82
|
bindBufferDrain(opts.onMessage, opts.onTap);
|
|
65
|
-
return { ipt };
|
|
83
|
+
return { ok: true, ipt };
|
|
66
84
|
}
|
|
67
85
|
catch (e) {
|
|
68
86
|
const err = e instanceof Error ? e : new Error(String(e));
|
|
69
|
-
|
|
70
|
-
opts.
|
|
71
|
-
|
|
87
|
+
const reason = e instanceof PushRegisterError ? e.reason : 'server-rejected';
|
|
88
|
+
return fail(opts, reason, err.message);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** One exit for every failure: warn once, tell `onError` if the host
|
|
92
|
+
* wants a callback, hand back the reason. */
|
|
93
|
+
function fail(opts, reason, message) {
|
|
94
|
+
logger.warn('push', `register failed (${reason}):`, message);
|
|
95
|
+
opts.onError?.(new Error(message));
|
|
96
|
+
return { ok: false, message, reason };
|
|
97
|
+
}
|
|
98
|
+
/** Internal carrier so the helpers below can name which failure they
|
|
99
|
+
* are without every one of them returning a result object. */
|
|
100
|
+
class PushRegisterError extends Error {
|
|
101
|
+
reason;
|
|
102
|
+
constructor(reason, message) {
|
|
103
|
+
super(message);
|
|
104
|
+
this.name = 'PushRegisterError';
|
|
105
|
+
this.reason = reason;
|
|
72
106
|
}
|
|
73
107
|
}
|
|
74
108
|
/**
|
|
@@ -101,13 +135,6 @@ export function getCachedIpt() {
|
|
|
101
135
|
}
|
|
102
136
|
/** Public re-export of the no-prompt status check. */
|
|
103
137
|
export { pushGetStatus as getStatus, pushRequestPermission as requestPermission };
|
|
104
|
-
function getRuntimeConfig() {
|
|
105
|
-
const cfg = tryGetRuntimeConfig();
|
|
106
|
-
if (!cfg) {
|
|
107
|
-
throw new Error('sentori is not initialised; call sentori.init() first');
|
|
108
|
-
}
|
|
109
|
-
return cfg;
|
|
110
|
-
}
|
|
111
138
|
function tryGetRuntimeConfig() {
|
|
112
139
|
// Dynamic require avoids a circular import — `./init` already
|
|
113
140
|
// depends on `./push` via the top-level barrel re-export.
|
|
@@ -124,7 +151,7 @@ async function waitForToken(timeoutMs) {
|
|
|
124
151
|
while (Date.now() - start < timeoutMs) {
|
|
125
152
|
const state = await pushDrainState();
|
|
126
153
|
if (state.error) {
|
|
127
|
-
throw new
|
|
154
|
+
throw new PushRegisterError('no-transport', `OS registration failed: ${state.error}`);
|
|
128
155
|
}
|
|
129
156
|
if (state.token) {
|
|
130
157
|
// Push any buffered events that arrived alongside the token
|
|
@@ -135,7 +162,7 @@ async function waitForToken(timeoutMs) {
|
|
|
135
162
|
flushBuffered(state.notifications, state.taps);
|
|
136
163
|
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
137
164
|
}
|
|
138
|
-
throw new
|
|
165
|
+
throw new PushRegisterError('token-timeout', `no device token within ${timeoutMs} ms`);
|
|
139
166
|
}
|
|
140
167
|
async function registerWithServer(cfg, nativeToken, opts) {
|
|
141
168
|
// v2.10 — cross-platform. iOS routes via APNs with a
|
|
@@ -149,11 +176,15 @@ async function registerWithServer(cfg, nativeToken, opts) {
|
|
|
149
176
|
: typeof __DEV__ !== 'undefined' && __DEV__
|
|
150
177
|
? 'sandbox'
|
|
151
178
|
: 'production';
|
|
179
|
+
// `kind`, not `provider` — the server's field name, which this
|
|
180
|
+
// sent for a year as `provider` and got a 422 for every time.
|
|
152
181
|
const body = {
|
|
153
|
-
|
|
182
|
+
kind: isAndroid ? 'fcm' : 'apns',
|
|
154
183
|
nativeToken,
|
|
155
|
-
|
|
156
|
-
|
|
184
|
+
// The same salted identity hash every event carries, so the
|
|
185
|
+
// dashboard can address this device by the user who hit an
|
|
186
|
+
// issue. Absent until the host calls `sentori.user()`.
|
|
187
|
+
userKey: currentUserKey(),
|
|
157
188
|
};
|
|
158
189
|
if (env != null)
|
|
159
190
|
body.env = env;
|
|
@@ -165,13 +196,17 @@ async function registerWithServer(cfg, nativeToken, opts) {
|
|
|
165
196
|
},
|
|
166
197
|
body: JSON.stringify(body),
|
|
167
198
|
});
|
|
168
|
-
if (!res.ok)
|
|
169
|
-
throw new
|
|
199
|
+
if (!res.ok) {
|
|
200
|
+
throw new PushRegisterError('server-rejected', `/v1/push/tokens HTTP ${res.status}`);
|
|
201
|
+
}
|
|
202
|
+
// The handle is the device_tokens row id — a uuid, which is what
|
|
203
|
+
// the revoke and send routes take. It was parsed here as an
|
|
204
|
+
// `ipt_*` string that no server has ever returned.
|
|
170
205
|
const json = (await res.json());
|
|
171
|
-
if (typeof json.
|
|
172
|
-
throw new
|
|
206
|
+
if (typeof json.token_id !== 'string' || json.token_id.length === 0) {
|
|
207
|
+
throw new PushRegisterError('server-rejected', 'server did not return a device token id');
|
|
173
208
|
}
|
|
174
|
-
return json.
|
|
209
|
+
return json.token_id;
|
|
175
210
|
}
|
|
176
211
|
function bindBufferDrain(onMessage, onTap) {
|
|
177
212
|
_onMessage = onMessage;
|
|
@@ -361,6 +396,16 @@ async function tryAsyncStorage() {
|
|
|
361
396
|
function joinUrl(base, path) {
|
|
362
397
|
return `${base.replace(/\/+$/, '')}${path}`;
|
|
363
398
|
}
|
|
399
|
+
/** Test-only: drop the cached handle and stop both timers, so one
|
|
400
|
+
* test's successful registration does not leave an interval running
|
|
401
|
+
* into the next. Production code paths must not call this. */
|
|
402
|
+
export function __resetForTests() {
|
|
403
|
+
_cachedIpt = null;
|
|
404
|
+
_onMessage = undefined;
|
|
405
|
+
_onTap = undefined;
|
|
406
|
+
_ackQueue = [];
|
|
407
|
+
teardownBufferDrain();
|
|
408
|
+
}
|
|
364
409
|
let _platformOverride = null;
|
|
365
410
|
/** Test-only hook to override Platform.OS detection. Production
|
|
366
411
|
* code paths must not call this. */
|
package/lib/push.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"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"}
|
package/lib/transport.js
CHANGED
|
@@ -15,7 +15,7 @@ const MAX_RETRY = 3;
|
|
|
15
15
|
const STORAGE_KEY = '@sentori/pending';
|
|
16
16
|
const MAX_PERSISTED = 1000;
|
|
17
17
|
// Pinned to package.json by a test — bump both together.
|
|
18
|
-
const SDK_VERSION = '
|
|
18
|
+
const SDK_VERSION = '6.0.0';
|
|
19
19
|
let _queue = [];
|
|
20
20
|
let _assertStats = new Map();
|
|
21
21
|
let _flushTimer = null;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goliapkg/sentori-react-native",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Sentori SDK for React Native
|
|
3
|
+
"version": "6.0.0",
|
|
4
|
+
"description": "Sentori SDK for React Native — JS-layer error capture, native crash handlers (iOS / Android), batched transport, fetch + react-navigation tracing.",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"author": "GOLIA K.K. <takagi@golia.jp> (https://golia.jp)",
|
|
7
7
|
"homepage": "https://sentori.golia.jp",
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
// Push registration: never throws, and names why it failed.
|
|
2
|
+
//
|
|
3
|
+
// There were no push tests in this package at all. That is the
|
|
4
|
+
// reason three unbalanced INSERTs on the server and two field
|
|
5
|
+
// mismatches in this file survived a year: every one of them made
|
|
6
|
+
// registration fail, and nothing anywhere asserted that registration
|
|
7
|
+
// succeeds.
|
|
8
|
+
|
|
9
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
10
|
+
|
|
11
|
+
import { __setNativeForTests } from '../native';
|
|
12
|
+
import {
|
|
13
|
+
__resetForTests as resetPush,
|
|
14
|
+
__setPlatformForTests as setPlatform,
|
|
15
|
+
register,
|
|
16
|
+
} from '../push';
|
|
17
|
+
import { __resetForTests as resetConfig, setConfig } from '../config';
|
|
18
|
+
import { __resetForTests as resetScope } from '../scope';
|
|
19
|
+
|
|
20
|
+
const baseConfig = {
|
|
21
|
+
token: 'st_test',
|
|
22
|
+
ingestUrl: 'http://localhost:18080',
|
|
23
|
+
release: 'app@1.0.0',
|
|
24
|
+
environment: 'test',
|
|
25
|
+
enabled: true,
|
|
26
|
+
detect: { rageTap: false, longFreeze: false, slowColdStart: false, slowApi: false },
|
|
27
|
+
replaySeconds: 30,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** A native module that grants permission and hands back a token on
|
|
31
|
+
* the first drain — the shape the real one has when everything
|
|
32
|
+
* works. Override pieces per test. */
|
|
33
|
+
function grantingNative(over: Record<string, unknown> = {}) {
|
|
34
|
+
return {
|
|
35
|
+
pushRequestPermission: () => Promise.resolve('granted'),
|
|
36
|
+
pushGetStatus: () => Promise.resolve('granted'),
|
|
37
|
+
pushRegister: () => undefined,
|
|
38
|
+
pushUnregister: () => undefined,
|
|
39
|
+
pushDrainState: () => Promise.resolve({ token: 'abc123', notifications: [], taps: [] }),
|
|
40
|
+
...over,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const realFetch = globalThis.fetch;
|
|
45
|
+
|
|
46
|
+
/** Answer /v1/push/tokens with `body` under `status`. */
|
|
47
|
+
function stubFetch(status: number, body: unknown): void {
|
|
48
|
+
globalThis.fetch = (() =>
|
|
49
|
+
Promise.resolve({
|
|
50
|
+
ok: status >= 200 && status < 300,
|
|
51
|
+
status,
|
|
52
|
+
json: () => Promise.resolve(body),
|
|
53
|
+
})) as unknown as typeof fetch;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
describe('push.register', () => {
|
|
57
|
+
beforeEach(() => {
|
|
58
|
+
resetPush();
|
|
59
|
+
resetConfig();
|
|
60
|
+
resetScope();
|
|
61
|
+
setPlatform('ios');
|
|
62
|
+
setConfig(baseConfig);
|
|
63
|
+
});
|
|
64
|
+
afterEach(() => {
|
|
65
|
+
resetPush();
|
|
66
|
+
resetConfig();
|
|
67
|
+
resetScope();
|
|
68
|
+
setPlatform(null);
|
|
69
|
+
__setNativeForTests(undefined);
|
|
70
|
+
globalThis.fetch = realFetch;
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('returns the device handle when the whole flow works', async () => {
|
|
74
|
+
__setNativeForTests(grantingNative());
|
|
75
|
+
stubFetch(200, { token_id: '018f0000-0000-7000-8000-000000000001', is_new: true });
|
|
76
|
+
|
|
77
|
+
const r = await register();
|
|
78
|
+
|
|
79
|
+
expect(r.ok).toBe(true);
|
|
80
|
+
if (r.ok) expect(r.ipt).toBe('018f0000-0000-7000-8000-000000000001');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('sends `kind`, not `provider` — the field name that 422d for a year', async () => {
|
|
84
|
+
__setNativeForTests(grantingNative());
|
|
85
|
+
let sent: Record<string, unknown> = {};
|
|
86
|
+
globalThis.fetch = ((_url: string, init: { body: string }) => {
|
|
87
|
+
sent = JSON.parse(init.body) as Record<string, unknown>;
|
|
88
|
+
return Promise.resolve({
|
|
89
|
+
ok: true,
|
|
90
|
+
status: 200,
|
|
91
|
+
json: () => Promise.resolve({ token_id: 'id-1' }),
|
|
92
|
+
});
|
|
93
|
+
}) as unknown as typeof fetch;
|
|
94
|
+
|
|
95
|
+
await register();
|
|
96
|
+
|
|
97
|
+
expect(sent.kind).toBe('apns');
|
|
98
|
+
expect(sent.provider).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('sends kind=fcm and no env on Android — FCM has no sandbox split', async () => {
|
|
102
|
+
setPlatform('android');
|
|
103
|
+
__setNativeForTests(grantingNative());
|
|
104
|
+
let sent: Record<string, unknown> = {};
|
|
105
|
+
globalThis.fetch = ((_url: string, init: { body: string }) => {
|
|
106
|
+
sent = JSON.parse(init.body) as Record<string, unknown>;
|
|
107
|
+
return Promise.resolve({
|
|
108
|
+
ok: true,
|
|
109
|
+
status: 200,
|
|
110
|
+
json: () => Promise.resolve({ token_id: 'id-1' }),
|
|
111
|
+
});
|
|
112
|
+
}) as unknown as typeof fetch;
|
|
113
|
+
|
|
114
|
+
await register();
|
|
115
|
+
|
|
116
|
+
expect(sent.kind).toBe('fcm');
|
|
117
|
+
expect('env' in sent).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('reports not-initialised rather than throwing when init() has not run', async () => {
|
|
121
|
+
resetConfig();
|
|
122
|
+
__setNativeForTests(grantingNative());
|
|
123
|
+
|
|
124
|
+
const r = await register();
|
|
125
|
+
|
|
126
|
+
expect(r.ok).toBe(false);
|
|
127
|
+
if (!r.ok) expect(r.reason).toBe('not-initialised');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('separates "no native module" from "user declined"', async () => {
|
|
131
|
+
__setNativeForTests(null);
|
|
132
|
+
const absent = await register();
|
|
133
|
+
expect(absent.ok).toBe(false);
|
|
134
|
+
if (!absent.ok) expect(absent.reason).toBe('no-transport');
|
|
135
|
+
|
|
136
|
+
__setNativeForTests(grantingNative({ pushRequestPermission: () => Promise.resolve('denied') }));
|
|
137
|
+
const declined = await register();
|
|
138
|
+
expect(declined.ok).toBe(false);
|
|
139
|
+
if (!declined.ok) expect(declined.reason).toBe('permission-denied');
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('reports token-timeout when the OS never hands one back', async () => {
|
|
143
|
+
__setNativeForTests(
|
|
144
|
+
grantingNative({
|
|
145
|
+
pushDrainState: () => Promise.resolve({ notifications: [], taps: [] }),
|
|
146
|
+
}),
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const r = await register({ tokenTimeoutMs: 250 });
|
|
150
|
+
|
|
151
|
+
expect(r.ok).toBe(false);
|
|
152
|
+
if (!r.ok) expect(r.reason).toBe('token-timeout');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('reports server-rejected on a non-2xx, and on a 2xx with no id', async () => {
|
|
156
|
+
__setNativeForTests(grantingNative());
|
|
157
|
+
|
|
158
|
+
stubFetch(500, {});
|
|
159
|
+
const five = await register();
|
|
160
|
+
expect(five.ok).toBe(false);
|
|
161
|
+
if (!five.ok) expect(five.reason).toBe('server-rejected');
|
|
162
|
+
|
|
163
|
+
// A 200 that carries nothing usable is the same problem wearing a
|
|
164
|
+
// better status code — this is what the SDK used to accept and
|
|
165
|
+
// then throw on, deeper in.
|
|
166
|
+
stubFetch(200, { ok: true });
|
|
167
|
+
const empty = await register();
|
|
168
|
+
expect(empty.ok).toBe(false);
|
|
169
|
+
if (!empty.ok) expect(empty.reason).toBe('server-rejected');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('never rejects — the whole point (client zero-cost iron rule)', async () => {
|
|
173
|
+
// Every failure mode in one loop, including a native module that
|
|
174
|
+
// throws out of each of its methods.
|
|
175
|
+
const hostile = [
|
|
176
|
+
null,
|
|
177
|
+
grantingNative({
|
|
178
|
+
pushRequestPermission: () => {
|
|
179
|
+
throw new Error('native exploded');
|
|
180
|
+
},
|
|
181
|
+
}),
|
|
182
|
+
grantingNative({
|
|
183
|
+
pushDrainState: () => Promise.resolve({ error: 'APS denied', notifications: [], taps: [] }),
|
|
184
|
+
}),
|
|
185
|
+
];
|
|
186
|
+
globalThis.fetch = (() => Promise.reject(new Error('network down'))) as unknown as typeof fetch;
|
|
187
|
+
|
|
188
|
+
for (const n of hostile) {
|
|
189
|
+
__setNativeForTests(n as never);
|
|
190
|
+
const r = await register({ tokenTimeoutMs: 150 });
|
|
191
|
+
expect(r.ok).toBe(false);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('calls onError but still resolves, so a host can use either style', async () => {
|
|
196
|
+
__setNativeForTests(null);
|
|
197
|
+
let seen: null | string = null;
|
|
198
|
+
|
|
199
|
+
const r = await register({ onError: (e) => (seen = e.message) });
|
|
200
|
+
|
|
201
|
+
expect(r.ok).toBe(false);
|
|
202
|
+
expect(seen).not.toBeNull();
|
|
203
|
+
});
|
|
204
|
+
});
|
package/src/native.ts
CHANGED
|
@@ -174,6 +174,14 @@ type SentoriNativeModule = {
|
|
|
174
174
|
|
|
175
175
|
let _native: SentoriNativeModule | null | undefined
|
|
176
176
|
|
|
177
|
+
/** Test-only: stand in for the native module so the paths that only
|
|
178
|
+
* exist when one is bound — a denied permission, a token that never
|
|
179
|
+
* arrives — can be exercised off-device. `undefined` restores real
|
|
180
|
+
* resolution. Production never calls this. */
|
|
181
|
+
export function __setNativeForTests(m: Partial<SentoriNativeModule> | null | undefined): void {
|
|
182
|
+
_native = m === undefined ? undefined : (m as SentoriNativeModule | null)
|
|
183
|
+
}
|
|
184
|
+
|
|
177
185
|
function native(): SentoriNativeModule | null {
|
|
178
186
|
if (_native !== undefined) return _native
|
|
179
187
|
try {
|
package/src/push.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// Mirrors `@goliapkg/sentori-javascript`'s `registerWeb` ergonomics
|
|
4
|
-
// so a cross-platform host app reasons about both flows the same way.
|
|
1
|
+
// React Native push notification opt-in. Both platforms: iOS via
|
|
2
|
+
// APNs, Android via FCM.
|
|
5
3
|
//
|
|
6
4
|
// Flow:
|
|
7
5
|
// 1. `pushRequestPermission()` — OS prompt the first time, or
|
|
8
6
|
// returns the cached decision.
|
|
9
|
-
// 2. `pushRegister()` — kicks off
|
|
10
|
-
// `UIApplication.registerForRemoteNotifications
|
|
11
|
-
//
|
|
12
|
-
// in the native buffer.
|
|
7
|
+
// 2. `pushRegister()` — on iOS kicks off
|
|
8
|
+
// `UIApplication.registerForRemoteNotifications`; on Android
|
|
9
|
+
// asks FCM for the instance token. Either way the token arrives
|
|
10
|
+
// asynchronously and lands in the native buffer.
|
|
13
11
|
// 3. Poll `pushDrainState()` at 200 ms ticks for up to 8 s waiting
|
|
14
12
|
// for the token.
|
|
15
|
-
// 4. POST `/v1/push/tokens` with
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
13
|
+
// 4. POST `/v1/push/tokens` with `kind: 'apns' | 'fcm'` — the
|
|
14
|
+
// server's field name; sending `provider` here earned a 422 for
|
|
15
|
+
// every registration this SDK ever attempted — plus
|
|
16
|
+
// `nativeToken`, `userKey`, and `env` on iOS only (FCM is a
|
|
17
|
+
// single host and has no sandbox/production split).
|
|
18
|
+
// 5. Cache the returned device handle (AsyncStorage when
|
|
19
19
|
// available, otherwise module-scoped).
|
|
20
20
|
// 6. Start a 1 Hz drain loop that fires `onMessage` / `onTap` from
|
|
21
21
|
// buffered events while the app is foreground. Pauses on
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
import { logger, pushSignal } from '@goliapkg/sentori-core'
|
|
25
25
|
|
|
26
|
+
import { currentUserKey } from './scope.js'
|
|
27
|
+
|
|
26
28
|
// AppState is RN-only; we treat it dynamically so the SDK keeps
|
|
27
29
|
// importing cleanly under Bun / web.
|
|
28
30
|
type AppStateModule = {
|
|
@@ -76,8 +78,9 @@ export type PushRegisterOptions = {
|
|
|
76
78
|
/** Token registration completed — useful when the host wants the
|
|
77
79
|
* ipt handle in real time without awaiting `register()`. */
|
|
78
80
|
onToken?: (ipt: string) => void
|
|
79
|
-
/** Any failure in the registration flow.
|
|
80
|
-
*
|
|
81
|
+
/** Any failure in the registration flow. Convenience only — the
|
|
82
|
+
* promise resolves to `{ ok: false, reason }` either way and
|
|
83
|
+
* never rejects. */
|
|
81
84
|
onError?: (err: Error) => void
|
|
82
85
|
/** Override the timeout when waiting for the native token to
|
|
83
86
|
* arrive after `registerForRemoteNotifications`. Defaults to
|
|
@@ -86,10 +89,42 @@ export type PushRegisterOptions = {
|
|
|
86
89
|
tokenTimeoutMs?: number
|
|
87
90
|
}
|
|
88
91
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
92
|
+
/** Why a registration did not produce a device handle. Each value is
|
|
93
|
+
* a different thing for the host to do, which is the only reason to
|
|
94
|
+
* distinguish them:
|
|
95
|
+
*
|
|
96
|
+
* - `not-initialised` — `sentori.init()` has not run. A wiring bug.
|
|
97
|
+
* - `permission-denied` — the user said no. Not an error. Do not
|
|
98
|
+
* retry on a timer; offer it again from a settings screen.
|
|
99
|
+
* - `no-transport` — no native push module in this binary (Expo Go,
|
|
100
|
+
* a simulator without a push entitlement). Nothing to do at
|
|
101
|
+
* runtime.
|
|
102
|
+
* - `token-timeout` — the OS never handed back a token inside the
|
|
103
|
+
* window. Usually provisioning; retrying later is reasonable.
|
|
104
|
+
* - `server-rejected` — Sentori answered non-2xx. Settings ▸ Push
|
|
105
|
+
* is where to look.
|
|
106
|
+
*/
|
|
107
|
+
export type PushRegisterFailure =
|
|
108
|
+
| 'not-initialised'
|
|
109
|
+
| 'no-transport'
|
|
110
|
+
| 'permission-denied'
|
|
111
|
+
| 'server-rejected'
|
|
112
|
+
| 'token-timeout'
|
|
113
|
+
|
|
114
|
+
/** Registration outcome. `register()` never throws and there is no
|
|
115
|
+
* `catch` branch to forget: a denied permission is an ordinary
|
|
116
|
+
* answer, not an exception. An opt-in that throws inside someone's
|
|
117
|
+
* `useEffect` is precisely the failure this SDK's contract with its
|
|
118
|
+
* host app is written against. */
|
|
119
|
+
export type PushRegisterResult =
|
|
120
|
+
| {
|
|
121
|
+
ok: true
|
|
122
|
+
/** Stable device handle: the `device_tokens` row id, a bare
|
|
123
|
+
* uuid. Named `ipt` for the handle format this once returned;
|
|
124
|
+
* the revoke and send routes take the uuid. */
|
|
125
|
+
ipt: string
|
|
126
|
+
}
|
|
127
|
+
| { ok: false; message: string; reason: PushRegisterFailure }
|
|
93
128
|
|
|
94
129
|
export type PushNotificationPayload = {
|
|
95
130
|
id?: string
|
|
@@ -102,12 +137,22 @@ export type PushNotificationPayload = {
|
|
|
102
137
|
}
|
|
103
138
|
|
|
104
139
|
/**
|
|
105
|
-
* Run the
|
|
106
|
-
*
|
|
140
|
+
* Run the push opt-in flow on either platform. Safe to call on every
|
|
141
|
+
* launch: the OS returns its cached permission decision without
|
|
142
|
+
* re-prompting, and the server upserts on
|
|
143
|
+
* `(project_id, provider, native_token)`. Use `getCachedIpt()` if you
|
|
144
|
+
* want the handle without a round trip.
|
|
145
|
+
*
|
|
146
|
+
* Never throws. Every way this can fail comes back as
|
|
147
|
+
* `{ ok: false, reason }` — see `PushRegisterFailure` for what each
|
|
148
|
+
* one asks the host to do.
|
|
107
149
|
*/
|
|
108
150
|
export async function register(opts: PushRegisterOptions = {}): Promise<PushRegisterResult> {
|
|
109
151
|
try {
|
|
110
|
-
const cfg =
|
|
152
|
+
const cfg = tryGetRuntimeConfig()
|
|
153
|
+
if (!cfg) {
|
|
154
|
+
return fail(opts, 'not-initialised', 'sentori.init() has not run')
|
|
155
|
+
}
|
|
111
156
|
// Bind callbacks up front so the buffer drain inside
|
|
112
157
|
// waitForToken can fire onMessage / onTap for events that arrive
|
|
113
158
|
// alongside or before the device token (e.g. user taps a push
|
|
@@ -116,8 +161,15 @@ export async function register(opts: PushRegisterOptions = {}): Promise<PushRegi
|
|
|
116
161
|
_onMessage = opts.onMessage
|
|
117
162
|
_onTap = opts.onTap
|
|
118
163
|
const status = await pushRequestPermission()
|
|
164
|
+
// `null` means there is no native push module in this binary —
|
|
165
|
+
// a different thing from the user declining, and a different
|
|
166
|
+
// thing for the host to do about it. These were one branch and
|
|
167
|
+
// one message until now.
|
|
168
|
+
if (status == null) {
|
|
169
|
+
return fail(opts, 'no-transport', 'no native push module in this build')
|
|
170
|
+
}
|
|
119
171
|
if (status !== 'granted' && status !== 'provisional' && status !== 'ephemeral') {
|
|
120
|
-
|
|
172
|
+
return fail(opts, 'permission-denied', `push permission '${status}'`)
|
|
121
173
|
}
|
|
122
174
|
nativePushRegister()
|
|
123
175
|
const token = await waitForToken(opts.tokenTimeoutMs ?? 8000)
|
|
@@ -126,12 +178,34 @@ export async function register(opts: PushRegisterOptions = {}): Promise<PushRegi
|
|
|
126
178
|
void persistIpt(ipt)
|
|
127
179
|
opts.onToken?.(ipt)
|
|
128
180
|
bindBufferDrain(opts.onMessage, opts.onTap)
|
|
129
|
-
return { ipt }
|
|
181
|
+
return { ok: true, ipt }
|
|
130
182
|
} catch (e) {
|
|
131
183
|
const err = e instanceof Error ? e : new Error(String(e))
|
|
132
|
-
|
|
133
|
-
opts.
|
|
134
|
-
|
|
184
|
+
const reason = e instanceof PushRegisterError ? e.reason : 'server-rejected'
|
|
185
|
+
return fail(opts, reason, err.message)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** One exit for every failure: warn once, tell `onError` if the host
|
|
190
|
+
* wants a callback, hand back the reason. */
|
|
191
|
+
function fail(
|
|
192
|
+
opts: PushRegisterOptions,
|
|
193
|
+
reason: PushRegisterFailure,
|
|
194
|
+
message: string,
|
|
195
|
+
): PushRegisterResult {
|
|
196
|
+
logger.warn('push', `register failed (${reason}):`, message)
|
|
197
|
+
opts.onError?.(new Error(message))
|
|
198
|
+
return { ok: false, message, reason }
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Internal carrier so the helpers below can name which failure they
|
|
202
|
+
* are without every one of them returning a result object. */
|
|
203
|
+
class PushRegisterError extends Error {
|
|
204
|
+
readonly reason: PushRegisterFailure
|
|
205
|
+
constructor(reason: PushRegisterFailure, message: string) {
|
|
206
|
+
super(message)
|
|
207
|
+
this.name = 'PushRegisterError'
|
|
208
|
+
this.reason = reason
|
|
135
209
|
}
|
|
136
210
|
}
|
|
137
211
|
|
|
@@ -171,14 +245,6 @@ export { pushGetStatus as getStatus, pushRequestPermission as requestPermission
|
|
|
171
245
|
|
|
172
246
|
type RuntimeConfig = { ingestUrl: string; token: string }
|
|
173
247
|
|
|
174
|
-
function getRuntimeConfig(): RuntimeConfig {
|
|
175
|
-
const cfg = tryGetRuntimeConfig()
|
|
176
|
-
if (!cfg) {
|
|
177
|
-
throw new Error('sentori is not initialised; call sentori.init() first')
|
|
178
|
-
}
|
|
179
|
-
return cfg
|
|
180
|
-
}
|
|
181
|
-
|
|
182
248
|
function tryGetRuntimeConfig(): RuntimeConfig | null {
|
|
183
249
|
// Dynamic require avoids a circular import — `./init` already
|
|
184
250
|
// depends on `./push` via the top-level barrel re-export.
|
|
@@ -195,7 +261,7 @@ async function waitForToken(timeoutMs: number): Promise<string> {
|
|
|
195
261
|
while (Date.now() - start < timeoutMs) {
|
|
196
262
|
const state = await pushDrainState()
|
|
197
263
|
if (state.error) {
|
|
198
|
-
throw new
|
|
264
|
+
throw new PushRegisterError('no-transport', `OS registration failed: ${state.error}`)
|
|
199
265
|
}
|
|
200
266
|
if (state.token) {
|
|
201
267
|
// Push any buffered events that arrived alongside the token
|
|
@@ -206,7 +272,7 @@ async function waitForToken(timeoutMs: number): Promise<string> {
|
|
|
206
272
|
flushBuffered(state.notifications, state.taps)
|
|
207
273
|
await new Promise((resolve) => setTimeout(resolve, 200))
|
|
208
274
|
}
|
|
209
|
-
throw new
|
|
275
|
+
throw new PushRegisterError('token-timeout', `no device token within ${timeoutMs} ms`)
|
|
210
276
|
}
|
|
211
277
|
|
|
212
278
|
async function registerWithServer(
|
|
@@ -225,11 +291,15 @@ async function registerWithServer(
|
|
|
225
291
|
: typeof __DEV__ !== 'undefined' && __DEV__
|
|
226
292
|
? 'sandbox'
|
|
227
293
|
: 'production'
|
|
294
|
+
// `kind`, not `provider` — the server's field name, which this
|
|
295
|
+
// sent for a year as `provider` and got a 422 for every time.
|
|
228
296
|
const body: Record<string, unknown> = {
|
|
229
|
-
|
|
297
|
+
kind: isAndroid ? 'fcm' : 'apns',
|
|
230
298
|
nativeToken,
|
|
231
|
-
|
|
232
|
-
|
|
299
|
+
// The same salted identity hash every event carries, so the
|
|
300
|
+
// dashboard can address this device by the user who hit an
|
|
301
|
+
// issue. Absent until the host calls `sentori.user()`.
|
|
302
|
+
userKey: currentUserKey(),
|
|
233
303
|
}
|
|
234
304
|
if (env != null) body.env = env
|
|
235
305
|
const res = await fetch(joinUrl(cfg.ingestUrl, '/v1/push/tokens'), {
|
|
@@ -240,12 +310,17 @@ async function registerWithServer(
|
|
|
240
310
|
},
|
|
241
311
|
body: JSON.stringify(body),
|
|
242
312
|
})
|
|
243
|
-
if (!res.ok)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
313
|
+
if (!res.ok) {
|
|
314
|
+
throw new PushRegisterError('server-rejected', `/v1/push/tokens HTTP ${res.status}`)
|
|
315
|
+
}
|
|
316
|
+
// The handle is the device_tokens row id — a uuid, which is what
|
|
317
|
+
// the revoke and send routes take. It was parsed here as an
|
|
318
|
+
// `ipt_*` string that no server has ever returned.
|
|
319
|
+
const json = (await res.json()) as { token_id?: string }
|
|
320
|
+
if (typeof json.token_id !== 'string' || json.token_id.length === 0) {
|
|
321
|
+
throw new PushRegisterError('server-rejected', 'server did not return a device token id')
|
|
247
322
|
}
|
|
248
|
-
return json.
|
|
323
|
+
return json.token_id
|
|
249
324
|
}
|
|
250
325
|
|
|
251
326
|
function bindBufferDrain(
|
|
@@ -454,6 +529,17 @@ function joinUrl(base: string, path: string): string {
|
|
|
454
529
|
return `${base.replace(/\/+$/, '')}${path}`
|
|
455
530
|
}
|
|
456
531
|
|
|
532
|
+
/** Test-only: drop the cached handle and stop both timers, so one
|
|
533
|
+
* test's successful registration does not leave an interval running
|
|
534
|
+
* into the next. Production code paths must not call this. */
|
|
535
|
+
export function __resetForTests(): void {
|
|
536
|
+
_cachedIpt = null
|
|
537
|
+
_onMessage = undefined
|
|
538
|
+
_onTap = undefined
|
|
539
|
+
_ackQueue = []
|
|
540
|
+
teardownBufferDrain()
|
|
541
|
+
}
|
|
542
|
+
|
|
457
543
|
let _platformOverride: 'ios' | 'android' | 'unknown' | null = null
|
|
458
544
|
|
|
459
545
|
/** Test-only hook to override Platform.OS detection. Production
|
package/src/transport.ts
CHANGED
|
@@ -20,7 +20,7 @@ const STORAGE_KEY = '@sentori/pending';
|
|
|
20
20
|
const MAX_PERSISTED = 1000;
|
|
21
21
|
|
|
22
22
|
// Pinned to package.json by a test — bump both together.
|
|
23
|
-
const SDK_VERSION = '
|
|
23
|
+
const SDK_VERSION = '6.0.0';
|
|
24
24
|
|
|
25
25
|
let _queue: WireEvent[] = [];
|
|
26
26
|
let _assertStats = new Map<string, AssertStat>();
|