@chipmobilesdk/rn-notification 0.6.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.
- package/CHANGELOG.md +111 -0
- package/README.md +8 -6
- package/lib/commonjs/advanced.js +139 -0
- package/lib/commonjs/advanced.js.map +1 -0
- package/lib/commonjs/channel/migrate.js +246 -0
- package/lib/commonjs/channel/migrate.js.map +1 -0
- package/lib/commonjs/channel/tone-map.js +120 -0
- package/lib/commonjs/channel/tone-map.js.map +1 -0
- package/lib/commonjs/channel/validate-tone.js +61 -0
- package/lib/commonjs/channel/validate-tone.js.map +1 -0
- package/lib/commonjs/contract/channel.js +52 -0
- package/lib/commonjs/contract/channel.js.map +1 -0
- package/lib/commonjs/contract/diagnostics.js +25 -0
- package/lib/commonjs/contract/diagnostics.js.map +1 -0
- package/lib/commonjs/contract/errors.js +126 -0
- package/lib/commonjs/contract/errors.js.map +1 -0
- package/lib/commonjs/contract/hash.js +35 -0
- package/lib/commonjs/contract/hash.js.map +1 -0
- package/lib/commonjs/contract/index.js +94 -0
- package/lib/commonjs/contract/index.js.map +1 -0
- package/lib/commonjs/contract/interaction.js +37 -0
- package/lib/commonjs/contract/interaction.js.map +1 -0
- package/lib/commonjs/contract/notification.js +42 -0
- package/lib/commonjs/contract/notification.js.map +1 -0
- package/lib/commonjs/contract/permission.js +2 -0
- package/lib/commonjs/contract/permission.js.map +1 -0
- package/lib/commonjs/contract/reconcile.js +6 -0
- package/lib/commonjs/contract/reconcile.js.map +1 -0
- package/lib/commonjs/contract/recurrence.js +53 -0
- package/lib/commonjs/contract/recurrence.js.map +1 -0
- package/lib/commonjs/diagnostics/burst.js +89 -0
- package/lib/commonjs/diagnostics/burst.js.map +1 -0
- package/lib/commonjs/diagnostics/events.js +63 -0
- package/lib/commonjs/diagnostics/events.js.map +1 -0
- package/lib/commonjs/diagnostics/redact.js +48 -0
- package/lib/commonjs/diagnostics/redact.js.map +1 -0
- package/lib/commonjs/diagnostics/snapshot.js +68 -0
- package/lib/commonjs/diagnostics/snapshot.js.map +1 -0
- package/lib/commonjs/engine/adapter.js +6 -0
- package/lib/commonjs/engine/adapter.js.map +1 -0
- package/lib/commonjs/engine/codec.js +84 -0
- package/lib/commonjs/engine/codec.js.map +1 -0
- package/lib/commonjs/engine/notify-kit/events.js +148 -0
- package/lib/commonjs/engine/notify-kit/events.js.map +1 -0
- package/lib/commonjs/engine/notify-kit/module.js +119 -0
- package/lib/commonjs/engine/notify-kit/module.js.map +1 -0
- package/lib/commonjs/engine/notify-kit/platform/android.js +159 -0
- package/lib/commonjs/engine/notify-kit/platform/android.js.map +1 -0
- package/lib/commonjs/engine/notify-kit/platform/index.js +57 -0
- package/lib/commonjs/engine/notify-kit/platform/index.js.map +1 -0
- package/lib/commonjs/engine/notify-kit/platform/ios.js +54 -0
- package/lib/commonjs/engine/notify-kit/platform/ios.js.map +1 -0
- package/lib/commonjs/engine/notify-kit/platform/types.js +6 -0
- package/lib/commonjs/engine/notify-kit/platform/types.js.map +1 -0
- package/lib/commonjs/engine/notify-kit-engine.js +260 -0
- package/lib/commonjs/engine/notify-kit-engine.js.map +1 -0
- package/lib/commonjs/index.js +367 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/initialize.js +187 -0
- package/lib/commonjs/initialize.js.map +1 -0
- package/lib/commonjs/interaction/index.js +120 -0
- package/lib/commonjs/interaction/index.js.map +1 -0
- package/lib/commonjs/maintenance/cycle.js +108 -0
- package/lib/commonjs/maintenance/cycle.js.map +1 -0
- package/lib/commonjs/maintenance/permission-refresh.js +39 -0
- package/lib/commonjs/maintenance/permission-refresh.js.map +1 -0
- package/lib/commonjs/maintenance/reanchor.js +99 -0
- package/lib/commonjs/maintenance/reanchor.js.map +1 -0
- package/lib/commonjs/maintenance/toggle.js +50 -0
- package/lib/commonjs/maintenance/toggle.js.map +1 -0
- package/lib/commonjs/maintenance/verify.js +70 -0
- package/lib/commonjs/maintenance/verify.js.map +1 -0
- package/lib/commonjs/maintenance/window-refresh.js +53 -0
- package/lib/commonjs/maintenance/window-refresh.js.map +1 -0
- package/lib/commonjs/notifications.js +161 -0
- package/lib/commonjs/notifications.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/permission/index.js +182 -0
- package/lib/commonjs/permission/index.js.map +1 -0
- package/lib/commonjs/permission/state.js +92 -0
- package/lib/commonjs/permission/state.js.map +1 -0
- package/lib/commonjs/push/envelope.js +141 -0
- package/lib/commonjs/push/envelope.js.map +1 -0
- package/lib/commonjs/push/fcm-provider.js +122 -0
- package/lib/commonjs/push/fcm-provider.js.map +1 -0
- package/lib/commonjs/push/gate.js +162 -0
- package/lib/commonjs/push/gate.js.map +1 -0
- package/lib/commonjs/push/index.js +47 -0
- package/lib/commonjs/push/index.js.map +1 -0
- package/lib/commonjs/push/instructions.js +101 -0
- package/lib/commonjs/push/instructions.js.map +1 -0
- package/lib/commonjs/push/provider-adapter.js +6 -0
- package/lib/commonjs/push/provider-adapter.js.map +1 -0
- package/lib/commonjs/push/signout.js +55 -0
- package/lib/commonjs/push/signout.js.map +1 -0
- package/lib/commonjs/reconcile/chunk.js +49 -0
- package/lib/commonjs/reconcile/chunk.js.map +1 -0
- package/lib/commonjs/reconcile/diff.js +105 -0
- package/lib/commonjs/reconcile/diff.js.map +1 -0
- package/lib/commonjs/reconcile/duplicates.js +60 -0
- package/lib/commonjs/reconcile/duplicates.js.map +1 -0
- package/lib/commonjs/reconcile/index.js +164 -0
- package/lib/commonjs/reconcile/index.js.map +1 -0
- package/lib/commonjs/reconcile/truncate.js +50 -0
- package/lib/commonjs/reconcile/truncate.js.map +1 -0
- package/lib/commonjs/recurrence/clock-guard.js +65 -0
- package/lib/commonjs/recurrence/clock-guard.js.map +1 -0
- package/lib/commonjs/recurrence/expand.js +254 -0
- package/lib/commonjs/recurrence/expand.js.map +1 -0
- package/lib/commonjs/recurrence/index.js +212 -0
- package/lib/commonjs/recurrence/index.js.map +1 -0
- package/lib/commonjs/repeat/expiry.js +41 -0
- package/lib/commonjs/repeat/expiry.js.map +1 -0
- package/lib/commonjs/repeat/index.js +100 -0
- package/lib/commonjs/repeat/index.js.map +1 -0
- package/lib/commonjs/repeat/marker.js +58 -0
- package/lib/commonjs/repeat/marker.js.map +1 -0
- package/lib/commonjs/repeat/place.js +83 -0
- package/lib/commonjs/repeat/place.js.map +1 -0
- package/lib/commonjs/schedule/anchor.js +243 -0
- package/lib/commonjs/schedule/anchor.js.map +1 -0
- package/lib/commonjs/schedule/index.js +142 -0
- package/lib/commonjs/schedule/index.js.map +1 -0
- package/lib/commonjs/schedule/partition.js +59 -0
- package/lib/commonjs/schedule/partition.js.map +1 -0
- package/lib/commonjs/schedule/resolve-moment.js +72 -0
- package/lib/commonjs/schedule/resolve-moment.js.map +1 -0
- package/lib/commonjs/schedule/validate-content.js +101 -0
- package/lib/commonjs/schedule/validate-content.js.map +1 -0
- package/lib/commonjs/schedule/validate-identifier.js +126 -0
- package/lib/commonjs/schedule/validate-identifier.js.map +1 -0
- package/lib/commonjs/schedule/writer.js +44 -0
- package/lib/commonjs/schedule/writer.js.map +1 -0
- package/lib/commonjs/state/caps.js +101 -0
- package/lib/commonjs/state/caps.js.map +1 -0
- package/lib/commonjs/state/dedup-ledger.js +39 -0
- package/lib/commonjs/state/dedup-ledger.js.map +1 -0
- package/lib/commonjs/state/interaction-buffer.js +98 -0
- package/lib/commonjs/state/interaction-buffer.js.map +1 -0
- package/lib/commonjs/state/mmkv-store.js +75 -0
- package/lib/commonjs/state/mmkv-store.js.map +1 -0
- package/lib/commonjs/state/permission-history.js +64 -0
- package/lib/commonjs/state/permission-history.js.map +1 -0
- package/lib/commonjs/state/record.js +269 -0
- package/lib/commonjs/state/record.js.map +1 -0
- package/lib/commonjs/state/reset.js +37 -0
- package/lib/commonjs/state/reset.js.map +1 -0
- package/lib/commonjs/state/series-ledger.js +71 -0
- package/lib/commonjs/state/series-ledger.js.map +1 -0
- package/lib/commonjs/state/store.js +39 -0
- package/lib/commonjs/state/store.js.map +1 -0
- package/lib/commonjs/testing/conformance/index.js +218 -0
- package/lib/commonjs/testing/conformance/index.js.map +1 -0
- package/lib/commonjs/testing/fake-engine.js +338 -0
- package/lib/commonjs/testing/fake-engine.js.map +1 -0
- package/lib/commonjs/testing/fake-provider.js +93 -0
- package/lib/commonjs/testing/fake-provider.js.map +1 -0
- package/lib/commonjs/testing/faults.js +59 -0
- package/lib/commonjs/testing/faults.js.map +1 -0
- package/lib/commonjs/testing/index.js +54 -0
- package/lib/commonjs/testing/index.js.map +1 -0
- package/lib/commonjs/testing/measure.js +298 -0
- package/lib/commonjs/testing/measure.js.map +1 -0
- package/lib/module/advanced.js +29 -0
- package/lib/module/advanced.js.map +1 -0
- package/lib/module/channel/migrate.js +242 -0
- package/lib/module/channel/migrate.js.map +1 -0
- package/lib/module/channel/tone-map.js +112 -0
- package/lib/module/channel/tone-map.js.map +1 -0
- package/lib/module/channel/validate-tone.js +57 -0
- package/lib/module/channel/validate-tone.js.map +1 -0
- package/lib/module/contract/channel.js +48 -0
- package/lib/module/contract/channel.js.map +1 -0
- package/lib/module/contract/diagnostics.js +21 -0
- package/lib/module/contract/diagnostics.js.map +1 -0
- package/lib/module/contract/errors.js +119 -0
- package/lib/module/contract/errors.js.map +1 -0
- package/lib/module/contract/hash.js +29 -0
- package/lib/module/contract/hash.js.map +1 -0
- package/lib/module/contract/index.js +13 -0
- package/lib/module/contract/index.js.map +1 -0
- package/lib/module/contract/interaction.js +33 -0
- package/lib/module/contract/interaction.js.map +1 -0
- package/lib/module/contract/notification.js +38 -0
- package/lib/module/contract/notification.js.map +1 -0
- package/lib/module/contract/permission.js +2 -0
- package/lib/module/contract/permission.js.map +1 -0
- package/lib/module/contract/reconcile.js +4 -0
- package/lib/module/contract/reconcile.js.map +1 -0
- package/lib/module/contract/recurrence.js +49 -0
- package/lib/module/contract/recurrence.js.map +1 -0
- package/lib/module/diagnostics/burst.js +85 -0
- package/lib/module/diagnostics/burst.js.map +1 -0
- package/lib/module/diagnostics/events.js +58 -0
- package/lib/module/diagnostics/events.js.map +1 -0
- package/lib/module/diagnostics/redact.js +44 -0
- package/lib/module/diagnostics/redact.js.map +1 -0
- package/lib/module/diagnostics/snapshot.js +64 -0
- package/lib/module/diagnostics/snapshot.js.map +1 -0
- package/lib/module/engine/adapter.js +4 -0
- package/lib/module/engine/adapter.js.map +1 -0
- package/lib/module/engine/codec.js +79 -0
- package/lib/module/engine/codec.js.map +1 -0
- package/lib/module/engine/notify-kit/events.js +139 -0
- package/lib/module/engine/notify-kit/events.js.map +1 -0
- package/lib/module/engine/notify-kit/module.js +113 -0
- package/lib/module/engine/notify-kit/module.js.map +1 -0
- package/lib/module/engine/notify-kit/platform/android.js +155 -0
- package/lib/module/engine/notify-kit/platform/android.js.map +1 -0
- package/lib/module/engine/notify-kit/platform/index.js +51 -0
- package/lib/module/engine/notify-kit/platform/index.js.map +1 -0
- package/lib/module/engine/notify-kit/platform/ios.js +49 -0
- package/lib/module/engine/notify-kit/platform/ios.js.map +1 -0
- package/lib/module/engine/notify-kit/platform/types.js +4 -0
- package/lib/module/engine/notify-kit/platform/types.js.map +1 -0
- package/lib/module/engine/notify-kit-engine.js +257 -0
- package/lib/module/engine/notify-kit-engine.js.map +1 -0
- package/lib/module/index.js +98 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/initialize.js +182 -0
- package/lib/module/initialize.js.map +1 -0
- package/lib/module/interaction/index.js +116 -0
- package/lib/module/interaction/index.js.map +1 -0
- package/lib/module/maintenance/cycle.js +102 -0
- package/lib/module/maintenance/cycle.js.map +1 -0
- package/lib/module/maintenance/permission-refresh.js +34 -0
- package/lib/module/maintenance/permission-refresh.js.map +1 -0
- package/lib/module/maintenance/reanchor.js +94 -0
- package/lib/module/maintenance/reanchor.js.map +1 -0
- package/lib/module/maintenance/toggle.js +45 -0
- package/lib/module/maintenance/toggle.js.map +1 -0
- package/lib/module/maintenance/verify.js +65 -0
- package/lib/module/maintenance/verify.js.map +1 -0
- package/lib/module/maintenance/window-refresh.js +48 -0
- package/lib/module/maintenance/window-refresh.js.map +1 -0
- package/lib/module/notifications.js +157 -0
- package/lib/module/notifications.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/permission/index.js +178 -0
- package/lib/module/permission/index.js.map +1 -0
- package/lib/module/permission/state.js +83 -0
- package/lib/module/permission/state.js.map +1 -0
- package/lib/module/push/envelope.js +137 -0
- package/lib/module/push/envelope.js.map +1 -0
- package/lib/module/push/fcm-provider.js +119 -0
- package/lib/module/push/fcm-provider.js.map +1 -0
- package/lib/module/push/gate.js +158 -0
- package/lib/module/push/gate.js.map +1 -0
- package/lib/module/push/index.js +16 -0
- package/lib/module/push/index.js.map +1 -0
- package/lib/module/push/instructions.js +97 -0
- package/lib/module/push/instructions.js.map +1 -0
- package/lib/module/push/provider-adapter.js +4 -0
- package/lib/module/push/provider-adapter.js.map +1 -0
- package/lib/module/push/signout.js +51 -0
- package/lib/module/push/signout.js.map +1 -0
- package/lib/module/reconcile/chunk.js +43 -0
- package/lib/module/reconcile/chunk.js.map +1 -0
- package/lib/module/reconcile/diff.js +101 -0
- package/lib/module/reconcile/diff.js.map +1 -0
- package/lib/module/reconcile/duplicates.js +56 -0
- package/lib/module/reconcile/duplicates.js.map +1 -0
- package/lib/module/reconcile/index.js +161 -0
- package/lib/module/reconcile/index.js.map +1 -0
- package/lib/module/reconcile/truncate.js +46 -0
- package/lib/module/reconcile/truncate.js.map +1 -0
- package/lib/module/recurrence/clock-guard.js +60 -0
- package/lib/module/recurrence/clock-guard.js.map +1 -0
- package/lib/module/recurrence/expand.js +248 -0
- package/lib/module/recurrence/expand.js.map +1 -0
- package/lib/module/recurrence/index.js +208 -0
- package/lib/module/recurrence/index.js.map +1 -0
- package/lib/module/repeat/expiry.js +37 -0
- package/lib/module/repeat/expiry.js.map +1 -0
- package/lib/module/repeat/index.js +67 -0
- package/lib/module/repeat/index.js.map +1 -0
- package/lib/module/repeat/marker.js +51 -0
- package/lib/module/repeat/marker.js.map +1 -0
- package/lib/module/repeat/place.js +79 -0
- package/lib/module/repeat/place.js.map +1 -0
- package/lib/module/schedule/anchor.js +234 -0
- package/lib/module/schedule/anchor.js.map +1 -0
- package/lib/module/schedule/index.js +137 -0
- package/lib/module/schedule/index.js.map +1 -0
- package/lib/module/schedule/partition.js +53 -0
- package/lib/module/schedule/partition.js.map +1 -0
- package/lib/module/schedule/resolve-moment.js +66 -0
- package/lib/module/schedule/resolve-moment.js.map +1 -0
- package/lib/module/schedule/validate-content.js +95 -0
- package/lib/module/schedule/validate-content.js.map +1 -0
- package/lib/module/schedule/validate-identifier.js +119 -0
- package/lib/module/schedule/validate-identifier.js.map +1 -0
- package/lib/module/schedule/writer.js +40 -0
- package/lib/module/schedule/writer.js.map +1 -0
- package/lib/module/state/caps.js +96 -0
- package/lib/module/state/caps.js.map +1 -0
- package/lib/module/state/dedup-ledger.js +34 -0
- package/lib/module/state/dedup-ledger.js.map +1 -0
- package/lib/module/state/interaction-buffer.js +92 -0
- package/lib/module/state/interaction-buffer.js.map +1 -0
- package/lib/module/state/mmkv-store.js +71 -0
- package/lib/module/state/mmkv-store.js.map +1 -0
- package/lib/module/state/permission-history.js +56 -0
- package/lib/module/state/permission-history.js.map +1 -0
- package/lib/module/state/record.js +264 -0
- package/lib/module/state/record.js.map +1 -0
- package/lib/module/state/reset.js +32 -0
- package/lib/module/state/reset.js.map +1 -0
- package/lib/module/state/series-ledger.js +62 -0
- package/lib/module/state/series-ledger.js.map +1 -0
- package/lib/module/state/store.js +35 -0
- package/lib/module/state/store.js.map +1 -0
- package/lib/module/testing/conformance/index.js +214 -0
- package/lib/module/testing/conformance/index.js.map +1 -0
- package/lib/module/testing/fake-engine.js +335 -0
- package/lib/module/testing/fake-engine.js.map +1 -0
- package/lib/module/testing/fake-provider.js +89 -0
- package/lib/module/testing/fake-provider.js.map +1 -0
- package/lib/module/testing/faults.js +55 -0
- package/lib/module/testing/faults.js.map +1 -0
- package/lib/module/testing/index.js +19 -0
- package/lib/module/testing/index.js.map +1 -0
- package/lib/module/testing/measure.js +294 -0
- package/lib/module/testing/measure.js.map +1 -0
- package/lib/typescript/commonjs/advanced.d.ts +36 -0
- package/lib/typescript/commonjs/advanced.d.ts.map +1 -0
- package/lib/typescript/commonjs/channel/migrate.d.ts +38 -0
- package/lib/typescript/commonjs/channel/migrate.d.ts.map +1 -0
- package/lib/typescript/commonjs/channel/tone-map.d.ts +34 -0
- package/lib/typescript/commonjs/channel/tone-map.d.ts.map +1 -0
- package/lib/typescript/commonjs/channel/validate-tone.d.ts +23 -0
- package/lib/typescript/commonjs/channel/validate-tone.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/channel.d.ts +185 -0
- package/lib/typescript/commonjs/contract/channel.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/diagnostics.d.ts +92 -0
- package/lib/typescript/commonjs/contract/diagnostics.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/errors.d.ts +91 -0
- package/lib/typescript/commonjs/contract/errors.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/hash.d.ts +14 -0
- package/lib/typescript/commonjs/contract/hash.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/index.d.ts +10 -0
- package/lib/typescript/commonjs/contract/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/interaction.d.ts +53 -0
- package/lib/typescript/commonjs/contract/interaction.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/notification.d.ts +110 -0
- package/lib/typescript/commonjs/contract/notification.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/permission.d.ts +49 -0
- package/lib/typescript/commonjs/contract/permission.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/reconcile.d.ts +82 -0
- package/lib/typescript/commonjs/contract/reconcile.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/recurrence.d.ts +118 -0
- package/lib/typescript/commonjs/contract/recurrence.d.ts.map +1 -0
- package/lib/typescript/commonjs/diagnostics/burst.d.ts +39 -0
- package/lib/typescript/commonjs/diagnostics/burst.d.ts.map +1 -0
- package/lib/typescript/commonjs/diagnostics/events.d.ts +28 -0
- package/lib/typescript/commonjs/diagnostics/events.d.ts.map +1 -0
- package/lib/typescript/commonjs/diagnostics/redact.d.ts +22 -0
- package/lib/typescript/commonjs/diagnostics/redact.d.ts.map +1 -0
- package/lib/typescript/commonjs/diagnostics/snapshot.d.ts +40 -0
- package/lib/typescript/commonjs/diagnostics/snapshot.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/adapter.d.ts +172 -0
- package/lib/typescript/commonjs/engine/adapter.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/codec.d.ts +20 -0
- package/lib/typescript/commonjs/engine/codec.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/notify-kit/events.d.ts +37 -0
- package/lib/typescript/commonjs/engine/notify-kit/events.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/notify-kit/module.d.ts +103 -0
- package/lib/typescript/commonjs/engine/notify-kit/module.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/android.d.ts +3 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/android.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/index.d.ts +12 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/ios.d.ts +3 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/ios.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/types.d.ts +33 -0
- package/lib/typescript/commonjs/engine/notify-kit/platform/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/engine/notify-kit-engine.d.ts +25 -0
- package/lib/typescript/commonjs/engine/notify-kit-engine.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +106 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/initialize.d.ts +74 -0
- package/lib/typescript/commonjs/initialize.d.ts.map +1 -0
- package/lib/typescript/commonjs/interaction/index.d.ts +53 -0
- package/lib/typescript/commonjs/interaction/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/maintenance/cycle.d.ts +77 -0
- package/lib/typescript/commonjs/maintenance/cycle.d.ts.map +1 -0
- package/lib/typescript/commonjs/maintenance/permission-refresh.d.ts +19 -0
- package/lib/typescript/commonjs/maintenance/permission-refresh.d.ts.map +1 -0
- package/lib/typescript/commonjs/maintenance/reanchor.d.ts +26 -0
- package/lib/typescript/commonjs/maintenance/reanchor.d.ts.map +1 -0
- package/lib/typescript/commonjs/maintenance/toggle.d.ts +35 -0
- package/lib/typescript/commonjs/maintenance/toggle.d.ts.map +1 -0
- package/lib/typescript/commonjs/maintenance/verify.d.ts +32 -0
- package/lib/typescript/commonjs/maintenance/verify.d.ts.map +1 -0
- package/lib/typescript/commonjs/maintenance/window-refresh.d.ts +29 -0
- package/lib/typescript/commonjs/maintenance/window-refresh.d.ts.map +1 -0
- package/lib/typescript/commonjs/notifications.d.ts +78 -0
- package/lib/typescript/commonjs/notifications.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/permission/index.d.ts +57 -0
- package/lib/typescript/commonjs/permission/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/permission/state.d.ts +41 -0
- package/lib/typescript/commonjs/permission/state.d.ts.map +1 -0
- package/lib/typescript/commonjs/push/envelope.d.ts +33 -0
- package/lib/typescript/commonjs/push/envelope.d.ts.map +1 -0
- package/lib/typescript/commonjs/push/fcm-provider.d.ts +43 -0
- package/lib/typescript/commonjs/push/fcm-provider.d.ts.map +1 -0
- package/lib/typescript/commonjs/push/gate.d.ts +57 -0
- package/lib/typescript/commonjs/push/gate.d.ts.map +1 -0
- package/lib/typescript/commonjs/push/index.d.ts +19 -0
- package/lib/typescript/commonjs/push/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/push/instructions.d.ts +45 -0
- package/lib/typescript/commonjs/push/instructions.d.ts.map +1 -0
- package/lib/typescript/commonjs/push/provider-adapter.d.ts +50 -0
- package/lib/typescript/commonjs/push/provider-adapter.d.ts.map +1 -0
- package/lib/typescript/commonjs/push/signout.d.ts +33 -0
- package/lib/typescript/commonjs/push/signout.d.ts.map +1 -0
- package/lib/typescript/commonjs/reconcile/chunk.d.ts +24 -0
- package/lib/typescript/commonjs/reconcile/chunk.d.ts.map +1 -0
- package/lib/typescript/commonjs/reconcile/diff.d.ts +54 -0
- package/lib/typescript/commonjs/reconcile/diff.d.ts.map +1 -0
- package/lib/typescript/commonjs/reconcile/duplicates.d.ts +32 -0
- package/lib/typescript/commonjs/reconcile/duplicates.d.ts.map +1 -0
- package/lib/typescript/commonjs/reconcile/index.d.ts +35 -0
- package/lib/typescript/commonjs/reconcile/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/reconcile/truncate.d.ts +26 -0
- package/lib/typescript/commonjs/reconcile/truncate.d.ts.map +1 -0
- package/lib/typescript/commonjs/recurrence/clock-guard.d.ts +37 -0
- package/lib/typescript/commonjs/recurrence/clock-guard.d.ts.map +1 -0
- package/lib/typescript/commonjs/recurrence/expand.d.ts +75 -0
- package/lib/typescript/commonjs/recurrence/expand.d.ts.map +1 -0
- package/lib/typescript/commonjs/recurrence/index.d.ts +40 -0
- package/lib/typescript/commonjs/recurrence/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/repeat/expiry.d.ts +23 -0
- package/lib/typescript/commonjs/repeat/expiry.d.ts.map +1 -0
- package/lib/typescript/commonjs/repeat/index.d.ts +49 -0
- package/lib/typescript/commonjs/repeat/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/repeat/marker.d.ts +36 -0
- package/lib/typescript/commonjs/repeat/marker.d.ts.map +1 -0
- package/lib/typescript/commonjs/repeat/place.d.ts +39 -0
- package/lib/typescript/commonjs/repeat/place.d.ts.map +1 -0
- package/lib/typescript/commonjs/schedule/anchor.d.ts +118 -0
- package/lib/typescript/commonjs/schedule/anchor.d.ts.map +1 -0
- package/lib/typescript/commonjs/schedule/index.d.ts +40 -0
- package/lib/typescript/commonjs/schedule/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/schedule/partition.d.ts +29 -0
- package/lib/typescript/commonjs/schedule/partition.d.ts.map +1 -0
- package/lib/typescript/commonjs/schedule/resolve-moment.d.ts +35 -0
- package/lib/typescript/commonjs/schedule/resolve-moment.d.ts.map +1 -0
- package/lib/typescript/commonjs/schedule/validate-content.d.ts +42 -0
- package/lib/typescript/commonjs/schedule/validate-content.d.ts.map +1 -0
- package/lib/typescript/commonjs/schedule/validate-identifier.d.ts +30 -0
- package/lib/typescript/commonjs/schedule/validate-identifier.d.ts.map +1 -0
- package/lib/typescript/commonjs/schedule/writer.d.ts +36 -0
- package/lib/typescript/commonjs/schedule/writer.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/caps.d.ts +51 -0
- package/lib/typescript/commonjs/state/caps.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/dedup-ledger.d.ts +21 -0
- package/lib/typescript/commonjs/state/dedup-ledger.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/interaction-buffer.d.ts +30 -0
- package/lib/typescript/commonjs/state/interaction-buffer.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/mmkv-store.d.ts +33 -0
- package/lib/typescript/commonjs/state/mmkv-store.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/permission-history.d.ts +20 -0
- package/lib/typescript/commonjs/state/permission-history.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/record.d.ts +134 -0
- package/lib/typescript/commonjs/state/record.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/reset.d.ts +22 -0
- package/lib/typescript/commonjs/state/reset.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/series-ledger.d.ts +47 -0
- package/lib/typescript/commonjs/state/series-ledger.d.ts.map +1 -0
- package/lib/typescript/commonjs/state/store.d.ts +20 -0
- package/lib/typescript/commonjs/state/store.d.ts.map +1 -0
- package/lib/typescript/commonjs/testing/conformance/index.d.ts +32 -0
- package/lib/typescript/commonjs/testing/conformance/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/testing/fake-engine.d.ts +91 -0
- package/lib/typescript/commonjs/testing/fake-engine.d.ts.map +1 -0
- package/lib/typescript/commonjs/testing/fake-provider.d.ts +35 -0
- package/lib/typescript/commonjs/testing/fake-provider.d.ts.map +1 -0
- package/lib/typescript/commonjs/testing/faults.d.ts +38 -0
- package/lib/typescript/commonjs/testing/faults.d.ts.map +1 -0
- package/lib/typescript/commonjs/testing/index.d.ts +22 -0
- package/lib/typescript/commonjs/testing/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/testing/measure.d.ts +59 -0
- package/lib/typescript/commonjs/testing/measure.d.ts.map +1 -0
- package/lib/typescript/module/advanced.d.ts +36 -0
- package/lib/typescript/module/advanced.d.ts.map +1 -0
- package/lib/typescript/module/channel/migrate.d.ts +38 -0
- package/lib/typescript/module/channel/migrate.d.ts.map +1 -0
- package/lib/typescript/module/channel/tone-map.d.ts +34 -0
- package/lib/typescript/module/channel/tone-map.d.ts.map +1 -0
- package/lib/typescript/module/channel/validate-tone.d.ts +23 -0
- package/lib/typescript/module/channel/validate-tone.d.ts.map +1 -0
- package/lib/typescript/module/contract/channel.d.ts +185 -0
- package/lib/typescript/module/contract/channel.d.ts.map +1 -0
- package/lib/typescript/module/contract/diagnostics.d.ts +92 -0
- package/lib/typescript/module/contract/diagnostics.d.ts.map +1 -0
- package/lib/typescript/module/contract/errors.d.ts +91 -0
- package/lib/typescript/module/contract/errors.d.ts.map +1 -0
- package/lib/typescript/module/contract/hash.d.ts +14 -0
- package/lib/typescript/module/contract/hash.d.ts.map +1 -0
- package/lib/typescript/module/contract/index.d.ts +10 -0
- package/lib/typescript/module/contract/index.d.ts.map +1 -0
- package/lib/typescript/module/contract/interaction.d.ts +53 -0
- package/lib/typescript/module/contract/interaction.d.ts.map +1 -0
- package/lib/typescript/module/contract/notification.d.ts +110 -0
- package/lib/typescript/module/contract/notification.d.ts.map +1 -0
- package/lib/typescript/module/contract/permission.d.ts +49 -0
- package/lib/typescript/module/contract/permission.d.ts.map +1 -0
- package/lib/typescript/module/contract/reconcile.d.ts +82 -0
- package/lib/typescript/module/contract/reconcile.d.ts.map +1 -0
- package/lib/typescript/module/contract/recurrence.d.ts +118 -0
- package/lib/typescript/module/contract/recurrence.d.ts.map +1 -0
- package/lib/typescript/module/diagnostics/burst.d.ts +39 -0
- package/lib/typescript/module/diagnostics/burst.d.ts.map +1 -0
- package/lib/typescript/module/diagnostics/events.d.ts +28 -0
- package/lib/typescript/module/diagnostics/events.d.ts.map +1 -0
- package/lib/typescript/module/diagnostics/redact.d.ts +22 -0
- package/lib/typescript/module/diagnostics/redact.d.ts.map +1 -0
- package/lib/typescript/module/diagnostics/snapshot.d.ts +40 -0
- package/lib/typescript/module/diagnostics/snapshot.d.ts.map +1 -0
- package/lib/typescript/module/engine/adapter.d.ts +172 -0
- package/lib/typescript/module/engine/adapter.d.ts.map +1 -0
- package/lib/typescript/module/engine/codec.d.ts +20 -0
- package/lib/typescript/module/engine/codec.d.ts.map +1 -0
- package/lib/typescript/module/engine/notify-kit/events.d.ts +37 -0
- package/lib/typescript/module/engine/notify-kit/events.d.ts.map +1 -0
- package/lib/typescript/module/engine/notify-kit/module.d.ts +103 -0
- package/lib/typescript/module/engine/notify-kit/module.d.ts.map +1 -0
- package/lib/typescript/module/engine/notify-kit/platform/android.d.ts +3 -0
- package/lib/typescript/module/engine/notify-kit/platform/android.d.ts.map +1 -0
- package/lib/typescript/module/engine/notify-kit/platform/index.d.ts +12 -0
- package/lib/typescript/module/engine/notify-kit/platform/index.d.ts.map +1 -0
- package/lib/typescript/module/engine/notify-kit/platform/ios.d.ts +3 -0
- package/lib/typescript/module/engine/notify-kit/platform/ios.d.ts.map +1 -0
- package/lib/typescript/module/engine/notify-kit/platform/types.d.ts +33 -0
- package/lib/typescript/module/engine/notify-kit/platform/types.d.ts.map +1 -0
- package/lib/typescript/module/engine/notify-kit-engine.d.ts +25 -0
- package/lib/typescript/module/engine/notify-kit-engine.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +106 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/initialize.d.ts +74 -0
- package/lib/typescript/module/initialize.d.ts.map +1 -0
- package/lib/typescript/module/interaction/index.d.ts +53 -0
- package/lib/typescript/module/interaction/index.d.ts.map +1 -0
- package/lib/typescript/module/maintenance/cycle.d.ts +77 -0
- package/lib/typescript/module/maintenance/cycle.d.ts.map +1 -0
- package/lib/typescript/module/maintenance/permission-refresh.d.ts +19 -0
- package/lib/typescript/module/maintenance/permission-refresh.d.ts.map +1 -0
- package/lib/typescript/module/maintenance/reanchor.d.ts +26 -0
- package/lib/typescript/module/maintenance/reanchor.d.ts.map +1 -0
- package/lib/typescript/module/maintenance/toggle.d.ts +35 -0
- package/lib/typescript/module/maintenance/toggle.d.ts.map +1 -0
- package/lib/typescript/module/maintenance/verify.d.ts +32 -0
- package/lib/typescript/module/maintenance/verify.d.ts.map +1 -0
- package/lib/typescript/module/maintenance/window-refresh.d.ts +29 -0
- package/lib/typescript/module/maintenance/window-refresh.d.ts.map +1 -0
- package/lib/typescript/module/notifications.d.ts +78 -0
- package/lib/typescript/module/notifications.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/permission/index.d.ts +57 -0
- package/lib/typescript/module/permission/index.d.ts.map +1 -0
- package/lib/typescript/module/permission/state.d.ts +41 -0
- package/lib/typescript/module/permission/state.d.ts.map +1 -0
- package/lib/typescript/module/push/envelope.d.ts +33 -0
- package/lib/typescript/module/push/envelope.d.ts.map +1 -0
- package/lib/typescript/module/push/fcm-provider.d.ts +43 -0
- package/lib/typescript/module/push/fcm-provider.d.ts.map +1 -0
- package/lib/typescript/module/push/gate.d.ts +57 -0
- package/lib/typescript/module/push/gate.d.ts.map +1 -0
- package/lib/typescript/module/push/index.d.ts +19 -0
- package/lib/typescript/module/push/index.d.ts.map +1 -0
- package/lib/typescript/module/push/instructions.d.ts +45 -0
- package/lib/typescript/module/push/instructions.d.ts.map +1 -0
- package/lib/typescript/module/push/provider-adapter.d.ts +50 -0
- package/lib/typescript/module/push/provider-adapter.d.ts.map +1 -0
- package/lib/typescript/module/push/signout.d.ts +33 -0
- package/lib/typescript/module/push/signout.d.ts.map +1 -0
- package/lib/typescript/module/reconcile/chunk.d.ts +24 -0
- package/lib/typescript/module/reconcile/chunk.d.ts.map +1 -0
- package/lib/typescript/module/reconcile/diff.d.ts +54 -0
- package/lib/typescript/module/reconcile/diff.d.ts.map +1 -0
- package/lib/typescript/module/reconcile/duplicates.d.ts +32 -0
- package/lib/typescript/module/reconcile/duplicates.d.ts.map +1 -0
- package/lib/typescript/module/reconcile/index.d.ts +35 -0
- package/lib/typescript/module/reconcile/index.d.ts.map +1 -0
- package/lib/typescript/module/reconcile/truncate.d.ts +26 -0
- package/lib/typescript/module/reconcile/truncate.d.ts.map +1 -0
- package/lib/typescript/module/recurrence/clock-guard.d.ts +37 -0
- package/lib/typescript/module/recurrence/clock-guard.d.ts.map +1 -0
- package/lib/typescript/module/recurrence/expand.d.ts +75 -0
- package/lib/typescript/module/recurrence/expand.d.ts.map +1 -0
- package/lib/typescript/module/recurrence/index.d.ts +40 -0
- package/lib/typescript/module/recurrence/index.d.ts.map +1 -0
- package/lib/typescript/module/repeat/expiry.d.ts +23 -0
- package/lib/typescript/module/repeat/expiry.d.ts.map +1 -0
- package/lib/typescript/module/repeat/index.d.ts +49 -0
- package/lib/typescript/module/repeat/index.d.ts.map +1 -0
- package/lib/typescript/module/repeat/marker.d.ts +36 -0
- package/lib/typescript/module/repeat/marker.d.ts.map +1 -0
- package/lib/typescript/module/repeat/place.d.ts +39 -0
- package/lib/typescript/module/repeat/place.d.ts.map +1 -0
- package/lib/typescript/module/schedule/anchor.d.ts +118 -0
- package/lib/typescript/module/schedule/anchor.d.ts.map +1 -0
- package/lib/typescript/module/schedule/index.d.ts +40 -0
- package/lib/typescript/module/schedule/index.d.ts.map +1 -0
- package/lib/typescript/module/schedule/partition.d.ts +29 -0
- package/lib/typescript/module/schedule/partition.d.ts.map +1 -0
- package/lib/typescript/module/schedule/resolve-moment.d.ts +35 -0
- package/lib/typescript/module/schedule/resolve-moment.d.ts.map +1 -0
- package/lib/typescript/module/schedule/validate-content.d.ts +42 -0
- package/lib/typescript/module/schedule/validate-content.d.ts.map +1 -0
- package/lib/typescript/module/schedule/validate-identifier.d.ts +30 -0
- package/lib/typescript/module/schedule/validate-identifier.d.ts.map +1 -0
- package/lib/typescript/module/schedule/writer.d.ts +36 -0
- package/lib/typescript/module/schedule/writer.d.ts.map +1 -0
- package/lib/typescript/module/state/caps.d.ts +51 -0
- package/lib/typescript/module/state/caps.d.ts.map +1 -0
- package/lib/typescript/module/state/dedup-ledger.d.ts +21 -0
- package/lib/typescript/module/state/dedup-ledger.d.ts.map +1 -0
- package/lib/typescript/module/state/interaction-buffer.d.ts +30 -0
- package/lib/typescript/module/state/interaction-buffer.d.ts.map +1 -0
- package/lib/typescript/module/state/mmkv-store.d.ts +33 -0
- package/lib/typescript/module/state/mmkv-store.d.ts.map +1 -0
- package/lib/typescript/module/state/permission-history.d.ts +20 -0
- package/lib/typescript/module/state/permission-history.d.ts.map +1 -0
- package/lib/typescript/module/state/record.d.ts +134 -0
- package/lib/typescript/module/state/record.d.ts.map +1 -0
- package/lib/typescript/module/state/reset.d.ts +22 -0
- package/lib/typescript/module/state/reset.d.ts.map +1 -0
- package/lib/typescript/module/state/series-ledger.d.ts +47 -0
- package/lib/typescript/module/state/series-ledger.d.ts.map +1 -0
- package/lib/typescript/module/state/store.d.ts +20 -0
- package/lib/typescript/module/state/store.d.ts.map +1 -0
- package/lib/typescript/module/testing/conformance/index.d.ts +32 -0
- package/lib/typescript/module/testing/conformance/index.d.ts.map +1 -0
- package/lib/typescript/module/testing/fake-engine.d.ts +91 -0
- package/lib/typescript/module/testing/fake-engine.d.ts.map +1 -0
- package/lib/typescript/module/testing/fake-provider.d.ts +35 -0
- package/lib/typescript/module/testing/fake-provider.d.ts.map +1 -0
- package/lib/typescript/module/testing/faults.d.ts +38 -0
- package/lib/typescript/module/testing/faults.d.ts.map +1 -0
- package/lib/typescript/module/testing/index.d.ts +22 -0
- package/lib/typescript/module/testing/index.d.ts.map +1 -0
- package/lib/typescript/module/testing/measure.d.ts +59 -0
- package/lib/typescript/module/testing/measure.d.ts.map +1 -0
- package/package.json +72 -26
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.expand = expand;
|
|
7
|
+
exports.occurrenceId = occurrenceId;
|
|
8
|
+
exports.occurrenceKey = occurrenceKey;
|
|
9
|
+
var _errors = require("../contract/errors.js");
|
|
10
|
+
var _anchor = require("../schedule/anchor.js");
|
|
11
|
+
/**
|
|
12
|
+
* Recurrence expansion.
|
|
13
|
+
*
|
|
14
|
+
* Written first-party rather than delegated to an RFC 5545 library, because the
|
|
15
|
+
* daylight-saving rules here are specified behaviour (FR-008) rather than a
|
|
16
|
+
* dependency's opinion, and because expansion must be provable with no device.
|
|
17
|
+
*
|
|
18
|
+
* Determinism is the hard requirement: the same rule, anchoring mode, zone, and
|
|
19
|
+
* evaluation moment must produce exactly the same occurrences in the same order
|
|
20
|
+
* on every run and on both platforms. Without that, reconciliation could not be
|
|
21
|
+
* idempotent over a recurring series.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const pad = (value, width) => String(value).padStart(width, '0');
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The calendar slot of an occurrence: the date and clock time the rule asked
|
|
28
|
+
* for, in the frame the series is anchored in. Fixed-width, so comparing two
|
|
29
|
+
* keys as strings compares them in time.
|
|
30
|
+
*/
|
|
31
|
+
function occurrenceKey(parts) {
|
|
32
|
+
return `${pad(parts.year, 4)}${pad(parts.month, 2)}${pad(parts.day, 2)}T${pad(parts.hour, 2)}${pad(parts.minute, 2)}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Occurrence identity.
|
|
37
|
+
*
|
|
38
|
+
* Derived from the series and the calendar slot, not the instant. Re-expanding
|
|
39
|
+
* the same series produces the same identifiers, which is what lets a refresh
|
|
40
|
+
* recognize an occurrence it already scheduled. Until 0.4.0 the instant was
|
|
41
|
+
* used, so after a time-zone change re-anchoring kept the old identifier while
|
|
42
|
+
* the window refresh derived a new one, and the occurrence was scheduled twice.
|
|
43
|
+
*/
|
|
44
|
+
function occurrenceId(seriesId, slot) {
|
|
45
|
+
return `${seriesId}#${typeof slot === 'string' ? slot : occurrenceKey(slot)}`;
|
|
46
|
+
}
|
|
47
|
+
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
48
|
+
function validatePattern(pattern) {
|
|
49
|
+
const {
|
|
50
|
+
hour,
|
|
51
|
+
minute
|
|
52
|
+
} = pattern;
|
|
53
|
+
if (!Number.isInteger(hour) || hour < 0 || hour > 23) {
|
|
54
|
+
throw new _errors.NotificationError(_errors.DIAGNOSTIC_CODES.INVALID_RECURRENCE, 'Recurrence hour must be an integer from 0 to 23.', {
|
|
55
|
+
hour
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (!Number.isInteger(minute) || minute < 0 || minute > 59) {
|
|
59
|
+
throw new _errors.NotificationError(_errors.DIAGNOSTIC_CODES.INVALID_RECURRENCE, 'Recurrence minute must be an integer from 0 to 59.', {
|
|
60
|
+
minute
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const interval = pattern.interval ?? 1;
|
|
64
|
+
if (!Number.isInteger(interval) || interval < 1) {
|
|
65
|
+
throw new _errors.NotificationError(_errors.DIAGNOSTIC_CODES.INVALID_RECURRENCE, 'Recurrence interval must be a positive integer.', {
|
|
66
|
+
interval
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (pattern.kind === 'weekly') {
|
|
70
|
+
if (pattern.weekdays.length === 0) {
|
|
71
|
+
throw new _errors.NotificationError(_errors.DIAGNOSTIC_CODES.INVALID_RECURRENCE, 'A weekly recurrence must name at least one weekday.');
|
|
72
|
+
}
|
|
73
|
+
for (const day of pattern.weekdays) {
|
|
74
|
+
if (!Number.isInteger(day) || day < 0 || day > 6) {
|
|
75
|
+
throw new _errors.NotificationError(_errors.DIAGNOSTIC_CODES.INVALID_RECURRENCE, 'Weekdays must be integers from 0 (Sunday) to 6 (Saturday).', {
|
|
76
|
+
day
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (pattern.kind === 'monthlyByDay') {
|
|
82
|
+
if (!Number.isInteger(pattern.dayOfMonth) || pattern.dayOfMonth < 1 || pattern.dayOfMonth > 31) {
|
|
83
|
+
throw new _errors.NotificationError(_errors.DIAGNOSTIC_CODES.INVALID_RECURRENCE, 'Day of month must be an integer from 1 to 31.', {
|
|
84
|
+
dayOfMonth: pattern.dayOfMonth
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Calendar date in the anchoring zone, carrying the pattern's clock time. */
|
|
91
|
+
function partsFor(date, pattern) {
|
|
92
|
+
return {
|
|
93
|
+
year: date.year,
|
|
94
|
+
month: date.month,
|
|
95
|
+
day: date.day,
|
|
96
|
+
hour: pattern.hour,
|
|
97
|
+
minute: pattern.minute,
|
|
98
|
+
second: 0
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function addDays(parts, days) {
|
|
102
|
+
const shifted = new Date(Date.UTC(parts.year, parts.month - 1, parts.day) + days * MS_PER_DAY);
|
|
103
|
+
return {
|
|
104
|
+
year: shifted.getUTCFullYear(),
|
|
105
|
+
month: shifted.getUTCMonth() + 1,
|
|
106
|
+
day: shifted.getUTCDate(),
|
|
107
|
+
hour: parts.hour,
|
|
108
|
+
minute: parts.minute,
|
|
109
|
+
second: 0
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function weekdayOf(parts) {
|
|
113
|
+
return new Date(Date.UTC(parts.year, parts.month - 1, parts.day)).getUTCDay();
|
|
114
|
+
}
|
|
115
|
+
function daysInMonth(year, month) {
|
|
116
|
+
return new Date(Date.UTC(year, month, 0)).getUTCDate();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Expands a rule inside the lookahead window.
|
|
120
|
+
*
|
|
121
|
+
* Bounded by both a duration and a count, because either alone fails: a
|
|
122
|
+
* duration alone lets a frequent series exhaust the platform ceiling, and a
|
|
123
|
+
* count alone leaves an annual series scheduled a decade out.
|
|
124
|
+
*/
|
|
125
|
+
function expand(input) {
|
|
126
|
+
const {
|
|
127
|
+
rule,
|
|
128
|
+
from,
|
|
129
|
+
lookahead,
|
|
130
|
+
timeZone
|
|
131
|
+
} = input;
|
|
132
|
+
validatePattern(rule.pattern);
|
|
133
|
+
const anchoring = rule.anchoring ?? 'wallClock';
|
|
134
|
+
const horizon = from + lookahead.days * MS_PER_DAY;
|
|
135
|
+
const start = Math.max(rule.startAt ?? from, from);
|
|
136
|
+
const {
|
|
137
|
+
lastEmittedKey
|
|
138
|
+
} = input;
|
|
139
|
+
const occurrences = [];
|
|
140
|
+
let cursor = partsFor((0, _anchor.partsInZone)(start, timeZone), rule.pattern);
|
|
141
|
+
// Position of the next not-yet-counted occurrence, for count-limited rules.
|
|
142
|
+
let index = input.alreadyEmitted ?? 0;
|
|
143
|
+
let exhausted = false;
|
|
144
|
+
|
|
145
|
+
// Bounded independently of the emit conditions so a pattern that matches
|
|
146
|
+
// nothing (e.g. day 31 in February) can never spin forever.
|
|
147
|
+
const maxIterations = lookahead.days * 2 + 400;
|
|
148
|
+
for (let iteration = 0; iteration < maxIterations; iteration += 1) {
|
|
149
|
+
if (occurrences.length >= lookahead.occurrencesPerSeries) break;
|
|
150
|
+
const candidate = nextCandidate(cursor, rule.pattern, iteration === 0);
|
|
151
|
+
if (candidate === undefined) break;
|
|
152
|
+
cursor = candidate;
|
|
153
|
+
const at = anchoring === 'absolute' ? Date.UTC(cursor.year, cursor.month - 1, cursor.day, cursor.hour, cursor.minute, 0) : (0, _anchor.instantForParts)(cursor, timeZone);
|
|
154
|
+
if (at > horizon) break;
|
|
155
|
+
if (at > start) {
|
|
156
|
+
if (rule.end.kind === 'untilDate' && at > rule.end.until) {
|
|
157
|
+
exhausted = true;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
const key = occurrenceKey(cursor);
|
|
161
|
+
const previouslyEmitted = lastEmittedKey !== undefined && key <= lastEmittedKey;
|
|
162
|
+
if (!previouslyEmitted && rule.end.kind === 'count' && index >= rule.end.count) {
|
|
163
|
+
exhausted = true;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
occurrences.push({
|
|
167
|
+
id: occurrenceId(rule.id, key),
|
|
168
|
+
key,
|
|
169
|
+
seriesId: rule.id,
|
|
170
|
+
at,
|
|
171
|
+
anchoring,
|
|
172
|
+
previouslyEmitted
|
|
173
|
+
});
|
|
174
|
+
if (!previouslyEmitted) index += 1;
|
|
175
|
+
}
|
|
176
|
+
cursor = advance(cursor, rule.pattern);
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
occurrences,
|
|
180
|
+
expandedThrough: horizon,
|
|
181
|
+
exhausted
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Moves the cursor onto the first date the pattern actually matches. */
|
|
186
|
+
function nextCandidate(cursor, pattern, isFirst) {
|
|
187
|
+
if (pattern.kind === 'daily') return cursor;
|
|
188
|
+
if (pattern.kind === 'weekly') {
|
|
189
|
+
const wanted = new Set(pattern.weekdays);
|
|
190
|
+
let candidate = cursor;
|
|
191
|
+
for (let step = 0; step < 14; step += 1) {
|
|
192
|
+
if (wanted.has(weekdayOf(candidate))) return candidate;
|
|
193
|
+
candidate = addDays(candidate, 1);
|
|
194
|
+
}
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
const monthly = pattern;
|
|
198
|
+
let candidate = cursor;
|
|
199
|
+
// Months shorter than the requested day are skipped rather than clamped: a
|
|
200
|
+
// caller asking for the 31st means the 31st, and inventing the 28th would be
|
|
201
|
+
// the package deciding something it was not asked to decide.
|
|
202
|
+
for (let step = 0; step < 48; step += 1) {
|
|
203
|
+
if (daysInMonth(candidate.year, candidate.month) >= monthly.dayOfMonth) {
|
|
204
|
+
const onDay = {
|
|
205
|
+
...candidate,
|
|
206
|
+
day: monthly.dayOfMonth
|
|
207
|
+
};
|
|
208
|
+
if (isFirst || onDay.day >= candidate.day || step > 0) return onDay;
|
|
209
|
+
}
|
|
210
|
+
candidate = firstOfNextMonth(candidate);
|
|
211
|
+
}
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
function firstOfNextMonth(parts) {
|
|
215
|
+
const month = parts.month === 12 ? 1 : parts.month + 1;
|
|
216
|
+
const year = parts.month === 12 ? parts.year + 1 : parts.year;
|
|
217
|
+
return {
|
|
218
|
+
...parts,
|
|
219
|
+
year,
|
|
220
|
+
month,
|
|
221
|
+
day: 1
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Steps the cursor past the occurrence just produced. */
|
|
226
|
+
function advance(cursor, pattern) {
|
|
227
|
+
const interval = pattern.interval ?? 1;
|
|
228
|
+
if (pattern.kind === 'daily') {
|
|
229
|
+
return addDays(cursor, pattern.interval ?? 1);
|
|
230
|
+
}
|
|
231
|
+
if (pattern.kind === 'weekly') {
|
|
232
|
+
const wanted = [...new Set(pattern.weekdays)].sort((a, b) => a - b);
|
|
233
|
+
const current = weekdayOf(cursor);
|
|
234
|
+
const next = wanted.find(day => day > current);
|
|
235
|
+
|
|
236
|
+
// Wrapping into a new week is where the interval applies — stepping day by
|
|
237
|
+
// day within the week would multiply the interval by the weekday count.
|
|
238
|
+
return next === undefined ? addDays(cursor, 7 * interval - current + wanted[0]) : addDays(cursor, next - current);
|
|
239
|
+
}
|
|
240
|
+
const monthly = pattern;
|
|
241
|
+
let year = cursor.year;
|
|
242
|
+
let month = cursor.month + interval;
|
|
243
|
+
while (month > 12) {
|
|
244
|
+
month -= 12;
|
|
245
|
+
year += 1;
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
...cursor,
|
|
249
|
+
year,
|
|
250
|
+
month,
|
|
251
|
+
day: Math.min(monthly.dayOfMonth, daysInMonth(year, month))
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=expand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_errors","require","_anchor","pad","value","width","String","padStart","occurrenceKey","parts","year","month","day","hour","minute","occurrenceId","seriesId","slot","MS_PER_DAY","validatePattern","pattern","Number","isInteger","NotificationError","DIAGNOSTIC_CODES","INVALID_RECURRENCE","interval","kind","weekdays","length","dayOfMonth","partsFor","date","second","addDays","days","shifted","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","weekdayOf","getUTCDay","daysInMonth","expand","input","rule","from","lookahead","timeZone","anchoring","horizon","start","Math","max","startAt","lastEmittedKey","occurrences","cursor","partsInZone","index","alreadyEmitted","exhausted","maxIterations","iteration","occurrencesPerSeries","candidate","nextCandidate","undefined","at","instantForParts","end","until","key","previouslyEmitted","count","push","id","advance","expandedThrough","isFirst","wanted","Set","step","has","monthly","onDay","firstOfNextMonth","sort","a","b","current","next","find","min"],"sourceRoot":"../../../src","sources":["recurrence/expand.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createRecurrence = createRecurrence;
|
|
7
|
+
var _anchor = require("../schedule/anchor.js");
|
|
8
|
+
var _validateIdentifier = require("../schedule/validate-identifier.js");
|
|
9
|
+
var _index = require("../schedule/index.js");
|
|
10
|
+
var _writer = require("../schedule/writer.js");
|
|
11
|
+
var _errors = require("../contract/errors.js");
|
|
12
|
+
var _expand = require("./expand.js");
|
|
13
|
+
var _clockGuard = require("./clock-guard.js");
|
|
14
|
+
var _seriesLedger = require("../state/series-ledger.js");
|
|
15
|
+
/**
|
|
16
|
+
* Series registration and the lookahead window.
|
|
17
|
+
*
|
|
18
|
+
* A caller declares a rule once. The package expands it inside a finite window
|
|
19
|
+
* and refreshes that window on its own, because only it knows when the horizon
|
|
20
|
+
* has moved — that is the one piece of recurrence knowledge the consumer does
|
|
21
|
+
* not have.
|
|
22
|
+
*
|
|
23
|
+
* Occurrences carry derived identifiers, so re-expanding a series recognises
|
|
24
|
+
* what it already scheduled instead of creating duplicates. That is what makes
|
|
25
|
+
* a window refresh with nothing to do cost zero platform operations.
|
|
26
|
+
*
|
|
27
|
+
* Occurrences are written through the shared `ScheduleWriter`, like every other
|
|
28
|
+
* consumer notification, so a repeating tone gets its stop marker and the
|
|
29
|
+
* platform ceiling is respected here too.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** Builds the request for one occurrence from the series template. */
|
|
33
|
+
function toRequest(rule, occurrence) {
|
|
34
|
+
return {
|
|
35
|
+
id: occurrence.id,
|
|
36
|
+
content: rule.template.content,
|
|
37
|
+
tone: rule.template.tone,
|
|
38
|
+
moment: {
|
|
39
|
+
at: occurrence.at,
|
|
40
|
+
anchoring: occurrence.anchoring
|
|
41
|
+
},
|
|
42
|
+
routing: rule.template.routing,
|
|
43
|
+
actions: rule.template.actions,
|
|
44
|
+
ownerTag: rule.template.ownerTag,
|
|
45
|
+
groupTag: rule.template.groupTag
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const belongsTo = (entry, seriesId) => entry.seriesId === seriesId || entry.id.startsWith(`${seriesId}#`);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The latest occurrence a ledger entry written before 0.4.0 had emitted. Those
|
|
52
|
+
* entries kept no key, so it is read back off the device: the last occurrence
|
|
53
|
+
* still pending is the last one emitted.
|
|
54
|
+
*/
|
|
55
|
+
function recoverLastEmittedKey(pending, anchoring, zone) {
|
|
56
|
+
if (pending.length === 0) return undefined;
|
|
57
|
+
const latest = Math.max(...pending.map(entry => entry.resolvedAt));
|
|
58
|
+
return (0, _expand.occurrenceKey)((0, _anchor.partsInZone)(latest, anchoring === 'absolute' ? 'UTC' : zone));
|
|
59
|
+
}
|
|
60
|
+
function createRecurrence(deps) {
|
|
61
|
+
const emit = deps.emit ?? (() => {});
|
|
62
|
+
const writer = (0, _writer.createScheduleWriter)(deps.engine);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Validates the template as the request every occurrence will be, once, so
|
|
66
|
+
* a series is refused at registration for exactly what a direct schedule
|
|
67
|
+
* would be refused for — an undeclared tone, too many actions, an oversized
|
|
68
|
+
* routing payload — rather than failing later inside maintenance.
|
|
69
|
+
*/
|
|
70
|
+
const validateTemplate = rule => (0, _index.validateRequest)({
|
|
71
|
+
id: rule.id,
|
|
72
|
+
content: rule.template.content,
|
|
73
|
+
tone: rule.template.tone,
|
|
74
|
+
moment: {
|
|
75
|
+
at: deps.now(),
|
|
76
|
+
anchoring: rule.anchoring ?? 'wallClock'
|
|
77
|
+
},
|
|
78
|
+
routing: rule.template.routing,
|
|
79
|
+
actions: rule.template.actions,
|
|
80
|
+
ownerTag: rule.template.ownerTag,
|
|
81
|
+
groupTag: rule.template.groupTag
|
|
82
|
+
}, deps.resolveTone);
|
|
83
|
+
const toneFor = rule => {
|
|
84
|
+
const tone = deps.resolveTone(rule.template.tone);
|
|
85
|
+
if (tone === undefined) {
|
|
86
|
+
throw new _errors.NotificationError(_errors.DIAGNOSTIC_CODES.UNDECLARED_TONE, `Tone "${rule.template.tone}" was never declared in the package configuration.`, {
|
|
87
|
+
toneId: rule.template.tone,
|
|
88
|
+
seriesId: rule.id
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return tone;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/** Expands and registers, scheduling only occurrences the device lacks. */
|
|
95
|
+
const materialize = async (rule, tone) => {
|
|
96
|
+
const now = deps.now();
|
|
97
|
+
const zone = deps.timeZone();
|
|
98
|
+
const previous = (0, _seriesLedger.readSeries)(deps.state, rule.id);
|
|
99
|
+
const pending = await deps.engine.getPending();
|
|
100
|
+
const ofSeries = pending.filter(entry => belongsTo(entry, rule.id));
|
|
101
|
+
const expansion = (0, _expand.expand)({
|
|
102
|
+
rule,
|
|
103
|
+
from: now,
|
|
104
|
+
lookahead: deps.lookahead,
|
|
105
|
+
timeZone: zone,
|
|
106
|
+
alreadyEmitted: previous?.emittedCount ?? 0,
|
|
107
|
+
lastEmittedKey: previous?.lastEmittedKey ?? (previous !== undefined ? recoverLastEmittedKey(ofSeries, rule.anchoring, zone) : undefined)
|
|
108
|
+
});
|
|
109
|
+
const guarded = (0, _clockGuard.guardAgainstClockChange)({
|
|
110
|
+
occurrences: expansion.occurrences,
|
|
111
|
+
previousHorizon: previous?.expandedThrough,
|
|
112
|
+
now,
|
|
113
|
+
previousNow: previous?.at
|
|
114
|
+
});
|
|
115
|
+
if (guarded.discontinuity !== 'none') {
|
|
116
|
+
emit('CLOCK_DISCONTINUITY', `Device clock moved ${guarded.discontinuity}; ${guarded.suppressed} already-handled occurrence(s) were suppressed rather than re-delivered.`, {
|
|
117
|
+
direction: guarded.discontinuity,
|
|
118
|
+
suppressed: guarded.suppressed,
|
|
119
|
+
seriesId: rule.id
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const wanted = new Set(guarded.occurrences.map(occurrence => occurrence.id));
|
|
123
|
+
|
|
124
|
+
// Upcoming entries of this series the expansion no longer produces: ones
|
|
125
|
+
// written under the instant-based identity before 0.4.0, or ones whose slot
|
|
126
|
+
// the rule no longer has. Left in place, each would fire beside its
|
|
127
|
+
// replacement. Entries already due are left alone — they may be firing now.
|
|
128
|
+
const stale = ofSeries.filter(entry => !wanted.has(entry.id) && entry.resolvedAt > now);
|
|
129
|
+
for (const entry of stale) {
|
|
130
|
+
await writer.cancel(entry.id);
|
|
131
|
+
}
|
|
132
|
+
const onDevice = new Set(ofSeries.filter(entry => !stale.includes(entry)).map(entry => entry.id));
|
|
133
|
+
const missing = guarded.occurrences.filter(occurrence => !onDevice.has(occurrence.id));
|
|
134
|
+
|
|
135
|
+
// The same ceiling reconciliation respects: soonest first, the rest
|
|
136
|
+
// registered by a later refresh once they move into range.
|
|
137
|
+
const room = Math.max(0, (await writer.capacity()) - (pending.length - stale.length));
|
|
138
|
+
const toSchedule = missing.slice(0, room);
|
|
139
|
+
if (toSchedule.length < missing.length) {
|
|
140
|
+
emit(_errors.DIAGNOSTIC_CODES.TRUNCATED_OVER_CEILING, `Series "${rule.id}" has ${missing.length - toSchedule.length} occurrence(s) beyond the platform ceiling; they are registered by a later window refresh.`, {
|
|
141
|
+
seriesId: rule.id,
|
|
142
|
+
dropped: missing.length - toSchedule.length
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
const approximate = !deps.canScheduleExactly();
|
|
146
|
+
for (const occurrence of toSchedule) {
|
|
147
|
+
await writer.write({
|
|
148
|
+
request: toRequest(rule, occurrence),
|
|
149
|
+
resolvedAt: occurrence.at,
|
|
150
|
+
tone,
|
|
151
|
+
// The zone the series was expanded against; absent for absolute series.
|
|
152
|
+
anchoringGeneration: occurrence.anchoring === 'absolute' ? undefined : zone,
|
|
153
|
+
approximate,
|
|
154
|
+
seriesId: rule.id
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Counted once, when first emitted — whether or not the ceiling let it on
|
|
159
|
+
// the device yet. Occurrences re-produced from an earlier expansion are not
|
|
160
|
+
// counted again.
|
|
161
|
+
const newlyEmitted = guarded.occurrences.filter(occurrence => !occurrence.previouslyEmitted);
|
|
162
|
+
const lastEmittedKey = newlyEmitted.length > 0 ? newlyEmitted[newlyEmitted.length - 1].key : previous?.lastEmittedKey;
|
|
163
|
+
(0, _seriesLedger.upsertSeries)(deps.state, rule, {
|
|
164
|
+
expandedThrough: expansion.expandedThrough,
|
|
165
|
+
emittedCount: (previous?.emittedCount ?? 0) + newlyEmitted.length,
|
|
166
|
+
exhausted: expansion.exhausted,
|
|
167
|
+
lastEmittedKey
|
|
168
|
+
}, now);
|
|
169
|
+
return {
|
|
170
|
+
seriesId: rule.id,
|
|
171
|
+
scheduled: toSchedule.length,
|
|
172
|
+
expandedThrough: expansion.expandedThrough,
|
|
173
|
+
exhausted: expansion.exhausted,
|
|
174
|
+
cancelled: stale.map(entry => entry.id)
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
return {
|
|
178
|
+
async registerSeries(rule) {
|
|
179
|
+
(0, _validateIdentifier.validateIdentifier)(rule.id, 'seriesId');
|
|
180
|
+
return materialize(rule, validateTemplate(rule));
|
|
181
|
+
},
|
|
182
|
+
/** Re-expands a tracked series. Called by the window-refresh maintenance step. */
|
|
183
|
+
async refreshSeries(rule) {
|
|
184
|
+
return materialize(rule, toneFor(rule));
|
|
185
|
+
},
|
|
186
|
+
async cancelSeries(seriesId) {
|
|
187
|
+
(0, _validateIdentifier.validateIdentifier)(seriesId, 'seriesId');
|
|
188
|
+
|
|
189
|
+
// Every occurrence already scheduled from this series goes, identified by
|
|
190
|
+
// its derived prefix rather than by a list the ledger would have to keep
|
|
191
|
+
// in sync with the device.
|
|
192
|
+
const pending = await deps.engine.getPending();
|
|
193
|
+
const ids = pending.filter(entry => belongsTo(entry, seriesId)).map(entry => entry.id);
|
|
194
|
+
await deps.engine.cancelMany(ids);
|
|
195
|
+
const pass = writer.pass();
|
|
196
|
+
for (const id of ids) await pass.releaseStop(id);
|
|
197
|
+
(0, _seriesLedger.removeSeries)(deps.state, seriesId);
|
|
198
|
+
return ids;
|
|
199
|
+
},
|
|
200
|
+
async listSeries() {
|
|
201
|
+
const pending = await deps.engine.getPending();
|
|
202
|
+
return (0, _seriesLedger.listSeries)(deps.state).map(entry => ({
|
|
203
|
+
seriesId: entry.seriesId,
|
|
204
|
+
anchoring: entry.anchoring,
|
|
205
|
+
expandedThrough: entry.expandedThrough,
|
|
206
|
+
pendingOccurrences: pending.filter(p => belongsTo(p, entry.seriesId)).length,
|
|
207
|
+
exhausted: entry.exhausted
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_anchor","require","_validateIdentifier","_index","_writer","_errors","_expand","_clockGuard","_seriesLedger","toRequest","rule","occurrence","id","content","template","tone","moment","at","anchoring","routing","actions","ownerTag","groupTag","belongsTo","entry","seriesId","startsWith","recoverLastEmittedKey","pending","zone","length","undefined","latest","Math","max","map","resolvedAt","occurrenceKey","partsInZone","createRecurrence","deps","emit","writer","createScheduleWriter","engine","validateTemplate","validateRequest","now","resolveTone","toneFor","NotificationError","DIAGNOSTIC_CODES","UNDECLARED_TONE","toneId","materialize","timeZone","previous","readSeries","state","getPending","ofSeries","filter","expansion","expand","from","lookahead","alreadyEmitted","emittedCount","lastEmittedKey","guarded","guardAgainstClockChange","occurrences","previousHorizon","expandedThrough","previousNow","discontinuity","suppressed","direction","wanted","Set","stale","has","cancel","onDevice","includes","missing","room","capacity","toSchedule","slice","TRUNCATED_OVER_CEILING","dropped","approximate","canScheduleExactly","write","request","anchoringGeneration","newlyEmitted","previouslyEmitted","key","upsertSeries","exhausted","scheduled","cancelled","registerSeries","validateIdentifier","refreshSeries","cancelSeries","ids","cancelMany","pass","releaseStop","removeSeries","listSeries","readLedger","pendingOccurrences","p"],"sourceRoot":"../../../src","sources":["recurrence/index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createRepeatExpiryHandler = createRepeatExpiryHandler;
|
|
7
|
+
var _place = require("./place.js");
|
|
8
|
+
/**
|
|
9
|
+
* Repeat expiry.
|
|
10
|
+
*
|
|
11
|
+
* When a stop marker is delivered, the alert it guards has run its declared
|
|
12
|
+
* course. This handler ends the sound and leaves the notification exactly where
|
|
13
|
+
* it is, then removes the marker.
|
|
14
|
+
*
|
|
15
|
+
* Nothing here imports the engine. It talks to the port, which is what lets the
|
|
16
|
+
* whole mechanism be proven on a virtual clock with no device.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
function createRepeatExpiryHandler(deps) {
|
|
20
|
+
return {
|
|
21
|
+
async handle(event) {
|
|
22
|
+
const stop = event.repeatStop;
|
|
23
|
+
if (stop === undefined) return;
|
|
24
|
+
|
|
25
|
+
// Order matters. Silence first, remove the marker second: if the
|
|
26
|
+
// process dies between the two, a marker left behind is harmless
|
|
27
|
+
// noise, whereas a device left sounding is the failure this exists to
|
|
28
|
+
// prevent.
|
|
29
|
+
//
|
|
30
|
+
// `silenceDelivered` returning false is the ordinary case, not an
|
|
31
|
+
// error — it means the user already handled the notification. Checking
|
|
32
|
+
// the tray rather than racing to cancel the marker on interaction is
|
|
33
|
+
// what makes early handling correct by construction: even if the marker
|
|
34
|
+
// fires, there is nothing left to act on.
|
|
35
|
+
await deps.engine.silenceDelivered(stop.targetId);
|
|
36
|
+
await deps.engine.cancel(stop.markerId);
|
|
37
|
+
},
|
|
38
|
+
release: targetId => (0, _place.createStopPlacement)(deps.engine).release(targetId)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=expiry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_place","require","createRepeatExpiryHandler","deps","handle","event","stop","repeatStop","undefined","engine","silenceDelivered","targetId","cancel","markerId","release","createStopPlacement"],"sourceRoot":"../../../src","sources":["repeat/expiry.ts"],"mappings":";;;;;;AAYA,IAAAA,MAAA,GAAAC,OAAA;AAZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiBO,SAASC,yBAAyBA,CAACC,IAA8B,EAAuB;EAC9F,OAAO;IACN,MAAMC,MAAMA,CAACC,KAAoB,EAAiB;MACjD,MAAMC,IAAI,GAAGD,KAAK,CAACE,UAAU;MAC7B,IAAID,IAAI,KAAKE,SAAS,EAAE;;MAExB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,MAAML,IAAI,CAACM,MAAM,CAACC,gBAAgB,CAACJ,IAAI,CAACK,QAAQ,CAAC;MACjD,MAAMR,IAAI,CAACM,MAAM,CAACG,MAAM,CAACN,IAAI,CAACO,QAAQ,CAAC;IACxC,CAAC;IAEDC,OAAO,EAAEH,QAAQ,IAAI,IAAAI,0BAAmB,EAACZ,IAAI,CAACM,MAAM,CAAC,CAACK,OAAO,CAACH,QAAQ;EACvE,CAAC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "REPEAT_STOP_PREFIX", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _marker.REPEAT_STOP_PREFIX;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "createRepeatExpiryHandler", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _expiry.createRepeatExpiryHandler;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "isRepeatStopId", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _marker.isRepeatStopId;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "markerIdFor", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _marker.markerIdFor;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
exports.registerBackgroundNotificationHandler = registerBackgroundNotificationHandler;
|
|
31
|
+
Object.defineProperty(exports, "repeatStopFor", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () {
|
|
34
|
+
return _marker.repeatStopFor;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
var _interactionBuffer = require("../state/interaction-buffer.js");
|
|
38
|
+
var _record = require("../state/record.js");
|
|
39
|
+
var _expiry = require("./expiry.js");
|
|
40
|
+
var _marker = require("./marker.js");
|
|
41
|
+
/**
|
|
42
|
+
* Repeat expiry — bounding an alert that repeats until it is handled.
|
|
43
|
+
*
|
|
44
|
+
* The one piece of this package a consumer has to wire up themselves. The
|
|
45
|
+
* engine registers its background task at module scope, outside the React tree,
|
|
46
|
+
* and no library can perform that registration on an app's behalf.
|
|
47
|
+
*
|
|
48
|
+
* An app that declares no repeating tone needs none of this.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Registers the handler that ends a repeating alert while the app is dead.
|
|
53
|
+
*
|
|
54
|
+
* Call this at module scope in `index.js`, beside the app registration — not
|
|
55
|
+
* inside a component, and not inside an effect. By the time a component mounts,
|
|
56
|
+
* the process that needed this handler has already been asked to run it.
|
|
57
|
+
*
|
|
58
|
+
* Without it a repeating alert still starts and still stops when the user
|
|
59
|
+
* handles it, but nothing ends it on a device left face-down on a table. That
|
|
60
|
+
* is the whole reason the feature exists, so `apply()` reports its absence
|
|
61
|
+
* rather than letting anyone find out the hard way.
|
|
62
|
+
*/
|
|
63
|
+
function registerBackgroundNotificationHandler(registration) {
|
|
64
|
+
const handler = (0, _expiry.createRepeatExpiryHandler)(registration);
|
|
65
|
+
const keep = event => {
|
|
66
|
+
if (registration.store === undefined) return;
|
|
67
|
+
// A manager of its own: this runs in a process with no runtime, and the
|
|
68
|
+
// runtime created later loads what is written here.
|
|
69
|
+
(0, _interactionBuffer.buffer)(new _record.StateManager({
|
|
70
|
+
store: registration.store,
|
|
71
|
+
now: registration.now ?? (() => Date.now())
|
|
72
|
+
}), event);
|
|
73
|
+
};
|
|
74
|
+
registration.engine.registerBackgroundDeliveryHandler(event => handler.handle(event), async event => {
|
|
75
|
+
if (registration.onInteraction === undefined) {
|
|
76
|
+
keep(event);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
await registration.onInteraction(event);
|
|
81
|
+
} catch {
|
|
82
|
+
// The app's handler failed; the interaction is kept rather than lost.
|
|
83
|
+
keep(event);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Both paths, not just the background one. The engine routes a delivery to
|
|
88
|
+
// the foreground listener while the app is alive and to the headless task
|
|
89
|
+
// only when it is not — so registering only the latter leaves the alert
|
|
90
|
+
// sounding for anyone holding the phone when the window runs out, which is
|
|
91
|
+
// the one case they would certainly notice.
|
|
92
|
+
registration.engine.subscribeToDeliveries(event => {
|
|
93
|
+
// Deliberately not awaited: the engine's foreground listener is
|
|
94
|
+
// synchronous, and a rejection here must not take the subscription down
|
|
95
|
+
// with it — a handler that stopped listening would leave every later
|
|
96
|
+
// alarm unbounded.
|
|
97
|
+
handler.handle(event).catch(() => {});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_interactionBuffer","require","_record","_expiry","_marker","registerBackgroundNotificationHandler","registration","handler","createRepeatExpiryHandler","keep","event","store","undefined","buffer","StateManager","now","Date","engine","registerBackgroundDeliveryHandler","handle","onInteraction","subscribeToDeliveries","catch"],"sourceRoot":"../../../src","sources":["repeat/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAAA,kBAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAIA,IAAAG,OAAA,GAAAH,OAAA;AAnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASI,qCAAqCA,CACpDC,YAA2C,EACpC;EACP,MAAMC,OAAO,GAAG,IAAAC,iCAAyB,EAACF,YAAY,CAAC;EAEvD,MAAMG,IAAI,GAAIC,KAAuB,IAAW;IAC/C,IAAIJ,YAAY,CAACK,KAAK,KAAKC,SAAS,EAAE;IACtC;IACA;IACA,IAAAC,yBAAM,EACL,IAAIC,oBAAY,CAAC;MAAEH,KAAK,EAAEL,YAAY,CAACK,KAAK;MAAEI,GAAG,EAAET,YAAY,CAACS,GAAG,KAAK,MAAMC,IAAI,CAACD,GAAG,CAAC,CAAC;IAAE,CAAC,CAAC,EAC5FL,KACD,CAAC;EACF,CAAC;EAEDJ,YAAY,CAACW,MAAM,CAACC,iCAAiC,CACpDR,KAAK,IAAIH,OAAO,CAACY,MAAM,CAACT,KAAK,CAAC,EAC9B,MAAMA,KAAK,IAAI;IACd,IAAIJ,YAAY,CAACc,aAAa,KAAKR,SAAS,EAAE;MAC7CH,IAAI,CAACC,KAAK,CAAC;MACX;IACD;IACA,IAAI;MACH,MAAMJ,YAAY,CAACc,aAAa,CAACV,KAAK,CAAC;IACxC,CAAC,CAAC,MAAM;MACP;MACAD,IAAI,CAACC,KAAK,CAAC;IACZ;EACD,CACD,CAAC;;EAED;EACA;EACA;EACA;EACA;EACAJ,YAAY,CAACW,MAAM,CAACI,qBAAqB,CAACX,KAAK,IAAI;IAClD;IACA;IACA;IACA;IACAH,OAAO,CAACY,MAAM,CAACT,KAAK,CAAC,CAACY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACtC,CAAC,CAAC;AACH","ignoreList":[]}
|