@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,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Identifier validation.
|
|
5
|
+
*
|
|
6
|
+
* Identity is the caller's contract: only the caller can derive an identifier
|
|
7
|
+
* reproducibly from its own data, so the package never generates one.
|
|
8
|
+
*
|
|
9
|
+
* The charset is composite-friendly because real derived keys are hierarchical
|
|
10
|
+
* — `task:1234:reminder:2`. A charset that forced encoding of natural keys
|
|
11
|
+
* would work against caller-supplied identity being readable and reproducible,
|
|
12
|
+
* which is most of its value.
|
|
13
|
+
*
|
|
14
|
+
* Nothing is normalized, trimmed, case-folded, or hashed. Two identifiers
|
|
15
|
+
* differing in any character are different identifiers, and the value visible
|
|
16
|
+
* at the platform boundary is exactly what the caller supplied — which is what
|
|
17
|
+
* lets a notification be traced back to the data that produced it.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { DIAGNOSTIC_CODES, NotificationError } from "../contract/errors.js";
|
|
21
|
+
import { REPEAT_STOP_PREFIX } from "../repeat/marker.js";
|
|
22
|
+
export const MAX_IDENTIFIER_LENGTH = 128;
|
|
23
|
+
|
|
24
|
+
/** `A–Z a–z 0–9 . _ - : /` — printable, unambiguous, and safe at every boundary. */
|
|
25
|
+
const IDENTIFIER_PATTERN = /^[A-Za-z0-9._:/-]+$/;
|
|
26
|
+
|
|
27
|
+
/** Reports the first offending character so a failure is actionable without echoing the value. */
|
|
28
|
+
function firstInvalidCharacter(value) {
|
|
29
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
30
|
+
const char = value[index];
|
|
31
|
+
if (!/[A-Za-z0-9._:/-]/.test(char)) {
|
|
32
|
+
return {
|
|
33
|
+
char,
|
|
34
|
+
index
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const EMPTY_CODE = {
|
|
41
|
+
id: DIAGNOSTIC_CODES.INVALID_ID_EMPTY,
|
|
42
|
+
ownerTag: DIAGNOSTIC_CODES.INVALID_OWNER_TAG,
|
|
43
|
+
groupTag: DIAGNOSTIC_CODES.INVALID_GROUP_TAG,
|
|
44
|
+
seriesId: DIAGNOSTIC_CODES.INVALID_ID_EMPTY,
|
|
45
|
+
actionId: DIAGNOSTIC_CODES.INVALID_ID_EMPTY
|
|
46
|
+
};
|
|
47
|
+
const LENGTH_CODE = {
|
|
48
|
+
id: DIAGNOSTIC_CODES.INVALID_ID_LENGTH,
|
|
49
|
+
ownerTag: DIAGNOSTIC_CODES.INVALID_OWNER_TAG,
|
|
50
|
+
groupTag: DIAGNOSTIC_CODES.INVALID_GROUP_TAG,
|
|
51
|
+
seriesId: DIAGNOSTIC_CODES.INVALID_ID_LENGTH,
|
|
52
|
+
actionId: DIAGNOSTIC_CODES.INVALID_ID_LENGTH
|
|
53
|
+
};
|
|
54
|
+
const CHARSET_CODE = {
|
|
55
|
+
id: DIAGNOSTIC_CODES.INVALID_ID_CHARSET,
|
|
56
|
+
ownerTag: DIAGNOSTIC_CODES.INVALID_OWNER_TAG,
|
|
57
|
+
groupTag: DIAGNOSTIC_CODES.INVALID_GROUP_TAG,
|
|
58
|
+
seriesId: DIAGNOSTIC_CODES.INVALID_ID_CHARSET,
|
|
59
|
+
actionId: DIAGNOSTIC_CODES.INVALID_ID_CHARSET
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Throws a typed error naming the violated rule.
|
|
64
|
+
*
|
|
65
|
+
* The offending character and its position are reported; the value itself never
|
|
66
|
+
* is, because an identifier can carry user data a caller derived it from.
|
|
67
|
+
*/
|
|
68
|
+
export function validateIdentifier(value, kind = 'id') {
|
|
69
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
70
|
+
throw new NotificationError(EMPTY_CODE[kind], `A ${kind} must be a non-empty string supplied by the caller. The package never generates one.`, {
|
|
71
|
+
kind,
|
|
72
|
+
received: typeof value
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (value.length > MAX_IDENTIFIER_LENGTH) {
|
|
76
|
+
throw new NotificationError(LENGTH_CODE[kind], `A ${kind} must be at most ${MAX_IDENTIFIER_LENGTH} characters.`, {
|
|
77
|
+
kind,
|
|
78
|
+
length: value.length,
|
|
79
|
+
max: MAX_IDENTIFIER_LENGTH
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (value.startsWith(REPEAT_STOP_PREFIX)) {
|
|
83
|
+
// Not a style rule. Repeat expiry cancels markers by identifier, so a
|
|
84
|
+
// consumer identifier that looks like one would be deleted out from under
|
|
85
|
+
// a real notification.
|
|
86
|
+
throw new NotificationError(CHARSET_CODE[kind], `A ${kind} may not begin with "${REPEAT_STOP_PREFIX}" — that prefix is reserved for the package's own repeat-expiry markers, which are cancelled automatically.`, {
|
|
87
|
+
kind,
|
|
88
|
+
reservedPrefix: REPEAT_STOP_PREFIX
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (!IDENTIFIER_PATTERN.test(value)) {
|
|
92
|
+
const offender = firstInvalidCharacter(value);
|
|
93
|
+
throw new NotificationError(CHARSET_CODE[kind], `A ${kind} may contain only A-Z, a-z, 0-9, and the separators . _ - : / — whitespace and control characters are not permitted.`, {
|
|
94
|
+
kind,
|
|
95
|
+
index: offender?.index,
|
|
96
|
+
charCode: offender?.char.charCodeAt(0)
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Non-throwing form, for validating a batch without unwinding on the first failure. */
|
|
103
|
+
export function isValidIdentifier(value) {
|
|
104
|
+
// The throwing form is the rule; this one only reports whether it holds, so
|
|
105
|
+
// the two cannot disagree (the reserved marker prefix was missing here).
|
|
106
|
+
try {
|
|
107
|
+
validateIdentifier(value);
|
|
108
|
+
return true;
|
|
109
|
+
} catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Validates an optional tag, returning undefined when absent rather than failing. */
|
|
115
|
+
export function validateOptionalTag(value, kind) {
|
|
116
|
+
if (value === undefined) return undefined;
|
|
117
|
+
return validateIdentifier(value, kind);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=validate-identifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DIAGNOSTIC_CODES","NotificationError","REPEAT_STOP_PREFIX","MAX_IDENTIFIER_LENGTH","IDENTIFIER_PATTERN","firstInvalidCharacter","value","index","length","char","test","undefined","EMPTY_CODE","id","INVALID_ID_EMPTY","ownerTag","INVALID_OWNER_TAG","groupTag","INVALID_GROUP_TAG","seriesId","actionId","LENGTH_CODE","INVALID_ID_LENGTH","CHARSET_CODE","INVALID_ID_CHARSET","validateIdentifier","kind","received","max","startsWith","reservedPrefix","offender","charCode","charCodeAt","isValidIdentifier","validateOptionalTag"],"sourceRoot":"../../../src","sources":["schedule/validate-identifier.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The one door every consumer notification goes through to reach the engine.
|
|
5
|
+
*
|
|
6
|
+
* Scheduler, reconciler, recurrence, re-anchoring and channel re-homing all
|
|
7
|
+
* write notifications. Each used to call `engine.schedule` itself, and the
|
|
8
|
+
* guarantees attached to a write — a repeating alert gets its stop marker, and
|
|
9
|
+
* that marker moves when the notification moves — existed only on the paths
|
|
10
|
+
* that remembered them. A recurring alarm never stopped, and a re-anchored one
|
|
11
|
+
* stopped at the old instant.
|
|
12
|
+
*
|
|
13
|
+
* Validation stays with each caller, because each has its own failure policy:
|
|
14
|
+
* the scheduler throws, reconciliation rejects one entry and carries on, and
|
|
15
|
+
* recurrence validates its template once at registration.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { createStopPlacement } from "../repeat/place.js";
|
|
19
|
+
export function createScheduleWriter(engine) {
|
|
20
|
+
return writerOver(engine, createStopPlacement(engine));
|
|
21
|
+
}
|
|
22
|
+
function writerOver(engine, stops) {
|
|
23
|
+
return {
|
|
24
|
+
async write(input) {
|
|
25
|
+
await engine.schedule(input);
|
|
26
|
+
await stops.sync(input.request.id, input.tone, input.resolvedAt);
|
|
27
|
+
},
|
|
28
|
+
async cancel(id) {
|
|
29
|
+
await engine.cancel(id);
|
|
30
|
+
await stops.release(id);
|
|
31
|
+
},
|
|
32
|
+
releaseStop: targetId => stops.release(targetId),
|
|
33
|
+
async capacity() {
|
|
34
|
+
const capabilities = await engine.getCapabilities();
|
|
35
|
+
return Math.max(0, capabilities.pendingCeiling - (await stops.count()));
|
|
36
|
+
},
|
|
37
|
+
pass: () => writerOver(engine, stops.pass())
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createStopPlacement","createScheduleWriter","engine","writerOver","stops","write","input","schedule","sync","request","id","tone","resolvedAt","cancel","release","releaseStop","targetId","capacity","capabilities","getCapabilities","Math","max","pendingCeiling","count","pass"],"sourceRoot":"../../../src","sources":["schedule/writer.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,mBAAmB,QAA4B,oBAAiB;AAsBzE,OAAO,SAASC,oBAAoBA,CAACC,MAAiC,EAAkB;EACvF,OAAOC,UAAU,CAACD,MAAM,EAAEF,mBAAmB,CAACE,MAAM,CAAC,CAAC;AACvD;AAEA,SAASC,UAAUA,CAACD,MAAiC,EAAEE,KAAoB,EAAkB;EAC5F,OAAO;IACN,MAAMC,KAAKA,CAACC,KAAK,EAAE;MAClB,MAAMJ,MAAM,CAACK,QAAQ,CAACD,KAAK,CAAC;MAC5B,MAAMF,KAAK,CAACI,IAAI,CAACF,KAAK,CAACG,OAAO,CAACC,EAAE,EAAEJ,KAAK,CAACK,IAAI,EAAEL,KAAK,CAACM,UAAU,CAAC;IACjE,CAAC;IAED,MAAMC,MAAMA,CAACH,EAAE,EAAE;MAChB,MAAMR,MAAM,CAACW,MAAM,CAACH,EAAE,CAAC;MACvB,MAAMN,KAAK,CAACU,OAAO,CAACJ,EAAE,CAAC;IACxB,CAAC;IAEDK,WAAW,EAAEC,QAAQ,IAAIZ,KAAK,CAACU,OAAO,CAACE,QAAQ,CAAC;IAEhD,MAAMC,QAAQA,CAAA,EAAG;MAChB,MAAMC,YAAY,GAAG,MAAMhB,MAAM,CAACiB,eAAe,CAAC,CAAC;MACnD,OAAOC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,YAAY,CAACI,cAAc,IAAI,MAAMlB,KAAK,CAACmB,KAAK,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEDC,IAAI,EAAEA,CAAA,KAAMrB,UAAU,CAACD,MAAM,EAAEE,KAAK,CAACoB,IAAI,CAAC,CAAC;EAC5C,CAAC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Caps and eviction for the persisted collections.
|
|
5
|
+
*
|
|
6
|
+
* No collection may grow without bound. Eviction is oldest-first and always
|
|
7
|
+
* observable — a silent eviction would turn a bounded guarantee into an
|
|
8
|
+
* unexplained one.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Every persisted collection with a size or age bound. */
|
|
12
|
+
export const COLLECTION_CAPS = {
|
|
13
|
+
dedupLedger: {
|
|
14
|
+
maxEntries: 500,
|
|
15
|
+
retentionMs: 24 * 60 * 60 * 1000
|
|
16
|
+
},
|
|
17
|
+
interactionBuffer: {
|
|
18
|
+
maxEntries: 50,
|
|
19
|
+
retentionMs: 7 * 24 * 60 * 60 * 1000
|
|
20
|
+
},
|
|
21
|
+
migrationLedger: {
|
|
22
|
+
maxEntries: 20,
|
|
23
|
+
retentionMs: Number.POSITIVE_INFINITY
|
|
24
|
+
},
|
|
25
|
+
seriesLedger: {
|
|
26
|
+
maxEntries: 32,
|
|
27
|
+
retentionMs: Number.POSITIVE_INFINITY
|
|
28
|
+
},
|
|
29
|
+
permissionHistory: {
|
|
30
|
+
maxEntries: 64,
|
|
31
|
+
retentionMs: Number.POSITIVE_INFINITY
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Anything stored with a timestamp, which is everything that can age out. */
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Which entries a cap may drop (NOT-16). The migration and series ledgers record
|
|
39
|
+
* live facts: an active channel's applied version, a series' count. Dropping one
|
|
40
|
+
* makes the package treat a migrated tone as new and restart a series from zero,
|
|
41
|
+
* so only retired and exhausted entries go; the rest are kept and reported.
|
|
42
|
+
*/
|
|
43
|
+
const EVICTABLE = {
|
|
44
|
+
migrationLedger: entry => entry.retired === true,
|
|
45
|
+
seriesLedger: entry => entry.exhausted === true
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Applies retention first, then the size cap.
|
|
50
|
+
*
|
|
51
|
+
* Order matters: expiring stale entries before trimming means a burst of new
|
|
52
|
+
* entries does not evict fresh ones while stale ones sit protected by
|
|
53
|
+
* recency ordering.
|
|
54
|
+
*/
|
|
55
|
+
export function evict(entries, collection, now) {
|
|
56
|
+
const {
|
|
57
|
+
maxEntries,
|
|
58
|
+
retentionMs
|
|
59
|
+
} = COLLECTION_CAPS[collection];
|
|
60
|
+
const expired = [];
|
|
61
|
+
const live = [];
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
if (Number.isFinite(retentionMs) && now - entry.at > retentionMs) {
|
|
64
|
+
expired.push(entry);
|
|
65
|
+
} else {
|
|
66
|
+
live.push(entry);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Oldest first, so the tail is what we keep when trimming.
|
|
71
|
+
live.sort((a, b) => a.at - b.at);
|
|
72
|
+
const evictable = EVICTABLE[collection] ?? (() => true);
|
|
73
|
+
const excess = Math.max(0, live.length - maxEntries);
|
|
74
|
+
const overflow = [];
|
|
75
|
+
for (const entry of live) {
|
|
76
|
+
if (overflow.length === excess) break;
|
|
77
|
+
if (evictable(entry)) overflow.push(entry);
|
|
78
|
+
}
|
|
79
|
+
const dropped = new Set(overflow);
|
|
80
|
+
const kept = overflow.length === 0 ? live : live.filter(entry => !dropped.has(entry));
|
|
81
|
+
let reason = 'none';
|
|
82
|
+
if (expired.length > 0 && overflow.length > 0) {
|
|
83
|
+
reason = 'cap+retention';
|
|
84
|
+
} else if (overflow.length > 0) {
|
|
85
|
+
reason = 'cap';
|
|
86
|
+
} else if (expired.length > 0) {
|
|
87
|
+
reason = 'retention';
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
kept,
|
|
91
|
+
evicted: [...expired, ...overflow],
|
|
92
|
+
reason,
|
|
93
|
+
overCap: Math.max(0, kept.length - maxEntries)
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=caps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["COLLECTION_CAPS","dedupLedger","maxEntries","retentionMs","interactionBuffer","migrationLedger","Number","POSITIVE_INFINITY","seriesLedger","permissionHistory","EVICTABLE","entry","retired","exhausted","evict","entries","collection","now","expired","live","isFinite","at","push","sort","a","b","evictable","excess","Math","max","length","overflow","dropped","Set","kept","filter","has","reason","evicted","overCap"],"sourceRoot":"../../../src","sources":["state/caps.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The push deduplication ledger.
|
|
5
|
+
*
|
|
6
|
+
* Providers redeliver. The redelivery typically arrives in a **fresh process**,
|
|
7
|
+
* which is precisely why this is persisted rather than held in memory — an
|
|
8
|
+
* in-memory set would forget exactly when it matters.
|
|
9
|
+
*
|
|
10
|
+
* Bounded by cap and retention. A payload redelivered after its entry has aged
|
|
11
|
+
* out is treated as new: that is the documented bound of the guarantee, not a
|
|
12
|
+
* defect.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export function isDuplicate(state, dedupId) {
|
|
16
|
+
return state.read().dedupLedger.some(entry => entry.dedupId === dedupId);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Records a payload as seen.
|
|
21
|
+
*
|
|
22
|
+
* Returns true when it was already known, so a caller can branch on the same
|
|
23
|
+
* read that records it rather than checking twice.
|
|
24
|
+
*/
|
|
25
|
+
export function recordSeen(state, dedupId, now, ownerTag) {
|
|
26
|
+
if (isDuplicate(state, dedupId)) return true;
|
|
27
|
+
state.update('dedupLedger', current => [...current, {
|
|
28
|
+
at: now,
|
|
29
|
+
dedupId,
|
|
30
|
+
ownerTag
|
|
31
|
+
}]);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=dedup-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isDuplicate","state","dedupId","read","dedupLedger","some","entry","recordSeen","now","ownerTag","update","current","at"],"sourceRoot":"../../../src","sources":["state/dedup-ledger.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,SAASA,WAAWA,CAACC,KAAmB,EAAEC,OAAe,EAAW;EAC1E,OAAOD,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,WAAW,CAACC,IAAI,CAACC,KAAK,IAAIA,KAAK,CAACJ,OAAO,KAAKA,OAAO,CAAC;AACzE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASK,UAAUA,CACzBN,KAAmB,EACnBC,OAAe,EACfM,GAAW,EACXC,QAAiB,EACP;EACV,IAAIT,WAAW,CAACC,KAAK,EAAEC,OAAO,CAAC,EAAE,OAAO,IAAI;EAE5CD,KAAK,CAACS,MAAM,CAAC,aAAa,EAAEC,OAAO,IAAI,CAAC,GAAGA,OAAO,EAAE;IAAEC,EAAE,EAAEJ,GAAG;IAAEN,OAAO;IAAEO;EAAS,CAAC,CAAC,CAAC;EACpF,OAAO,KAAK;AACb","ignoreList":[]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The durable interaction buffer.
|
|
5
|
+
*
|
|
6
|
+
* A cold-start tap arrives before any handler exists. Holding it in memory
|
|
7
|
+
* would be enough if the process always survived — but the process is exactly
|
|
8
|
+
* what does not survive a cold start, so the buffer is persisted.
|
|
9
|
+
*
|
|
10
|
+
* This is the one content-bearing thing the package stores: an interaction
|
|
11
|
+
* cannot be delivered without its routing payload. It is evicted the moment it
|
|
12
|
+
* is delivered, and time-limited regardless, so an event nobody ever collects
|
|
13
|
+
* cannot sit on disk forever.
|
|
14
|
+
*
|
|
15
|
+
* Text the user typed into a reply action is never written to disk (NOT-14): it
|
|
16
|
+
* is free text, and the store is not encrypted. It is held in memory beside the
|
|
17
|
+
* buffer, so a handler registered later in the same process still receives it;
|
|
18
|
+
* if the process dies first, the event is delivered without `inputText`.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Typed replies, in memory only, per state manager and buffered event id. */
|
|
22
|
+
const typedReplies = new WeakMap();
|
|
23
|
+
function repliesOf(state) {
|
|
24
|
+
let replies = typedReplies.get(state);
|
|
25
|
+
if (!replies) {
|
|
26
|
+
replies = new Map();
|
|
27
|
+
typedReplies.set(state, replies);
|
|
28
|
+
}
|
|
29
|
+
return replies;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Identity for a buffered event, derived so re-buffering cannot duplicate. */
|
|
33
|
+
function bufferedId(event) {
|
|
34
|
+
return `${event.kind}:${event.notificationId}:${event.actionId ?? ''}:${event.occurredAt}`;
|
|
35
|
+
}
|
|
36
|
+
export function buffer(state, event) {
|
|
37
|
+
const id = bufferedId(event);
|
|
38
|
+
if (event.inputText !== undefined) {
|
|
39
|
+
repliesOf(state).set(id, event.inputText);
|
|
40
|
+
}
|
|
41
|
+
state.update('interactionBuffer', current => {
|
|
42
|
+
if (current.some(entry => entry.id === id)) return current;
|
|
43
|
+
const entry = {
|
|
44
|
+
at: event.occurredAt,
|
|
45
|
+
id,
|
|
46
|
+
kind: event.kind,
|
|
47
|
+
notificationId: event.notificationId,
|
|
48
|
+
actionId: event.actionId,
|
|
49
|
+
routing: event.routing,
|
|
50
|
+
ownerTag: event.ownerTag
|
|
51
|
+
};
|
|
52
|
+
return [...current, entry];
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Takes every buffered event in occurrence order and clears them.
|
|
58
|
+
*
|
|
59
|
+
* Draining and clearing together is deliberate: delivering an event twice is
|
|
60
|
+
* worse than the alternative, because a consumer that acts on an interaction
|
|
61
|
+
* (marking a task done, sending a reply) would act twice.
|
|
62
|
+
*/
|
|
63
|
+
export function drain(state) {
|
|
64
|
+
const buffered = [...state.read().interactionBuffer].sort((a, b) => a.at - b.at);
|
|
65
|
+
if (buffered.length === 0) return [];
|
|
66
|
+
state.update('interactionBuffer', () => []);
|
|
67
|
+
const replies = repliesOf(state);
|
|
68
|
+
return buffered.map(entry => ({
|
|
69
|
+
kind: entry.kind,
|
|
70
|
+
notificationId: entry.notificationId,
|
|
71
|
+
actionId: entry.actionId,
|
|
72
|
+
// A record written before 0.5 may still carry the text on disk; it is
|
|
73
|
+
// delivered once, and the buffer was just cleared.
|
|
74
|
+
inputText: takeReply(replies, entry.id) ?? entry.inputText,
|
|
75
|
+
routing: entry.routing,
|
|
76
|
+
ownerTag: entry.ownerTag,
|
|
77
|
+
occurredAt: entry.at,
|
|
78
|
+
// The state it arrived in is gone; what matters to a consumer is that it
|
|
79
|
+
// waited, which is what `wasBuffered` says.
|
|
80
|
+
appState: 'coldStart',
|
|
81
|
+
wasBuffered: true
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
export function bufferedCount(state) {
|
|
85
|
+
return state.read().interactionBuffer.length;
|
|
86
|
+
}
|
|
87
|
+
function takeReply(replies, id) {
|
|
88
|
+
const text = replies.get(id);
|
|
89
|
+
replies.delete(id);
|
|
90
|
+
return text;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=interaction-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["typedReplies","WeakMap","repliesOf","state","replies","get","Map","set","bufferedId","event","kind","notificationId","actionId","occurredAt","buffer","id","inputText","undefined","update","current","some","entry","at","routing","ownerTag","drain","buffered","read","interactionBuffer","sort","a","b","length","map","takeReply","appState","wasBuffered","bufferedCount","text","delete"],"sourceRoot":"../../../src","sources":["state/interaction-buffer.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MMKV-backed state store.
|
|
5
|
+
*
|
|
6
|
+
* Every MMKV import is confined to this file, so the rest of the package stays
|
|
7
|
+
* testable without a native module.
|
|
8
|
+
*
|
|
9
|
+
* Backup exclusion is achieved by *where* the data lives rather than by setting
|
|
10
|
+
* a file attribute: on iOS the instance is rooted under `Library/Caches`, which
|
|
11
|
+
* the platform excludes from iCloud and iTunes backup by design. The OS may
|
|
12
|
+
* purge that directory under storage pressure — acceptable here precisely
|
|
13
|
+
* because discarding and rebuilding this record is already a specified,
|
|
14
|
+
* non-blocking condition.
|
|
15
|
+
*
|
|
16
|
+
* On Android, backup exclusion is declared in the consuming app's
|
|
17
|
+
* `data_extraction_rules.xml` and `full_backup_content`, documented in the
|
|
18
|
+
* README. It is the app's manifest, so it is the app's declaration to make.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { createDiagnosticChannel, currentPlatform, lazyPeer, openDurable } from '@chipmobilesdk/rn-core';
|
|
22
|
+
import { DIAGNOSTIC_CODES } from "../contract/errors.js";
|
|
23
|
+
const INSTANCE_ID = 'chipmobilesdk.notification';
|
|
24
|
+
const mmkv = lazyPeer('react-native-mmkv', () => {
|
|
25
|
+
// Inside `try`, so Metro bundles an app that leaves this optional peer out.
|
|
26
|
+
try {
|
|
27
|
+
return require('react-native-mmkv');
|
|
28
|
+
} catch (cause) {
|
|
29
|
+
throw cause;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const channel = createDiagnosticChannel('rn-notification');
|
|
33
|
+
/**
|
|
34
|
+
* Creates the persistent store, falling back to memory when MMKV is absent.
|
|
35
|
+
*
|
|
36
|
+
* The fallback is deliberate: a missing optional native module degrades
|
|
37
|
+
* deduplication and cold-start buffering to session scope, which is a
|
|
38
|
+
* documented degradation. It must never stop notifications being delivered, and
|
|
39
|
+
* it is never silent (NOT-15): it reports `STATE_STORE_DEGRADED` to the app's SDK
|
|
40
|
+
* sinks and to `onDegraded`, and the store reports `durable: false`.
|
|
41
|
+
*/
|
|
42
|
+
export function createMmkvStore(options = {}) {
|
|
43
|
+
const port = openDurable(() =>
|
|
44
|
+
// v4's factory: up to 0.2.0 this called the v3 `new MMKV()`, which v4 no
|
|
45
|
+
// longer exports as a value, so every device silently got memory.
|
|
46
|
+
mmkv.require(peer => new Error(`${peer} is not installed`)).createMMKV({
|
|
47
|
+
id: INSTANCE_ID,
|
|
48
|
+
// Caches is backup-excluded by platform design; see the note above.
|
|
49
|
+
...(currentPlatform() === 'ios' ? {
|
|
50
|
+
path: 'Library/Caches/chipmobilesdk-notification'
|
|
51
|
+
} : {})
|
|
52
|
+
}), cause => {
|
|
53
|
+
channel.emit(DIAGNOSTIC_CODES.STATE_STORE_DEGRADED, 'warn');
|
|
54
|
+
options.onDegraded?.(cause);
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
getString: key => port.getString(key),
|
|
58
|
+
setString: (key, value) => port.set(key, value),
|
|
59
|
+
delete: key => port.remove(key),
|
|
60
|
+
clearAll: () => port.clearAll(),
|
|
61
|
+
approximateBytes: () => {
|
|
62
|
+
let total = 0;
|
|
63
|
+
for (const key of port.keys()) {
|
|
64
|
+
total += key.length + (port.getString(key)?.length ?? 0);
|
|
65
|
+
}
|
|
66
|
+
return total;
|
|
67
|
+
},
|
|
68
|
+
durable: port.durable
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=mmkv-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createDiagnosticChannel","currentPlatform","lazyPeer","openDurable","DIAGNOSTIC_CODES","INSTANCE_ID","mmkv","require","cause","channel","createMmkvStore","options","port","peer","Error","createMMKV","id","path","emit","STATE_STORE_DEGRADED","onDegraded","getString","key","setString","value","set","delete","remove","clearAll","approximateBytes","total","keys","length","durable"],"sourceRoot":"../../../src","sources":["state/mmkv-store.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SACCA,uBAAuB,EACvBC,eAAe,EACfC,QAAQ,EACRC,WAAW,QAEL,wBAAwB;AAE/B,SAASC,gBAAgB,QAAQ,uBAAoB;AAGrD,MAAMC,WAAW,GAAG,4BAA4B;AAEhD,MAAMC,IAAI,GAAGJ,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAChD;EACA,IAAI;IACH,OAAOK,OAAO,CAAC,mBAAmB,CAAC;EAGpC,CAAC,CAAC,OAAOC,KAAK,EAAE;IACf,MAAMA,KAAK;EACZ;AACD,CAAC,CAAC;AAEF,MAAMC,OAAO,GAAGT,uBAAuB,CAAC,iBAAiB,CAAC;AAO1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASU,eAAeA,CAACC,OAAyB,GAAG,CAAC,CAAC,EAAc;EAC3E,MAAMC,IAAI,GAAGT,WAAW,CACvB;EACC;EACA;EACAG,IAAI,CACFC,OAAO,CAACM,IAAI,IAAI,IAAIC,KAAK,CAAC,GAAGD,IAAI,mBAAmB,CAAC,CAAC,CACtDE,UAAU,CAAC;IACXC,EAAE,EAAEX,WAAW;IACf;IACA,IAAIJ,eAAe,CAAC,CAAC,KAAK,KAAK,GAC5B;MAAEgB,IAAI,EAAE;IAA4C,CAAC,GACrD,CAAC,CAAC;EACN,CAAC,CAAC,EACJT,KAAK,IAAI;IACRC,OAAO,CAACS,IAAI,CAACd,gBAAgB,CAACe,oBAAoB,EAAE,MAAM,CAAC;IAC3DR,OAAO,CAACS,UAAU,GAAGZ,KAAK,CAAC;EAC5B,CACD,CAAC;EACD,OAAO;IACNa,SAAS,EAAEC,GAAG,IAAIV,IAAI,CAACS,SAAS,CAACC,GAAG,CAAC;IACrCC,SAAS,EAAEA,CAACD,GAAG,EAAEE,KAAK,KAAKZ,IAAI,CAACa,GAAG,CAACH,GAAG,EAAEE,KAAK,CAAC;IAC/CE,MAAM,EAAEJ,GAAG,IAAIV,IAAI,CAACe,MAAM,CAACL,GAAG,CAAC;IAC/BM,QAAQ,EAAEA,CAAA,KAAMhB,IAAI,CAACgB,QAAQ,CAAC,CAAC;IAC/BC,gBAAgB,EAAEA,CAAA,KAAM;MACvB,IAAIC,KAAK,GAAG,CAAC;MACb,KAAK,MAAMR,GAAG,IAAIV,IAAI,CAACmB,IAAI,CAAC,CAAC,EAAE;QAC9BD,KAAK,IAAIR,GAAG,CAACU,MAAM,IAAIpB,IAAI,CAACS,SAAS,CAACC,GAAG,CAAC,EAAEU,MAAM,IAAI,CAAC,CAAC;MACzD;MACA,OAAOF,KAAK;IACb,CAAC;IACDG,OAAO,EAAErB,IAAI,CAACqB;EACf,CAAC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Permission-request history.
|
|
5
|
+
*
|
|
6
|
+
* The platform cannot tell you whether you have already asked. On both
|
|
7
|
+
* platforms a second request after a denial is silently a no-op, so an app that
|
|
8
|
+
* does not remember will keep "asking" and keep appearing to be refused.
|
|
9
|
+
*
|
|
10
|
+
* Keyed by owner tag so a multi-account device can clear one account's history
|
|
11
|
+
* on sign-out without forgetting what it asked the others.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
function key(kind, ownerTag) {
|
|
15
|
+
return `${ownerTag ?? '*'}:${kind}`;
|
|
16
|
+
}
|
|
17
|
+
export function hasRequested(state, kind, ownerTag) {
|
|
18
|
+
const target = key(kind, ownerTag);
|
|
19
|
+
return state.read().permissionHistory.some(entry => entry.key === target && entry.requested);
|
|
20
|
+
}
|
|
21
|
+
export function recordRequested(state, kind, now, ownerTag) {
|
|
22
|
+
const target = key(kind, ownerTag);
|
|
23
|
+
if (hasRequested(state, kind, ownerTag)) return;
|
|
24
|
+
state.update('permissionHistory', current => [...current.filter(entry => entry.key !== target), {
|
|
25
|
+
at: now,
|
|
26
|
+
key: target,
|
|
27
|
+
requested: true
|
|
28
|
+
}]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The device-wide key: a refusal is the user's answer to the app, not to one account. */
|
|
32
|
+
const DEVICE = '#device';
|
|
33
|
+
|
|
34
|
+
/** How many requests for `kind` the user has refused on this device. */
|
|
35
|
+
export function denialCount(state, kind) {
|
|
36
|
+
const target = key(kind, DEVICE);
|
|
37
|
+
return state.read().permissionHistory.find(entry => entry.key === target)?.denials ?? 0;
|
|
38
|
+
}
|
|
39
|
+
export function recordDenial(state, kind, now) {
|
|
40
|
+
const target = key(kind, DEVICE);
|
|
41
|
+
const denials = denialCount(state, kind) + 1;
|
|
42
|
+
state.update('permissionHistory', current => [...current.filter(entry => entry.key !== target), {
|
|
43
|
+
at: now,
|
|
44
|
+
key: target,
|
|
45
|
+
requested: true,
|
|
46
|
+
denials
|
|
47
|
+
}]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Forgets refusals once the permission is seen granted: the next refusal starts over. */
|
|
51
|
+
export function clearDenials(state, kind) {
|
|
52
|
+
if (denialCount(state, kind) === 0) return;
|
|
53
|
+
const target = key(kind, DEVICE);
|
|
54
|
+
state.update('permissionHistory', current => current.filter(entry => entry.key !== target));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=permission-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["key","kind","ownerTag","hasRequested","state","target","read","permissionHistory","some","entry","requested","recordRequested","now","update","current","filter","at","DEVICE","denialCount","find","denials","recordDenial","clearDenials"],"sourceRoot":"../../../src","sources":["state/permission-history.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,GAAGA,CAACC,IAAoB,EAAEC,QAAiB,EAAU;EAC7D,OAAO,GAAGA,QAAQ,IAAI,GAAG,IAAID,IAAI,EAAE;AACpC;AAEA,OAAO,SAASE,YAAYA,CAC3BC,KAAmB,EACnBH,IAAoB,EACpBC,QAAiB,EACP;EACV,MAAMG,MAAM,GAAGL,GAAG,CAACC,IAAI,EAAEC,QAAQ,CAAC;EAClC,OAAOE,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,iBAAiB,CAACC,IAAI,CAACC,KAAK,IAAIA,KAAK,CAACT,GAAG,KAAKK,MAAM,IAAII,KAAK,CAACC,SAAS,CAAC;AAC7F;AAEA,OAAO,SAASC,eAAeA,CAC9BP,KAAmB,EACnBH,IAAoB,EACpBW,GAAW,EACXV,QAAiB,EACV;EACP,MAAMG,MAAM,GAAGL,GAAG,CAACC,IAAI,EAAEC,QAAQ,CAAC;EAClC,IAAIC,YAAY,CAACC,KAAK,EAAEH,IAAI,EAAEC,QAAQ,CAAC,EAAE;EAEzCE,KAAK,CAACS,MAAM,CAAC,mBAAmB,EAAEC,OAAO,IAAI,CAC5C,GAAGA,OAAO,CAACC,MAAM,CAACN,KAAK,IAAIA,KAAK,CAACT,GAAG,KAAKK,MAAM,CAAC,EAChD;IAAEW,EAAE,EAAEJ,GAAG;IAAEZ,GAAG,EAAEK,MAAM;IAAEK,SAAS,EAAE;EAAK,CAAC,CACzC,CAAC;AACH;;AAEA;AACA,MAAMO,MAAM,GAAG,SAAS;;AAExB;AACA,OAAO,SAASC,WAAWA,CAACd,KAAmB,EAAEH,IAAoB,EAAU;EAC9E,MAAMI,MAAM,GAAGL,GAAG,CAACC,IAAI,EAAEgB,MAAM,CAAC;EAChC,OAAOb,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,iBAAiB,CAACY,IAAI,CAACV,KAAK,IAAIA,KAAK,CAACT,GAAG,KAAKK,MAAM,CAAC,EAAEe,OAAO,IAAI,CAAC;AACxF;AAEA,OAAO,SAASC,YAAYA,CAACjB,KAAmB,EAAEH,IAAoB,EAAEW,GAAW,EAAQ;EAC1F,MAAMP,MAAM,GAAGL,GAAG,CAACC,IAAI,EAAEgB,MAAM,CAAC;EAChC,MAAMG,OAAO,GAAGF,WAAW,CAACd,KAAK,EAAEH,IAAI,CAAC,GAAG,CAAC;EAC5CG,KAAK,CAACS,MAAM,CAAC,mBAAmB,EAAEC,OAAO,IAAI,CAC5C,GAAGA,OAAO,CAACC,MAAM,CAACN,KAAK,IAAIA,KAAK,CAACT,GAAG,KAAKK,MAAM,CAAC,EAChD;IAAEW,EAAE,EAAEJ,GAAG;IAAEZ,GAAG,EAAEK,MAAM;IAAEK,SAAS,EAAE,IAAI;IAAEU;EAAQ,CAAC,CAClD,CAAC;AACH;;AAEA;AACA,OAAO,SAASE,YAAYA,CAAClB,KAAmB,EAAEH,IAAoB,EAAQ;EAC7E,IAAIiB,WAAW,CAACd,KAAK,EAAEH,IAAI,CAAC,KAAK,CAAC,EAAE;EACpC,MAAMI,MAAM,GAAGL,GAAG,CAACC,IAAI,EAAEgB,MAAM,CAAC;EAChCb,KAAK,CAACS,MAAM,CAAC,mBAAmB,EAAEC,OAAO,IAAIA,OAAO,CAACC,MAAM,CAACN,KAAK,IAAIA,KAAK,CAACT,GAAG,KAAKK,MAAM,CAAC,CAAC;AAC5F","ignoreList":[]}
|