@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 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["push/provider-adapter.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Sign-out cleanup.
5
+ *
6
+ * Three things must happen together, and the order matters: invalidate the
7
+ * token first so no further messages arrive for the account being left, then
8
+ * cancel its notifications, then clear its persisted state.
9
+ *
10
+ * Deliberately **scoped to one owner tag**. On a shared device, signing one
11
+ * account out must not clear another's deduplication history or cancel their
12
+ * reminders — and must not discard the channel migration ledger, which
13
+ * describes the device rather than any account.
14
+ */
15
+
16
+ import { clearOwner } from "../state/reset.js";
17
+ export function createSignOut(deps) {
18
+ return {
19
+ async signOut(ownerTag) {
20
+ // Token first: stop the inbound flow before removing what would have
21
+ // handled it, so nothing arrives for an account that is already gone.
22
+ let tokenInvalidated = false;
23
+ if (deps.push !== undefined) {
24
+ try {
25
+ tokenInvalidated = await deps.push.invalidateToken();
26
+ } catch {
27
+ // A failed invalidation must not prevent local cleanup — leaving a
28
+ // signed-out account's notifications on the device is the worse of
29
+ // the two outcomes.
30
+ tokenInvalidated = false;
31
+ }
32
+ }
33
+ const cancelledIds = await deps.scheduler.cancelByOwner(ownerTag);
34
+ const {
35
+ clearedCollections
36
+ } = clearOwner(deps.state, ownerTag);
37
+ deps.emit?.('SIGN_OUT', `Signed out ${ownerTag}: token ${tokenInvalidated ? 'invalidated' : 'not invalidated'}, ${cancelledIds.length} notification(s) cancelled, per-owner state cleared.`, {
38
+ ownerTag,
39
+ tokenInvalidated,
40
+ cancelled: cancelledIds.length
41
+ });
42
+ return {
43
+ ownerTag,
44
+ tokenInvalidated,
45
+ cancelledIds,
46
+ clearedCollections
47
+ };
48
+ }
49
+ };
50
+ }
51
+ //# sourceMappingURL=signout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["clearOwner","createSignOut","deps","signOut","ownerTag","tokenInvalidated","push","undefined","invalidateToken","cancelledIds","scheduler","cancelByOwner","clearedCollections","state","emit","length","cancelled"],"sourceRoot":"../../../src","sources":["push/signout.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,UAAU,QAAQ,mBAAgB;AAiB3C,OAAO,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,GAAGZ,UAAU,CAACE,IAAI,CAACW,KAAK,EAAET,QAAQ,CAAC;MAE/DF,IAAI,CAACY,IAAI,GACR,UAAU,EACV,cAAcV,QAAQ,WAAWC,gBAAgB,GAAG,aAAa,GAAG,iBAAiB,KAAKI,YAAY,CAACM,MAAM,sDAAsD,EACnK;QAAEX,QAAQ;QAAEC,gBAAgB;QAAEW,SAAS,EAAEP,YAAY,CAACM;MAAO,CAC9D,CAAC;MAED,OAAO;QAAEX,QAAQ;QAAEC,gBAAgB;QAAEI,YAAY;QAAEG;MAAmB,CAAC;IACxE;EACD,CAAC;AACF","ignoreList":[]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Chunked application.
5
+ *
6
+ * A 500-entry reconciliation must not drop frames on a list screen, so work is
7
+ * applied in slices with a yield between them. No single slice may occupy the
8
+ * interface thread for more than 16 ms, which is what holds 60 fps while
9
+ * reconciliation is in flight.
10
+ */
11
+
12
+ export const DEFAULT_CHUNK_SIZE = 25;
13
+
14
+ /** Yields to the event loop so the interface thread can render between slices. */
15
+ export function yieldToEventLoop() {
16
+ return new Promise(resolve => setTimeout(resolve, 0));
17
+ }
18
+ /**
19
+ * Applies `work` to every item, yielding between chunks.
20
+ *
21
+ * Sequential within a chunk rather than parallel: these calls bridge to native,
22
+ * and a burst of concurrent scheduling is where duplicate-delivery races come
23
+ * from.
24
+ */
25
+ export async function applyInChunks(items, work, options = {}) {
26
+ const size = Math.max(1, options.size ?? DEFAULT_CHUNK_SIZE);
27
+ const yieldFn = options.onYield ?? yieldToEventLoop;
28
+ let applied = 0;
29
+ for (let start = 0; start < items.length; start += size) {
30
+ const chunk = items.slice(start, start + size);
31
+ for (const item of chunk) {
32
+ await work(item);
33
+ applied += 1;
34
+ }
35
+
36
+ // No yield after the final chunk — the caller is about to resume anyway.
37
+ if (start + size < items.length) {
38
+ await yieldFn();
39
+ }
40
+ }
41
+ return applied;
42
+ }
43
+ //# sourceMappingURL=chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_CHUNK_SIZE","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;;AAEA,OAAO,MAAMA,kBAAkB,GAAG,EAAE;;AAEpC;AACA,OAAO,SAASC,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;AACA,OAAO,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,IAAIT,kBAAkB,CAAC;EAC5D,MAAMY,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,101 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Desired-versus-device diffing.
5
+ *
6
+ * The package's central promise lives here: reconciling twice with unchanged
7
+ * input must produce **zero** platform operations on the second run. That is
8
+ * only true if "unchanged" is decided by comparing everything that would make
9
+ * the delivered notification different — miss a field and the second run
10
+ * rewrites entries needlessly; include a volatile one and it never settles.
11
+ *
12
+ * Anchoring mode is part of the comparison key deliberately. A mode change on
13
+ * the same identifier must force a replacement rather than read as unchanged,
14
+ * because the two modes resolve to different instants the moment a zone
15
+ * changes.
16
+ */
17
+
18
+ /** The fields that make one delivered notification different from another. */
19
+
20
+ /**
21
+ * Stable serialization of those fields. One function for what the app wants and
22
+ * what the device holds, so the two cannot drift into comparing different
23
+ * things (NOT-19).
24
+ */
25
+ function fingerprintFields(fields) {
26
+ 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,
27
+ // Key order is not stable across constructions, so sort before comparing —
28
+ // otherwise two structurally identical payloads could compare unequal and
29
+ // the second pass would rewrite every entry carrying routing data.
30
+ 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])]);
31
+ }
32
+ function fingerprint(request, resolvedAt) {
33
+ return fingerprintFields({
34
+ ...request,
35
+ resolvedAt,
36
+ anchoring: request.moment.anchoring ?? 'wallClock'
37
+ });
38
+ }
39
+ function entryFingerprint(entry) {
40
+ return fingerprintFields(entry);
41
+ }
42
+
43
+ /** Key-order-independent JSON, so structurally equal payloads compare equal. */
44
+ function stableStringify(value) {
45
+ if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null';
46
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;
47
+ const entries = Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
48
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(',')}}`;
49
+ }
50
+ /**
51
+ * Computes the minimal operation set.
52
+ *
53
+ * Cancels are emitted before creates so an interrupted pass leaves a
54
+ * recoverable gap rather than a duplicate: a missing notification is fixed by
55
+ * the next reconcile, whereas two notifications for one subject is a defect the
56
+ * user sees.
57
+ */
58
+ export function diff(input) {
59
+ const deviceById = new Map(input.device.map(entry => [entry.id, entry]));
60
+ const desiredIds = new Set(input.desired.map(request => request.id));
61
+ const cancels = [];
62
+ const writes = [];
63
+ const unchanged = [];
64
+ const protectedIds = input.protectedIds ?? new Set();
65
+ for (const entry of input.device) {
66
+ if (!desiredIds.has(entry.id) && !protectedIds.has(entry.id)) {
67
+ cancels.push({
68
+ kind: 'cancel',
69
+ id: entry.id
70
+ });
71
+ }
72
+ }
73
+ for (const request of input.desired) {
74
+ const resolvedAt = input.resolvedAt.get(request.id) ?? request.moment.at;
75
+ const existing = deviceById.get(request.id);
76
+ if (existing === undefined) {
77
+ writes.push({
78
+ kind: 'create',
79
+ id: request.id,
80
+ request,
81
+ resolvedAt
82
+ });
83
+ continue;
84
+ }
85
+ if (fingerprint(request, resolvedAt) === entryFingerprint(existing)) {
86
+ unchanged.push(request.id);
87
+ continue;
88
+ }
89
+ writes.push({
90
+ kind: 'replace',
91
+ id: request.id,
92
+ request,
93
+ resolvedAt
94
+ });
95
+ }
96
+ return {
97
+ operations: [...cancels, ...writes],
98
+ unchanged
99
+ };
100
+ }
101
+ //# 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,56 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Duplicate identifier resolution.
5
+ *
6
+ * An identifier appearing twice in one desired set means the caller's key
7
+ * derivation produced two notifications for one identity. That is a bug, not a
8
+ * preference, so the package refuses rather than silently picking a winner.
9
+ *
10
+ * **Every** copy is rejected — no entry wins. Order-independence then follows
11
+ * for free rather than having to be engineered: there is no "first" or "last"
12
+ * to depend on.
13
+ *
14
+ * The rule applies even to byte-identical duplicates. Treating those as
15
+ * mergeable would require a deep-equality definition that becomes a contract of
16
+ * its own, and a repeated identifier is a key-derivation bug either way.
17
+ */
18
+
19
+ import { DIAGNOSTIC_CODES } from "../contract/errors.js";
20
+ /**
21
+ * Splits a desired set into applicable entries and rejections.
22
+ *
23
+ * `existingIds` lets the rejection state whether a notification already
24
+ * scheduled under that identifier was left in place — without it a caller could
25
+ * reasonably read "rejected" as "cancelled".
26
+ */
27
+ export function splitDuplicates(desired, existingIds = new Set()) {
28
+ const counts = new Map();
29
+ for (const request of desired) {
30
+ counts.set(request.id, (counts.get(request.id) ?? 0) + 1);
31
+ }
32
+ const unique = [];
33
+ const rejected = [];
34
+ for (const request of desired) {
35
+ if ((counts.get(request.id) ?? 0) === 1) {
36
+ unique.push(request);
37
+ }
38
+ }
39
+
40
+ // Sorted so the report itself is order-independent, not merely its effect.
41
+ const repeated = [...counts.entries()].filter(([, count]) => count > 1).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
42
+ for (const [id, occurrences] of repeated) {
43
+ rejected.push({
44
+ id,
45
+ code: DIAGNOSTIC_CODES.DUPLICATE_IDENTIFIER,
46
+ 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.' : ''),
47
+ occurrences,
48
+ existingLeftInPlace: existingIds.has(id)
49
+ });
50
+ }
51
+ return {
52
+ unique,
53
+ rejected
54
+ };
55
+ }
56
+ //# sourceMappingURL=duplicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DIAGNOSTIC_CODES","splitDuplicates","desired","existingIds","Set","counts","Map","request","set","id","get","unique","rejected","push","repeated","entries","filter","count","sort","a","b","occurrences","code","DUPLICATE_IDENTIFIER","reason","has","existingLeftInPlace"],"sourceRoot":"../../../src","sources":["reconcile/duplicates.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,gBAAgB,QAAQ,uBAAoB;AASrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,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,EAAEtB,gBAAgB,CAACuB,oBAAoB;MAC3CC,MAAM,EACL,uBAAuBH,WAAW,yGAAyG,IAC1IlB,WAAW,CAACsB,GAAG,CAAChB,EAAE,CAAC,GACjB,2GAA2G,GAC3G,EAAE,CAAC;MACPY,WAAW;MACXK,mBAAmB,EAAEvB,WAAW,CAACsB,GAAG,CAAChB,EAAE;IACxC,CAAC,CAAC;EACH;EAEA,OAAO;IAAEE,MAAM;IAAEC;EAAS,CAAC;AAC5B","ignoreList":[]}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * The reconciliation operation.
5
+ *
6
+ * A caller hands over the complete set its data implies; the package works out
7
+ * what to add, replace, and remove. This is **never** run automatically — only
8
+ * the caller knows what its data implies, and a package that guessed a desired
9
+ * set would cancel notifications it does not understand.
10
+ *
11
+ * Overlapping calls are serialized rather than run concurrently, because two
12
+ * passes interleaving their cancels and creates is exactly how duplicates
13
+ * appear.
14
+ */
15
+
16
+ import { DIAGNOSTIC_CODES } from "../contract/errors.js";
17
+ import { anchorMoment } from "../schedule/anchor.js";
18
+ import { resolveMoment } from "../schedule/resolve-moment.js";
19
+ import { validateRequest } from "../schedule/index.js";
20
+ import { isNotificationError } from "../contract/errors.js";
21
+ import { splitDuplicates } from "./duplicates.js";
22
+ import { truncateToCeiling } from "./truncate.js";
23
+ import { createScheduleWriter } from "../schedule/writer.js";
24
+ import { diff } from "./diff.js";
25
+ import { applyInChunks } from "./chunk.js";
26
+ /**
27
+ * Narrows the device set to the caller's declared domain.
28
+ *
29
+ * Everything outside it is invisible to this pass, which is what makes it safe
30
+ * to cancel strays: a notification from another domain or another library is
31
+ * never a stray, it simply is not ours.
32
+ */
33
+ function inDomain(entry, input) {
34
+ if (entry.pushCreated && input.includePushCreated !== true) return false;
35
+ return entry.groupTag === input.domain;
36
+ }
37
+ export function createReconciler(deps) {
38
+ const emit = deps.emit ?? (() => {});
39
+ const writer = createScheduleWriter(deps.engine);
40
+ let inFlight = Promise.resolve();
41
+ const run = async input => {
42
+ const startedAt = deps.now();
43
+ const zone = deps.timeZone();
44
+ const everything = await deps.engine.getPending();
45
+ const device = everything.filter(entry => inDomain(entry, input));
46
+ // The ceiling is the platform's, shared with every other domain, every
47
+ // recurring series and every directly scheduled notification. Budgeting a
48
+ // domain against the whole of it let two domains and a series overflow iOS's
49
+ // 64 together while each reported "nothing truncated" (NOT-11).
50
+ const heldElsewhere = everything.length - device.length;
51
+ const existingIds = new Set(device.map(entry => entry.id));
52
+
53
+ // Duplicates first: a repeated identifier is refused before anything else
54
+ // looks at it, so no later stage has to decide which copy it meant.
55
+ const {
56
+ unique,
57
+ rejected: duplicateRejections
58
+ } = splitDuplicates(input.desired, existingIds);
59
+ const rejected = [...duplicateRejections];
60
+
61
+ // Validate and anchor. A rejection here removes one entry; it never fails
62
+ // the pass, because 499 valid entries should not be lost to one bad one.
63
+ const valid = [];
64
+ const resolvedAt = new Map();
65
+ for (const request of unique) {
66
+ try {
67
+ validateRequest(request, deps.resolveTone);
68
+ const anchored = anchorMoment(request.moment, zone);
69
+ const resolution = resolveMoment(anchored.resolvedAt, deps.now());
70
+ resolvedAt.set(request.id, resolution.at);
71
+ valid.push(request);
72
+ } catch (error) {
73
+ rejected.push({
74
+ id: request.id,
75
+ code: isNotificationError(error) ? error.code : 'UNKNOWN',
76
+ reason: error instanceof Error ? error.message : String(error),
77
+ occurrences: 1,
78
+ existingLeftInPlace: existingIds.has(request.id)
79
+ });
80
+ }
81
+ }
82
+
83
+ // Stop markers occupy real platform capacity, so the ceiling a consumer's
84
+ // notifications can actually use is smaller than the platform's own.
85
+ // Hiding that would let the package quietly reduce how many notifications
86
+ // fit and report a full set as registered when it was not.
87
+ // One pass: the outstanding stop markers are read once for the capacity and
88
+ // every operation below, not once per operation (NOT-08).
89
+ const pass = writer.pass();
90
+ const {
91
+ kept,
92
+ report: truncation
93
+ } = truncateToCeiling(valid, resolvedAt, Math.max(0, (await pass.capacity()) - heldElsewhere));
94
+ if (truncation !== undefined) {
95
+ emit(DIAGNOSTIC_CODES.TRUNCATED_OVER_CEILING, `Desired set exceeded the platform ceiling of ${truncation.ceiling}; ${truncation.droppedCount} furthest-out entries were not registered. They are re-evaluated at the next window refresh.`, {
96
+ ceiling: truncation.ceiling,
97
+ dropped: truncation.droppedCount
98
+ });
99
+ }
100
+
101
+ // Every rejected identifier is protected from cancellation. A rejection
102
+ // means the package could not tell what the caller intended, and
103
+ // destroying the existing notification on that basis would be the worst
104
+ // available answer (FR-028c).
105
+ const {
106
+ operations,
107
+ unchanged
108
+ } = diff({
109
+ desired: kept,
110
+ resolvedAt,
111
+ device,
112
+ protectedIds: new Set(rejected.map(entry => entry.id))
113
+ });
114
+ const created = [];
115
+ const replaced = [];
116
+ const cancelled = [];
117
+ const approximate = !deps.canScheduleExactly();
118
+ await applyInChunks(operations, async operation => {
119
+ if (operation.kind === 'cancel') {
120
+ await pass.cancel(operation.id);
121
+ cancelled.push(operation.id);
122
+ return;
123
+ }
124
+ const request = operation.request;
125
+ const tone = deps.resolveTone(request.tone);
126
+ await pass.write({
127
+ request,
128
+ resolvedAt: operation.resolvedAt,
129
+ tone,
130
+ anchoringGeneration: (request.moment.anchoring ?? 'wallClock') === 'absolute' ? undefined : zone,
131
+ approximate
132
+ });
133
+ (operation.kind === 'create' ? created : replaced).push(operation.id);
134
+ }, {
135
+ size: deps.chunkSize
136
+ });
137
+ return {
138
+ domain: input.domain,
139
+ created,
140
+ replaced,
141
+ cancelled,
142
+ unchanged,
143
+ rejected,
144
+ truncated: truncation,
145
+ operationCount: operations.length,
146
+ durationMs: deps.now() - startedAt
147
+ };
148
+ };
149
+ return {
150
+ /**
151
+ * Serialized against itself: a second call waits for the first rather than
152
+ * interleaving with it.
153
+ */
154
+ async reconcile(input) {
155
+ const next = inFlight.then(() => run(input), () => run(input));
156
+ inFlight = next.catch(() => undefined);
157
+ return next;
158
+ }
159
+ };
160
+ }
161
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DIAGNOSTIC_CODES","anchorMoment","resolveMoment","validateRequest","isNotificationError","splitDuplicates","truncateToCeiling","createScheduleWriter","diff","applyInChunks","inDomain","entry","input","pushCreated","includePushCreated","groupTag","domain","createReconciler","deps","emit","writer","engine","inFlight","Promise","resolve","run","startedAt","now","zone","timeZone","everything","getPending","device","filter","heldElsewhere","length","existingIds","Set","map","id","unique","rejected","duplicateRejections","desired","valid","resolvedAt","Map","request","resolveTone","anchored","moment","resolution","set","at","push","error","code","reason","Error","message","String","occurrences","existingLeftInPlace","has","pass","kept","report","truncation","Math","max","capacity","undefined","TRUNCATED_OVER_CEILING","ceiling","droppedCount","dropped","operations","unchanged","protectedIds","created","replaced","cancelled","approximate","canScheduleExactly","operation","kind","cancel","tone","write","anchoringGeneration","anchoring","size","chunkSize","truncated","operationCount","durationMs","reconcile","next","then","catch"],"sourceRoot":"../../../src","sources":["reconcile/index.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Platform-ceiling truncation.
5
+ *
6
+ * iOS keeps only the 64 soonest pending notifications and silently discards the
7
+ * rest. The package computes the same cut deliberately, so the outcome is
8
+ * reported rather than discovered as missing notifications.
9
+ *
10
+ * Soonest-first is the only rule that degrades gracefully: dropped entries are
11
+ * not lost, they are simply not yet registered, and each window refresh
12
+ * registers those that have moved into range.
13
+ */
14
+
15
+ /**
16
+ * Keeps the `ceiling` soonest entries.
17
+ *
18
+ * Ties on the delivery instant are broken by identifier so the cut is
19
+ * deterministic — otherwise two runs over the same data could drop different
20
+ * entries and the idempotence guarantee would not hold.
21
+ */
22
+ export function truncateToCeiling(desired, resolvedAt, ceiling) {
23
+ if (desired.length <= ceiling) {
24
+ return {
25
+ kept: desired
26
+ };
27
+ }
28
+ const ordered = [...desired].sort((a, b) => {
29
+ const aAt = resolvedAt.get(a.id) ?? a.moment.at;
30
+ const bAt = resolvedAt.get(b.id) ?? b.moment.at;
31
+ if (aAt !== bAt) return aAt - bAt;
32
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
33
+ });
34
+ const kept = ordered.slice(0, ceiling);
35
+ const dropped = ordered.slice(ceiling);
36
+ return {
37
+ kept,
38
+ report: {
39
+ ceiling,
40
+ droppedCount: dropped.length,
41
+ droppedIds: dropped.map(entry => entry.id),
42
+ reEvaluatedOnNextRefresh: true
43
+ }
44
+ };
45
+ }
46
+ //# sourceMappingURL=truncate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["truncateToCeiling","desired","resolvedAt","ceiling","length","kept","ordered","sort","a","b","aAt","get","id","moment","at","bAt","slice","dropped","report","droppedCount","droppedIds","map","entry","reEvaluatedOnNextRefresh"],"sourceRoot":"../../../src","sources":["reconcile/truncate.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAChCC,OAAuC,EACvCC,UAAuC,EACvCC,OAAe,EACK;EACpB,IAAIF,OAAO,CAACG,MAAM,IAAID,OAAO,EAAE;IAC9B,OAAO;MAAEE,IAAI,EAAEJ;IAAQ,CAAC;EACzB;EAEA,MAAMK,OAAO,GAAG,CAAC,GAAGL,OAAO,CAAC,CAACM,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IAC3C,MAAMC,GAAG,GAAGR,UAAU,CAACS,GAAG,CAACH,CAAC,CAACI,EAAE,CAAC,IAAIJ,CAAC,CAACK,MAAM,CAACC,EAAE;IAC/C,MAAMC,GAAG,GAAGb,UAAU,CAACS,GAAG,CAACF,CAAC,CAACG,EAAE,CAAC,IAAIH,CAAC,CAACI,MAAM,CAACC,EAAE;IAC/C,IAAIJ,GAAG,KAAKK,GAAG,EAAE,OAAOL,GAAG,GAAGK,GAAG;IACjC,OAAOP,CAAC,CAACI,EAAE,GAAGH,CAAC,CAACG,EAAE,GAAG,CAAC,CAAC,GAAGJ,CAAC,CAACI,EAAE,GAAGH,CAAC,CAACG,EAAE,GAAG,CAAC,GAAG,CAAC;EAC9C,CAAC,CAAC;EAEF,MAAMP,IAAI,GAAGC,OAAO,CAACU,KAAK,CAAC,CAAC,EAAEb,OAAO,CAAC;EACtC,MAAMc,OAAO,GAAGX,OAAO,CAACU,KAAK,CAACb,OAAO,CAAC;EAEtC,OAAO;IACNE,IAAI;IACJa,MAAM,EAAE;MACPf,OAAO;MACPgB,YAAY,EAAEF,OAAO,CAACb,MAAM;MAC5BgB,UAAU,EAAEH,OAAO,CAACI,GAAG,CAACC,KAAK,IAAIA,KAAK,CAACV,EAAE,CAAC;MAC1CW,wBAAwB,EAAE;IAC3B;EACD,CAAC;AACF","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Clock-discontinuity bounding.
5
+ *
6
+ * A device clock moved backwards makes past occurrences look future again. Left
7
+ * alone, the next expansion would re-register every occurrence the user already
8
+ * received, and moving the clock forward again would fire them all at once.
9
+ *
10
+ * The guard is deliberately blunt: occurrences at or before the last horizon the
11
+ * series already expanded through are never re-emitted. The package would
12
+ * rather lose an occurrence after a manual clock change than deliver a burst of
13
+ * notifications for events that already happened.
14
+ */
15
+
16
+ /** A jump larger than this is treated as a clock change rather than ordinary drift. */
17
+ export const CLOCK_DISCONTINUITY_THRESHOLD_MS = 60 * 60 * 1000;
18
+ /**
19
+ * Drops occurrences that a clock discontinuity would otherwise resurrect.
20
+ *
21
+ * Forward jumps are detected and reported but not filtered: an occurrence that
22
+ * became due because time genuinely passed is legitimate, and the platform's
23
+ * own delivery is the right place for it to be resolved.
24
+ */
25
+ export function guardAgainstClockChange(input) {
26
+ const {
27
+ occurrences,
28
+ previousHorizon,
29
+ now,
30
+ previousNow
31
+ } = input;
32
+ let discontinuity = 'none';
33
+ if (previousNow !== undefined) {
34
+ const delta = now - previousNow;
35
+ if (delta < -CLOCK_DISCONTINUITY_THRESHOLD_MS) {
36
+ discontinuity = 'backwards';
37
+ } else if (delta > CLOCK_DISCONTINUITY_THRESHOLD_MS * 24) {
38
+ discontinuity = 'forwards';
39
+ }
40
+ }
41
+ if (previousHorizon === undefined) {
42
+ return {
43
+ occurrences,
44
+ suppressed: 0,
45
+ discontinuity
46
+ };
47
+ }
48
+
49
+ // Anything at or before the previously-expanded horizon was already handled
50
+ // once. Re-emitting it would mean delivering a notification for an event the
51
+ // user has already seen.
52
+ const kept = occurrences.filter(occurrence => occurrence.at > previousHorizon || occurrence.at > now);
53
+ const alreadyHandled = occurrences.filter(occurrence => occurrence.at <= previousHorizon && occurrence.at <= now);
54
+ return {
55
+ occurrences: kept,
56
+ suppressed: alreadyHandled.length,
57
+ discontinuity
58
+ };
59
+ }
60
+ //# sourceMappingURL=clock-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CLOCK_DISCONTINUITY_THRESHOLD_MS","guardAgainstClockChange","input","occurrences","previousHorizon","now","previousNow","discontinuity","undefined","delta","suppressed","kept","filter","occurrence","at","alreadyHandled","length"],"sourceRoot":"../../../src","sources":["recurrence/clock-guard.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA,OAAO,MAAMA,gCAAgC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAiB9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CAACC,KAAsB,EAAoB;EACjF,MAAM;IAAEC,WAAW;IAAEC,eAAe;IAAEC,GAAG;IAAEC;EAAY,CAAC,GAAGJ,KAAK;EAEhE,IAAIK,aAAgD,GAAG,MAAM;EAC7D,IAAID,WAAW,KAAKE,SAAS,EAAE;IAC9B,MAAMC,KAAK,GAAGJ,GAAG,GAAGC,WAAW;IAC/B,IAAIG,KAAK,GAAG,CAACT,gCAAgC,EAAE;MAC9CO,aAAa,GAAG,WAAW;IAC5B,CAAC,MAAM,IAAIE,KAAK,GAAGT,gCAAgC,GAAG,EAAE,EAAE;MACzDO,aAAa,GAAG,UAAU;IAC3B;EACD;EAEA,IAAIH,eAAe,KAAKI,SAAS,EAAE;IAClC,OAAO;MAAEL,WAAW;MAAEO,UAAU,EAAE,CAAC;MAAEH;IAAc,CAAC;EACrD;;EAEA;EACA;EACA;EACA,MAAMI,IAAI,GAAGR,WAAW,CAACS,MAAM,CAC9BC,UAAU,IAAIA,UAAU,CAACC,EAAE,GAAGV,eAAe,IAAIS,UAAU,CAACC,EAAE,GAAGT,GAClE,CAAC;EACD,MAAMU,cAAc,GAAGZ,WAAW,CAACS,MAAM,CACxCC,UAAU,IAAIA,UAAU,CAACC,EAAE,IAAIV,eAAe,IAAIS,UAAU,CAACC,EAAE,IAAIT,GACpE,CAAC;EAED,OAAO;IACNF,WAAW,EAAEQ,IAAI;IACjBD,UAAU,EAAEK,cAAc,CAACC,MAAM;IACjCT;EACD,CAAC;AACF","ignoreList":[]}