@buoy-gg/notifications 7.0.41

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 (88) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +28 -0
  3. package/lib/commonjs/components/LocalNotificationTest.js +185 -0
  4. package/lib/commonjs/components/LocalNotificationTest.js.map +1 -0
  5. package/lib/commonjs/components/NotificationTestView.js +329 -0
  6. package/lib/commonjs/components/NotificationTestView.js.map +1 -0
  7. package/lib/commonjs/components/NotificationToolView.js +673 -0
  8. package/lib/commonjs/components/NotificationToolView.js.map +1 -0
  9. package/lib/commonjs/components/notificationStyles.js +292 -0
  10. package/lib/commonjs/components/notificationStyles.js.map +1 -0
  11. package/lib/commonjs/expo.js +247 -0
  12. package/lib/commonjs/expo.js.map +1 -0
  13. package/lib/commonjs/index.js +148 -0
  14. package/lib/commonjs/index.js.map +1 -0
  15. package/lib/commonjs/json.js +58 -0
  16. package/lib/commonjs/json.js.map +1 -0
  17. package/lib/commonjs/package.json +1 -0
  18. package/lib/commonjs/payload.js +68 -0
  19. package/lib/commonjs/payload.js.map +1 -0
  20. package/lib/commonjs/preset.js +56 -0
  21. package/lib/commonjs/preset.js.map +1 -0
  22. package/lib/commonjs/preview.js +18 -0
  23. package/lib/commonjs/preview.js.map +1 -0
  24. package/lib/commonjs/recorder.js +339 -0
  25. package/lib/commonjs/recorder.js.map +1 -0
  26. package/lib/commonjs/runtime.js +110 -0
  27. package/lib/commonjs/runtime.js.map +1 -0
  28. package/lib/commonjs/storage.js +61 -0
  29. package/lib/commonjs/storage.js.map +1 -0
  30. package/lib/commonjs/types.js +2 -0
  31. package/lib/commonjs/types.js.map +1 -0
  32. package/lib/module/components/LocalNotificationTest.js +180 -0
  33. package/lib/module/components/LocalNotificationTest.js.map +1 -0
  34. package/lib/module/components/NotificationTestView.js +324 -0
  35. package/lib/module/components/NotificationTestView.js.map +1 -0
  36. package/lib/module/components/NotificationToolView.js +668 -0
  37. package/lib/module/components/NotificationToolView.js.map +1 -0
  38. package/lib/module/components/notificationStyles.js +288 -0
  39. package/lib/module/components/notificationStyles.js.map +1 -0
  40. package/lib/module/expo.js +241 -0
  41. package/lib/module/expo.js.map +1 -0
  42. package/lib/module/index.js +13 -0
  43. package/lib/module/index.js.map +1 -0
  44. package/lib/module/json.js +51 -0
  45. package/lib/module/json.js.map +1 -0
  46. package/lib/module/payload.js +63 -0
  47. package/lib/module/payload.js.map +1 -0
  48. package/lib/module/preset.js +50 -0
  49. package/lib/module/preset.js.map +1 -0
  50. package/lib/module/preview.js +14 -0
  51. package/lib/module/preview.js.map +1 -0
  52. package/lib/module/recorder.js +332 -0
  53. package/lib/module/recorder.js.map +1 -0
  54. package/lib/module/runtime.js +103 -0
  55. package/lib/module/runtime.js.map +1 -0
  56. package/lib/module/storage.js +56 -0
  57. package/lib/module/storage.js.map +1 -0
  58. package/lib/module/types.js +2 -0
  59. package/lib/module/types.js.map +1 -0
  60. package/lib/typescript/components/LocalNotificationTest.d.ts +8 -0
  61. package/lib/typescript/components/LocalNotificationTest.d.ts.map +1 -0
  62. package/lib/typescript/components/NotificationTestView.d.ts +27 -0
  63. package/lib/typescript/components/NotificationTestView.d.ts.map +1 -0
  64. package/lib/typescript/components/NotificationToolView.d.ts +16 -0
  65. package/lib/typescript/components/NotificationToolView.d.ts.map +1 -0
  66. package/lib/typescript/components/notificationStyles.d.ts +284 -0
  67. package/lib/typescript/components/notificationStyles.d.ts.map +1 -0
  68. package/lib/typescript/expo.d.ts +66 -0
  69. package/lib/typescript/expo.d.ts.map +1 -0
  70. package/lib/typescript/index.d.ts +15 -0
  71. package/lib/typescript/index.d.ts.map +1 -0
  72. package/lib/typescript/json.d.ts +7 -0
  73. package/lib/typescript/json.d.ts.map +1 -0
  74. package/lib/typescript/payload.d.ts +18 -0
  75. package/lib/typescript/payload.d.ts.map +1 -0
  76. package/lib/typescript/preset.d.ts +31 -0
  77. package/lib/typescript/preset.d.ts.map +1 -0
  78. package/lib/typescript/preview.d.ts +4 -0
  79. package/lib/typescript/preview.d.ts.map +1 -0
  80. package/lib/typescript/recorder.d.ts +52 -0
  81. package/lib/typescript/recorder.d.ts.map +1 -0
  82. package/lib/typescript/runtime.d.ts +50 -0
  83. package/lib/typescript/runtime.d.ts.map +1 -0
  84. package/lib/typescript/storage.d.ts +23 -0
  85. package/lib/typescript/storage.d.ts.map +1 -0
  86. package/lib/typescript/types.d.ts +64 -0
  87. package/lib/typescript/types.d.ts.map +1 -0
  88. package/package.json +66 -0
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NotificationRecorder = void 0;
7
+ exports.expoMetadata = expoMetadata;
8
+ exports.responseKey = responseKey;
9
+ var _json = require("./json");
10
+ const PREFIX = "buoy.notifications.v1.";
11
+ const SESSION = PREFIX + "session";
12
+ const TOKENS = PREFIX + "tokens";
13
+ const EVENT = PREFIX + "event.";
14
+ const MAX_RECORD_BYTES = 16 * 1024;
15
+ const MAX_JOURNAL_BYTES = 512 * 1024;
16
+ const MAX_RECORDS = 200;
17
+ /** Recording runs independently of the desktop's snapshot subscriptions. */
18
+ class NotificationRecorder {
19
+ state = {
20
+ version: 1,
21
+ ready: false,
22
+ provider: null,
23
+ providerVersion: null,
24
+ platform: "unknown",
25
+ appId: null,
26
+ capabilities: [],
27
+ durable: false,
28
+ storageError: null,
29
+ evicted: 0,
30
+ session: null,
31
+ events: [],
32
+ tokens: [],
33
+ permissions: null,
34
+ presented: null
35
+ };
36
+ listeners = new Set();
37
+ sequence = 0;
38
+ queue = Promise.resolve();
39
+ constructor(options = {}) {
40
+ this.options = options;
41
+ this.now = options.now ?? Date.now;
42
+ this.processId = options.processId ?? `${this.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
43
+ this.state.durable = !!options.storage && options.durable === true;
44
+ this.ready = this.hydrate();
45
+ this.queue = this.ready;
46
+ }
47
+ getSnapshot = () => this.state;
48
+ subscribe = listener => {
49
+ this.listeners.add(listener);
50
+ return () => {
51
+ this.listeners.delete(listener);
52
+ };
53
+ };
54
+ update(patch) {
55
+ this.state = {
56
+ ...this.state,
57
+ ...patch
58
+ };
59
+ for (const listener of this.listeners) {
60
+ try {
61
+ listener();
62
+ } catch {/* Observers cannot interrupt app callbacks. */}
63
+ }
64
+ }
65
+ configure(patch) {
66
+ this.update(patch);
67
+ }
68
+ allowed() {
69
+ return this.options.enabled?.() ?? true;
70
+ }
71
+ storageFailure(error) {
72
+ this.update({
73
+ storageError: error instanceof Error ? error.message : String(error),
74
+ durable: false
75
+ });
76
+ }
77
+ serial(task) {
78
+ const next = this.queue.then(task);
79
+ this.queue = next.catch(() => {});
80
+ return next;
81
+ }
82
+ async hydrate() {
83
+ if (!this.allowed()) {
84
+ this.update({
85
+ ready: true
86
+ });
87
+ return;
88
+ }
89
+ if (this.options.durability) {
90
+ try {
91
+ this.update({
92
+ durable: await this.options.durability
93
+ });
94
+ } catch (error) {
95
+ this.storageFailure(error);
96
+ }
97
+ }
98
+ const storage = this.options.storage;
99
+ let explicitlyStopped = false;
100
+ if (storage) try {
101
+ const rawSession = await storage.getItem(SESSION);
102
+ explicitlyStopped = rawSession === "null";
103
+ if (rawSession) {
104
+ const s = JSON.parse(rawSession);
105
+ if (s && typeof s.runId === "string" && Number.isFinite(s.expiresAt) && s.expiresAt > this.now()) this.update({
106
+ session: s
107
+ });
108
+ }
109
+ const rawTokens = await storage.getItem(TOKENS);
110
+ if (rawTokens) {
111
+ const tokens = JSON.parse(rawTokens);
112
+ if (Array.isArray(tokens)) this.update({
113
+ tokens: tokens.filter(t => t && ["apns", "fcm", "expo"].includes(t.type) && typeof t.value === "string").slice(-10)
114
+ });
115
+ }
116
+ const keys = (await storage.getAllKeys()).filter(key => key.startsWith(EVENT)).sort();
117
+ const records = [];
118
+ for (const key of keys) {
119
+ try {
120
+ const raw = await storage.getItem(key);
121
+ if (!raw || (0, _json.byteLength)(raw) > MAX_RECORD_BYTES) {
122
+ await storage.removeItem(key);
123
+ continue;
124
+ }
125
+ const record = JSON.parse(raw);
126
+ if (typeof record.id === "string" && typeof record.kind === "string" && Number.isFinite(record.capturedAt)) records.push(record);else await storage.removeItem(key);
127
+ } catch {
128
+ await storage.removeItem(key);
129
+ }
130
+ }
131
+ records.sort((a, b) => a.capturedAt - b.capturedAt || a.sequence - b.sequence || a.id.localeCompare(b.id));
132
+ this.update({
133
+ events: records
134
+ });
135
+ await this.prune();
136
+ } catch (error) {
137
+ this.storageFailure(error);
138
+ }
139
+ if (this.options.autoStart && !this.state.session && !explicitlyStopped) {
140
+ const startedAt = this.now();
141
+ const session = {
142
+ runId: this.processId,
143
+ startedAt,
144
+ expiresAt: startedAt + 30 * 60 * 1000
145
+ };
146
+ try {
147
+ await storage?.setItem(SESSION, JSON.stringify(session));
148
+ } catch (error) {
149
+ this.storageFailure(error);
150
+ }
151
+ this.update({
152
+ session
153
+ });
154
+ }
155
+ this.update({
156
+ ready: true
157
+ });
158
+ }
159
+ async setCaptureSession(runId, durationMs = 30 * 60 * 1000) {
160
+ if (!this.allowed()) throw new Error("Notification capture is disabled in this build.");
161
+ if (runId !== null && (typeof runId !== "string" || !runId.trim() || runId.length > 128)) throw new Error("runId must contain 1 to 128 characters, or be null to stop capture.");
162
+ if (!Number.isFinite(durationMs) || durationMs < 1000 || durationMs > 60 * 60 * 1000) throw new Error("Capture duration must be between 1 second and 1 hour.");
163
+ return this.serial(async () => {
164
+ const startedAt = this.now();
165
+ const session = runId === null ? null : {
166
+ runId,
167
+ startedAt,
168
+ expiresAt: startedAt + durationMs
169
+ };
170
+ try {
171
+ if (this.options.storage) await this.options.storage.setItem(SESSION, JSON.stringify(session));
172
+ } catch (error) {
173
+ this.storageFailure(error);
174
+ throw new Error("Could not persist the capture session. Keep the app open and check storage.");
175
+ }
176
+ this.update({
177
+ session
178
+ });
179
+ return {
180
+ session,
181
+ durable: this.state.durable
182
+ };
183
+ });
184
+ }
185
+ record(kind, raw, metadata = {}) {
186
+ const capturedAt = this.now();
187
+ const observedAppState = this.options.appState?.() ?? "unknown";
188
+ const clean = (0, _json.json)(raw);
189
+ return this.serial(async () => {
190
+ if (!this.allowed()) return null;
191
+ const session = this.state.session;
192
+ if (!session || session.expiresAt <= capturedAt) {
193
+ if (session) this.update({
194
+ session: null
195
+ });
196
+ return null;
197
+ }
198
+ const clipped = (value, max = 512) => typeof value === "string" ? value.slice(0, max) : null;
199
+ const dedupeKey = clipped(metadata.dedupeKey, 2048);
200
+ if (dedupeKey && this.state.events.some(e => e.dedupeKey === dedupeKey)) return null;
201
+ const record = {
202
+ id: `${this.processId}-${++this.sequence}`,
203
+ processId: this.processId,
204
+ sequence: this.sequence,
205
+ capturedAt,
206
+ runId: session.runId,
207
+ kind,
208
+ provider: clipped(metadata.provider, 64) ?? this.state.provider ?? "app",
209
+ observedAppState,
210
+ notificationId: clipped(metadata.notificationId),
211
+ testId: clipped(metadata.testId),
212
+ title: clipped(metadata.title, 1024),
213
+ actionIdentifier: clipped(metadata.actionIdentifier),
214
+ ...(dedupeKey ? {
215
+ dedupeKey
216
+ } : {}),
217
+ raw: clean
218
+ };
219
+ if ((0, _json.byteLength)(JSON.stringify(record)) > MAX_RECORD_BYTES) {
220
+ record.raw = {
221
+ note: "Payload exceeded the 16 KiB capture limit."
222
+ };
223
+ record.truncated = true;
224
+ }
225
+ this.update({
226
+ events: [...this.state.events, record]
227
+ });
228
+ try {
229
+ await this.options.storage?.setItem(EVENT + record.id, JSON.stringify(record));
230
+ } catch (error) {
231
+ this.storageFailure(error);
232
+ }
233
+ // Keep the in-memory bound even when the disk is full or unavailable.
234
+ try {
235
+ await this.prune();
236
+ } catch (error) {
237
+ this.storageFailure(error);
238
+ }
239
+ return record;
240
+ });
241
+ }
242
+ async prune() {
243
+ const events = [...this.state.events];
244
+ const sizes = events.map(e => (0, _json.byteLength)(JSON.stringify(e)));
245
+ let bytes = sizes.reduce((sum, size) => sum + size, 0);
246
+ const removed = [];
247
+ while (events.length > MAX_RECORDS || bytes > MAX_JOURNAL_BYTES) {
248
+ removed.push(events.shift());
249
+ bytes -= sizes.shift();
250
+ }
251
+ if (removed.length) this.update({
252
+ events,
253
+ evicted: this.state.evicted + removed.length
254
+ });
255
+ for (const event of removed) await this.options.storage?.removeItem(EVENT + event.id);
256
+ }
257
+ async clearCapturedEvents() {
258
+ return this.serial(async () => {
259
+ const events = this.state.events;
260
+ for (const event of events) await this.options.storage?.removeItem(EVENT + event.id);
261
+ this.update({
262
+ events: [],
263
+ evicted: 0
264
+ });
265
+ return {
266
+ cleared: true
267
+ };
268
+ });
269
+ }
270
+ async observeToken(type, value, metadata = {}) {
271
+ if (!this.allowed()) return;
272
+ if (!value || value.length > 8192) throw new Error("The notification token is empty or too long.");
273
+ return this.serial(async () => {
274
+ const token = {
275
+ type,
276
+ value,
277
+ observedAt: this.now(),
278
+ ...(typeof metadata.projectId === "string" ? {
279
+ projectId: metadata.projectId.slice(0, 256)
280
+ } : {}),
281
+ ...(typeof metadata.environment === "string" ? {
282
+ environment: metadata.environment.slice(0, 256)
283
+ } : {})
284
+ };
285
+ const tokens = [...this.state.tokens.filter(t => !(t.type === type && t.projectId === metadata.projectId && t.environment === metadata.environment)), token].slice(-10);
286
+ this.update({
287
+ tokens
288
+ });
289
+ try {
290
+ await this.options.storage?.setItem(TOKENS, JSON.stringify(tokens));
291
+ } catch (error) {
292
+ this.storageFailure(error);
293
+ }
294
+ });
295
+ }
296
+ setPermissions(permissions) {
297
+ const value = (0, _json.json)(permissions);
298
+ this.update({
299
+ permissions: (0, _json.byteLength)(JSON.stringify(value)) <= MAX_RECORD_BYTES ? value : {
300
+ note: "Permission result exceeded the capture limit."
301
+ }
302
+ });
303
+ }
304
+ setPresented(presented) {
305
+ const value = (0, _json.json)(presented);
306
+ if ((0, _json.byteLength)(JSON.stringify(value)) <= 128 * 1024) this.update({
307
+ presented: value
308
+ });else this.update({
309
+ presented: {
310
+ note: "System tray result exceeded 128 KiB. Inspect fewer presented notifications in the app.",
311
+ count: Array.isArray(presented) ? presented.length : null
312
+ }
313
+ });
314
+ }
315
+ async flush() {
316
+ await this.queue;
317
+ }
318
+ }
319
+ exports.NotificationRecorder = NotificationRecorder;
320
+ function expoMetadata(value) {
321
+ const raw = (0, _json.object)(value);
322
+ const notification = (0, _json.object)(raw.notification ?? value);
323
+ const request = (0, _json.object)(notification.request);
324
+ const content = (0, _json.object)(request.content);
325
+ const payload = (0, _json.object)((0, _json.object)(request.trigger).payload);
326
+ const data = (0, _json.object)(content.data ?? payload.body);
327
+ return {
328
+ notificationId: (0, _json.string)(request.identifier),
329
+ testId: (0, _json.string)(data.__buoyTestId),
330
+ title: (0, _json.string)(content.title),
331
+ actionIdentifier: (0, _json.string)(raw.actionIdentifier)
332
+ };
333
+ }
334
+ function responseKey(value) {
335
+ const raw = (0, _json.object)(value);
336
+ const notification = (0, _json.object)(raw.notification);
337
+ return JSON.stringify([(0, _json.object)(notification.request).identifier, notification.date, raw.actionIdentifier, raw.userText]);
338
+ }
339
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_json","require","PREFIX","SESSION","TOKENS","EVENT","MAX_RECORD_BYTES","MAX_JOURNAL_BYTES","MAX_RECORDS","NotificationRecorder","state","version","ready","provider","providerVersion","platform","appId","capabilities","durable","storageError","evicted","session","events","tokens","permissions","presented","listeners","Set","sequence","queue","Promise","resolve","constructor","options","now","Date","processId","toString","Math","random","slice","storage","hydrate","getSnapshot","subscribe","listener","add","delete","update","patch","configure","allowed","enabled","storageFailure","error","Error","message","String","serial","task","next","then","catch","durability","explicitlyStopped","rawSession","getItem","s","JSON","parse","runId","Number","isFinite","expiresAt","rawTokens","Array","isArray","filter","t","includes","type","value","keys","getAllKeys","key","startsWith","sort","records","raw","byteLength","removeItem","record","id","kind","capturedAt","push","a","b","localeCompare","prune","autoStart","startedAt","setItem","stringify","setCaptureSession","durationMs","trim","length","metadata","observedAppState","appState","clean","json","clipped","max","dedupeKey","some","e","notificationId","testId","title","actionIdentifier","note","truncated","sizes","map","bytes","reduce","sum","size","removed","shift","event","clearCapturedEvents","cleared","observeToken","token","observedAt","projectId","environment","setPermissions","setPresented","count","flush","exports","expoMetadata","object","notification","request","content","payload","trigger","data","body","string","identifier","__buoyTestId","responseKey","date","userText"],"sourceRoot":"../../src","sources":["recorder.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.captureEnabled = captureEnabled;
7
+ exports.getNotificationRecorder = getNotificationRecorder;
8
+ exports.installExpoNotificationCapture = installExpoNotificationCapture;
9
+ exports.notificationSyncAdapter = void 0;
10
+ var _reactNative = require("react-native");
11
+ var _storage = require("./storage");
12
+ var _recorder = require("./recorder");
13
+ var _expo = require("./expo");
14
+ var _json = require("./json");
15
+ const globals = globalThis;
16
+ function captureEnabled(enableInRelease = false) {
17
+ return typeof __DEV__ !== "undefined" && __DEV__ || enableInRelease === true;
18
+ }
19
+ function getNotificationRecorder() {
20
+ return globals.__buoyNotificationsV1?.recorder ?? null;
21
+ }
22
+ function installExpoNotificationCapture(sdk, options = {}) {
23
+ if (!captureEnabled(options.enableInRelease)) return null;
24
+ const key = JSON.stringify([options.platform ?? _reactNative.Platform.OS, options.appId, options.providerVersion, options.projectId, options.enableInRelease, options.preview]);
25
+ let runtime = globals.__buoyNotificationsV1;
26
+ if (!runtime) {
27
+ const persistence = options.storage ? {
28
+ storage: options.storage,
29
+ durable: options.durable === true
30
+ } : (0, _storage.defaultNotificationStorage)();
31
+ const recorder = new _recorder.NotificationRecorder({
32
+ ...persistence,
33
+ enabled: () => captureEnabled(options.enableInRelease),
34
+ appState: () => _reactNative.AppState.currentState ?? "unknown",
35
+ autoStart: true
36
+ });
37
+ runtime = {
38
+ recorder
39
+ };
40
+ globals.__buoyNotificationsV1 = runtime;
41
+ }
42
+ if (runtime.sdk !== sdk || runtime.key !== key) {
43
+ runtime.attachment?.dispose();
44
+ runtime.attachment = (0, _expo.attachExpoNotifications)(runtime.recorder, sdk, {
45
+ ...options,
46
+ platform: options.platform ?? _reactNative.Platform.OS
47
+ });
48
+ runtime.sdk = sdk;
49
+ runtime.key = key;
50
+ }
51
+ return runtime.recorder;
52
+ }
53
+ const emptyRecorder = new _recorder.NotificationRecorder();
54
+ function current() {
55
+ const runtime = globals.__buoyNotificationsV1;
56
+ if (!runtime) throw new Error("Install Expo notification capture in the app entry point, before rendering the root component.");
57
+ return runtime;
58
+ }
59
+ const notificationSyncAdapter = exports.notificationSyncAdapter = {
60
+ version: 1,
61
+ getSnapshot: () => (getNotificationRecorder() ?? emptyRecorder).getSnapshot(),
62
+ subscribe: listener => (getNotificationRecorder() ?? emptyRecorder).subscribe(listener),
63
+ actions: {
64
+ getSnapshot: () => notificationSyncAdapter.getSnapshot(),
65
+ getCapabilities: () => {
66
+ const {
67
+ ready,
68
+ provider,
69
+ providerVersion,
70
+ platform,
71
+ appId,
72
+ capabilities,
73
+ durable,
74
+ storageError
75
+ } = notificationSyncAdapter.getSnapshot();
76
+ return {
77
+ ready,
78
+ provider,
79
+ providerVersion,
80
+ platform,
81
+ appId,
82
+ capabilities,
83
+ durable,
84
+ storageError
85
+ };
86
+ },
87
+ getEvent(params) {
88
+ const {
89
+ id
90
+ } = (0, _json.object)(params);
91
+ if (typeof id !== "string") throw new Error("Provide the captured event id.");
92
+ return current().recorder.getSnapshot().events.find(event => event.id === id) ?? null;
93
+ },
94
+ async setCaptureSession(params) {
95
+ const {
96
+ runId,
97
+ durationMs
98
+ } = (0, _json.object)(params);
99
+ if (typeof runId !== "string" && runId !== null) throw new Error("Provide runId, or null to stop capture.");
100
+ if (durationMs !== undefined && typeof durationMs !== "number") throw new Error("durationMs must be a number.");
101
+ return current().recorder.setCaptureSession(runId, durationMs);
102
+ },
103
+ clearCapturedEvents: () => current().recorder.clearCapturedEvents(),
104
+ getPermissions: () => current().attachment.actions.getPermissions(),
105
+ listPresented: () => current().attachment.actions.listPresented(),
106
+ refreshToken: params => current().attachment.actions.refreshToken(params),
107
+ scheduleLocal: params => current().attachment.actions.scheduleLocal(params)
108
+ }
109
+ };
110
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_storage","_recorder","_expo","_json","globals","globalThis","captureEnabled","enableInRelease","__DEV__","getNotificationRecorder","__buoyNotificationsV1","recorder","installExpoNotificationCapture","sdk","options","key","JSON","stringify","platform","Platform","OS","appId","providerVersion","projectId","preview","runtime","persistence","storage","durable","defaultNotificationStorage","NotificationRecorder","enabled","appState","AppState","currentState","autoStart","attachment","dispose","attachExpoNotifications","emptyRecorder","current","Error","notificationSyncAdapter","exports","version","getSnapshot","subscribe","listener","actions","getCapabilities","ready","provider","capabilities","storageError","getEvent","params","id","object","events","find","event","setCaptureSession","runId","durationMs","undefined","clearCapturedEvents","getPermissions","listPresented","refreshToken","scheduleLocal"],"sourceRoot":"../../src","sources":["runtime.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createExpoNotificationStorage = createExpoNotificationStorage;
7
+ exports.defaultNotificationStorage = defaultNotificationStorage;
8
+ /** Propagates native I/O failures so capture never acknowledges a memory fallback as durable. */
9
+ function createExpoNotificationStorage(fs) {
10
+ if (!fs.documentDirectory) throw new Error("Expo FileSystem has no persistent document directory.");
11
+ const directory = fs.documentDirectory + "buoy-notifications/";
12
+ const pathFor = key => directory + encodeURIComponent(key) + ".json";
13
+ return {
14
+ async getItem(key) {
15
+ const path = pathFor(key);
16
+ return (await fs.getInfoAsync(path)).exists ? fs.readAsStringAsync(path) : null;
17
+ },
18
+ async setItem(key, value) {
19
+ if (!(await fs.getInfoAsync(directory)).exists) await fs.makeDirectoryAsync(directory, {
20
+ intermediates: true
21
+ });
22
+ await fs.writeAsStringAsync(pathFor(key), value);
23
+ },
24
+ async removeItem(key) {
25
+ await fs.deleteAsync(pathFor(key), {
26
+ idempotent: true
27
+ });
28
+ },
29
+ async getAllKeys() {
30
+ if (!(await fs.getInfoAsync(directory)).exists) return [];
31
+ return (await fs.readDirectoryAsync(directory)).filter(file => file.endsWith(".json")).flatMap(file => {
32
+ try {
33
+ return [decodeURIComponent(file.slice(0, -5))];
34
+ } catch {
35
+ return [];
36
+ }
37
+ });
38
+ }
39
+ };
40
+ }
41
+ function defaultNotificationStorage() {
42
+ try {
43
+ const fs = require("expo-file-system/legacy");
44
+ if (fs.documentDirectory && typeof fs.writeAsStringAsync === "function") return {
45
+ storage: createExpoNotificationStorage(fs),
46
+ durable: true
47
+ };
48
+ } catch {/* An app can provide its own storage when Expo FileSystem is absent. */}
49
+ try {
50
+ const module = require("@react-native-async-storage/async-storage");
51
+ const storage = module.default ?? module;
52
+ if (typeof storage.getItem === "function" && typeof storage.setItem === "function" && typeof storage.getAllKeys === "function") return {
53
+ storage,
54
+ durable: true
55
+ };
56
+ } catch {/* Capture remains available in memory. */}
57
+ return {
58
+ durable: false
59
+ };
60
+ }
61
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createExpoNotificationStorage","fs","documentDirectory","Error","directory","pathFor","key","encodeURIComponent","getItem","path","getInfoAsync","exists","readAsStringAsync","setItem","value","makeDirectoryAsync","intermediates","writeAsStringAsync","removeItem","deleteAsync","idempotent","getAllKeys","readDirectoryAsync","filter","file","endsWith","flatMap","decodeURIComponent","slice","defaultNotificationStorage","require","storage","durable","module","default"],"sourceRoot":"../../src","sources":["storage.ts"],"mappings":";;;;;;;AAYA;AACO,SAASA,6BAA6BA,CAACC,EAA8B,EAAuB;EACjG,IAAI,CAACA,EAAE,CAACC,iBAAiB,EAAE,MAAM,IAAIC,KAAK,CAAC,uDAAuD,CAAC;EACnG,MAAMC,SAAS,GAAGH,EAAE,CAACC,iBAAiB,GAAG,qBAAqB;EAC9D,MAAMG,OAAO,GAAIC,GAAW,IAAKF,SAAS,GAAGG,kBAAkB,CAACD,GAAG,CAAC,GAAG,OAAO;EAC9E,OAAO;IACL,MAAME,OAAOA,CAACF,GAAG,EAAE;MACjB,MAAMG,IAAI,GAAGJ,OAAO,CAACC,GAAG,CAAC;MACzB,OAAO,CAAC,MAAML,EAAE,CAACS,YAAY,CAACD,IAAI,CAAC,EAAEE,MAAM,GAAGV,EAAE,CAACW,iBAAiB,CAACH,IAAI,CAAC,GAAG,IAAI;IACjF,CAAC;IACD,MAAMI,OAAOA,CAACP,GAAG,EAAEQ,KAAK,EAAE;MACxB,IAAI,CAAC,CAAC,MAAMb,EAAE,CAACS,YAAY,CAACN,SAAS,CAAC,EAAEO,MAAM,EAAE,MAAMV,EAAE,CAACc,kBAAkB,CAACX,SAAS,EAAE;QAAEY,aAAa,EAAE;MAAK,CAAC,CAAC;MAC/G,MAAMf,EAAE,CAACgB,kBAAkB,CAACZ,OAAO,CAACC,GAAG,CAAC,EAAEQ,KAAK,CAAC;IAClD,CAAC;IACD,MAAMI,UAAUA,CAACZ,GAAG,EAAE;MAAE,MAAML,EAAE,CAACkB,WAAW,CAACd,OAAO,CAACC,GAAG,CAAC,EAAE;QAAEc,UAAU,EAAE;MAAK,CAAC,CAAC;IAAE,CAAC;IACnF,MAAMC,UAAUA,CAAA,EAAG;MACjB,IAAI,CAAC,CAAC,MAAMpB,EAAE,CAACS,YAAY,CAACN,SAAS,CAAC,EAAEO,MAAM,EAAE,OAAO,EAAE;MACzD,OAAO,CAAC,MAAMV,EAAE,CAACqB,kBAAkB,CAAClB,SAAS,CAAC,EAAEmB,MAAM,CAACC,IAAI,IAAIA,IAAI,CAACC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAACC,OAAO,CAACF,IAAI,IAAI;QACrG,IAAI;UAAE,OAAO,CAACG,kBAAkB,CAACH,IAAI,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,CAAC,CAAC,MAAM;UAAE,OAAO,EAAE;QAAE;MAC7E,CAAC,CAAC;IACJ;EACF,CAAC;AACH;AAEO,SAASC,0BAA0BA,CAAA,EAAwD;EAChG,IAAI;IACF,MAAM5B,EAAE,GAAG6B,OAAO,CAAC,yBAAyB,CAA+B;IAC3E,IAAI7B,EAAE,CAACC,iBAAiB,IAAI,OAAOD,EAAE,CAACgB,kBAAkB,KAAK,UAAU,EAAE,OAAO;MAAEc,OAAO,EAAE/B,6BAA6B,CAACC,EAAE,CAAC;MAAE+B,OAAO,EAAE;IAAK,CAAC;EAC/I,CAAC,CAAC,MAAM,CAAE;EACV,IAAI;IACF,MAAMC,MAAM,GAAGH,OAAO,CAAC,2CAA2C,CAAC;IACnE,MAAMC,OAAO,GAAGE,MAAM,CAACC,OAAO,IAAID,MAAM;IACxC,IAAI,OAAOF,OAAO,CAACvB,OAAO,KAAK,UAAU,IAAI,OAAOuB,OAAO,CAAClB,OAAO,KAAK,UAAU,IAAI,OAAOkB,OAAO,CAACV,UAAU,KAAK,UAAU,EAAE,OAAO;MAAEU,OAAO;MAAEC,OAAO,EAAE;IAAK,CAAC;EACnK,CAAC,CAAC,MAAM,CAAE;EACV,OAAO;IAAEA,OAAO,EAAE;EAAM,CAAC;AAC3B","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}