@chipmobilesdk/rn-notification 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/CHANGELOG.md +184 -0
  2. package/README.md +108 -16
  3. package/lib/commonjs/advanced.js +139 -0
  4. package/lib/commonjs/advanced.js.map +1 -0
  5. package/lib/commonjs/channel/migrate.js +246 -0
  6. package/lib/commonjs/channel/migrate.js.map +1 -0
  7. package/lib/commonjs/channel/tone-map.js +120 -0
  8. package/lib/commonjs/channel/tone-map.js.map +1 -0
  9. package/lib/commonjs/channel/validate-tone.js +61 -0
  10. package/lib/commonjs/channel/validate-tone.js.map +1 -0
  11. package/lib/commonjs/contract/channel.js +52 -0
  12. package/lib/commonjs/contract/channel.js.map +1 -0
  13. package/lib/commonjs/contract/diagnostics.js +25 -0
  14. package/lib/commonjs/contract/diagnostics.js.map +1 -0
  15. package/lib/commonjs/contract/errors.js +126 -0
  16. package/lib/commonjs/contract/errors.js.map +1 -0
  17. package/lib/commonjs/contract/hash.js +35 -0
  18. package/lib/commonjs/contract/hash.js.map +1 -0
  19. package/lib/commonjs/contract/index.js +94 -0
  20. package/lib/commonjs/contract/index.js.map +1 -0
  21. package/lib/commonjs/contract/interaction.js +37 -0
  22. package/lib/commonjs/contract/interaction.js.map +1 -0
  23. package/lib/commonjs/contract/notification.js +42 -0
  24. package/lib/commonjs/contract/notification.js.map +1 -0
  25. package/lib/commonjs/contract/permission.js +2 -0
  26. package/lib/commonjs/contract/permission.js.map +1 -0
  27. package/lib/commonjs/contract/reconcile.js +6 -0
  28. package/lib/commonjs/contract/reconcile.js.map +1 -0
  29. package/lib/commonjs/contract/recurrence.js +53 -0
  30. package/lib/commonjs/contract/recurrence.js.map +1 -0
  31. package/lib/commonjs/diagnostics/burst.js +89 -0
  32. package/lib/commonjs/diagnostics/burst.js.map +1 -0
  33. package/lib/commonjs/diagnostics/events.js +63 -0
  34. package/lib/commonjs/diagnostics/events.js.map +1 -0
  35. package/lib/commonjs/diagnostics/redact.js +48 -0
  36. package/lib/commonjs/diagnostics/redact.js.map +1 -0
  37. package/lib/commonjs/diagnostics/snapshot.js +68 -0
  38. package/lib/commonjs/diagnostics/snapshot.js.map +1 -0
  39. package/lib/commonjs/engine/adapter.js +6 -0
  40. package/lib/commonjs/engine/adapter.js.map +1 -0
  41. package/lib/commonjs/engine/codec.js +84 -0
  42. package/lib/commonjs/engine/codec.js.map +1 -0
  43. package/lib/commonjs/engine/notify-kit/events.js +148 -0
  44. package/lib/commonjs/engine/notify-kit/events.js.map +1 -0
  45. package/lib/commonjs/engine/notify-kit/module.js +119 -0
  46. package/lib/commonjs/engine/notify-kit/module.js.map +1 -0
  47. package/lib/commonjs/engine/notify-kit/platform/android.js +159 -0
  48. package/lib/commonjs/engine/notify-kit/platform/android.js.map +1 -0
  49. package/lib/commonjs/engine/notify-kit/platform/index.js +57 -0
  50. package/lib/commonjs/engine/notify-kit/platform/index.js.map +1 -0
  51. package/lib/commonjs/engine/notify-kit/platform/ios.js +54 -0
  52. package/lib/commonjs/engine/notify-kit/platform/ios.js.map +1 -0
  53. package/lib/commonjs/engine/notify-kit/platform/types.js +6 -0
  54. package/lib/commonjs/engine/notify-kit/platform/types.js.map +1 -0
  55. package/lib/commonjs/engine/notify-kit-engine.js +260 -0
  56. package/lib/commonjs/engine/notify-kit-engine.js.map +1 -0
  57. package/lib/commonjs/index.js +367 -0
  58. package/lib/commonjs/index.js.map +1 -0
  59. package/lib/commonjs/initialize.js +187 -0
  60. package/lib/commonjs/initialize.js.map +1 -0
  61. package/lib/commonjs/interaction/index.js +120 -0
  62. package/lib/commonjs/interaction/index.js.map +1 -0
  63. package/lib/commonjs/maintenance/cycle.js +108 -0
  64. package/lib/commonjs/maintenance/cycle.js.map +1 -0
  65. package/lib/commonjs/maintenance/permission-refresh.js +39 -0
  66. package/lib/commonjs/maintenance/permission-refresh.js.map +1 -0
  67. package/lib/commonjs/maintenance/reanchor.js +99 -0
  68. package/lib/commonjs/maintenance/reanchor.js.map +1 -0
  69. package/lib/commonjs/maintenance/toggle.js +50 -0
  70. package/lib/commonjs/maintenance/toggle.js.map +1 -0
  71. package/lib/commonjs/maintenance/verify.js +70 -0
  72. package/lib/commonjs/maintenance/verify.js.map +1 -0
  73. package/lib/commonjs/maintenance/window-refresh.js +53 -0
  74. package/lib/commonjs/maintenance/window-refresh.js.map +1 -0
  75. package/lib/commonjs/notifications.js +161 -0
  76. package/lib/commonjs/notifications.js.map +1 -0
  77. package/lib/commonjs/package.json +1 -0
  78. package/lib/commonjs/permission/index.js +182 -0
  79. package/lib/commonjs/permission/index.js.map +1 -0
  80. package/lib/commonjs/permission/state.js +92 -0
  81. package/lib/commonjs/permission/state.js.map +1 -0
  82. package/lib/commonjs/push/envelope.js +141 -0
  83. package/lib/commonjs/push/envelope.js.map +1 -0
  84. package/lib/commonjs/push/fcm-provider.js +122 -0
  85. package/lib/commonjs/push/fcm-provider.js.map +1 -0
  86. package/lib/commonjs/push/gate.js +162 -0
  87. package/lib/commonjs/push/gate.js.map +1 -0
  88. package/lib/commonjs/push/index.js +47 -0
  89. package/lib/commonjs/push/index.js.map +1 -0
  90. package/lib/commonjs/push/instructions.js +101 -0
  91. package/lib/commonjs/push/instructions.js.map +1 -0
  92. package/lib/commonjs/push/provider-adapter.js +6 -0
  93. package/lib/commonjs/push/provider-adapter.js.map +1 -0
  94. package/lib/commonjs/push/signout.js +55 -0
  95. package/lib/commonjs/push/signout.js.map +1 -0
  96. package/lib/commonjs/reconcile/chunk.js +49 -0
  97. package/lib/commonjs/reconcile/chunk.js.map +1 -0
  98. package/lib/commonjs/reconcile/diff.js +105 -0
  99. package/lib/commonjs/reconcile/diff.js.map +1 -0
  100. package/lib/commonjs/reconcile/duplicates.js +60 -0
  101. package/lib/commonjs/reconcile/duplicates.js.map +1 -0
  102. package/lib/commonjs/reconcile/index.js +164 -0
  103. package/lib/commonjs/reconcile/index.js.map +1 -0
  104. package/lib/commonjs/reconcile/truncate.js +50 -0
  105. package/lib/commonjs/reconcile/truncate.js.map +1 -0
  106. package/lib/commonjs/recurrence/clock-guard.js +65 -0
  107. package/lib/commonjs/recurrence/clock-guard.js.map +1 -0
  108. package/lib/commonjs/recurrence/expand.js +254 -0
  109. package/lib/commonjs/recurrence/expand.js.map +1 -0
  110. package/lib/commonjs/recurrence/index.js +212 -0
  111. package/lib/commonjs/recurrence/index.js.map +1 -0
  112. package/lib/commonjs/repeat/expiry.js +41 -0
  113. package/lib/commonjs/repeat/expiry.js.map +1 -0
  114. package/lib/commonjs/repeat/index.js +100 -0
  115. package/lib/commonjs/repeat/index.js.map +1 -0
  116. package/lib/commonjs/repeat/marker.js +58 -0
  117. package/lib/commonjs/repeat/marker.js.map +1 -0
  118. package/lib/commonjs/repeat/place.js +83 -0
  119. package/lib/commonjs/repeat/place.js.map +1 -0
  120. package/lib/commonjs/schedule/anchor.js +243 -0
  121. package/lib/commonjs/schedule/anchor.js.map +1 -0
  122. package/lib/commonjs/schedule/index.js +142 -0
  123. package/lib/commonjs/schedule/index.js.map +1 -0
  124. package/lib/commonjs/schedule/partition.js +59 -0
  125. package/lib/commonjs/schedule/partition.js.map +1 -0
  126. package/lib/commonjs/schedule/resolve-moment.js +72 -0
  127. package/lib/commonjs/schedule/resolve-moment.js.map +1 -0
  128. package/lib/commonjs/schedule/validate-content.js +101 -0
  129. package/lib/commonjs/schedule/validate-content.js.map +1 -0
  130. package/lib/commonjs/schedule/validate-identifier.js +126 -0
  131. package/lib/commonjs/schedule/validate-identifier.js.map +1 -0
  132. package/lib/commonjs/schedule/writer.js +44 -0
  133. package/lib/commonjs/schedule/writer.js.map +1 -0
  134. package/lib/commonjs/state/caps.js +101 -0
  135. package/lib/commonjs/state/caps.js.map +1 -0
  136. package/lib/commonjs/state/dedup-ledger.js +39 -0
  137. package/lib/commonjs/state/dedup-ledger.js.map +1 -0
  138. package/lib/commonjs/state/interaction-buffer.js +98 -0
  139. package/lib/commonjs/state/interaction-buffer.js.map +1 -0
  140. package/lib/commonjs/state/mmkv-store.js +75 -0
  141. package/lib/commonjs/state/mmkv-store.js.map +1 -0
  142. package/lib/commonjs/state/permission-history.js +64 -0
  143. package/lib/commonjs/state/permission-history.js.map +1 -0
  144. package/lib/commonjs/state/record.js +269 -0
  145. package/lib/commonjs/state/record.js.map +1 -0
  146. package/lib/commonjs/state/reset.js +37 -0
  147. package/lib/commonjs/state/reset.js.map +1 -0
  148. package/lib/commonjs/state/series-ledger.js +71 -0
  149. package/lib/commonjs/state/series-ledger.js.map +1 -0
  150. package/lib/commonjs/state/store.js +39 -0
  151. package/lib/commonjs/state/store.js.map +1 -0
  152. package/lib/commonjs/testing/conformance/index.js +218 -0
  153. package/lib/commonjs/testing/conformance/index.js.map +1 -0
  154. package/lib/commonjs/testing/fake-engine.js +338 -0
  155. package/lib/commonjs/testing/fake-engine.js.map +1 -0
  156. package/lib/commonjs/testing/fake-provider.js +93 -0
  157. package/lib/commonjs/testing/fake-provider.js.map +1 -0
  158. package/lib/commonjs/testing/faults.js +59 -0
  159. package/lib/commonjs/testing/faults.js.map +1 -0
  160. package/lib/commonjs/testing/index.js +54 -0
  161. package/lib/commonjs/testing/index.js.map +1 -0
  162. package/lib/commonjs/testing/measure.js +298 -0
  163. package/lib/commonjs/testing/measure.js.map +1 -0
  164. package/lib/module/advanced.js +29 -0
  165. package/lib/module/advanced.js.map +1 -0
  166. package/lib/module/channel/migrate.js +242 -0
  167. package/lib/module/channel/migrate.js.map +1 -0
  168. package/lib/module/channel/tone-map.js +112 -0
  169. package/lib/module/channel/tone-map.js.map +1 -0
  170. package/lib/module/channel/validate-tone.js +57 -0
  171. package/lib/module/channel/validate-tone.js.map +1 -0
  172. package/lib/module/contract/channel.js +48 -0
  173. package/lib/module/contract/channel.js.map +1 -0
  174. package/lib/module/contract/diagnostics.js +21 -0
  175. package/lib/module/contract/diagnostics.js.map +1 -0
  176. package/lib/module/contract/errors.js +119 -0
  177. package/lib/module/contract/errors.js.map +1 -0
  178. package/lib/module/contract/hash.js +29 -0
  179. package/lib/module/contract/hash.js.map +1 -0
  180. package/lib/module/contract/index.js +13 -0
  181. package/lib/module/contract/index.js.map +1 -0
  182. package/lib/module/contract/interaction.js +33 -0
  183. package/lib/module/contract/interaction.js.map +1 -0
  184. package/lib/module/contract/notification.js +38 -0
  185. package/lib/module/contract/notification.js.map +1 -0
  186. package/lib/module/contract/permission.js +2 -0
  187. package/lib/module/contract/permission.js.map +1 -0
  188. package/lib/module/contract/reconcile.js +4 -0
  189. package/lib/module/contract/reconcile.js.map +1 -0
  190. package/lib/module/contract/recurrence.js +49 -0
  191. package/lib/module/contract/recurrence.js.map +1 -0
  192. package/lib/module/diagnostics/burst.js +85 -0
  193. package/lib/module/diagnostics/burst.js.map +1 -0
  194. package/lib/module/diagnostics/events.js +58 -0
  195. package/lib/module/diagnostics/events.js.map +1 -0
  196. package/lib/module/diagnostics/redact.js +44 -0
  197. package/lib/module/diagnostics/redact.js.map +1 -0
  198. package/lib/module/diagnostics/snapshot.js +64 -0
  199. package/lib/module/diagnostics/snapshot.js.map +1 -0
  200. package/lib/module/engine/adapter.js +4 -0
  201. package/lib/module/engine/adapter.js.map +1 -0
  202. package/lib/module/engine/codec.js +79 -0
  203. package/lib/module/engine/codec.js.map +1 -0
  204. package/lib/module/engine/notify-kit/events.js +139 -0
  205. package/lib/module/engine/notify-kit/events.js.map +1 -0
  206. package/lib/module/engine/notify-kit/module.js +113 -0
  207. package/lib/module/engine/notify-kit/module.js.map +1 -0
  208. package/lib/module/engine/notify-kit/platform/android.js +155 -0
  209. package/lib/module/engine/notify-kit/platform/android.js.map +1 -0
  210. package/lib/module/engine/notify-kit/platform/index.js +51 -0
  211. package/lib/module/engine/notify-kit/platform/index.js.map +1 -0
  212. package/lib/module/engine/notify-kit/platform/ios.js +49 -0
  213. package/lib/module/engine/notify-kit/platform/ios.js.map +1 -0
  214. package/lib/module/engine/notify-kit/platform/types.js +4 -0
  215. package/lib/module/engine/notify-kit/platform/types.js.map +1 -0
  216. package/lib/module/engine/notify-kit-engine.js +257 -0
  217. package/lib/module/engine/notify-kit-engine.js.map +1 -0
  218. package/lib/module/index.js +98 -0
  219. package/lib/module/index.js.map +1 -0
  220. package/lib/module/initialize.js +182 -0
  221. package/lib/module/initialize.js.map +1 -0
  222. package/lib/module/interaction/index.js +116 -0
  223. package/lib/module/interaction/index.js.map +1 -0
  224. package/lib/module/maintenance/cycle.js +102 -0
  225. package/lib/module/maintenance/cycle.js.map +1 -0
  226. package/lib/module/maintenance/permission-refresh.js +34 -0
  227. package/lib/module/maintenance/permission-refresh.js.map +1 -0
  228. package/lib/module/maintenance/reanchor.js +94 -0
  229. package/lib/module/maintenance/reanchor.js.map +1 -0
  230. package/lib/module/maintenance/toggle.js +45 -0
  231. package/lib/module/maintenance/toggle.js.map +1 -0
  232. package/lib/module/maintenance/verify.js +65 -0
  233. package/lib/module/maintenance/verify.js.map +1 -0
  234. package/lib/module/maintenance/window-refresh.js +48 -0
  235. package/lib/module/maintenance/window-refresh.js.map +1 -0
  236. package/lib/module/notifications.js +157 -0
  237. package/lib/module/notifications.js.map +1 -0
  238. package/lib/module/package.json +1 -0
  239. package/lib/module/permission/index.js +178 -0
  240. package/lib/module/permission/index.js.map +1 -0
  241. package/lib/module/permission/state.js +83 -0
  242. package/lib/module/permission/state.js.map +1 -0
  243. package/lib/module/push/envelope.js +137 -0
  244. package/lib/module/push/envelope.js.map +1 -0
  245. package/lib/module/push/fcm-provider.js +119 -0
  246. package/lib/module/push/fcm-provider.js.map +1 -0
  247. package/lib/module/push/gate.js +158 -0
  248. package/lib/module/push/gate.js.map +1 -0
  249. package/lib/module/push/index.js +16 -0
  250. package/lib/module/push/index.js.map +1 -0
  251. package/lib/module/push/instructions.js +97 -0
  252. package/lib/module/push/instructions.js.map +1 -0
  253. package/lib/module/push/provider-adapter.js +4 -0
  254. package/lib/module/push/provider-adapter.js.map +1 -0
  255. package/lib/module/push/signout.js +51 -0
  256. package/lib/module/push/signout.js.map +1 -0
  257. package/lib/module/reconcile/chunk.js +43 -0
  258. package/lib/module/reconcile/chunk.js.map +1 -0
  259. package/lib/module/reconcile/diff.js +101 -0
  260. package/lib/module/reconcile/diff.js.map +1 -0
  261. package/lib/module/reconcile/duplicates.js +56 -0
  262. package/lib/module/reconcile/duplicates.js.map +1 -0
  263. package/lib/module/reconcile/index.js +161 -0
  264. package/lib/module/reconcile/index.js.map +1 -0
  265. package/lib/module/reconcile/truncate.js +46 -0
  266. package/lib/module/reconcile/truncate.js.map +1 -0
  267. package/lib/module/recurrence/clock-guard.js +60 -0
  268. package/lib/module/recurrence/clock-guard.js.map +1 -0
  269. package/lib/module/recurrence/expand.js +248 -0
  270. package/lib/module/recurrence/expand.js.map +1 -0
  271. package/lib/module/recurrence/index.js +208 -0
  272. package/lib/module/recurrence/index.js.map +1 -0
  273. package/lib/module/repeat/expiry.js +37 -0
  274. package/lib/module/repeat/expiry.js.map +1 -0
  275. package/lib/module/repeat/index.js +67 -0
  276. package/lib/module/repeat/index.js.map +1 -0
  277. package/lib/module/repeat/marker.js +51 -0
  278. package/lib/module/repeat/marker.js.map +1 -0
  279. package/lib/module/repeat/place.js +79 -0
  280. package/lib/module/repeat/place.js.map +1 -0
  281. package/lib/module/schedule/anchor.js +234 -0
  282. package/lib/module/schedule/anchor.js.map +1 -0
  283. package/lib/module/schedule/index.js +137 -0
  284. package/lib/module/schedule/index.js.map +1 -0
  285. package/lib/module/schedule/partition.js +53 -0
  286. package/lib/module/schedule/partition.js.map +1 -0
  287. package/lib/module/schedule/resolve-moment.js +66 -0
  288. package/lib/module/schedule/resolve-moment.js.map +1 -0
  289. package/lib/module/schedule/validate-content.js +95 -0
  290. package/lib/module/schedule/validate-content.js.map +1 -0
  291. package/lib/module/schedule/validate-identifier.js +119 -0
  292. package/lib/module/schedule/validate-identifier.js.map +1 -0
  293. package/lib/module/schedule/writer.js +40 -0
  294. package/lib/module/schedule/writer.js.map +1 -0
  295. package/lib/module/state/caps.js +96 -0
  296. package/lib/module/state/caps.js.map +1 -0
  297. package/lib/module/state/dedup-ledger.js +34 -0
  298. package/lib/module/state/dedup-ledger.js.map +1 -0
  299. package/lib/module/state/interaction-buffer.js +92 -0
  300. package/lib/module/state/interaction-buffer.js.map +1 -0
  301. package/lib/module/state/mmkv-store.js +71 -0
  302. package/lib/module/state/mmkv-store.js.map +1 -0
  303. package/lib/module/state/permission-history.js +56 -0
  304. package/lib/module/state/permission-history.js.map +1 -0
  305. package/lib/module/state/record.js +264 -0
  306. package/lib/module/state/record.js.map +1 -0
  307. package/lib/module/state/reset.js +32 -0
  308. package/lib/module/state/reset.js.map +1 -0
  309. package/lib/module/state/series-ledger.js +62 -0
  310. package/lib/module/state/series-ledger.js.map +1 -0
  311. package/lib/module/state/store.js +35 -0
  312. package/lib/module/state/store.js.map +1 -0
  313. package/lib/module/testing/conformance/index.js +214 -0
  314. package/lib/module/testing/conformance/index.js.map +1 -0
  315. package/lib/module/testing/fake-engine.js +335 -0
  316. package/lib/module/testing/fake-engine.js.map +1 -0
  317. package/lib/module/testing/fake-provider.js +89 -0
  318. package/lib/module/testing/fake-provider.js.map +1 -0
  319. package/lib/module/testing/faults.js +55 -0
  320. package/lib/module/testing/faults.js.map +1 -0
  321. package/lib/module/testing/index.js +19 -0
  322. package/lib/module/testing/index.js.map +1 -0
  323. package/lib/module/testing/measure.js +294 -0
  324. package/lib/module/testing/measure.js.map +1 -0
  325. package/lib/typescript/commonjs/advanced.d.ts +36 -0
  326. package/lib/typescript/commonjs/advanced.d.ts.map +1 -0
  327. package/lib/typescript/commonjs/channel/migrate.d.ts +38 -0
  328. package/lib/typescript/commonjs/channel/migrate.d.ts.map +1 -0
  329. package/lib/typescript/commonjs/channel/tone-map.d.ts +34 -0
  330. package/lib/typescript/commonjs/channel/tone-map.d.ts.map +1 -0
  331. package/lib/typescript/commonjs/channel/validate-tone.d.ts +23 -0
  332. package/lib/typescript/commonjs/channel/validate-tone.d.ts.map +1 -0
  333. package/lib/typescript/commonjs/contract/channel.d.ts +185 -0
  334. package/lib/typescript/commonjs/contract/channel.d.ts.map +1 -0
  335. package/lib/typescript/commonjs/contract/diagnostics.d.ts +92 -0
  336. package/lib/typescript/commonjs/contract/diagnostics.d.ts.map +1 -0
  337. package/lib/typescript/commonjs/contract/errors.d.ts +91 -0
  338. package/lib/typescript/commonjs/contract/errors.d.ts.map +1 -0
  339. package/lib/typescript/commonjs/contract/hash.d.ts +14 -0
  340. package/lib/typescript/commonjs/contract/hash.d.ts.map +1 -0
  341. package/lib/typescript/commonjs/contract/index.d.ts +10 -0
  342. package/lib/typescript/commonjs/contract/index.d.ts.map +1 -0
  343. package/lib/typescript/commonjs/contract/interaction.d.ts +53 -0
  344. package/lib/typescript/commonjs/contract/interaction.d.ts.map +1 -0
  345. package/lib/typescript/commonjs/contract/notification.d.ts +110 -0
  346. package/lib/typescript/commonjs/contract/notification.d.ts.map +1 -0
  347. package/lib/typescript/commonjs/contract/permission.d.ts +49 -0
  348. package/lib/typescript/commonjs/contract/permission.d.ts.map +1 -0
  349. package/lib/typescript/commonjs/contract/reconcile.d.ts +82 -0
  350. package/lib/typescript/commonjs/contract/reconcile.d.ts.map +1 -0
  351. package/lib/typescript/commonjs/contract/recurrence.d.ts +118 -0
  352. package/lib/typescript/commonjs/contract/recurrence.d.ts.map +1 -0
  353. package/lib/typescript/commonjs/diagnostics/burst.d.ts +39 -0
  354. package/lib/typescript/commonjs/diagnostics/burst.d.ts.map +1 -0
  355. package/lib/typescript/commonjs/diagnostics/events.d.ts +28 -0
  356. package/lib/typescript/commonjs/diagnostics/events.d.ts.map +1 -0
  357. package/lib/typescript/commonjs/diagnostics/redact.d.ts +22 -0
  358. package/lib/typescript/commonjs/diagnostics/redact.d.ts.map +1 -0
  359. package/lib/typescript/commonjs/diagnostics/snapshot.d.ts +40 -0
  360. package/lib/typescript/commonjs/diagnostics/snapshot.d.ts.map +1 -0
  361. package/lib/typescript/commonjs/engine/adapter.d.ts +172 -0
  362. package/lib/typescript/commonjs/engine/adapter.d.ts.map +1 -0
  363. package/lib/typescript/commonjs/engine/codec.d.ts +20 -0
  364. package/lib/typescript/commonjs/engine/codec.d.ts.map +1 -0
  365. package/lib/typescript/commonjs/engine/notify-kit/events.d.ts +37 -0
  366. package/lib/typescript/commonjs/engine/notify-kit/events.d.ts.map +1 -0
  367. package/lib/typescript/commonjs/engine/notify-kit/module.d.ts +103 -0
  368. package/lib/typescript/commonjs/engine/notify-kit/module.d.ts.map +1 -0
  369. package/lib/typescript/commonjs/engine/notify-kit/platform/android.d.ts +3 -0
  370. package/lib/typescript/commonjs/engine/notify-kit/platform/android.d.ts.map +1 -0
  371. package/lib/typescript/commonjs/engine/notify-kit/platform/index.d.ts +12 -0
  372. package/lib/typescript/commonjs/engine/notify-kit/platform/index.d.ts.map +1 -0
  373. package/lib/typescript/commonjs/engine/notify-kit/platform/ios.d.ts +3 -0
  374. package/lib/typescript/commonjs/engine/notify-kit/platform/ios.d.ts.map +1 -0
  375. package/lib/typescript/commonjs/engine/notify-kit/platform/types.d.ts +33 -0
  376. package/lib/typescript/commonjs/engine/notify-kit/platform/types.d.ts.map +1 -0
  377. package/lib/typescript/commonjs/engine/notify-kit-engine.d.ts +25 -0
  378. package/lib/typescript/commonjs/engine/notify-kit-engine.d.ts.map +1 -0
  379. package/lib/typescript/commonjs/index.d.ts +106 -0
  380. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  381. package/lib/typescript/commonjs/initialize.d.ts +74 -0
  382. package/lib/typescript/commonjs/initialize.d.ts.map +1 -0
  383. package/lib/typescript/commonjs/interaction/index.d.ts +53 -0
  384. package/lib/typescript/commonjs/interaction/index.d.ts.map +1 -0
  385. package/lib/typescript/commonjs/maintenance/cycle.d.ts +77 -0
  386. package/lib/typescript/commonjs/maintenance/cycle.d.ts.map +1 -0
  387. package/lib/typescript/commonjs/maintenance/permission-refresh.d.ts +19 -0
  388. package/lib/typescript/commonjs/maintenance/permission-refresh.d.ts.map +1 -0
  389. package/lib/typescript/commonjs/maintenance/reanchor.d.ts +26 -0
  390. package/lib/typescript/commonjs/maintenance/reanchor.d.ts.map +1 -0
  391. package/lib/typescript/commonjs/maintenance/toggle.d.ts +35 -0
  392. package/lib/typescript/commonjs/maintenance/toggle.d.ts.map +1 -0
  393. package/lib/typescript/commonjs/maintenance/verify.d.ts +32 -0
  394. package/lib/typescript/commonjs/maintenance/verify.d.ts.map +1 -0
  395. package/lib/typescript/commonjs/maintenance/window-refresh.d.ts +29 -0
  396. package/lib/typescript/commonjs/maintenance/window-refresh.d.ts.map +1 -0
  397. package/lib/typescript/commonjs/notifications.d.ts +78 -0
  398. package/lib/typescript/commonjs/notifications.d.ts.map +1 -0
  399. package/lib/typescript/commonjs/package.json +1 -0
  400. package/lib/typescript/commonjs/permission/index.d.ts +57 -0
  401. package/lib/typescript/commonjs/permission/index.d.ts.map +1 -0
  402. package/lib/typescript/commonjs/permission/state.d.ts +41 -0
  403. package/lib/typescript/commonjs/permission/state.d.ts.map +1 -0
  404. package/lib/typescript/commonjs/push/envelope.d.ts +33 -0
  405. package/lib/typescript/commonjs/push/envelope.d.ts.map +1 -0
  406. package/lib/typescript/commonjs/push/fcm-provider.d.ts +43 -0
  407. package/lib/typescript/commonjs/push/fcm-provider.d.ts.map +1 -0
  408. package/lib/typescript/commonjs/push/gate.d.ts +57 -0
  409. package/lib/typescript/commonjs/push/gate.d.ts.map +1 -0
  410. package/lib/typescript/commonjs/push/index.d.ts +19 -0
  411. package/lib/typescript/commonjs/push/index.d.ts.map +1 -0
  412. package/lib/typescript/commonjs/push/instructions.d.ts +45 -0
  413. package/lib/typescript/commonjs/push/instructions.d.ts.map +1 -0
  414. package/lib/typescript/commonjs/push/provider-adapter.d.ts +50 -0
  415. package/lib/typescript/commonjs/push/provider-adapter.d.ts.map +1 -0
  416. package/lib/typescript/commonjs/push/signout.d.ts +33 -0
  417. package/lib/typescript/commonjs/push/signout.d.ts.map +1 -0
  418. package/lib/typescript/commonjs/reconcile/chunk.d.ts +24 -0
  419. package/lib/typescript/commonjs/reconcile/chunk.d.ts.map +1 -0
  420. package/lib/typescript/commonjs/reconcile/diff.d.ts +54 -0
  421. package/lib/typescript/commonjs/reconcile/diff.d.ts.map +1 -0
  422. package/lib/typescript/commonjs/reconcile/duplicates.d.ts +32 -0
  423. package/lib/typescript/commonjs/reconcile/duplicates.d.ts.map +1 -0
  424. package/lib/typescript/commonjs/reconcile/index.d.ts +35 -0
  425. package/lib/typescript/commonjs/reconcile/index.d.ts.map +1 -0
  426. package/lib/typescript/commonjs/reconcile/truncate.d.ts +26 -0
  427. package/lib/typescript/commonjs/reconcile/truncate.d.ts.map +1 -0
  428. package/lib/typescript/commonjs/recurrence/clock-guard.d.ts +37 -0
  429. package/lib/typescript/commonjs/recurrence/clock-guard.d.ts.map +1 -0
  430. package/lib/typescript/commonjs/recurrence/expand.d.ts +75 -0
  431. package/lib/typescript/commonjs/recurrence/expand.d.ts.map +1 -0
  432. package/lib/typescript/commonjs/recurrence/index.d.ts +40 -0
  433. package/lib/typescript/commonjs/recurrence/index.d.ts.map +1 -0
  434. package/lib/typescript/commonjs/repeat/expiry.d.ts +23 -0
  435. package/lib/typescript/commonjs/repeat/expiry.d.ts.map +1 -0
  436. package/lib/typescript/commonjs/repeat/index.d.ts +49 -0
  437. package/lib/typescript/commonjs/repeat/index.d.ts.map +1 -0
  438. package/lib/typescript/commonjs/repeat/marker.d.ts +36 -0
  439. package/lib/typescript/commonjs/repeat/marker.d.ts.map +1 -0
  440. package/lib/typescript/commonjs/repeat/place.d.ts +39 -0
  441. package/lib/typescript/commonjs/repeat/place.d.ts.map +1 -0
  442. package/lib/typescript/commonjs/schedule/anchor.d.ts +118 -0
  443. package/lib/typescript/commonjs/schedule/anchor.d.ts.map +1 -0
  444. package/lib/typescript/commonjs/schedule/index.d.ts +40 -0
  445. package/lib/typescript/commonjs/schedule/index.d.ts.map +1 -0
  446. package/lib/typescript/commonjs/schedule/partition.d.ts +29 -0
  447. package/lib/typescript/commonjs/schedule/partition.d.ts.map +1 -0
  448. package/lib/typescript/commonjs/schedule/resolve-moment.d.ts +35 -0
  449. package/lib/typescript/commonjs/schedule/resolve-moment.d.ts.map +1 -0
  450. package/lib/typescript/commonjs/schedule/validate-content.d.ts +42 -0
  451. package/lib/typescript/commonjs/schedule/validate-content.d.ts.map +1 -0
  452. package/lib/typescript/commonjs/schedule/validate-identifier.d.ts +30 -0
  453. package/lib/typescript/commonjs/schedule/validate-identifier.d.ts.map +1 -0
  454. package/lib/typescript/commonjs/schedule/writer.d.ts +36 -0
  455. package/lib/typescript/commonjs/schedule/writer.d.ts.map +1 -0
  456. package/lib/typescript/commonjs/state/caps.d.ts +51 -0
  457. package/lib/typescript/commonjs/state/caps.d.ts.map +1 -0
  458. package/lib/typescript/commonjs/state/dedup-ledger.d.ts +21 -0
  459. package/lib/typescript/commonjs/state/dedup-ledger.d.ts.map +1 -0
  460. package/lib/typescript/commonjs/state/interaction-buffer.d.ts +30 -0
  461. package/lib/typescript/commonjs/state/interaction-buffer.d.ts.map +1 -0
  462. package/lib/typescript/commonjs/state/mmkv-store.d.ts +33 -0
  463. package/lib/typescript/commonjs/state/mmkv-store.d.ts.map +1 -0
  464. package/lib/typescript/commonjs/state/permission-history.d.ts +20 -0
  465. package/lib/typescript/commonjs/state/permission-history.d.ts.map +1 -0
  466. package/lib/typescript/commonjs/state/record.d.ts +134 -0
  467. package/lib/typescript/commonjs/state/record.d.ts.map +1 -0
  468. package/lib/typescript/commonjs/state/reset.d.ts +22 -0
  469. package/lib/typescript/commonjs/state/reset.d.ts.map +1 -0
  470. package/lib/typescript/commonjs/state/series-ledger.d.ts +47 -0
  471. package/lib/typescript/commonjs/state/series-ledger.d.ts.map +1 -0
  472. package/lib/typescript/commonjs/state/store.d.ts +20 -0
  473. package/lib/typescript/commonjs/state/store.d.ts.map +1 -0
  474. package/lib/typescript/commonjs/testing/conformance/index.d.ts +32 -0
  475. package/lib/typescript/commonjs/testing/conformance/index.d.ts.map +1 -0
  476. package/lib/typescript/commonjs/testing/fake-engine.d.ts +91 -0
  477. package/lib/typescript/commonjs/testing/fake-engine.d.ts.map +1 -0
  478. package/lib/typescript/commonjs/testing/fake-provider.d.ts +35 -0
  479. package/lib/typescript/commonjs/testing/fake-provider.d.ts.map +1 -0
  480. package/lib/typescript/commonjs/testing/faults.d.ts +38 -0
  481. package/lib/typescript/commonjs/testing/faults.d.ts.map +1 -0
  482. package/lib/typescript/commonjs/testing/index.d.ts +22 -0
  483. package/lib/typescript/commonjs/testing/index.d.ts.map +1 -0
  484. package/lib/typescript/commonjs/testing/measure.d.ts +59 -0
  485. package/lib/typescript/commonjs/testing/measure.d.ts.map +1 -0
  486. package/lib/typescript/module/advanced.d.ts +36 -0
  487. package/lib/typescript/module/advanced.d.ts.map +1 -0
  488. package/lib/typescript/module/channel/migrate.d.ts +38 -0
  489. package/lib/typescript/module/channel/migrate.d.ts.map +1 -0
  490. package/lib/typescript/module/channel/tone-map.d.ts +34 -0
  491. package/lib/typescript/module/channel/tone-map.d.ts.map +1 -0
  492. package/lib/typescript/module/channel/validate-tone.d.ts +23 -0
  493. package/lib/typescript/module/channel/validate-tone.d.ts.map +1 -0
  494. package/lib/typescript/module/contract/channel.d.ts +185 -0
  495. package/lib/typescript/module/contract/channel.d.ts.map +1 -0
  496. package/lib/typescript/module/contract/diagnostics.d.ts +92 -0
  497. package/lib/typescript/module/contract/diagnostics.d.ts.map +1 -0
  498. package/lib/typescript/module/contract/errors.d.ts +91 -0
  499. package/lib/typescript/module/contract/errors.d.ts.map +1 -0
  500. package/lib/typescript/module/contract/hash.d.ts +14 -0
  501. package/lib/typescript/module/contract/hash.d.ts.map +1 -0
  502. package/lib/typescript/module/contract/index.d.ts +10 -0
  503. package/lib/typescript/module/contract/index.d.ts.map +1 -0
  504. package/lib/typescript/module/contract/interaction.d.ts +53 -0
  505. package/lib/typescript/module/contract/interaction.d.ts.map +1 -0
  506. package/lib/typescript/module/contract/notification.d.ts +110 -0
  507. package/lib/typescript/module/contract/notification.d.ts.map +1 -0
  508. package/lib/typescript/module/contract/permission.d.ts +49 -0
  509. package/lib/typescript/module/contract/permission.d.ts.map +1 -0
  510. package/lib/typescript/module/contract/reconcile.d.ts +82 -0
  511. package/lib/typescript/module/contract/reconcile.d.ts.map +1 -0
  512. package/lib/typescript/module/contract/recurrence.d.ts +118 -0
  513. package/lib/typescript/module/contract/recurrence.d.ts.map +1 -0
  514. package/lib/typescript/module/diagnostics/burst.d.ts +39 -0
  515. package/lib/typescript/module/diagnostics/burst.d.ts.map +1 -0
  516. package/lib/typescript/module/diagnostics/events.d.ts +28 -0
  517. package/lib/typescript/module/diagnostics/events.d.ts.map +1 -0
  518. package/lib/typescript/module/diagnostics/redact.d.ts +22 -0
  519. package/lib/typescript/module/diagnostics/redact.d.ts.map +1 -0
  520. package/lib/typescript/module/diagnostics/snapshot.d.ts +40 -0
  521. package/lib/typescript/module/diagnostics/snapshot.d.ts.map +1 -0
  522. package/lib/typescript/module/engine/adapter.d.ts +172 -0
  523. package/lib/typescript/module/engine/adapter.d.ts.map +1 -0
  524. package/lib/typescript/module/engine/codec.d.ts +20 -0
  525. package/lib/typescript/module/engine/codec.d.ts.map +1 -0
  526. package/lib/typescript/module/engine/notify-kit/events.d.ts +37 -0
  527. package/lib/typescript/module/engine/notify-kit/events.d.ts.map +1 -0
  528. package/lib/typescript/module/engine/notify-kit/module.d.ts +103 -0
  529. package/lib/typescript/module/engine/notify-kit/module.d.ts.map +1 -0
  530. package/lib/typescript/module/engine/notify-kit/platform/android.d.ts +3 -0
  531. package/lib/typescript/module/engine/notify-kit/platform/android.d.ts.map +1 -0
  532. package/lib/typescript/module/engine/notify-kit/platform/index.d.ts +12 -0
  533. package/lib/typescript/module/engine/notify-kit/platform/index.d.ts.map +1 -0
  534. package/lib/typescript/module/engine/notify-kit/platform/ios.d.ts +3 -0
  535. package/lib/typescript/module/engine/notify-kit/platform/ios.d.ts.map +1 -0
  536. package/lib/typescript/module/engine/notify-kit/platform/types.d.ts +33 -0
  537. package/lib/typescript/module/engine/notify-kit/platform/types.d.ts.map +1 -0
  538. package/lib/typescript/module/engine/notify-kit-engine.d.ts +25 -0
  539. package/lib/typescript/module/engine/notify-kit-engine.d.ts.map +1 -0
  540. package/lib/typescript/module/index.d.ts +106 -0
  541. package/lib/typescript/module/index.d.ts.map +1 -0
  542. package/lib/typescript/module/initialize.d.ts +74 -0
  543. package/lib/typescript/module/initialize.d.ts.map +1 -0
  544. package/lib/typescript/module/interaction/index.d.ts +53 -0
  545. package/lib/typescript/module/interaction/index.d.ts.map +1 -0
  546. package/lib/typescript/module/maintenance/cycle.d.ts +77 -0
  547. package/lib/typescript/module/maintenance/cycle.d.ts.map +1 -0
  548. package/lib/typescript/module/maintenance/permission-refresh.d.ts +19 -0
  549. package/lib/typescript/module/maintenance/permission-refresh.d.ts.map +1 -0
  550. package/lib/typescript/module/maintenance/reanchor.d.ts +26 -0
  551. package/lib/typescript/module/maintenance/reanchor.d.ts.map +1 -0
  552. package/lib/typescript/module/maintenance/toggle.d.ts +35 -0
  553. package/lib/typescript/module/maintenance/toggle.d.ts.map +1 -0
  554. package/lib/typescript/module/maintenance/verify.d.ts +32 -0
  555. package/lib/typescript/module/maintenance/verify.d.ts.map +1 -0
  556. package/lib/typescript/module/maintenance/window-refresh.d.ts +29 -0
  557. package/lib/typescript/module/maintenance/window-refresh.d.ts.map +1 -0
  558. package/lib/typescript/module/notifications.d.ts +78 -0
  559. package/lib/typescript/module/notifications.d.ts.map +1 -0
  560. package/lib/typescript/module/package.json +1 -0
  561. package/lib/typescript/module/permission/index.d.ts +57 -0
  562. package/lib/typescript/module/permission/index.d.ts.map +1 -0
  563. package/lib/typescript/module/permission/state.d.ts +41 -0
  564. package/lib/typescript/module/permission/state.d.ts.map +1 -0
  565. package/lib/typescript/module/push/envelope.d.ts +33 -0
  566. package/lib/typescript/module/push/envelope.d.ts.map +1 -0
  567. package/lib/typescript/module/push/fcm-provider.d.ts +43 -0
  568. package/lib/typescript/module/push/fcm-provider.d.ts.map +1 -0
  569. package/lib/typescript/module/push/gate.d.ts +57 -0
  570. package/lib/typescript/module/push/gate.d.ts.map +1 -0
  571. package/lib/typescript/module/push/index.d.ts +19 -0
  572. package/lib/typescript/module/push/index.d.ts.map +1 -0
  573. package/lib/typescript/module/push/instructions.d.ts +45 -0
  574. package/lib/typescript/module/push/instructions.d.ts.map +1 -0
  575. package/lib/typescript/module/push/provider-adapter.d.ts +50 -0
  576. package/lib/typescript/module/push/provider-adapter.d.ts.map +1 -0
  577. package/lib/typescript/module/push/signout.d.ts +33 -0
  578. package/lib/typescript/module/push/signout.d.ts.map +1 -0
  579. package/lib/typescript/module/reconcile/chunk.d.ts +24 -0
  580. package/lib/typescript/module/reconcile/chunk.d.ts.map +1 -0
  581. package/lib/typescript/module/reconcile/diff.d.ts +54 -0
  582. package/lib/typescript/module/reconcile/diff.d.ts.map +1 -0
  583. package/lib/typescript/module/reconcile/duplicates.d.ts +32 -0
  584. package/lib/typescript/module/reconcile/duplicates.d.ts.map +1 -0
  585. package/lib/typescript/module/reconcile/index.d.ts +35 -0
  586. package/lib/typescript/module/reconcile/index.d.ts.map +1 -0
  587. package/lib/typescript/module/reconcile/truncate.d.ts +26 -0
  588. package/lib/typescript/module/reconcile/truncate.d.ts.map +1 -0
  589. package/lib/typescript/module/recurrence/clock-guard.d.ts +37 -0
  590. package/lib/typescript/module/recurrence/clock-guard.d.ts.map +1 -0
  591. package/lib/typescript/module/recurrence/expand.d.ts +75 -0
  592. package/lib/typescript/module/recurrence/expand.d.ts.map +1 -0
  593. package/lib/typescript/module/recurrence/index.d.ts +40 -0
  594. package/lib/typescript/module/recurrence/index.d.ts.map +1 -0
  595. package/lib/typescript/module/repeat/expiry.d.ts +23 -0
  596. package/lib/typescript/module/repeat/expiry.d.ts.map +1 -0
  597. package/lib/typescript/module/repeat/index.d.ts +49 -0
  598. package/lib/typescript/module/repeat/index.d.ts.map +1 -0
  599. package/lib/typescript/module/repeat/marker.d.ts +36 -0
  600. package/lib/typescript/module/repeat/marker.d.ts.map +1 -0
  601. package/lib/typescript/module/repeat/place.d.ts +39 -0
  602. package/lib/typescript/module/repeat/place.d.ts.map +1 -0
  603. package/lib/typescript/module/schedule/anchor.d.ts +118 -0
  604. package/lib/typescript/module/schedule/anchor.d.ts.map +1 -0
  605. package/lib/typescript/module/schedule/index.d.ts +40 -0
  606. package/lib/typescript/module/schedule/index.d.ts.map +1 -0
  607. package/lib/typescript/module/schedule/partition.d.ts +29 -0
  608. package/lib/typescript/module/schedule/partition.d.ts.map +1 -0
  609. package/lib/typescript/module/schedule/resolve-moment.d.ts +35 -0
  610. package/lib/typescript/module/schedule/resolve-moment.d.ts.map +1 -0
  611. package/lib/typescript/module/schedule/validate-content.d.ts +42 -0
  612. package/lib/typescript/module/schedule/validate-content.d.ts.map +1 -0
  613. package/lib/typescript/module/schedule/validate-identifier.d.ts +30 -0
  614. package/lib/typescript/module/schedule/validate-identifier.d.ts.map +1 -0
  615. package/lib/typescript/module/schedule/writer.d.ts +36 -0
  616. package/lib/typescript/module/schedule/writer.d.ts.map +1 -0
  617. package/lib/typescript/module/state/caps.d.ts +51 -0
  618. package/lib/typescript/module/state/caps.d.ts.map +1 -0
  619. package/lib/typescript/module/state/dedup-ledger.d.ts +21 -0
  620. package/lib/typescript/module/state/dedup-ledger.d.ts.map +1 -0
  621. package/lib/typescript/module/state/interaction-buffer.d.ts +30 -0
  622. package/lib/typescript/module/state/interaction-buffer.d.ts.map +1 -0
  623. package/lib/typescript/module/state/mmkv-store.d.ts +33 -0
  624. package/lib/typescript/module/state/mmkv-store.d.ts.map +1 -0
  625. package/lib/typescript/module/state/permission-history.d.ts +20 -0
  626. package/lib/typescript/module/state/permission-history.d.ts.map +1 -0
  627. package/lib/typescript/module/state/record.d.ts +134 -0
  628. package/lib/typescript/module/state/record.d.ts.map +1 -0
  629. package/lib/typescript/module/state/reset.d.ts +22 -0
  630. package/lib/typescript/module/state/reset.d.ts.map +1 -0
  631. package/lib/typescript/module/state/series-ledger.d.ts +47 -0
  632. package/lib/typescript/module/state/series-ledger.d.ts.map +1 -0
  633. package/lib/typescript/module/state/store.d.ts +20 -0
  634. package/lib/typescript/module/state/store.d.ts.map +1 -0
  635. package/lib/typescript/module/testing/conformance/index.d.ts +32 -0
  636. package/lib/typescript/module/testing/conformance/index.d.ts.map +1 -0
  637. package/lib/typescript/module/testing/fake-engine.d.ts +91 -0
  638. package/lib/typescript/module/testing/fake-engine.d.ts.map +1 -0
  639. package/lib/typescript/module/testing/fake-provider.d.ts +35 -0
  640. package/lib/typescript/module/testing/fake-provider.d.ts.map +1 -0
  641. package/lib/typescript/module/testing/faults.d.ts +38 -0
  642. package/lib/typescript/module/testing/faults.d.ts.map +1 -0
  643. package/lib/typescript/module/testing/index.d.ts +22 -0
  644. package/lib/typescript/module/testing/index.d.ts.map +1 -0
  645. package/lib/typescript/module/testing/measure.d.ts +59 -0
  646. package/lib/typescript/module/testing/measure.d.ts.map +1 -0
  647. package/package.json +74 -23
  648. package/skills/sdk-rn-notification/SKILL.md +6 -5
  649. package/src/advanced.ts +35 -0
  650. package/src/channel/migrate.ts +176 -158
  651. package/src/channel/tone-map.ts +2 -10
  652. package/src/contract/errors.ts +7 -0
  653. package/src/contract/hash.ts +26 -0
  654. package/src/engine/adapter.ts +21 -1
  655. package/src/engine/notify-kit/events.ts +155 -0
  656. package/src/engine/notify-kit/module.ts +148 -0
  657. package/src/engine/notify-kit/platform/android.ts +172 -0
  658. package/src/engine/notify-kit/platform/index.ts +55 -0
  659. package/src/engine/notify-kit/platform/ios.ts +54 -0
  660. package/src/engine/notify-kit/platform/types.ts +40 -0
  661. package/src/engine/notify-kit-engine.ts +96 -477
  662. package/src/index.ts +9 -0
  663. package/src/notifications.ts +195 -0
  664. package/src/permission/index.ts +65 -4
  665. package/src/push/fcm-provider.ts +14 -4
  666. package/src/push/gate.ts +27 -5
  667. package/src/reconcile/diff.ts +38 -27
  668. package/src/reconcile/index.ts +13 -4
  669. package/src/recurrence/index.ts +2 -1
  670. package/src/repeat/expiry.ts +2 -6
  671. package/src/repeat/index.ts +45 -1
  672. package/src/repeat/marker.ts +1 -22
  673. package/src/repeat/place.ts +74 -35
  674. package/src/schedule/index.ts +10 -4
  675. package/src/schedule/partition.ts +0 -19
  676. package/src/schedule/validate-identifier.ts +8 -6
  677. package/src/schedule/writer.ts +13 -4
  678. package/src/state/caps.ts +28 -3
  679. package/src/state/permission-history.ts +25 -0
  680. package/src/state/record.ts +110 -20
  681. package/src/testing/fake-engine.ts +17 -1
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createPushGate = createPushGate;
7
+ var _errors = require("../contract/errors.js");
8
+ var _envelope = require("./envelope.js");
9
+ var _dedupLedger = require("../state/dedup-ledger.js");
10
+ /**
11
+ * The push gate.
12
+ *
13
+ * Everything a consumer sees about push comes through here, in one normalized
14
+ * shape with zero provider types. Substituting a provider is therefore an
15
+ * adapter swap rather than a consumer rewrite.
16
+ *
17
+ * Two behaviours are deliberate and easy to get wrong. A push arriving in the
18
+ * **foreground is never auto-displayed** — presentation is the app's decision,
19
+ * and a library that decided for it would fight every consumer's design. And a
20
+ * malformed payload is **dropped safely**, because a broken message from a
21
+ * server must not be able to crash an installed app.
22
+ */
23
+
24
+ function createPushGate(deps) {
25
+ const emit = deps.emit ?? (() => {});
26
+ let handlers = [];
27
+ let subscription;
28
+ /** Every token subscription, so a second one does not leak the first (NOT-24). */
29
+ const tokenSubscriptions = new Set();
30
+ let deliveryChain = Promise.resolve();
31
+ const dispatch = envelope => {
32
+ deliveryChain = deliveryChain.then(async () => {
33
+ for (const handler of handlers) {
34
+ try {
35
+ await handler(envelope);
36
+ } catch {
37
+ // A consumer's handler failing must not stop the next payload.
38
+ }
39
+ }
40
+ });
41
+ };
42
+ const receive = raw => {
43
+ let normalized;
44
+ try {
45
+ normalized = (0, _envelope.normalizeEnvelope)(raw, deps.now());
46
+ } catch (error) {
47
+ // Dropped safely and recorded. A broken message must never crash the app
48
+ // or corrupt the local schedule.
49
+ emit(_errors.DIAGNOSTIC_CODES.PAYLOAD_MALFORMED, (0, _errors.isNotificationError)(error) ? error.message : 'Push payload could not be interpreted and was discarded.', (0, _errors.isNotificationError)(error) ? error.context : undefined);
50
+ return undefined;
51
+ }
52
+ const {
53
+ envelope,
54
+ versionSkew
55
+ } = normalized;
56
+ if (versionSkew) {
57
+ emit(_errors.DIAGNOSTIC_CODES.PAYLOAD_VERSION_SKEW, `Push payload declares contract version ${envelope.version}; this build implements ${_envelope.IMPLEMENTED_PAYLOAD_VERSION}. Processed best-effort — known fields honoured, unknown fields ignored.`, {
58
+ received: envelope.version,
59
+ implemented: _envelope.IMPLEMENTED_PAYLOAD_VERSION
60
+ });
61
+ }
62
+
63
+ // Deduplication survives process death, which is the case that matters:
64
+ // a redelivery usually arrives in a fresh process.
65
+ if ((0, _dedupLedger.recordSeen)(deps.state, envelope.dedupId, deps.now(), envelope.ownerTag)) {
66
+ emit(_errors.DIAGNOSTIC_CODES.PAYLOAD_DUPLICATE, 'Push payload was already handled and was suppressed.', {
67
+ dedupId: envelope.dedupId
68
+ });
69
+ return undefined;
70
+ }
71
+ dispatch(envelope);
72
+ return envelope;
73
+ };
74
+ return {
75
+ /** Reports whether platform push services exist, so degradation is controlled. */
76
+ async getAvailability() {
77
+ const availability = await deps.provider.getAvailability();
78
+ if (availability === 'unavailable') {
79
+ emit(_errors.DIAGNOSTIC_CODES.PUSH_UNAVAILABLE, 'Platform push services are unavailable on this device. The push path is disabled; the entire local notification path is unaffected.');
80
+ }
81
+ return availability;
82
+ },
83
+ /** Waits for a genuine token. Never returns a placeholder presented as one. */
84
+ async getToken() {
85
+ const token = await deps.provider.getToken();
86
+ if (typeof token !== 'string' || token.length === 0) {
87
+ emit(_errors.DIAGNOSTIC_CODES.TOKEN_UNAVAILABLE, 'The provider has no registration token yet. An empty value is never returned as if it were one.');
88
+ throw new Error('Push token is not yet available.');
89
+ }
90
+ // The token value itself is never logged.
91
+ return token;
92
+ },
93
+ onTokenChange(handler) {
94
+ const unsubscribe = deps.provider.onTokenChange(handler);
95
+ tokenSubscriptions.add(unsubscribe);
96
+ return () => {
97
+ if (tokenSubscriptions.delete(unsubscribe)) {
98
+ unsubscribe();
99
+ }
100
+ };
101
+ },
102
+ async invalidateToken() {
103
+ const ok = await deps.provider.invalidateToken();
104
+ if (!ok) {
105
+ emit(_errors.DIAGNOSTIC_CODES.TOKEN_INVALIDATION_FAILED, 'Token invalidation did not succeed. The device may keep receiving messages for the previous account.');
106
+ }
107
+ return ok;
108
+ },
109
+ /**
110
+ * Subscribes to inbound payloads.
111
+ *
112
+ * Nothing is displayed automatically — the consumer decides whether and how
113
+ * to present a foreground push.
114
+ */
115
+ onPushReceived(handler) {
116
+ handlers.push(handler);
117
+ subscription ??= deps.provider.subscribeToMessages(receive);
118
+ return () => {
119
+ handlers = handlers.filter(h => h !== handler);
120
+ };
121
+ },
122
+ /**
123
+ * Processes a payload delivered while the app was in the background, from
124
+ * the module-scope handler `setBackgroundMessageHandler` requires (NOT-24).
125
+ *
126
+ * The same normalization and the same persisted deduplication as a
127
+ * foreground payload, so a redelivery after the process restarted is
128
+ * suppressed rather than handled twice. Resolves once every handler has run.
129
+ */
130
+ async handleBackground(raw) {
131
+ const envelope = receive(raw);
132
+ await deliveryChain;
133
+ return envelope;
134
+ },
135
+ /** Processes the payload that launched the app, if any. */
136
+ async collectInitial() {
137
+ const raw = await deps.provider.takeInitialMessage();
138
+ return raw === undefined ? undefined : receive(raw);
139
+ },
140
+ /** Reports a specific cause rather than leaving a non-delivery unexplained. */
141
+ reportUndeliverable(cause, context) {
142
+ emit(_errors.DIAGNOSTIC_CODES.PUSH_UNDELIVERABLE, `A push could not be delivered or displayed: ${cause}.`, {
143
+ cause,
144
+ ...context
145
+ });
146
+ },
147
+ /** Exposed for tests and orderly shutdown. */
148
+ async flush() {
149
+ await deliveryChain;
150
+ },
151
+ dispose() {
152
+ subscription?.();
153
+ subscription = undefined;
154
+ for (const unsubscribe of tokenSubscriptions) {
155
+ unsubscribe();
156
+ }
157
+ tokenSubscriptions.clear();
158
+ handlers = [];
159
+ }
160
+ };
161
+ }
162
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_errors","require","_envelope","_dedupLedger","createPushGate","deps","emit","handlers","subscription","tokenSubscriptions","Set","deliveryChain","Promise","resolve","dispatch","envelope","then","handler","receive","raw","normalized","normalizeEnvelope","now","error","DIAGNOSTIC_CODES","PAYLOAD_MALFORMED","isNotificationError","message","context","undefined","versionSkew","PAYLOAD_VERSION_SKEW","version","IMPLEMENTED_PAYLOAD_VERSION","received","implemented","recordSeen","state","dedupId","ownerTag","PAYLOAD_DUPLICATE","getAvailability","availability","provider","PUSH_UNAVAILABLE","getToken","token","length","TOKEN_UNAVAILABLE","Error","onTokenChange","unsubscribe","add","delete","invalidateToken","ok","TOKEN_INVALIDATION_FAILED","onPushReceived","push","subscribeToMessages","filter","h","handleBackground","collectInitial","takeInitialMessage","reportUndeliverable","cause","PUSH_UNDELIVERABLE","flush","dispose","clear"],"sourceRoot":"../../../src","sources":["push/gate.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "IMPLEMENTED_PAYLOAD_VERSION", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _envelope.IMPLEMENTED_PAYLOAD_VERSION;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "createFcmProvider", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _fcmProvider.createFcmProvider;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "createInstructionHandler", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _instructions.createInstructionHandler;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "createPushGate", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _gate.createPushGate;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "createSignOut", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _signout.createSignOut;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "normalizeEnvelope", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _envelope.normalizeEnvelope;
40
+ }
41
+ });
42
+ var _gate = require("./gate.js");
43
+ var _fcmProvider = require("./fcm-provider.js");
44
+ var _signout = require("./signout.js");
45
+ var _instructions = require("./instructions.js");
46
+ var _envelope = require("./envelope.js");
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_gate","require","_fcmProvider","_signout","_instructions","_envelope"],"sourceRoot":"../../../src","sources":["push/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAAA,KAAA,GAAAC,OAAA;AAGA,IAAAC,YAAA,GAAAD,OAAA;AAGA,IAAAE,QAAA,GAAAF,OAAA;AAGA,IAAAG,aAAA,GAAAH,OAAA;AAOA,IAAAI,SAAA,GAAAJ,OAAA","ignoreList":[]}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createInstructionHandler = createInstructionHandler;
7
+ var _errors = require("../contract/errors.js");
8
+ /**
9
+ * Push-driven local scheduling.
10
+ *
11
+ * Where the two paths meet. A server can schedule or cancel a local
12
+ * notification, and it gets **no privileged path**: an instruction arriving by
13
+ * push passes exactly the same identifier validation, moment validation, tone
14
+ * resolution, and permission rules as a request from app code.
15
+ *
16
+ * That symmetry is the point. A server that could bypass validation would be
17
+ * able to put the device into a state the app itself could not produce, and no
18
+ * amount of local correctness would survive it.
19
+ */
20
+
21
+ function createInstructionHandler(deps) {
22
+ const emit = deps.emit ?? (() => {});
23
+
24
+ /**
25
+ * Whether a local schedule already covers this event.
26
+ *
27
+ * Local wins: it is the entry the device can present at the right moment with
28
+ * no network. A server that genuinely wants to override sends an explicit
29
+ * cancel followed by a schedule, which is unambiguous in a way "last write
30
+ * wins" is not.
31
+ */
32
+ const localAlreadyCovers = async id => {
33
+ const pending = await deps.engine.getPending();
34
+ const existing = pending.find(entry => entry.id === id);
35
+ return existing !== undefined && !existing.pushCreated;
36
+ };
37
+ return {
38
+ async handle(envelope) {
39
+ if (envelope.kind !== 'schedule' && envelope.kind !== 'cancel') {
40
+ return {
41
+ kind: 'ignored',
42
+ id: envelope.id
43
+ };
44
+ }
45
+ try {
46
+ if (envelope.kind === 'cancel') {
47
+ await deps.scheduler.cancel(envelope.id);
48
+ return {
49
+ kind: 'cancelled',
50
+ id: envelope.id
51
+ };
52
+ }
53
+ if (envelope.moment === undefined || envelope.content === undefined) {
54
+ throw Object.assign(new Error('A schedule instruction must carry both a moment and content.'), {
55
+ code: _errors.DIAGNOSTIC_CODES.PAYLOAD_MALFORMED
56
+ });
57
+ }
58
+ if (await localAlreadyCovers(envelope.id)) {
59
+ emit(_errors.DIAGNOSTIC_CODES.PAYLOAD_DUPLICATE, 'A local schedule already covers this event; the push instruction was suppressed so the user sees exactly one notification.', {
60
+ id: envelope.id
61
+ });
62
+ return {
63
+ kind: 'suppressed',
64
+ id: envelope.id,
65
+ reason: 'A local schedule already covers this event.'
66
+ };
67
+ }
68
+ const result = await deps.scheduler.schedule({
69
+ id: envelope.id,
70
+ content: envelope.content,
71
+ tone: envelope.tone ?? '',
72
+ moment: envelope.moment,
73
+ routing: envelope.routing,
74
+ ownerTag: envelope.ownerTag
75
+ }, {
76
+ pushCreated: true
77
+ });
78
+ return {
79
+ kind: 'scheduled',
80
+ id: envelope.id,
81
+ replaced: result.replaced
82
+ };
83
+ } catch (error) {
84
+ // Rejected under exactly the rules an app-initiated request would face,
85
+ // and recorded rather than swallowed.
86
+ const code = (0, _errors.isNotificationError)(error) ? error.code : error.code ?? 'UNKNOWN';
87
+ const reason = error instanceof Error ? error.message : String(error);
88
+ emit(code, `Push instruction rejected: ${reason}`, {
89
+ id: envelope.id
90
+ });
91
+ return {
92
+ kind: 'rejected',
93
+ id: envelope.id,
94
+ code,
95
+ reason
96
+ };
97
+ }
98
+ }
99
+ };
100
+ }
101
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_errors","require","createInstructionHandler","deps","emit","localAlreadyCovers","id","pending","engine","getPending","existing","find","entry","undefined","pushCreated","handle","envelope","kind","scheduler","cancel","moment","content","Object","assign","Error","code","DIAGNOSTIC_CODES","PAYLOAD_MALFORMED","PAYLOAD_DUPLICATE","reason","result","schedule","tone","routing","ownerTag","replaced","error","isNotificationError","message","String"],"sourceRoot":"../../../src","sources":["push/instructions.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=provider-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["push/provider-adapter.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createSignOut = createSignOut;
7
+ var _reset = require("../state/reset.js");
8
+ /**
9
+ * Sign-out cleanup.
10
+ *
11
+ * Three things must happen together, and the order matters: invalidate the
12
+ * token first so no further messages arrive for the account being left, then
13
+ * cancel its notifications, then clear its persisted state.
14
+ *
15
+ * Deliberately **scoped to one owner tag**. On a shared device, signing one
16
+ * account out must not clear another's deduplication history or cancel their
17
+ * reminders — and must not discard the channel migration ledger, which
18
+ * describes the device rather than any account.
19
+ */
20
+
21
+ function createSignOut(deps) {
22
+ return {
23
+ async signOut(ownerTag) {
24
+ // Token first: stop the inbound flow before removing what would have
25
+ // handled it, so nothing arrives for an account that is already gone.
26
+ let tokenInvalidated = false;
27
+ if (deps.push !== undefined) {
28
+ try {
29
+ tokenInvalidated = await deps.push.invalidateToken();
30
+ } catch {
31
+ // A failed invalidation must not prevent local cleanup — leaving a
32
+ // signed-out account's notifications on the device is the worse of
33
+ // the two outcomes.
34
+ tokenInvalidated = false;
35
+ }
36
+ }
37
+ const cancelledIds = await deps.scheduler.cancelByOwner(ownerTag);
38
+ const {
39
+ clearedCollections
40
+ } = (0, _reset.clearOwner)(deps.state, ownerTag);
41
+ deps.emit?.('SIGN_OUT', `Signed out ${ownerTag}: token ${tokenInvalidated ? 'invalidated' : 'not invalidated'}, ${cancelledIds.length} notification(s) cancelled, per-owner state cleared.`, {
42
+ ownerTag,
43
+ tokenInvalidated,
44
+ cancelled: cancelledIds.length
45
+ });
46
+ return {
47
+ ownerTag,
48
+ tokenInvalidated,
49
+ cancelledIds,
50
+ clearedCollections
51
+ };
52
+ }
53
+ };
54
+ }
55
+ //# sourceMappingURL=signout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reset","require","createSignOut","deps","signOut","ownerTag","tokenInvalidated","push","undefined","invalidateToken","cancelledIds","scheduler","cancelByOwner","clearedCollections","clearOwner","state","emit","length","cancelled"],"sourceRoot":"../../../src","sources":["push/signout.ts"],"mappings":";;;;;;AAgBA,IAAAA,MAAA,GAAAC,OAAA;AAhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAsBO,SAASC,aAAaA,CAACC,IAAyB,EAAE;EACxD,OAAO;IACN,MAAMC,OAAOA,CAACC,QAAgB,EAA0B;MACvD;MACA;MACA,IAAIC,gBAAgB,GAAG,KAAK;MAC5B,IAAIH,IAAI,CAACI,IAAI,KAAKC,SAAS,EAAE;QAC5B,IAAI;UACHF,gBAAgB,GAAG,MAAMH,IAAI,CAACI,IAAI,CAACE,eAAe,CAAC,CAAC;QACrD,CAAC,CAAC,MAAM;UACP;UACA;UACA;UACAH,gBAAgB,GAAG,KAAK;QACzB;MACD;MAEA,MAAMI,YAAY,GAAG,MAAMP,IAAI,CAACQ,SAAS,CAACC,aAAa,CAACP,QAAQ,CAAC;MACjE,MAAM;QAAEQ;MAAmB,CAAC,GAAG,IAAAC,iBAAU,EAACX,IAAI,CAACY,KAAK,EAAEV,QAAQ,CAAC;MAE/DF,IAAI,CAACa,IAAI,GACR,UAAU,EACV,cAAcX,QAAQ,WAAWC,gBAAgB,GAAG,aAAa,GAAG,iBAAiB,KAAKI,YAAY,CAACO,MAAM,sDAAsD,EACnK;QAAEZ,QAAQ;QAAEC,gBAAgB;QAAEY,SAAS,EAAER,YAAY,CAACO;MAAO,CAC9D,CAAC;MAED,OAAO;QAAEZ,QAAQ;QAAEC,gBAAgB;QAAEI,YAAY;QAAEG;MAAmB,CAAC;IACxE;EACD,CAAC;AACF","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_CHUNK_SIZE = void 0;
7
+ exports.applyInChunks = applyInChunks;
8
+ exports.yieldToEventLoop = yieldToEventLoop;
9
+ /**
10
+ * Chunked application.
11
+ *
12
+ * A 500-entry reconciliation must not drop frames on a list screen, so work is
13
+ * applied in slices with a yield between them. No single slice may occupy the
14
+ * interface thread for more than 16 ms, which is what holds 60 fps while
15
+ * reconciliation is in flight.
16
+ */
17
+
18
+ const DEFAULT_CHUNK_SIZE = exports.DEFAULT_CHUNK_SIZE = 25;
19
+
20
+ /** Yields to the event loop so the interface thread can render between slices. */
21
+ function yieldToEventLoop() {
22
+ return new Promise(resolve => setTimeout(resolve, 0));
23
+ }
24
+ /**
25
+ * Applies `work` to every item, yielding between chunks.
26
+ *
27
+ * Sequential within a chunk rather than parallel: these calls bridge to native,
28
+ * and a burst of concurrent scheduling is where duplicate-delivery races come
29
+ * from.
30
+ */
31
+ async function applyInChunks(items, work, options = {}) {
32
+ const size = Math.max(1, options.size ?? DEFAULT_CHUNK_SIZE);
33
+ const yieldFn = options.onYield ?? yieldToEventLoop;
34
+ let applied = 0;
35
+ for (let start = 0; start < items.length; start += size) {
36
+ const chunk = items.slice(start, start + size);
37
+ for (const item of chunk) {
38
+ await work(item);
39
+ applied += 1;
40
+ }
41
+
42
+ // No yield after the final chunk — the caller is about to resume anyway.
43
+ if (start + size < items.length) {
44
+ await yieldFn();
45
+ }
46
+ }
47
+ return applied;
48
+ }
49
+ //# sourceMappingURL=chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_CHUNK_SIZE","exports","yieldToEventLoop","Promise","resolve","setTimeout","applyInChunks","items","work","options","size","Math","max","yieldFn","onYield","applied","start","length","chunk","slice","item"],"sourceRoot":"../../../src","sources":["reconcile/chunk.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAMA,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG,EAAE;;AAEpC;AACO,SAASE,gBAAgBA,CAAA,EAAkB;EACjD,OAAO,IAAIC,OAAO,CAACC,OAAO,IAAIC,UAAU,CAACD,OAAO,EAAE,CAAC,CAAC,CAAC;AACtD;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeE,aAAaA,CAClCC,KAAmB,EACnBC,IAAgC,EAChCC,OAAqB,GAAG,CAAC,CAAC,EACR;EAClB,MAAMC,IAAI,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,OAAO,CAACC,IAAI,IAAIV,kBAAkB,CAAC;EAC5D,MAAMa,OAAO,GAAGJ,OAAO,CAACK,OAAO,IAAIZ,gBAAgB;EACnD,IAAIa,OAAO,GAAG,CAAC;EAEf,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGT,KAAK,CAACU,MAAM,EAAED,KAAK,IAAIN,IAAI,EAAE;IACxD,MAAMQ,KAAK,GAAGX,KAAK,CAACY,KAAK,CAACH,KAAK,EAAEA,KAAK,GAAGN,IAAI,CAAC;IAE9C,KAAK,MAAMU,IAAI,IAAIF,KAAK,EAAE;MACzB,MAAMV,IAAI,CAACY,IAAI,CAAC;MAChBL,OAAO,IAAI,CAAC;IACb;;IAEA;IACA,IAAIC,KAAK,GAAGN,IAAI,GAAGH,KAAK,CAACU,MAAM,EAAE;MAChC,MAAMJ,OAAO,CAAC,CAAC;IAChB;EACD;EAEA,OAAOE,OAAO;AACf","ignoreList":[]}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.diff = diff;
7
+ /**
8
+ * Desired-versus-device diffing.
9
+ *
10
+ * The package's central promise lives here: reconciling twice with unchanged
11
+ * input must produce **zero** platform operations on the second run. That is
12
+ * only true if "unchanged" is decided by comparing everything that would make
13
+ * the delivered notification different — miss a field and the second run
14
+ * rewrites entries needlessly; include a volatile one and it never settles.
15
+ *
16
+ * Anchoring mode is part of the comparison key deliberately. A mode change on
17
+ * the same identifier must force a replacement rather than read as unchanged,
18
+ * because the two modes resolve to different instants the moment a zone
19
+ * changes.
20
+ */
21
+
22
+ /** The fields that make one delivered notification different from another. */
23
+
24
+ /**
25
+ * Stable serialization of those fields. One function for what the app wants and
26
+ * what the device holds, so the two cannot drift into comparing different
27
+ * things (NOT-19).
28
+ */
29
+ function fingerprintFields(fields) {
30
+ return JSON.stringify([fields.resolvedAt, fields.anchoring, fields.content.title, fields.content.body, fields.content.subtitle ?? null, fields.tone, fields.ownerTag ?? null, fields.groupTag ?? null,
31
+ // Key order is not stable across constructions, so sort before comparing —
32
+ // otherwise two structurally identical payloads could compare unequal and
33
+ // the second pass would rewrite every entry carrying routing data.
34
+ fields.routing === undefined ? null : stableStringify(fields.routing), fields.actions === undefined ? null : fields.actions.map(a => [a.id, a.title, a.mode, a.input?.placeholder ?? null])]);
35
+ }
36
+ function fingerprint(request, resolvedAt) {
37
+ return fingerprintFields({
38
+ ...request,
39
+ resolvedAt,
40
+ anchoring: request.moment.anchoring ?? 'wallClock'
41
+ });
42
+ }
43
+ function entryFingerprint(entry) {
44
+ return fingerprintFields(entry);
45
+ }
46
+
47
+ /** Key-order-independent JSON, so structurally equal payloads compare equal. */
48
+ function stableStringify(value) {
49
+ if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null';
50
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;
51
+ const entries = Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
52
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(',')}}`;
53
+ }
54
+ /**
55
+ * Computes the minimal operation set.
56
+ *
57
+ * Cancels are emitted before creates so an interrupted pass leaves a
58
+ * recoverable gap rather than a duplicate: a missing notification is fixed by
59
+ * the next reconcile, whereas two notifications for one subject is a defect the
60
+ * user sees.
61
+ */
62
+ function diff(input) {
63
+ const deviceById = new Map(input.device.map(entry => [entry.id, entry]));
64
+ const desiredIds = new Set(input.desired.map(request => request.id));
65
+ const cancels = [];
66
+ const writes = [];
67
+ const unchanged = [];
68
+ const protectedIds = input.protectedIds ?? new Set();
69
+ for (const entry of input.device) {
70
+ if (!desiredIds.has(entry.id) && !protectedIds.has(entry.id)) {
71
+ cancels.push({
72
+ kind: 'cancel',
73
+ id: entry.id
74
+ });
75
+ }
76
+ }
77
+ for (const request of input.desired) {
78
+ const resolvedAt = input.resolvedAt.get(request.id) ?? request.moment.at;
79
+ const existing = deviceById.get(request.id);
80
+ if (existing === undefined) {
81
+ writes.push({
82
+ kind: 'create',
83
+ id: request.id,
84
+ request,
85
+ resolvedAt
86
+ });
87
+ continue;
88
+ }
89
+ if (fingerprint(request, resolvedAt) === entryFingerprint(existing)) {
90
+ unchanged.push(request.id);
91
+ continue;
92
+ }
93
+ writes.push({
94
+ kind: 'replace',
95
+ id: request.id,
96
+ request,
97
+ resolvedAt
98
+ });
99
+ }
100
+ return {
101
+ operations: [...cancels, ...writes],
102
+ unchanged
103
+ };
104
+ }
105
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["fingerprintFields","fields","JSON","stringify","resolvedAt","anchoring","content","title","body","subtitle","tone","ownerTag","groupTag","routing","undefined","stableStringify","actions","map","a","id","mode","input","placeholder","fingerprint","request","moment","entryFingerprint","entry","value","Array","isArray","join","entries","Object","sort","b","k","v","diff","deviceById","Map","device","desiredIds","Set","desired","cancels","writes","unchanged","protectedIds","has","push","kind","get","at","existing","operations"],"sourceRoot":"../../../src","sources":["reconcile/diff.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.splitDuplicates = splitDuplicates;
7
+ var _errors = require("../contract/errors.js");
8
+ /**
9
+ * Duplicate identifier resolution.
10
+ *
11
+ * An identifier appearing twice in one desired set means the caller's key
12
+ * derivation produced two notifications for one identity. That is a bug, not a
13
+ * preference, so the package refuses rather than silently picking a winner.
14
+ *
15
+ * **Every** copy is rejected — no entry wins. Order-independence then follows
16
+ * for free rather than having to be engineered: there is no "first" or "last"
17
+ * to depend on.
18
+ *
19
+ * The rule applies even to byte-identical duplicates. Treating those as
20
+ * mergeable would require a deep-equality definition that becomes a contract of
21
+ * its own, and a repeated identifier is a key-derivation bug either way.
22
+ */
23
+
24
+ /**
25
+ * Splits a desired set into applicable entries and rejections.
26
+ *
27
+ * `existingIds` lets the rejection state whether a notification already
28
+ * scheduled under that identifier was left in place — without it a caller could
29
+ * reasonably read "rejected" as "cancelled".
30
+ */
31
+ function splitDuplicates(desired, existingIds = new Set()) {
32
+ const counts = new Map();
33
+ for (const request of desired) {
34
+ counts.set(request.id, (counts.get(request.id) ?? 0) + 1);
35
+ }
36
+ const unique = [];
37
+ const rejected = [];
38
+ for (const request of desired) {
39
+ if ((counts.get(request.id) ?? 0) === 1) {
40
+ unique.push(request);
41
+ }
42
+ }
43
+
44
+ // Sorted so the report itself is order-independent, not merely its effect.
45
+ const repeated = [...counts.entries()].filter(([, count]) => count > 1).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
46
+ for (const [id, occurrences] of repeated) {
47
+ rejected.push({
48
+ id,
49
+ code: _errors.DIAGNOSTIC_CODES.DUPLICATE_IDENTIFIER,
50
+ reason: `Identifier appeared ${occurrences} times in one desired set. Every copy was rejected, because the package cannot know which was intended.` + (existingIds.has(id) ? ' Any notification already scheduled under it was left in place — this is a rejection, not a cancellation.' : ''),
51
+ occurrences,
52
+ existingLeftInPlace: existingIds.has(id)
53
+ });
54
+ }
55
+ return {
56
+ unique,
57
+ rejected
58
+ };
59
+ }
60
+ //# sourceMappingURL=duplicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_errors","require","splitDuplicates","desired","existingIds","Set","counts","Map","request","set","id","get","unique","rejected","push","repeated","entries","filter","count","sort","a","b","occurrences","code","DIAGNOSTIC_CODES","DUPLICATE_IDENTIFIER","reason","has","existingLeftInPlace"],"sourceRoot":"../../../src","sources":["reconcile/duplicates.ts"],"mappings":";;;;;;AAkBA,IAAAA,OAAA,GAAAC,OAAA;AAlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,eAAeA,CAC9BC,OAAuC,EACvCC,WAAgC,GAAG,IAAIC,GAAG,CAAC,CAAC,EAC3B;EACjB,MAAMC,MAAM,GAAG,IAAIC,GAAG,CAAiB,CAAC;EACxC,KAAK,MAAMC,OAAO,IAAIL,OAAO,EAAE;IAC9BG,MAAM,CAACG,GAAG,CAACD,OAAO,CAACE,EAAE,EAAE,CAACJ,MAAM,CAACK,GAAG,CAACH,OAAO,CAACE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EAC1D;EAEA,MAAME,MAA6B,GAAG,EAAE;EACxC,MAAMC,QAAyB,GAAG,EAAE;EAEpC,KAAK,MAAML,OAAO,IAAIL,OAAO,EAAE;IAC9B,IAAI,CAACG,MAAM,CAACK,GAAG,CAACH,OAAO,CAACE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;MACxCE,MAAM,CAACE,IAAI,CAACN,OAAO,CAAC;IACrB;EACD;;EAEA;EACA,MAAMO,QAAQ,GAAG,CAAC,GAAGT,MAAM,CAACU,OAAO,CAAC,CAAC,CAAC,CACpCC,MAAM,CAAC,CAAC,GAAGC,KAAK,CAAC,KAAKA,KAAK,GAAG,CAAC,CAAC,CAChCC,IAAI,CAAC,CAAC,CAACC,CAAC,CAAC,EAAE,CAACC,CAAC,CAAC,KAAMD,CAAC,GAAGC,CAAC,GAAG,CAAC,CAAC,GAAGD,CAAC,GAAGC,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;EAElD,KAAK,MAAM,CAACX,EAAE,EAAEY,WAAW,CAAC,IAAIP,QAAQ,EAAE;IACzCF,QAAQ,CAACC,IAAI,CAAC;MACbJ,EAAE;MACFa,IAAI,EAAEC,wBAAgB,CAACC,oBAAoB;MAC3CC,MAAM,EACL,uBAAuBJ,WAAW,yGAAyG,IAC1IlB,WAAW,CAACuB,GAAG,CAACjB,EAAE,CAAC,GACjB,2GAA2G,GAC3G,EAAE,CAAC;MACPY,WAAW;MACXM,mBAAmB,EAAExB,WAAW,CAACuB,GAAG,CAACjB,EAAE;IACxC,CAAC,CAAC;EACH;EAEA,OAAO;IAAEE,MAAM;IAAEC;EAAS,CAAC;AAC5B","ignoreList":[]}