@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,51 @@
1
+ "use strict";
2
+
3
+ export function object(value) {
4
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
5
+ }
6
+ export function string(value) {
7
+ return typeof value === "string" ? value : null;
8
+ }
9
+ export function json(value) {
10
+ const seen = new WeakSet();
11
+ function visit(v, depth) {
12
+ if (v == null) return null;
13
+ if (typeof v === "string") return v.length > 12000 ? v.slice(0, 12000) + " [truncated]" : v;
14
+ if (typeof v === "boolean") return v;
15
+ if (typeof v === "number") return Number.isFinite(v) ? v : String(v);
16
+ if (typeof v !== "object") return String(v);
17
+ if (seen.has(v)) return "[Circular]";
18
+ if (depth > 12) return "[Depth limit]";
19
+ seen.add(v);
20
+ if (v instanceof Error) return {
21
+ name: v.name,
22
+ message: v.message
23
+ };
24
+ if (v instanceof Date) return Number.isNaN(v.getTime()) ? "[Invalid date]" : v.toISOString();
25
+ if (Array.isArray(v)) return v.slice(0, 200).map(item => visit(item, depth + 1));
26
+ const out = {};
27
+ for (const key of Object.keys(v).slice(0, 200)) {
28
+ try {
29
+ Object.defineProperty(out, key, {
30
+ value: visit(v[key], depth + 1),
31
+ enumerable: true
32
+ });
33
+ } catch {
34
+ out[key] = "[Unreadable]";
35
+ }
36
+ }
37
+ return out;
38
+ }
39
+ return visit(value, 0);
40
+ }
41
+
42
+ /** UTF-8 size without requiring Buffer or TextEncoder in Hermes. */
43
+ export function byteLength(value) {
44
+ let bytes = 0;
45
+ for (const character of value) {
46
+ const cp = character.codePointAt(0);
47
+ bytes += cp <= 0x7f ? 1 : cp <= 0x7ff ? 2 : cp <= 0xffff ? 3 : 4;
48
+ }
49
+ return bytes;
50
+ }
51
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["object","value","Array","isArray","string","json","seen","WeakSet","visit","v","depth","length","slice","Number","isFinite","String","has","add","Error","name","message","Date","isNaN","getTime","toISOString","map","item","out","key","Object","keys","defineProperty","enumerable","byteLength","bytes","character","cp","codePointAt"],"sourceRoot":"../../src","sources":["json.ts"],"mappings":";;AAEA,OAAO,SAASA,MAAMA,CAACC,KAAc,EAA2B;EAC9D,OAAOA,KAAK,KAAK,IAAI,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,GACvEA,KAAK,GAA8B,CAAC,CAAC;AAC3C;AACA,OAAO,SAASG,MAAMA,CAACH,KAAc,EAAiB;EACpD,OAAO,OAAOA,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAG,IAAI;AACjD;AACA,OAAO,SAASI,IAAIA,CAACJ,KAAc,EAAQ;EACzC,MAAMK,IAAI,GAAG,IAAIC,OAAO,CAAS,CAAC;EAClC,SAASC,KAAKA,CAACC,CAAU,EAAEC,KAAa,EAAQ;IAC9C,IAAID,CAAC,IAAI,IAAI,EAAE,OAAO,IAAI;IAC1B,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAE,OAAOA,CAAC,CAACE,MAAM,GAAG,KAAK,GAAGF,CAAC,CAACG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,cAAc,GAAGH,CAAC;IAC3F,IAAI,OAAOA,CAAC,KAAK,SAAS,EAAE,OAAOA,CAAC;IACpC,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAE,OAAOI,MAAM,CAACC,QAAQ,CAACL,CAAC,CAAC,GAAGA,CAAC,GAAGM,MAAM,CAACN,CAAC,CAAC;IACpE,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAE,OAAOM,MAAM,CAACN,CAAC,CAAC;IAC3C,IAAIH,IAAI,CAACU,GAAG,CAACP,CAAC,CAAC,EAAE,OAAO,YAAY;IACpC,IAAIC,KAAK,GAAG,EAAE,EAAE,OAAO,eAAe;IACtCJ,IAAI,CAACW,GAAG,CAACR,CAAC,CAAC;IACX,IAAIA,CAAC,YAAYS,KAAK,EAAE,OAAO;MAAEC,IAAI,EAAEV,CAAC,CAACU,IAAI;MAAEC,OAAO,EAAEX,CAAC,CAACW;IAAQ,CAAC;IACnE,IAAIX,CAAC,YAAYY,IAAI,EAAE,OAAOR,MAAM,CAACS,KAAK,CAACb,CAAC,CAACc,OAAO,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAGd,CAAC,CAACe,WAAW,CAAC,CAAC;IAC5F,IAAItB,KAAK,CAACC,OAAO,CAACM,CAAC,CAAC,EAAE,OAAOA,CAAC,CAACG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAACa,GAAG,CAACC,IAAI,IAAIlB,KAAK,CAACkB,IAAI,EAAEhB,KAAK,GAAG,CAAC,CAAC,CAAC;IAChF,MAAMiB,GAAyB,GAAG,CAAC,CAAC;IACpC,KAAK,MAAMC,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACrB,CAAC,CAAC,CAACG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;MAC9C,IAAI;QAAEiB,MAAM,CAACE,cAAc,CAACJ,GAAG,EAAEC,GAAG,EAAE;UAAE3B,KAAK,EAAEO,KAAK,CAAEC,CAAC,CAA6BmB,GAAG,CAAC,EAAElB,KAAK,GAAG,CAAC,CAAC;UAAEsB,UAAU,EAAE;QAAK,CAAC,CAAC;MAAE,CAAC,CAC5H,MAAM;QAAEL,GAAG,CAACC,GAAG,CAAC,GAAG,cAAc;MAAE;IACrC;IACA,OAAOD,GAAG;EACZ;EACA,OAAOnB,KAAK,CAACP,KAAK,EAAE,CAAC,CAAC;AACxB;;AAEA;AACA,OAAO,SAASgC,UAAUA,CAAChC,KAAa,EAAU;EAChD,IAAIiC,KAAK,GAAG,CAAC;EACb,KAAK,MAAMC,SAAS,IAAIlC,KAAK,EAAE;IAC7B,MAAMmC,EAAE,GAAGD,SAAS,CAACE,WAAW,CAAC,CAAC,CAAE;IACpCH,KAAK,IAAIE,EAAE,IAAI,IAAI,GAAG,CAAC,GAAGA,EAAE,IAAI,KAAK,GAAG,CAAC,GAAGA,EAAE,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC;EAClE;EACA,OAAOF,KAAK;AACd","ignoreList":[]}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ import { byteLength, object } from "./json";
4
+ export function composeSimulatorPayload(draft) {
5
+ const data = {
6
+ ...draft.data,
7
+ __buoyTestId: draft.testId
8
+ };
9
+ const aps = draft.silent ? {
10
+ "content-available": 1
11
+ } : {
12
+ alert: {
13
+ title: draft.title,
14
+ body: draft.body
15
+ },
16
+ sound: "default"
17
+ };
18
+ return JSON.stringify(draft.adapter === "expo" ? {
19
+ aps,
20
+ body: data
21
+ } : {
22
+ ...data,
23
+ aps
24
+ }, null, 2);
25
+ }
26
+ export function validateSimulatorPayload(source) {
27
+ const errors = [];
28
+ const warnings = [];
29
+ if (typeof source !== "string") return {
30
+ valid: false,
31
+ bytes: 0,
32
+ errors: ["Provide the APNs payload as JSON text."],
33
+ warnings,
34
+ testId: null
35
+ };
36
+ const bytes = byteLength(source);
37
+ if (bytes > 4096) errors.push(`Payload is ${bytes} bytes. APNs payloads must fit in 4096 UTF-8 bytes.`);
38
+ let parsed;
39
+ try {
40
+ parsed = JSON.parse(source);
41
+ } catch {
42
+ errors.push("Payload is not valid JSON.");
43
+ }
44
+ const value = object(parsed);
45
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) errors.push("The payload must be a JSON object.");
46
+ if (!value.aps || typeof value.aps !== "object" || Array.isArray(value.aps)) errors.push('The payload needs an "aps" object.');
47
+ const aps = object(value.aps);
48
+ if (aps.alert !== undefined && typeof aps.alert !== "string" && (aps.alert === null || typeof aps.alert !== "object" || Array.isArray(aps.alert))) errors.push("aps.alert must be text or an object.");
49
+ if (aps.badge !== undefined && (!Number.isInteger(aps.badge) || Number(aps.badge) < 0)) errors.push("aps.badge must be a non-negative integer.");
50
+ for (const key of ["content-available", "mutable-content"]) if (aps[key] !== undefined && aps[key] !== 1) errors.push(`aps.${key} must be 1 when present.`);
51
+ if (aps["content-available"] === 1) warnings.push("Background execution depends on app configuration and OS scheduling. A successful send does not prove the task ran.");
52
+ if (aps["mutable-content"] === 1) warnings.push("Use real APNs delivery to verify notification service extensions.");
53
+ if (value.data !== undefined && value.body === undefined) warnings.push("Expo on iOS reads custom data from a top-level body object. This raw payload will be sent unchanged.");
54
+ const testId = object(value.body).__buoyTestId ?? value.__buoyTestId;
55
+ return {
56
+ valid: errors.length === 0,
57
+ bytes,
58
+ errors,
59
+ warnings,
60
+ testId: typeof testId === "string" ? testId : null
61
+ };
62
+ }
63
+ //# sourceMappingURL=payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["byteLength","object","composeSimulatorPayload","draft","data","__buoyTestId","testId","aps","silent","alert","title","body","sound","JSON","stringify","adapter","validateSimulatorPayload","source","errors","warnings","valid","bytes","push","parsed","parse","value","Array","isArray","undefined","badge","Number","isInteger","key","length"],"sourceRoot":"../../src","sources":["payload.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ import React, { useSyncExternalStore } from "react";
4
+ import { createToolFactory, defineToolPreset, JsModal, NotificationsIcon } from "@buoy-gg/shared-ui";
5
+ import { NotificationToolView } from "./components/NotificationToolView";
6
+ import { notificationSyncAdapter } from "./runtime";
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ export function NotificationsModal(props) {
9
+ const snapshot = useSyncExternalStore(notificationSyncAdapter.subscribe, notificationSyncAdapter.getSnapshot);
10
+ return /*#__PURE__*/_jsx(NotificationToolView, {
11
+ snapshot: snapshot,
12
+ renderShell: ({
13
+ header,
14
+ body
15
+ }) => /*#__PURE__*/_jsx(JsModal, {
16
+ ...props,
17
+ persistenceKey: props.persistenceKey ?? "buoy-notifications",
18
+ variant: "night",
19
+ header: {
20
+ showToggleButton: true,
21
+ customContent: header
22
+ },
23
+ enablePersistence: true,
24
+ initialMode: "bottomSheet",
25
+ disableScrollWrapper: true,
26
+ children: body
27
+ }),
28
+ onAction: async (action, params) => {
29
+ const fn = notificationSyncAdapter.actions[action];
30
+ if (!fn) throw new Error("This notification action is unavailable.");
31
+ return fn(params);
32
+ }
33
+ });
34
+ }
35
+ export const notificationToolPreset = defineToolPreset({
36
+ id: "push-notifications",
37
+ name: "NOTIFICATIONS",
38
+ description: "Send a test notification and inspect how the app responds",
39
+ slot: "both",
40
+ icon: ({
41
+ size,
42
+ color
43
+ }) => /*#__PURE__*/_jsx(NotificationsIcon, {
44
+ size: size,
45
+ color: color
46
+ }),
47
+ component: NotificationsModal
48
+ });
49
+ export const createNotificationTool = createToolFactory(notificationToolPreset);
50
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useSyncExternalStore","createToolFactory","defineToolPreset","JsModal","NotificationsIcon","NotificationToolView","notificationSyncAdapter","jsx","_jsx","NotificationsModal","props","snapshot","subscribe","getSnapshot","renderShell","header","body","persistenceKey","variant","showToggleButton","customContent","enablePersistence","initialMode","disableScrollWrapper","children","onAction","action","params","fn","actions","Error","notificationToolPreset","id","name","description","slot","icon","size","color","component","createNotificationTool"],"sourceRoot":"../../src","sources":["preset.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,oBAAoB,QAAQ,OAAO;AACnD,SACEC,iBAAiB,EACjBC,gBAAgB,EAChBC,OAAO,EACPC,iBAAiB,QACZ,oBAAoB;AAE3B,SAASC,oBAAoB,QAAQ,mCAAmC;AACxE,SAASC,uBAAuB,QAAQ,WAAW;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEpD,OAAO,SAASC,kBAAkBA,CAACC,KAKlC,EAAE;EACD,MAAMC,QAAQ,GAAGX,oBAAoB,CACnCM,uBAAuB,CAACM,SAAS,EACjCN,uBAAuB,CAACO,WAC1B,CAAC;EACD,oBACEL,IAAA,CAACH,oBAAoB;IACnBM,QAAQ,EAAEA,QAAS;IACnBG,WAAW,EAAEA,CAAC;MAAEC,MAAM;MAAEC;IAAK,CAAC,kBAC5BR,IAAA,CAACL,OAAO;MAAA,GACFO,KAAK;MACTO,cAAc,EAAEP,KAAK,CAACO,cAAc,IAAI,oBAAqB;MAC7DC,OAAO,EAAC,OAAO;MACfH,MAAM,EAAE;QAAEI,gBAAgB,EAAE,IAAI;QAAEC,aAAa,EAAEL;MAAO,CAAE;MAC1DM,iBAAiB;MACjBC,WAAW,EAAC,aAAa;MACzBC,oBAAoB;MAAAC,QAAA,EAEnBR;IAAI,CACE,CACT;IACFS,QAAQ,EAAE,MAAAA,CAAOC,MAAM,EAAEC,MAAM,KAAK;MAClC,MAAMC,EAAE,GACNtB,uBAAuB,CAACuB,OAAO,CAI/BH,MAAM,CAAC;MACT,IAAI,CAACE,EAAE,EAAE,MAAM,IAAIE,KAAK,CAAC,0CAA0C,CAAC;MACpE,OAAOF,EAAE,CAACD,MAAM,CAAC;IACnB;EAAE,CACH,CAAC;AAEN;AACA,OAAO,MAAMI,sBAAsB,GAAG7B,gBAAgB,CAAC;EACrD8B,EAAE,EAAE,oBAAoB;EACxBC,IAAI,EAAE,eAAe;EACrBC,WAAW,EAAE,2DAA2D;EACxEC,IAAI,EAAE,MAAe;EACrBC,IAAI,EAAEA,CAAC;IAAEC,IAAI;IAAEC;EAAwC,CAAC,kBACtD9B,IAAA,CAACJ,iBAAiB;IAACiC,IAAI,EAAEA,IAAK;IAACC,KAAK,EAAEA;EAAM,CAAE,CAC/C;EACDC,SAAS,EAAE9B;AACb,CAAC,CAAC;AACF,OAAO,MAAM+B,sBAAsB,GAAGvC,iBAAiB,CAAC8B,sBAAsB,CAAC","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ /** Keep preview artwork self-contained and small enough for device snapshots. */
4
+ export function normalizePreviewAppearance(value) {
5
+ if (!value || typeof value !== "object") return undefined;
6
+ const result = {};
7
+ if (typeof value.appName === "string") result.appName = value.appName.trim().slice(0, 80);
8
+ if (typeof value.iconUri === "string" && value.iconUri.length <= 32768 && /^data:image\/(png|jpeg|webp);base64,[A-Za-z0-9+/]+={0,2}$/.test(value.iconUri)) result.iconUri = value.iconUri;
9
+ for (const key of ["backgroundColor", "textColor"]) {
10
+ if (typeof value[key] === "string" && /^#[0-9a-f]{6}$/i.test(value[key])) result[key] = value[key];
11
+ }
12
+ return Object.keys(result).length ? result : undefined;
13
+ }
14
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["normalizePreviewAppearance","value","undefined","result","appName","trim","slice","iconUri","length","test","key","Object","keys"],"sourceRoot":"../../src","sources":["preview.ts"],"mappings":";;AAEA;AACA,OAAO,SAASA,0BAA0BA,CACxCC,KAAqC,EACM;EAC3C,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOC,SAAS;EACzD,MAAMC,MAAqC,GAAG,CAAC,CAAC;EAChD,IAAI,OAAOF,KAAK,CAACG,OAAO,KAAK,QAAQ,EACnCD,MAAM,CAACC,OAAO,GAAGH,KAAK,CAACG,OAAO,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;EACpD,IACE,OAAOL,KAAK,CAACM,OAAO,KAAK,QAAQ,IACjCN,KAAK,CAACM,OAAO,CAACC,MAAM,IAAI,KAAK,IAC7B,2DAA2D,CAACC,IAAI,CAC9DR,KAAK,CAACM,OACR,CAAC,EAEDJ,MAAM,CAACI,OAAO,GAAGN,KAAK,CAACM,OAAO;EAChC,KAAK,MAAMG,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,EAAW;IAC3D,IAAI,OAAOT,KAAK,CAACS,GAAG,CAAC,KAAK,QAAQ,IAAI,iBAAiB,CAACD,IAAI,CAACR,KAAK,CAACS,GAAG,CAAE,CAAC,EACvEP,MAAM,CAACO,GAAG,CAAC,GAAGT,KAAK,CAACS,GAAG,CAAC;EAC5B;EACA,OAAOC,MAAM,CAACC,IAAI,CAACT,MAAM,CAAC,CAACK,MAAM,GAAGL,MAAM,GAAGD,SAAS;AACxD","ignoreList":[]}
@@ -0,0 +1,332 @@
1
+ "use strict";
2
+
3
+ import { byteLength, json, object, string } from "./json";
4
+ const PREFIX = "buoy.notifications.v1.";
5
+ const SESSION = PREFIX + "session";
6
+ const TOKENS = PREFIX + "tokens";
7
+ const EVENT = PREFIX + "event.";
8
+ const MAX_RECORD_BYTES = 16 * 1024;
9
+ const MAX_JOURNAL_BYTES = 512 * 1024;
10
+ const MAX_RECORDS = 200;
11
+ /** Recording runs independently of the desktop's snapshot subscriptions. */
12
+ export class NotificationRecorder {
13
+ state = {
14
+ version: 1,
15
+ ready: false,
16
+ provider: null,
17
+ providerVersion: null,
18
+ platform: "unknown",
19
+ appId: null,
20
+ capabilities: [],
21
+ durable: false,
22
+ storageError: null,
23
+ evicted: 0,
24
+ session: null,
25
+ events: [],
26
+ tokens: [],
27
+ permissions: null,
28
+ presented: null
29
+ };
30
+ listeners = new Set();
31
+ sequence = 0;
32
+ queue = Promise.resolve();
33
+ constructor(options = {}) {
34
+ this.options = options;
35
+ this.now = options.now ?? Date.now;
36
+ this.processId = options.processId ?? `${this.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
37
+ this.state.durable = !!options.storage && options.durable === true;
38
+ this.ready = this.hydrate();
39
+ this.queue = this.ready;
40
+ }
41
+ getSnapshot = () => this.state;
42
+ subscribe = listener => {
43
+ this.listeners.add(listener);
44
+ return () => {
45
+ this.listeners.delete(listener);
46
+ };
47
+ };
48
+ update(patch) {
49
+ this.state = {
50
+ ...this.state,
51
+ ...patch
52
+ };
53
+ for (const listener of this.listeners) {
54
+ try {
55
+ listener();
56
+ } catch {/* Observers cannot interrupt app callbacks. */}
57
+ }
58
+ }
59
+ configure(patch) {
60
+ this.update(patch);
61
+ }
62
+ allowed() {
63
+ return this.options.enabled?.() ?? true;
64
+ }
65
+ storageFailure(error) {
66
+ this.update({
67
+ storageError: error instanceof Error ? error.message : String(error),
68
+ durable: false
69
+ });
70
+ }
71
+ serial(task) {
72
+ const next = this.queue.then(task);
73
+ this.queue = next.catch(() => {});
74
+ return next;
75
+ }
76
+ async hydrate() {
77
+ if (!this.allowed()) {
78
+ this.update({
79
+ ready: true
80
+ });
81
+ return;
82
+ }
83
+ if (this.options.durability) {
84
+ try {
85
+ this.update({
86
+ durable: await this.options.durability
87
+ });
88
+ } catch (error) {
89
+ this.storageFailure(error);
90
+ }
91
+ }
92
+ const storage = this.options.storage;
93
+ let explicitlyStopped = false;
94
+ if (storage) try {
95
+ const rawSession = await storage.getItem(SESSION);
96
+ explicitlyStopped = rawSession === "null";
97
+ if (rawSession) {
98
+ const s = JSON.parse(rawSession);
99
+ if (s && typeof s.runId === "string" && Number.isFinite(s.expiresAt) && s.expiresAt > this.now()) this.update({
100
+ session: s
101
+ });
102
+ }
103
+ const rawTokens = await storage.getItem(TOKENS);
104
+ if (rawTokens) {
105
+ const tokens = JSON.parse(rawTokens);
106
+ if (Array.isArray(tokens)) this.update({
107
+ tokens: tokens.filter(t => t && ["apns", "fcm", "expo"].includes(t.type) && typeof t.value === "string").slice(-10)
108
+ });
109
+ }
110
+ const keys = (await storage.getAllKeys()).filter(key => key.startsWith(EVENT)).sort();
111
+ const records = [];
112
+ for (const key of keys) {
113
+ try {
114
+ const raw = await storage.getItem(key);
115
+ if (!raw || byteLength(raw) > MAX_RECORD_BYTES) {
116
+ await storage.removeItem(key);
117
+ continue;
118
+ }
119
+ const record = JSON.parse(raw);
120
+ if (typeof record.id === "string" && typeof record.kind === "string" && Number.isFinite(record.capturedAt)) records.push(record);else await storage.removeItem(key);
121
+ } catch {
122
+ await storage.removeItem(key);
123
+ }
124
+ }
125
+ records.sort((a, b) => a.capturedAt - b.capturedAt || a.sequence - b.sequence || a.id.localeCompare(b.id));
126
+ this.update({
127
+ events: records
128
+ });
129
+ await this.prune();
130
+ } catch (error) {
131
+ this.storageFailure(error);
132
+ }
133
+ if (this.options.autoStart && !this.state.session && !explicitlyStopped) {
134
+ const startedAt = this.now();
135
+ const session = {
136
+ runId: this.processId,
137
+ startedAt,
138
+ expiresAt: startedAt + 30 * 60 * 1000
139
+ };
140
+ try {
141
+ await storage?.setItem(SESSION, JSON.stringify(session));
142
+ } catch (error) {
143
+ this.storageFailure(error);
144
+ }
145
+ this.update({
146
+ session
147
+ });
148
+ }
149
+ this.update({
150
+ ready: true
151
+ });
152
+ }
153
+ async setCaptureSession(runId, durationMs = 30 * 60 * 1000) {
154
+ if (!this.allowed()) throw new Error("Notification capture is disabled in this build.");
155
+ 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.");
156
+ if (!Number.isFinite(durationMs) || durationMs < 1000 || durationMs > 60 * 60 * 1000) throw new Error("Capture duration must be between 1 second and 1 hour.");
157
+ return this.serial(async () => {
158
+ const startedAt = this.now();
159
+ const session = runId === null ? null : {
160
+ runId,
161
+ startedAt,
162
+ expiresAt: startedAt + durationMs
163
+ };
164
+ try {
165
+ if (this.options.storage) await this.options.storage.setItem(SESSION, JSON.stringify(session));
166
+ } catch (error) {
167
+ this.storageFailure(error);
168
+ throw new Error("Could not persist the capture session. Keep the app open and check storage.");
169
+ }
170
+ this.update({
171
+ session
172
+ });
173
+ return {
174
+ session,
175
+ durable: this.state.durable
176
+ };
177
+ });
178
+ }
179
+ record(kind, raw, metadata = {}) {
180
+ const capturedAt = this.now();
181
+ const observedAppState = this.options.appState?.() ?? "unknown";
182
+ const clean = json(raw);
183
+ return this.serial(async () => {
184
+ if (!this.allowed()) return null;
185
+ const session = this.state.session;
186
+ if (!session || session.expiresAt <= capturedAt) {
187
+ if (session) this.update({
188
+ session: null
189
+ });
190
+ return null;
191
+ }
192
+ const clipped = (value, max = 512) => typeof value === "string" ? value.slice(0, max) : null;
193
+ const dedupeKey = clipped(metadata.dedupeKey, 2048);
194
+ if (dedupeKey && this.state.events.some(e => e.dedupeKey === dedupeKey)) return null;
195
+ const record = {
196
+ id: `${this.processId}-${++this.sequence}`,
197
+ processId: this.processId,
198
+ sequence: this.sequence,
199
+ capturedAt,
200
+ runId: session.runId,
201
+ kind,
202
+ provider: clipped(metadata.provider, 64) ?? this.state.provider ?? "app",
203
+ observedAppState,
204
+ notificationId: clipped(metadata.notificationId),
205
+ testId: clipped(metadata.testId),
206
+ title: clipped(metadata.title, 1024),
207
+ actionIdentifier: clipped(metadata.actionIdentifier),
208
+ ...(dedupeKey ? {
209
+ dedupeKey
210
+ } : {}),
211
+ raw: clean
212
+ };
213
+ if (byteLength(JSON.stringify(record)) > MAX_RECORD_BYTES) {
214
+ record.raw = {
215
+ note: "Payload exceeded the 16 KiB capture limit."
216
+ };
217
+ record.truncated = true;
218
+ }
219
+ this.update({
220
+ events: [...this.state.events, record]
221
+ });
222
+ try {
223
+ await this.options.storage?.setItem(EVENT + record.id, JSON.stringify(record));
224
+ } catch (error) {
225
+ this.storageFailure(error);
226
+ }
227
+ // Keep the in-memory bound even when the disk is full or unavailable.
228
+ try {
229
+ await this.prune();
230
+ } catch (error) {
231
+ this.storageFailure(error);
232
+ }
233
+ return record;
234
+ });
235
+ }
236
+ async prune() {
237
+ const events = [...this.state.events];
238
+ const sizes = events.map(e => byteLength(JSON.stringify(e)));
239
+ let bytes = sizes.reduce((sum, size) => sum + size, 0);
240
+ const removed = [];
241
+ while (events.length > MAX_RECORDS || bytes > MAX_JOURNAL_BYTES) {
242
+ removed.push(events.shift());
243
+ bytes -= sizes.shift();
244
+ }
245
+ if (removed.length) this.update({
246
+ events,
247
+ evicted: this.state.evicted + removed.length
248
+ });
249
+ for (const event of removed) await this.options.storage?.removeItem(EVENT + event.id);
250
+ }
251
+ async clearCapturedEvents() {
252
+ return this.serial(async () => {
253
+ const events = this.state.events;
254
+ for (const event of events) await this.options.storage?.removeItem(EVENT + event.id);
255
+ this.update({
256
+ events: [],
257
+ evicted: 0
258
+ });
259
+ return {
260
+ cleared: true
261
+ };
262
+ });
263
+ }
264
+ async observeToken(type, value, metadata = {}) {
265
+ if (!this.allowed()) return;
266
+ if (!value || value.length > 8192) throw new Error("The notification token is empty or too long.");
267
+ return this.serial(async () => {
268
+ const token = {
269
+ type,
270
+ value,
271
+ observedAt: this.now(),
272
+ ...(typeof metadata.projectId === "string" ? {
273
+ projectId: metadata.projectId.slice(0, 256)
274
+ } : {}),
275
+ ...(typeof metadata.environment === "string" ? {
276
+ environment: metadata.environment.slice(0, 256)
277
+ } : {})
278
+ };
279
+ const tokens = [...this.state.tokens.filter(t => !(t.type === type && t.projectId === metadata.projectId && t.environment === metadata.environment)), token].slice(-10);
280
+ this.update({
281
+ tokens
282
+ });
283
+ try {
284
+ await this.options.storage?.setItem(TOKENS, JSON.stringify(tokens));
285
+ } catch (error) {
286
+ this.storageFailure(error);
287
+ }
288
+ });
289
+ }
290
+ setPermissions(permissions) {
291
+ const value = json(permissions);
292
+ this.update({
293
+ permissions: byteLength(JSON.stringify(value)) <= MAX_RECORD_BYTES ? value : {
294
+ note: "Permission result exceeded the capture limit."
295
+ }
296
+ });
297
+ }
298
+ setPresented(presented) {
299
+ const value = json(presented);
300
+ if (byteLength(JSON.stringify(value)) <= 128 * 1024) this.update({
301
+ presented: value
302
+ });else this.update({
303
+ presented: {
304
+ note: "System tray result exceeded 128 KiB. Inspect fewer presented notifications in the app.",
305
+ count: Array.isArray(presented) ? presented.length : null
306
+ }
307
+ });
308
+ }
309
+ async flush() {
310
+ await this.queue;
311
+ }
312
+ }
313
+ export function expoMetadata(value) {
314
+ const raw = object(value);
315
+ const notification = object(raw.notification ?? value);
316
+ const request = object(notification.request);
317
+ const content = object(request.content);
318
+ const payload = object(object(request.trigger).payload);
319
+ const data = object(content.data ?? payload.body);
320
+ return {
321
+ notificationId: string(request.identifier),
322
+ testId: string(data.__buoyTestId),
323
+ title: string(content.title),
324
+ actionIdentifier: string(raw.actionIdentifier)
325
+ };
326
+ }
327
+ export function responseKey(value) {
328
+ const raw = object(value);
329
+ const notification = object(raw.notification);
330
+ return JSON.stringify([object(notification.request).identifier, notification.date, raw.actionIdentifier, raw.userText]);
331
+ }
332
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["byteLength","json","object","string","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","removeItem","record","id","kind","capturedAt","push","a","b","localeCompare","prune","autoStart","startedAt","setItem","stringify","setCaptureSession","durationMs","trim","length","metadata","observedAppState","appState","clean","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","expoMetadata","notification","request","content","payload","trigger","data","body","identifier","__buoyTestId","responseKey","date","userText"],"sourceRoot":"../../src","sources":["recorder.ts"],"mappings":"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","ignoreList":[]}