@sempdev/semp 0.4.3
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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/brief/address.d.ts +77 -0
- package/dist/brief/address.d.ts.map +1 -0
- package/dist/brief/address.js +217 -0
- package/dist/brief/address.js.map +1 -0
- package/dist/brief/brief.d.ts +75 -0
- package/dist/brief/brief.d.ts.map +1 -0
- package/dist/brief/brief.js +56 -0
- package/dist/brief/brief.js.map +1 -0
- package/dist/brief/index.d.ts +11 -0
- package/dist/brief/index.d.ts.map +1 -0
- package/dist/brief/index.js +11 -0
- package/dist/brief/index.js.map +1 -0
- package/dist/canonical/index.d.ts +8 -0
- package/dist/canonical/index.d.ts.map +1 -0
- package/dist/canonical/index.js +8 -0
- package/dist/canonical/index.js.map +1 -0
- package/dist/canonical/marshal.d.ts +35 -0
- package/dist/canonical/marshal.d.ts.map +1 -0
- package/dist/canonical/marshal.js +107 -0
- package/dist/canonical/marshal.js.map +1 -0
- package/dist/clockskew/index.d.ts +52 -0
- package/dist/clockskew/index.d.ts.map +1 -0
- package/dist/clockskew/index.js +62 -0
- package/dist/clockskew/index.js.map +1 -0
- package/dist/closure/closure.d.ts +106 -0
- package/dist/closure/closure.d.ts.map +1 -0
- package/dist/closure/closure.js +152 -0
- package/dist/closure/closure.js.map +1 -0
- package/dist/closure/driver.d.ts +103 -0
- package/dist/closure/driver.d.ts.map +1 -0
- package/dist/closure/driver.js +126 -0
- package/dist/closure/driver.js.map +1 -0
- package/dist/closure/index.d.ts +13 -0
- package/dist/closure/index.d.ts.map +1 -0
- package/dist/closure/index.js +13 -0
- package/dist/closure/index.js.map +1 -0
- package/dist/closure/store.d.ts +80 -0
- package/dist/closure/store.d.ts.map +1 -0
- package/dist/closure/store.js +89 -0
- package/dist/closure/store.js.map +1 -0
- package/dist/crypto/aead.d.ts +29 -0
- package/dist/crypto/aead.d.ts.map +1 -0
- package/dist/crypto/aead.js +48 -0
- package/dist/crypto/aead.js.map +1 -0
- package/dist/crypto/argon2.d.ts +20 -0
- package/dist/crypto/argon2.d.ts.map +1 -0
- package/dist/crypto/argon2.js +28 -0
- package/dist/crypto/argon2.js.map +1 -0
- package/dist/crypto/index.d.ts +14 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +14 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/kdf.d.ts +96 -0
- package/dist/crypto/kdf.d.ts.map +1 -0
- package/dist/crypto/kdf.js +122 -0
- package/dist/crypto/kdf.js.map +1 -0
- package/dist/crypto/kem.d.ts +85 -0
- package/dist/crypto/kem.d.ts.map +1 -0
- package/dist/crypto/kem.js +130 -0
- package/dist/crypto/kem.js.map +1 -0
- package/dist/crypto/mac.d.ts +19 -0
- package/dist/crypto/mac.d.ts.map +1 -0
- package/dist/crypto/mac.js +32 -0
- package/dist/crypto/mac.js.map +1 -0
- package/dist/delivery/ack.d.ts +125 -0
- package/dist/delivery/ack.d.ts.map +1 -0
- package/dist/delivery/ack.js +141 -0
- package/dist/delivery/ack.js.map +1 -0
- package/dist/delivery/blocklist.d.ts +87 -0
- package/dist/delivery/blocklist.d.ts.map +1 -0
- package/dist/delivery/blocklist.js +107 -0
- package/dist/delivery/blocklist.js.map +1 -0
- package/dist/delivery/cancel.d.ts +60 -0
- package/dist/delivery/cancel.d.ts.map +1 -0
- package/dist/delivery/cancel.js +43 -0
- package/dist/delivery/cancel.js.map +1 -0
- package/dist/delivery/disposition.d.ts +106 -0
- package/dist/delivery/disposition.d.ts.map +1 -0
- package/dist/delivery/disposition.js +105 -0
- package/dist/delivery/disposition.js.map +1 -0
- package/dist/delivery/fetch.d.ts +59 -0
- package/dist/delivery/fetch.d.ts.map +1 -0
- package/dist/delivery/fetch.js +47 -0
- package/dist/delivery/fetch.js.map +1 -0
- package/dist/delivery/forwarder.d.ts +106 -0
- package/dist/delivery/forwarder.d.ts.map +1 -0
- package/dist/delivery/forwarder.js +251 -0
- package/dist/delivery/forwarder.js.map +1 -0
- package/dist/delivery/inbox.d.ts +42 -0
- package/dist/delivery/inbox.d.ts.map +1 -0
- package/dist/delivery/inbox.js +68 -0
- package/dist/delivery/inbox.js.map +1 -0
- package/dist/delivery/index.d.ts +31 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +31 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/internalroute.d.ts +50 -0
- package/dist/delivery/internalroute.d.ts.map +1 -0
- package/dist/delivery/internalroute.js +23 -0
- package/dist/delivery/internalroute.js.map +1 -0
- package/dist/delivery/pipeline.d.ts +153 -0
- package/dist/delivery/pipeline.d.ts.map +1 -0
- package/dist/delivery/pipeline.js +356 -0
- package/dist/delivery/pipeline.js.map +1 -0
- package/dist/delivery/policy_state.d.ts +105 -0
- package/dist/delivery/policy_state.d.ts.map +1 -0
- package/dist/delivery/policy_state.js +293 -0
- package/dist/delivery/policy_state.js.map +1 -0
- package/dist/delivery/queue.d.ts +47 -0
- package/dist/delivery/queue.d.ts.map +1 -0
- package/dist/delivery/queue.js +33 -0
- package/dist/delivery/queue.js.map +1 -0
- package/dist/delivery/receipt.d.ts +137 -0
- package/dist/delivery/receipt.d.ts.map +1 -0
- package/dist/delivery/receipt.js +181 -0
- package/dist/delivery/receipt.js.map +1 -0
- package/dist/delivery/receipt_store.d.ts +81 -0
- package/dist/delivery/receipt_store.d.ts.map +1 -0
- package/dist/delivery/receipt_store.js +74 -0
- package/dist/delivery/receipt_store.js.map +1 -0
- package/dist/delivery/retry.d.ts +78 -0
- package/dist/delivery/retry.d.ts.map +1 -0
- package/dist/delivery/retry.js +132 -0
- package/dist/delivery/retry.js.map +1 -0
- package/dist/delivery/scheduler.d.ts +156 -0
- package/dist/delivery/scheduler.d.ts.map +1 -0
- package/dist/delivery/scheduler.js +349 -0
- package/dist/delivery/scheduler.js.map +1 -0
- package/dist/delivery/stage_partition.d.ts +87 -0
- package/dist/delivery/stage_partition.d.ts.map +1 -0
- package/dist/delivery/stage_partition.js +122 -0
- package/dist/delivery/stage_partition.js.map +1 -0
- package/dist/delivery/staged_runner.d.ts +100 -0
- package/dist/delivery/staged_runner.d.ts.map +1 -0
- package/dist/delivery/staged_runner.js +277 -0
- package/dist/delivery/staged_runner.js.map +1 -0
- package/dist/delivery/submission.d.ts +72 -0
- package/dist/delivery/submission.d.ts.map +1 -0
- package/dist/delivery/submission.js +58 -0
- package/dist/delivery/submission.js.map +1 -0
- package/dist/delivery/sync.d.ts +68 -0
- package/dist/delivery/sync.d.ts.map +1 -0
- package/dist/delivery/sync.js +99 -0
- package/dist/delivery/sync.js.map +1 -0
- package/dist/delivery/user_policy.d.ts +74 -0
- package/dist/delivery/user_policy.d.ts.map +1 -0
- package/dist/delivery/user_policy.js +140 -0
- package/dist/delivery/user_policy.js.map +1 -0
- package/dist/discovery/cache.d.ts +37 -0
- package/dist/discovery/cache.d.ts.map +1 -0
- package/dist/discovery/cache.js +45 -0
- package/dist/discovery/cache.js.map +1 -0
- package/dist/discovery/configuration.d.ts +97 -0
- package/dist/discovery/configuration.d.ts.map +1 -0
- package/dist/discovery/configuration.js +146 -0
- package/dist/discovery/configuration.js.map +1 -0
- package/dist/discovery/dns.d.ts +56 -0
- package/dist/discovery/dns.d.ts.map +1 -0
- package/dist/discovery/dns.js +120 -0
- package/dist/discovery/dns.js.map +1 -0
- package/dist/discovery/domain_keys.d.ts +62 -0
- package/dist/discovery/domain_keys.d.ts.map +1 -0
- package/dist/discovery/domain_keys.js +89 -0
- package/dist/discovery/domain_keys.js.map +1 -0
- package/dist/discovery/index.d.ts +19 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +19 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/lookup.d.ts +72 -0
- package/dist/discovery/lookup.d.ts.map +1 -0
- package/dist/discovery/lookup.js +121 -0
- package/dist/discovery/lookup.js.map +1 -0
- package/dist/discovery/onion.d.ts +34 -0
- package/dist/discovery/onion.d.ts.map +1 -0
- package/dist/discovery/onion.js +61 -0
- package/dist/discovery/onion.js.map +1 -0
- package/dist/discovery/partition.d.ts +96 -0
- package/dist/discovery/partition.d.ts.map +1 -0
- package/dist/discovery/partition.js +247 -0
- package/dist/discovery/partition.js.map +1 -0
- package/dist/discovery/resolver.d.ts +113 -0
- package/dist/discovery/resolver.d.ts.map +1 -0
- package/dist/discovery/resolver.js +176 -0
- package/dist/discovery/resolver.js.map +1 -0
- package/dist/discovery/txt.d.ts +39 -0
- package/dist/discovery/txt.d.ts.map +1 -0
- package/dist/discovery/txt.js +71 -0
- package/dist/discovery/txt.js.map +1 -0
- package/dist/enclosure/forwarding.d.ts +128 -0
- package/dist/enclosure/forwarding.d.ts.map +1 -0
- package/dist/enclosure/forwarding.js +119 -0
- package/dist/enclosure/forwarding.js.map +1 -0
- package/dist/enclosure/index.d.ts +11 -0
- package/dist/enclosure/index.d.ts.map +1 -0
- package/dist/enclosure/index.js +11 -0
- package/dist/enclosure/index.js.map +1 -0
- package/dist/envelope/buckets.d.ts +38 -0
- package/dist/envelope/buckets.d.ts.map +1 -0
- package/dist/envelope/buckets.js +73 -0
- package/dist/envelope/buckets.js.map +1 -0
- package/dist/envelope/canonical.d.ts +28 -0
- package/dist/envelope/canonical.d.ts.map +1 -0
- package/dist/envelope/canonical.js +54 -0
- package/dist/envelope/canonical.js.map +1 -0
- package/dist/envelope/compose.d.ts +171 -0
- package/dist/envelope/compose.d.ts.map +1 -0
- package/dist/envelope/compose.js +237 -0
- package/dist/envelope/compose.js.map +1 -0
- package/dist/envelope/encode.d.ts +41 -0
- package/dist/envelope/encode.d.ts.map +1 -0
- package/dist/envelope/encode.js +69 -0
- package/dist/envelope/encode.js.map +1 -0
- package/dist/envelope/index.d.ts +20 -0
- package/dist/envelope/index.d.ts.map +1 -0
- package/dist/envelope/index.js +20 -0
- package/dist/envelope/index.js.map +1 -0
- package/dist/envelope/open_any.d.ts +48 -0
- package/dist/envelope/open_any.d.ts.map +1 -0
- package/dist/envelope/open_any.js +81 -0
- package/dist/envelope/open_any.js.map +1 -0
- package/dist/envelope/open_verified.d.ts +59 -0
- package/dist/envelope/open_verified.d.ts.map +1 -0
- package/dist/envelope/open_verified.js +67 -0
- package/dist/envelope/open_verified.js.map +1 -0
- package/dist/envelope/padding.d.ts +55 -0
- package/dist/envelope/padding.d.ts.map +1 -0
- package/dist/envelope/padding.js +162 -0
- package/dist/envelope/padding.js.map +1 -0
- package/dist/envelope/rejection.d.ts +22 -0
- package/dist/envelope/rejection.d.ts.map +1 -0
- package/dist/envelope/rejection.js +30 -0
- package/dist/envelope/rejection.js.map +1 -0
- package/dist/envelope/sendtime.d.ts +49 -0
- package/dist/envelope/sendtime.d.ts.map +1 -0
- package/dist/envelope/sendtime.js +87 -0
- package/dist/envelope/sendtime.js.map +1 -0
- package/dist/envelope/verify.d.ts +29 -0
- package/dist/envelope/verify.d.ts.map +1 -0
- package/dist/envelope/verify.js +90 -0
- package/dist/envelope/verify.js.map +1 -0
- package/dist/extensions/index.d.ts +7 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +7 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/limits.d.ts +101 -0
- package/dist/extensions/limits.d.ts.map +1 -0
- package/dist/extensions/limits.js +175 -0
- package/dist/extensions/limits.js.map +1 -0
- package/dist/handshake/abort.d.ts +49 -0
- package/dist/handshake/abort.d.ts.map +1 -0
- package/dist/handshake/abort.js +82 -0
- package/dist/handshake/abort.js.map +1 -0
- package/dist/handshake/capabilities.d.ts +46 -0
- package/dist/handshake/capabilities.d.ts.map +1 -0
- package/dist/handshake/capabilities.js +114 -0
- package/dist/handshake/capabilities.js.map +1 -0
- package/dist/handshake/client_state.d.ts +186 -0
- package/dist/handshake/client_state.d.ts.map +1 -0
- package/dist/handshake/client_state.js +520 -0
- package/dist/handshake/client_state.js.map +1 -0
- package/dist/handshake/confirm.d.ts +21 -0
- package/dist/handshake/confirm.d.ts.map +1 -0
- package/dist/handshake/confirm.js +27 -0
- package/dist/handshake/confirm.js.map +1 -0
- package/dist/handshake/driver.d.ts +126 -0
- package/dist/handshake/driver.d.ts.map +1 -0
- package/dist/handshake/driver.js +251 -0
- package/dist/handshake/driver.js.map +1 -0
- package/dist/handshake/federation.d.ts +365 -0
- package/dist/handshake/federation.d.ts.map +1 -0
- package/dist/handshake/federation.js +664 -0
- package/dist/handshake/federation.js.map +1 -0
- package/dist/handshake/first_contact.d.ts +57 -0
- package/dist/handshake/first_contact.d.ts.map +1 -0
- package/dist/handshake/first_contact.js +124 -0
- package/dist/handshake/first_contact.js.map +1 -0
- package/dist/handshake/identity.d.ts +101 -0
- package/dist/handshake/identity.d.ts.map +1 -0
- package/dist/handshake/identity.js +117 -0
- package/dist/handshake/identity.js.map +1 -0
- package/dist/handshake/index.d.ts +21 -0
- package/dist/handshake/index.d.ts.map +1 -0
- package/dist/handshake/index.js +21 -0
- package/dist/handshake/index.js.map +1 -0
- package/dist/handshake/messages.d.ts +176 -0
- package/dist/handshake/messages.d.ts.map +1 -0
- package/dist/handshake/messages.js +125 -0
- package/dist/handshake/messages.js.map +1 -0
- package/dist/handshake/pow.d.ts +53 -0
- package/dist/handshake/pow.d.ts.map +1 -0
- package/dist/handshake/pow.js +142 -0
- package/dist/handshake/pow.js.map +1 -0
- package/dist/handshake/resume_driver.d.ts +56 -0
- package/dist/handshake/resume_driver.d.ts.map +1 -0
- package/dist/handshake/resume_driver.js +75 -0
- package/dist/handshake/resume_driver.js.map +1 -0
- package/dist/handshake/server.d.ts +112 -0
- package/dist/handshake/server.d.ts.map +1 -0
- package/dist/handshake/server.js +247 -0
- package/dist/handshake/server.js.map +1 -0
- package/dist/handshake/server_state.d.ts +102 -0
- package/dist/handshake/server_state.d.ts.map +1 -0
- package/dist/handshake/server_state.js +278 -0
- package/dist/handshake/server_state.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/keys/compromise.d.ts +118 -0
- package/dist/keys/compromise.d.ts.map +1 -0
- package/dist/keys/compromise.js +218 -0
- package/dist/keys/compromise.js.map +1 -0
- package/dist/keys/device_certificate.d.ts +166 -0
- package/dist/keys/device_certificate.d.ts.map +1 -0
- package/dist/keys/device_certificate.js +328 -0
- package/dist/keys/device_certificate.js.map +1 -0
- package/dist/keys/device_records.d.ts +175 -0
- package/dist/keys/device_records.d.ts.map +1 -0
- package/dist/keys/device_records.js +418 -0
- package/dist/keys/device_records.js.map +1 -0
- package/dist/keys/directory_cache.d.ts +64 -0
- package/dist/keys/directory_cache.d.ts.map +1 -0
- package/dist/keys/directory_cache.js +98 -0
- package/dist/keys/directory_cache.js.map +1 -0
- package/dist/keys/directory_state.d.ts +79 -0
- package/dist/keys/directory_state.d.ts.map +1 -0
- package/dist/keys/directory_state.js +155 -0
- package/dist/keys/directory_state.js.map +1 -0
- package/dist/keys/index.d.ts +18 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +18 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/keys/key_revocation.d.ts +61 -0
- package/dist/keys/key_revocation.d.ts.map +1 -0
- package/dist/keys/key_revocation.js +88 -0
- package/dist/keys/key_revocation.js.map +1 -0
- package/dist/keys/request.d.ts +124 -0
- package/dist/keys/request.d.ts.map +1 -0
- package/dist/keys/request.js +130 -0
- package/dist/keys/request.js.map +1 -0
- package/dist/keys/sign.d.ts +49 -0
- package/dist/keys/sign.d.ts.map +1 -0
- package/dist/keys/sign.js +80 -0
- package/dist/keys/sign.js.map +1 -0
- package/dist/keys/signed.d.ts +80 -0
- package/dist/keys/signed.d.ts.map +1 -0
- package/dist/keys/signed.js +138 -0
- package/dist/keys/signed.js.map +1 -0
- package/dist/keys/store.d.ts +138 -0
- package/dist/keys/store.d.ts.map +1 -0
- package/dist/keys/store.js +107 -0
- package/dist/keys/store.js.map +1 -0
- package/dist/largeattachment/crypto.d.ts +47 -0
- package/dist/largeattachment/crypto.d.ts.map +1 -0
- package/dist/largeattachment/crypto.js +235 -0
- package/dist/largeattachment/crypto.js.map +1 -0
- package/dist/largeattachment/enclosure.d.ts +48 -0
- package/dist/largeattachment/enclosure.d.ts.map +1 -0
- package/dist/largeattachment/enclosure.js +102 -0
- package/dist/largeattachment/enclosure.js.map +1 -0
- package/dist/largeattachment/index.d.ts +15 -0
- package/dist/largeattachment/index.d.ts.map +1 -0
- package/dist/largeattachment/index.js +15 -0
- package/dist/largeattachment/index.js.map +1 -0
- package/dist/largeattachment/store.d.ts +36 -0
- package/dist/largeattachment/store.d.ts.map +1 -0
- package/dist/largeattachment/store.js +37 -0
- package/dist/largeattachment/store.js.map +1 -0
- package/dist/largeattachment/types.d.ts +56 -0
- package/dist/largeattachment/types.d.ts.map +1 -0
- package/dist/largeattachment/types.js +31 -0
- package/dist/largeattachment/types.js.map +1 -0
- package/dist/largeattachment/upload.d.ts +62 -0
- package/dist/largeattachment/upload.d.ts.map +1 -0
- package/dist/largeattachment/upload.js +166 -0
- package/dist/largeattachment/upload.js.map +1 -0
- package/dist/migration/index.d.ts +17 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +17 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/lockout.d.ts +48 -0
- package/dist/migration/lockout.d.ts.map +1 -0
- package/dist/migration/lockout.js +57 -0
- package/dist/migration/lockout.js.map +1 -0
- package/dist/migration/migration.d.ts +48 -0
- package/dist/migration/migration.d.ts.map +1 -0
- package/dist/migration/migration.js +58 -0
- package/dist/migration/migration.js.map +1 -0
- package/dist/migration/notice.d.ts +33 -0
- package/dist/migration/notice.d.ts.map +1 -0
- package/dist/migration/notice.js +85 -0
- package/dist/migration/notice.js.map +1 -0
- package/dist/migration/orchestrate.d.ts +109 -0
- package/dist/migration/orchestrate.d.ts.map +1 -0
- package/dist/migration/orchestrate.js +212 -0
- package/dist/migration/orchestrate.js.map +1 -0
- package/dist/migration/publication_store.d.ts +34 -0
- package/dist/migration/publication_store.d.ts.map +1 -0
- package/dist/migration/publication_store.js +44 -0
- package/dist/migration/publication_store.js.map +1 -0
- package/dist/migration/sign.d.ts +65 -0
- package/dist/migration/sign.d.ts.map +1 -0
- package/dist/migration/sign.js +331 -0
- package/dist/migration/sign.js.map +1 -0
- package/dist/migration/types.d.ts +92 -0
- package/dist/migration/types.d.ts.map +1 -0
- package/dist/migration/types.js +26 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/reasoncodes.d.ts +42 -0
- package/dist/reasoncodes.d.ts.map +1 -0
- package/dist/reasoncodes.js +80 -0
- package/dist/reasoncodes.js.map +1 -0
- package/dist/recovery/bundle.d.ts +34 -0
- package/dist/recovery/bundle.d.ts.map +1 -0
- package/dist/recovery/bundle.js +144 -0
- package/dist/recovery/bundle.js.map +1 -0
- package/dist/recovery/bundle_crypto.d.ts +60 -0
- package/dist/recovery/bundle_crypto.d.ts.map +1 -0
- package/dist/recovery/bundle_crypto.js +179 -0
- package/dist/recovery/bundle_crypto.js.map +1 -0
- package/dist/recovery/bundle_store.d.ts +57 -0
- package/dist/recovery/bundle_store.d.ts.map +1 -0
- package/dist/recovery/bundle_store.js +104 -0
- package/dist/recovery/bundle_store.js.map +1 -0
- package/dist/recovery/index.d.ts +19 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +19 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/recovery/manifest_crosscheck.d.ts +59 -0
- package/dist/recovery/manifest_crosscheck.d.ts.map +1 -0
- package/dist/recovery/manifest_crosscheck.js +59 -0
- package/dist/recovery/manifest_crosscheck.js.map +1 -0
- package/dist/recovery/shamir.d.ts +51 -0
- package/dist/recovery/shamir.d.ts.map +1 -0
- package/dist/recovery/shamir.js +181 -0
- package/dist/recovery/shamir.js.map +1 -0
- package/dist/recovery/sign.d.ts +61 -0
- package/dist/recovery/sign.d.ts.map +1 -0
- package/dist/recovery/sign.js +359 -0
- package/dist/recovery/sign.js.map +1 -0
- package/dist/recovery/types.d.ts +180 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/recovery/types.js +31 -0
- package/dist/recovery/types.js.map +1 -0
- package/dist/reputation/abuse_report.d.ts +62 -0
- package/dist/reputation/abuse_report.d.ts.map +1 -0
- package/dist/reputation/abuse_report.js +111 -0
- package/dist/reputation/abuse_report.js.map +1 -0
- package/dist/reputation/bucketize.d.ts +31 -0
- package/dist/reputation/bucketize.d.ts.map +1 -0
- package/dist/reputation/bucketize.js +77 -0
- package/dist/reputation/bucketize.js.map +1 -0
- package/dist/reputation/gossip.d.ts +24 -0
- package/dist/reputation/gossip.d.ts.map +1 -0
- package/dist/reputation/gossip.js +64 -0
- package/dist/reputation/gossip.js.map +1 -0
- package/dist/reputation/gossip_fetch.d.ts +64 -0
- package/dist/reputation/gossip_fetch.d.ts.map +1 -0
- package/dist/reputation/gossip_fetch.js +114 -0
- package/dist/reputation/gossip_fetch.js.map +1 -0
- package/dist/reputation/index.d.ts +20 -0
- package/dist/reputation/index.d.ts.map +1 -0
- package/dist/reputation/index.js +20 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/observation_store.d.ts +67 -0
- package/dist/reputation/observation_store.d.ts.map +1 -0
- package/dist/reputation/observation_store.js +171 -0
- package/dist/reputation/observation_store.js.map +1 -0
- package/dist/reputation/pow.d.ts +91 -0
- package/dist/reputation/pow.d.ts.map +1 -0
- package/dist/reputation/pow.js +209 -0
- package/dist/reputation/pow.js.map +1 -0
- package/dist/reputation/sign.d.ts +40 -0
- package/dist/reputation/sign.d.ts.map +1 -0
- package/dist/reputation/sign.js +202 -0
- package/dist/reputation/sign.js.map +1 -0
- package/dist/reputation/types.d.ts +133 -0
- package/dist/reputation/types.d.ts.map +1 -0
- package/dist/reputation/types.js +33 -0
- package/dist/reputation/types.js.map +1 -0
- package/dist/reputation/whois.d.ts +25 -0
- package/dist/reputation/whois.d.ts.map +1 -0
- package/dist/reputation/whois.js +20 -0
- package/dist/reputation/whois.js.map +1 -0
- package/dist/seal/index.d.ts +8 -0
- package/dist/seal/index.d.ts.map +1 -0
- package/dist/seal/index.js +8 -0
- package/dist/seal/index.js.map +1 -0
- package/dist/seal/wrap.d.ts +74 -0
- package/dist/seal/wrap.d.ts.map +1 -0
- package/dist/seal/wrap.js +213 -0
- package/dist/seal/wrap.js.map +1 -0
- package/dist/session/dispatcher.d.ts +65 -0
- package/dist/session/dispatcher.d.ts.map +1 -0
- package/dist/session/dispatcher.js +96 -0
- package/dist/session/dispatcher.js.map +1 -0
- package/dist/session/index.d.ts +15 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +15 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/rekey.d.ts +108 -0
- package/dist/session/rekey.d.ts.map +1 -0
- package/dist/session/rekey.js +207 -0
- package/dist/session/rekey.js.map +1 -0
- package/dist/session/rekey_seal.d.ts +66 -0
- package/dist/session/rekey_seal.d.ts.map +1 -0
- package/dist/session/rekey_seal.js +153 -0
- package/dist/session/rekey_seal.js.map +1 -0
- package/dist/session/resume.d.ts +125 -0
- package/dist/session/resume.d.ts.map +1 -0
- package/dist/session/resume.js +263 -0
- package/dist/session/resume.js.map +1 -0
- package/dist/session/session.d.ts +136 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +188 -0
- package/dist/session/session.js.map +1 -0
- package/dist/transparency/index.d.ts +13 -0
- package/dist/transparency/index.d.ts.map +1 -0
- package/dist/transparency/index.js +13 -0
- package/dist/transparency/index.js.map +1 -0
- package/dist/transparency/log.d.ts +61 -0
- package/dist/transparency/log.d.ts.map +1 -0
- package/dist/transparency/log.js +133 -0
- package/dist/transparency/log.js.map +1 -0
- package/dist/transparency/merkle.d.ts +59 -0
- package/dist/transparency/merkle.d.ts.map +1 -0
- package/dist/transparency/merkle.js +314 -0
- package/dist/transparency/merkle.js.map +1 -0
- package/dist/transparency/sign.d.ts +48 -0
- package/dist/transparency/sign.d.ts.map +1 -0
- package/dist/transparency/sign.js +140 -0
- package/dist/transparency/sign.js.map +1 -0
- package/dist/transparency/types.d.ts +97 -0
- package/dist/transparency/types.d.ts.map +1 -0
- package/dist/transparency/types.js +25 -0
- package/dist/transparency/types.js.map +1 -0
- package/dist/transport/h2.d.ts +163 -0
- package/dist/transport/h2.d.ts.map +1 -0
- package/dist/transport/h2.js +397 -0
- package/dist/transport/h2.js.map +1 -0
- package/dist/transport/index.d.ts +15 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +15 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/memory.d.ts +21 -0
- package/dist/transport/memory.d.ts.map +1 -0
- package/dist/transport/memory.js +112 -0
- package/dist/transport/memory.js.map +1 -0
- package/dist/transport/transport.d.ts +54 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +20 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/transport/ws.d.ts +40 -0
- package/dist/transport/ws.d.ts.map +1 -0
- package/dist/transport/ws.js +204 -0
- package/dist/transport/ws.js.map +1 -0
- package/package.json +147 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience compose for the full migration record per MIGRATION.md §3.
|
|
3
|
+
*
|
|
4
|
+
* Wraps {@link prepareSignatures} + the four `sign*` passes into a
|
|
5
|
+
* single deterministic composer. Production callers that need the
|
|
6
|
+
* cooperative submit / accept flow use
|
|
7
|
+
* {@link "./orchestrate".buildSubmission} +
|
|
8
|
+
* {@link "./orchestrate".acceptSubmission} instead.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { prepareSignatures, signNewDomain, signNewIdentity, signOldDomain, signOldIdentity, } from "./sign.js";
|
|
13
|
+
import { MigrationPrefix, MigrationRecordType, MigrationRecordVersion, } from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Compose a fully-signed migration record. The four (or three, in
|
|
16
|
+
* unilateral mode) signatures are applied in §3.3 chain order.
|
|
17
|
+
*/
|
|
18
|
+
export function composeMigrationRecord(input) {
|
|
19
|
+
const r = {
|
|
20
|
+
type: MigrationRecordType,
|
|
21
|
+
version: MigrationRecordVersion,
|
|
22
|
+
record_id: input.recordId,
|
|
23
|
+
old_address: input.oldAddress,
|
|
24
|
+
new_address: input.newAddress,
|
|
25
|
+
old_identity_key_id: input.oldIdentityKeyId,
|
|
26
|
+
new_identity_key_id: input.newIdentityKeyId,
|
|
27
|
+
new_identity_public_key: input.newIdentityPublicKey,
|
|
28
|
+
migrated_at: input.migratedAt,
|
|
29
|
+
forwarding_window_until: input.forwardingWindowUntil === undefined ||
|
|
30
|
+
input.forwardingWindowUntil === ""
|
|
31
|
+
? null
|
|
32
|
+
: input.forwardingWindowUntil,
|
|
33
|
+
mode: input.mode,
|
|
34
|
+
old_identity_signature: { algorithm: "", key_id: "", value: "" },
|
|
35
|
+
new_identity_signature: { algorithm: "", key_id: "", value: "" },
|
|
36
|
+
new_domain_signature: { algorithm: "", key_id: "", value: "" },
|
|
37
|
+
old_domain_signature: null,
|
|
38
|
+
};
|
|
39
|
+
if (input.extensions !== undefined) {
|
|
40
|
+
r.extensions = input.extensions;
|
|
41
|
+
}
|
|
42
|
+
prepareSignatures(r, input.oldIdentityKeyId, input.newIdentityKeyId, input.newDomainKeyId, input.oldDomainKeyId);
|
|
43
|
+
signOldIdentity(r, input.oldIdentitySeed, input.oldIdentityKeyId);
|
|
44
|
+
signNewIdentity(r, input.newIdentitySeed, input.newIdentityKeyId);
|
|
45
|
+
signNewDomain(r, input.newDomainSeed, input.newDomainKeyId);
|
|
46
|
+
if (input.mode === "cooperative") {
|
|
47
|
+
if (input.oldDomainSeed === undefined ||
|
|
48
|
+
input.oldDomainKeyId === undefined ||
|
|
49
|
+
input.oldDomainKeyId === "") {
|
|
50
|
+
throw new Error("migration: cooperative mode requires oldDomainSeed + oldDomainKeyId");
|
|
51
|
+
}
|
|
52
|
+
signOldDomain(r, input.oldDomainSeed, input.oldDomainKeyId);
|
|
53
|
+
}
|
|
54
|
+
return r;
|
|
55
|
+
}
|
|
56
|
+
// Re-export so old import paths keep working.
|
|
57
|
+
export { MigrationPrefix };
|
|
58
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/migration/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAGL,eAAe,EACf,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAqCpB;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAA4B;IAE5B,MAAM,CAAC,GAAoB;QACzB,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,sBAAsB;QAC/B,SAAS,EAAE,KAAK,CAAC,QAAQ;QACzB,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,mBAAmB,EAAE,KAAK,CAAC,gBAAgB;QAC3C,mBAAmB,EAAE,KAAK,CAAC,gBAAgB;QAC3C,uBAAuB,EAAE,KAAK,CAAC,oBAAoB;QACnD,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,uBAAuB,EACrB,KAAK,CAAC,qBAAqB,KAAK,SAAS;YACzC,KAAK,CAAC,qBAAqB,KAAK,EAAE;YAChC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC,qBAAqB;QACjC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,sBAAsB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAChE,sBAAsB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAChE,oBAAoB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9D,oBAAoB,EAAE,IAAI;KAC3B,CAAC;IACF,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAClC,CAAC;IACD,iBAAiB,CACf,CAAC,EACD,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,cAAc,CACrB,CAAC;IACF,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAClE,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAClE,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjC,IACE,KAAK,CAAC,aAAa,KAAK,SAAS;YACjC,KAAK,CAAC,cAAc,KAAK,SAAS;YAClC,KAAK,CAAC,cAAc,KAAK,EAAE,EAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8CAA8C;AAC9C,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration notice messages per MIGRATION.md §4.
|
|
3
|
+
*
|
|
4
|
+
* A `SEMP_MIGRATION_NOTICE` is what a server returns to a sender
|
|
5
|
+
* that attempted to deliver to a migrated address. It carries a
|
|
6
|
+
* pointer to the published migration record (URL + record_id) so
|
|
7
|
+
* the sender's stack can fetch and verify it before redirecting.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { type MigrationNotice, type MigrationNoticeRejection, type MigrationRecord } from "./types.js";
|
|
12
|
+
/** Inputs to {@link buildMigrationNotice}. */
|
|
13
|
+
export interface BuildMigrationNoticeInput {
|
|
14
|
+
record: MigrationRecord;
|
|
15
|
+
/** URL pattern with `{record_id}` placeholder, e.g. `https://old.example/migration/{record_id}`. */
|
|
16
|
+
recordUrlPattern: string;
|
|
17
|
+
/** Optional pre-assigned notice id; auto-generated when omitted. */
|
|
18
|
+
noticeId?: string;
|
|
19
|
+
/** Wall-clock; defaults to `() => new Date()`. */
|
|
20
|
+
nowFn?: () => Date;
|
|
21
|
+
/** Random source for ULID generation. */
|
|
22
|
+
rand?: (n: number) => Uint8Array;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build a {@link MigrationNotice} that points at the published
|
|
26
|
+
* `record`. The notice is unsigned — the recipient sender verifies
|
|
27
|
+
* the underlying record by fetching `record_url` and running
|
|
28
|
+
* `verifyMigrationRecord`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildMigrationNotice(input: BuildMigrationNoticeInput): MigrationNotice;
|
|
31
|
+
/** Construct a rejection wrapper to refuse honoring a notice. */
|
|
32
|
+
export declare function newMigrationNoticeRejection(notice: MigrationNotice, reason: string): MigrationNoticeRejection;
|
|
33
|
+
//# sourceMappingURL=notice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notice.d.ts","sourceRoot":"","sources":["../../src/migration/notice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EAGrB,MAAM,YAAY,CAAC;AAEpB,8CAA8C;AAC9C,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,eAAe,CAAC;IACxB,oGAAoG;IACpG,gBAAgB,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,yBAAyB,GAC/B,eAAe,CAuBjB;AAED,iEAAiE;AACjE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,wBAAwB,CAE1B"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration notice messages per MIGRATION.md §4.
|
|
3
|
+
*
|
|
4
|
+
* A `SEMP_MIGRATION_NOTICE` is what a server returns to a sender
|
|
5
|
+
* that attempted to deliver to a migrated address. It carries a
|
|
6
|
+
* pointer to the published migration record (URL + record_id) so
|
|
7
|
+
* the sender's stack can fetch and verify it before redirecting.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { MigrationNoticeType, MigrationRecordVersion, } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Build a {@link MigrationNotice} that points at the published
|
|
14
|
+
* `record`. The notice is unsigned — the recipient sender verifies
|
|
15
|
+
* the underlying record by fetching `record_url` and running
|
|
16
|
+
* `verifyMigrationRecord`.
|
|
17
|
+
*/
|
|
18
|
+
export function buildMigrationNotice(input) {
|
|
19
|
+
if (input.recordUrlPattern === "" || !input.recordUrlPattern.includes("{record_id}")) {
|
|
20
|
+
throw new Error("migration: recordUrlPattern must include {record_id} placeholder");
|
|
21
|
+
}
|
|
22
|
+
const recordUrl = input.recordUrlPattern.replace("{record_id}", encodeURIComponent(input.record.record_id));
|
|
23
|
+
const noticeId = input.noticeId ?? newULID(input.rand);
|
|
24
|
+
const nowFn = input.nowFn ?? (() => new Date());
|
|
25
|
+
return {
|
|
26
|
+
type: MigrationNoticeType,
|
|
27
|
+
version: MigrationRecordVersion,
|
|
28
|
+
notice_id: noticeId,
|
|
29
|
+
record_id: input.record.record_id,
|
|
30
|
+
record_url: recordUrl,
|
|
31
|
+
old_address: input.record.old_address,
|
|
32
|
+
new_address: input.record.new_address,
|
|
33
|
+
mode: input.record.mode,
|
|
34
|
+
issued_at: isoSecond(nowFn()),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Construct a rejection wrapper to refuse honoring a notice. */
|
|
38
|
+
export function newMigrationNoticeRejection(notice, reason) {
|
|
39
|
+
return { notice, reason };
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Helpers (inlined ULID minter — same as elsewhere in the codebase)
|
|
43
|
+
const ULID_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
44
|
+
function newULID(rand) {
|
|
45
|
+
const r = rand ?? defaultRand;
|
|
46
|
+
const bits = new Uint8Array(16);
|
|
47
|
+
const ms = BigInt(Date.now());
|
|
48
|
+
bits[0] = Number((ms >> 40n) & 0xffn);
|
|
49
|
+
bits[1] = Number((ms >> 32n) & 0xffn);
|
|
50
|
+
bits[2] = Number((ms >> 24n) & 0xffn);
|
|
51
|
+
bits[3] = Number((ms >> 16n) & 0xffn);
|
|
52
|
+
bits[4] = Number((ms >> 8n) & 0xffn);
|
|
53
|
+
bits[5] = Number(ms & 0xffn);
|
|
54
|
+
const random = r(10);
|
|
55
|
+
for (let i = 0; i < 10; i++) {
|
|
56
|
+
bits[6 + i] = random[i] ?? 0;
|
|
57
|
+
}
|
|
58
|
+
let u = 0n;
|
|
59
|
+
for (let i = 0; i < 8; i++) {
|
|
60
|
+
u = (u << 8n) | BigInt(bits[i] ?? 0);
|
|
61
|
+
}
|
|
62
|
+
let u2 = 0n;
|
|
63
|
+
for (let i = 8; i < 16; i++) {
|
|
64
|
+
u2 = (u2 << 8n) | BigInt(bits[i] ?? 0);
|
|
65
|
+
}
|
|
66
|
+
const out = new Array(26);
|
|
67
|
+
for (let i = 25; i >= 13; i--) {
|
|
68
|
+
out[i] = ULID_ALPHABET[Number(u2 & 31n)] ?? "0";
|
|
69
|
+
u2 >>= 5n;
|
|
70
|
+
}
|
|
71
|
+
for (let i = 12; i >= 0; i--) {
|
|
72
|
+
out[i] = ULID_ALPHABET[Number(u & 31n)] ?? "0";
|
|
73
|
+
u >>= 5n;
|
|
74
|
+
}
|
|
75
|
+
return out.join("");
|
|
76
|
+
}
|
|
77
|
+
function defaultRand(n) {
|
|
78
|
+
const out = new Uint8Array(n);
|
|
79
|
+
globalThis.crypto.getRandomValues(out);
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
function isoSecond(d) {
|
|
83
|
+
return d.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=notice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notice.js","sourceRoot":"","sources":["../../src/migration/notice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration submission + acceptance orchestration per MIGRATION.md
|
|
3
|
+
* §4.1.
|
|
4
|
+
*
|
|
5
|
+
* The new provider builds a 3-signature submission record and POSTs
|
|
6
|
+
* it to the old provider's migration endpoint. The old provider
|
|
7
|
+
* verifies the three submitted signatures, applies its forwarding
|
|
8
|
+
* policy, registers the §6 lockout, countersigns, persists, and
|
|
9
|
+
* returns the final 4-signature record.
|
|
10
|
+
*
|
|
11
|
+
* Unilateral mode skips the countersign step — the new provider's
|
|
12
|
+
* 3-signature record is the final published form.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
import { type LockoutRegistry } from "./lockout.js";
|
|
17
|
+
import { type PublicationStore } from "./publication_store.js";
|
|
18
|
+
import { type MigrationMode, type MigrationRecord } from "./types.js";
|
|
19
|
+
/** Inputs to {@link buildSubmission}. */
|
|
20
|
+
export interface BuildSubmissionInput {
|
|
21
|
+
oldAddress: string;
|
|
22
|
+
newAddress: string;
|
|
23
|
+
oldIdentityKeyId: string;
|
|
24
|
+
newIdentityKeyId: string;
|
|
25
|
+
/** Base64-encoded new identity public key (advertised in the record body). */
|
|
26
|
+
newIdentityPublicKey: string;
|
|
27
|
+
oldIdentityPriv: Uint8Array;
|
|
28
|
+
newIdentityPriv: Uint8Array;
|
|
29
|
+
newDomainKeyId: string;
|
|
30
|
+
newDomainPriv: Uint8Array;
|
|
31
|
+
/** Old provider's domain signing fingerprint (cooperative only). */
|
|
32
|
+
oldDomainKeyId?: string;
|
|
33
|
+
mode: MigrationMode;
|
|
34
|
+
/** Forwarding window in milliseconds. Cooperative mode only. */
|
|
35
|
+
forwardingWindowMs?: number;
|
|
36
|
+
/** ISO 8601 UTC. */
|
|
37
|
+
migratedAt: string;
|
|
38
|
+
/** Optional pre-assigned record_id; auto-generated when omitted. */
|
|
39
|
+
recordId?: string;
|
|
40
|
+
/** Random source for record id minting. */
|
|
41
|
+
rand?: (n: number) => Uint8Array;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Construct and apply the new-provider signatures (passes 1–3). In
|
|
45
|
+
* cooperative mode the returned record's `old_domain_signature`
|
|
46
|
+
* slot is prepared but empty — the new provider POSTs the record
|
|
47
|
+
* to the old provider, who runs {@link acceptSubmission} to verify
|
|
48
|
+
* and countersign.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildSubmission(input: BuildSubmissionInput): MigrationRecord;
|
|
51
|
+
/** Inputs to {@link acceptSubmission}. */
|
|
52
|
+
export interface AcceptSubmissionInput {
|
|
53
|
+
/** 3-signature record submitted by the new provider. */
|
|
54
|
+
record: MigrationRecord;
|
|
55
|
+
/** Old identity public key resolved from the old provider's prior key state. */
|
|
56
|
+
oldIdentityPub: Uint8Array;
|
|
57
|
+
/** New provider's current domain signing key (resolved via discovery). */
|
|
58
|
+
newDomainPub: Uint8Array;
|
|
59
|
+
/** Old provider's domain signing private key. */
|
|
60
|
+
oldDomainPriv: Uint8Array;
|
|
61
|
+
oldDomainKeyId: string;
|
|
62
|
+
/** Wall-clock; used for migrated_at clock-skew validation. */
|
|
63
|
+
now: Date;
|
|
64
|
+
/** Old identity key's `created` timestamp (for §3.4 lower bound check). */
|
|
65
|
+
oldIdentityCreated?: Date | null;
|
|
66
|
+
/** Optional clock-skew tolerance. Defaults to 5 minutes. */
|
|
67
|
+
clockSkewMs?: number;
|
|
68
|
+
/**
|
|
69
|
+
* Optional forwarding-policy hook. Called BEFORE countersigning.
|
|
70
|
+
* Throw to refuse the submission with a structured reason.
|
|
71
|
+
*/
|
|
72
|
+
forwardingPolicy?: (r: MigrationRecord) => Promise<void> | void;
|
|
73
|
+
/** Optional persistence layer. */
|
|
74
|
+
store?: PublicationStore;
|
|
75
|
+
/** Optional lockout registry. */
|
|
76
|
+
lockout?: LockoutRegistry;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Old-provider side of cooperative migration: verify the 3
|
|
80
|
+
* submitted signatures, apply optional forwarding policy, register
|
|
81
|
+
* the §6 lockout, countersign with `old_domain_priv`, persist via
|
|
82
|
+
* the store, and return the 4-sig record.
|
|
83
|
+
*
|
|
84
|
+
* In unilateral mode this throws — there is no countersignature
|
|
85
|
+
* step in the unilateral flow.
|
|
86
|
+
*/
|
|
87
|
+
export declare function acceptSubmission(input: AcceptSubmissionInput): Promise<MigrationRecord>;
|
|
88
|
+
/**
|
|
89
|
+
* Per-hook signature for {@link applyThirdPartyPolicy}. A hook
|
|
90
|
+
* receives the published record and returns either nothing
|
|
91
|
+
* (success) or throws with a reason string (the third-party
|
|
92
|
+
* verifier rejects).
|
|
93
|
+
*/
|
|
94
|
+
export type ThirdPartyHook = (record: MigrationRecord) => Promise<void> | void;
|
|
95
|
+
/** Group of policy hooks third parties apply when verifying a published record. */
|
|
96
|
+
export interface ThirdPartyPolicy {
|
|
97
|
+
/** Verify the four-signature chain. */
|
|
98
|
+
verifyChain?: ThirdPartyHook;
|
|
99
|
+
/** Operator-defined acceptability policy (domain reputation, etc.). */
|
|
100
|
+
acceptability?: ThirdPartyHook;
|
|
101
|
+
/** Cross-check the record against transparency-log inclusion. */
|
|
102
|
+
transparency?: ThirdPartyHook;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Run every non-nil hook in `policy`. Aggregates errors so the
|
|
106
|
+
* caller sees every reason at once.
|
|
107
|
+
*/
|
|
108
|
+
export declare function applyThirdPartyPolicy(record: MigrationRecord, policy: ThirdPartyPolicy): Promise<void>;
|
|
109
|
+
//# sourceMappingURL=orchestrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.d.ts","sourceRoot":"","sources":["../../src/migration/orchestrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAWhC,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EAKrB,MAAM,YAAY,CAAC;AAEpB,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,oBAAoB,EAAE,MAAM,CAAC;IAE7B,eAAe,EAAE,UAAU,CAAC;IAC5B,eAAe,EAAE,UAAU,CAAC;IAE5B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,UAAU,CAAC;IAE1B,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,IAAI,EAAE,aAAa,CAAC;IAEpB,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;IAEnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,oBAAoB,GAC1B,eAAe,CAgFjB;AAED,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,MAAM,EAAE,eAAe,CAAC;IAExB,gFAAgF;IAChF,cAAc,EAAE,UAAU,CAAC;IAE3B,0EAA0E;IAC1E,YAAY,EAAE,UAAU,CAAC;IAEzB,iDAAiD;IACjD,aAAa,EAAE,UAAU,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,GAAG,EAAE,IAAI,CAAC;IAEV,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAEjC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEhE,kCAAkC;IAClC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAEzB,iCAAiC;IACjC,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAsD1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE/E,mFAAmF;AACnF,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,uEAAuE;IACvE,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,iEAAiE;IACjE,YAAY,CAAC,EAAE,cAAc,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration submission + acceptance orchestration per MIGRATION.md
|
|
3
|
+
* §4.1.
|
|
4
|
+
*
|
|
5
|
+
* The new provider builds a 3-signature submission record and POSTs
|
|
6
|
+
* it to the old provider's migration endpoint. The old provider
|
|
7
|
+
* verifies the three submitted signatures, applies its forwarding
|
|
8
|
+
* policy, registers the §6 lockout, countersigns, persists, and
|
|
9
|
+
* returns the final 4-signature record.
|
|
10
|
+
*
|
|
11
|
+
* Unilateral mode skips the countersign step — the new provider's
|
|
12
|
+
* 3-signature record is the final published form.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
import {} from "./lockout.js";
|
|
17
|
+
import {} from "./publication_store.js";
|
|
18
|
+
import { checkMigratedAtBound, prepareSignatures, signNewDomain, signNewIdentity, signOldDomain, signOldIdentity, validateMigrationRecord, verifyMigrationPass, } from "./sign.js";
|
|
19
|
+
import { MaxForwardingWindowMs, MigrationRecordType, MigrationRecordVersion, MinForwardingWindowMs, } from "./types.js";
|
|
20
|
+
/**
|
|
21
|
+
* Construct and apply the new-provider signatures (passes 1–3). In
|
|
22
|
+
* cooperative mode the returned record's `old_domain_signature`
|
|
23
|
+
* slot is prepared but empty — the new provider POSTs the record
|
|
24
|
+
* to the old provider, who runs {@link acceptSubmission} to verify
|
|
25
|
+
* and countersign.
|
|
26
|
+
*/
|
|
27
|
+
export function buildSubmission(input) {
|
|
28
|
+
if (input.oldAddress === "" || input.newAddress === "") {
|
|
29
|
+
throw new Error("migration: old_address and new_address are required");
|
|
30
|
+
}
|
|
31
|
+
if (input.oldIdentityKeyId === "" || input.newIdentityKeyId === "") {
|
|
32
|
+
throw new Error("migration: old_identity_key_id and new_identity_key_id are required");
|
|
33
|
+
}
|
|
34
|
+
if (input.newIdentityPublicKey === "") {
|
|
35
|
+
throw new Error("migration: new_identity_public_key is required");
|
|
36
|
+
}
|
|
37
|
+
if (input.newDomainKeyId === "") {
|
|
38
|
+
throw new Error("migration: new_domain_key_id is required");
|
|
39
|
+
}
|
|
40
|
+
if (input.migratedAt === "") {
|
|
41
|
+
throw new Error("migration: migrated_at is required");
|
|
42
|
+
}
|
|
43
|
+
if (input.mode !== "cooperative" && input.mode !== "unilateral") {
|
|
44
|
+
throw new Error(`migration: unknown mode ${JSON.stringify(input.mode)}`);
|
|
45
|
+
}
|
|
46
|
+
let forwardingUntil = null;
|
|
47
|
+
if (input.mode === "cooperative") {
|
|
48
|
+
const windowMs = input.forwardingWindowMs ?? 0;
|
|
49
|
+
if (windowMs < MinForwardingWindowMs) {
|
|
50
|
+
throw new Error(`migration: forwarding window ${windowMs} below minimum ${MinForwardingWindowMs}`);
|
|
51
|
+
}
|
|
52
|
+
if (windowMs > MaxForwardingWindowMs) {
|
|
53
|
+
throw new Error(`migration: forwarding window ${windowMs} exceeds maximum ${MaxForwardingWindowMs}`);
|
|
54
|
+
}
|
|
55
|
+
if (input.oldDomainKeyId === undefined || input.oldDomainKeyId === "") {
|
|
56
|
+
throw new Error("migration: cooperative mode requires oldDomainKeyId (looked up from the old provider's discovery configuration)");
|
|
57
|
+
}
|
|
58
|
+
const migratedMs = Date.parse(input.migratedAt);
|
|
59
|
+
if (Number.isNaN(migratedMs)) {
|
|
60
|
+
throw new Error("migration: migrated_at is not ISO 8601");
|
|
61
|
+
}
|
|
62
|
+
forwardingUntil = new Date(migratedMs + windowMs).toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
63
|
+
}
|
|
64
|
+
const recordId = input.recordId ?? newRecordID(input.rand);
|
|
65
|
+
const record = {
|
|
66
|
+
type: MigrationRecordType,
|
|
67
|
+
version: MigrationRecordVersion,
|
|
68
|
+
record_id: recordId,
|
|
69
|
+
old_address: input.oldAddress,
|
|
70
|
+
new_address: input.newAddress,
|
|
71
|
+
old_identity_key_id: input.oldIdentityKeyId,
|
|
72
|
+
new_identity_key_id: input.newIdentityKeyId,
|
|
73
|
+
new_identity_public_key: input.newIdentityPublicKey,
|
|
74
|
+
migrated_at: input.migratedAt,
|
|
75
|
+
forwarding_window_until: forwardingUntil,
|
|
76
|
+
mode: input.mode,
|
|
77
|
+
old_identity_signature: { algorithm: "", key_id: "", value: "" },
|
|
78
|
+
new_identity_signature: { algorithm: "", key_id: "", value: "" },
|
|
79
|
+
new_domain_signature: { algorithm: "", key_id: "", value: "" },
|
|
80
|
+
old_domain_signature: null,
|
|
81
|
+
};
|
|
82
|
+
prepareSignatures(record, input.oldIdentityKeyId, input.newIdentityKeyId, input.newDomainKeyId, input.oldDomainKeyId);
|
|
83
|
+
signOldIdentity(record, input.oldIdentityPriv, input.oldIdentityKeyId);
|
|
84
|
+
signNewIdentity(record, input.newIdentityPriv, input.newIdentityKeyId);
|
|
85
|
+
signNewDomain(record, input.newDomainPriv, input.newDomainKeyId);
|
|
86
|
+
return record;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Old-provider side of cooperative migration: verify the 3
|
|
90
|
+
* submitted signatures, apply optional forwarding policy, register
|
|
91
|
+
* the §6 lockout, countersign with `old_domain_priv`, persist via
|
|
92
|
+
* the store, and return the 4-sig record.
|
|
93
|
+
*
|
|
94
|
+
* In unilateral mode this throws — there is no countersignature
|
|
95
|
+
* step in the unilateral flow.
|
|
96
|
+
*/
|
|
97
|
+
export async function acceptSubmission(input) {
|
|
98
|
+
const r = input.record;
|
|
99
|
+
if (r.mode !== "cooperative") {
|
|
100
|
+
throw new Error(`migration: acceptSubmission only valid for mode=cooperative (got ${JSON.stringify(r.mode)})`);
|
|
101
|
+
}
|
|
102
|
+
validateMigrationRecord(r);
|
|
103
|
+
// Verify the three submitted signatures (the §3.3 chain is not
|
|
104
|
+
// yet complete — the old domain signature has not been added —
|
|
105
|
+
// so verify each prior pass individually rather than calling the
|
|
106
|
+
// full verifyMigrationRecord.)
|
|
107
|
+
const newIdentityPub = base64Decode(r.new_identity_public_key);
|
|
108
|
+
if (!verifyMigrationPass(r, 0, input.oldIdentityPub)) {
|
|
109
|
+
throw new Error("migration: old_identity_signature verification failed");
|
|
110
|
+
}
|
|
111
|
+
if (!verifyMigrationPass(r, 1, newIdentityPub)) {
|
|
112
|
+
throw new Error("migration: new_identity_signature verification failed");
|
|
113
|
+
}
|
|
114
|
+
if (!verifyMigrationPass(r, 2, input.newDomainPub)) {
|
|
115
|
+
throw new Error("migration: new_domain_signature verification failed");
|
|
116
|
+
}
|
|
117
|
+
// §3.3 migrated_at bound.
|
|
118
|
+
checkMigratedAtBound(r, input.oldIdentityCreated ?? null, input.now, input.clockSkewMs);
|
|
119
|
+
// Optional forwarding-policy hook.
|
|
120
|
+
if (input.forwardingPolicy !== undefined) {
|
|
121
|
+
await input.forwardingPolicy(r);
|
|
122
|
+
}
|
|
123
|
+
// Register lockout for the duration of the forwarding window.
|
|
124
|
+
if (input.lockout !== undefined && r.forwarding_window_until !== null) {
|
|
125
|
+
const untilMs = Date.parse(r.forwarding_window_until);
|
|
126
|
+
if (!Number.isNaN(untilMs)) {
|
|
127
|
+
const localpart = r.old_address.includes("@")
|
|
128
|
+
? r.old_address.split("@")[0] ?? r.old_address
|
|
129
|
+
: r.old_address;
|
|
130
|
+
await input.lockout.reserve(localpart, new Date(untilMs), r.record_id);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
signOldDomain(r, input.oldDomainPriv, input.oldDomainKeyId);
|
|
134
|
+
if (input.store !== undefined) {
|
|
135
|
+
await input.store.putRecord(r);
|
|
136
|
+
}
|
|
137
|
+
return r;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Run every non-nil hook in `policy`. Aggregates errors so the
|
|
141
|
+
* caller sees every reason at once.
|
|
142
|
+
*/
|
|
143
|
+
export async function applyThirdPartyPolicy(record, policy) {
|
|
144
|
+
const errors = [];
|
|
145
|
+
for (const hook of [policy.verifyChain, policy.acceptability, policy.transparency]) {
|
|
146
|
+
if (hook === undefined) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
await hook(record);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (errors.length > 0) {
|
|
157
|
+
throw new Error(`migration: third-party policy: ${errors.join("; ")}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Helpers (inline ULID minter — same shape as elsewhere)
|
|
162
|
+
const ULID_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
163
|
+
function newRecordID(rand) {
|
|
164
|
+
const r = rand ?? defaultRand;
|
|
165
|
+
const bits = new Uint8Array(16);
|
|
166
|
+
const ms = BigInt(Date.now());
|
|
167
|
+
bits[0] = Number((ms >> 40n) & 0xffn);
|
|
168
|
+
bits[1] = Number((ms >> 32n) & 0xffn);
|
|
169
|
+
bits[2] = Number((ms >> 24n) & 0xffn);
|
|
170
|
+
bits[3] = Number((ms >> 16n) & 0xffn);
|
|
171
|
+
bits[4] = Number((ms >> 8n) & 0xffn);
|
|
172
|
+
bits[5] = Number(ms & 0xffn);
|
|
173
|
+
const random = r(10);
|
|
174
|
+
for (let i = 0; i < 10; i++) {
|
|
175
|
+
bits[6 + i] = random[i] ?? 0;
|
|
176
|
+
}
|
|
177
|
+
let u = 0n;
|
|
178
|
+
for (let i = 0; i < 8; i++) {
|
|
179
|
+
u = (u << 8n) | BigInt(bits[i] ?? 0);
|
|
180
|
+
}
|
|
181
|
+
let u2 = 0n;
|
|
182
|
+
for (let i = 8; i < 16; i++) {
|
|
183
|
+
u2 = (u2 << 8n) | BigInt(bits[i] ?? 0);
|
|
184
|
+
}
|
|
185
|
+
const out = new Array(26);
|
|
186
|
+
for (let i = 25; i >= 13; i--) {
|
|
187
|
+
out[i] = ULID_ALPHABET[Number(u2 & 31n)] ?? "0";
|
|
188
|
+
u2 >>= 5n;
|
|
189
|
+
}
|
|
190
|
+
for (let i = 12; i >= 0; i--) {
|
|
191
|
+
out[i] = ULID_ALPHABET[Number(u & 31n)] ?? "0";
|
|
192
|
+
u >>= 5n;
|
|
193
|
+
}
|
|
194
|
+
return out.join("");
|
|
195
|
+
}
|
|
196
|
+
function defaultRand(n) {
|
|
197
|
+
const out = new Uint8Array(n);
|
|
198
|
+
globalThis.crypto.getRandomValues(out);
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
function base64Decode(s) {
|
|
202
|
+
if (typeof Buffer !== "undefined") {
|
|
203
|
+
return new Uint8Array(Buffer.from(s, "base64"));
|
|
204
|
+
}
|
|
205
|
+
const bin = atob(s);
|
|
206
|
+
const out = new Uint8Array(bin.length);
|
|
207
|
+
for (let i = 0; i < bin.length; i++) {
|
|
208
|
+
out[i] = bin.charCodeAt(i);
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=orchestrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/migration/orchestrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence interface for published migration records per
|
|
3
|
+
* MIGRATION.md §3.4 + §6.2.
|
|
4
|
+
*
|
|
5
|
+
* Even after the local-part is reassigned, the published migration
|
|
6
|
+
* record stays accessible as historical evidence. The store keys
|
|
7
|
+
* records by both `old_address` (for sender-side address lookups
|
|
8
|
+
* after a delivery failure) and by `record_id` (for direct fetches
|
|
9
|
+
* via `record_url`).
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import type { MigrationRecord } from "./types.js";
|
|
14
|
+
/** Persistence interface for migration records. */
|
|
15
|
+
export interface PublicationStore {
|
|
16
|
+
/** Persist `r`. Idempotent on repeated calls with the same record_id. */
|
|
17
|
+
putRecord(r: MigrationRecord): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Return the most recent published record for `oldAddress`, or
|
|
20
|
+
* null if none exists.
|
|
21
|
+
*/
|
|
22
|
+
getByOldAddress(oldAddress: string): Promise<MigrationRecord | null>;
|
|
23
|
+
/** Return the record with `recordId`, or null if not found. */
|
|
24
|
+
getByRecordId(recordId: string): Promise<MigrationRecord | null>;
|
|
25
|
+
}
|
|
26
|
+
/** Reference {@link PublicationStore}. Single-process only. */
|
|
27
|
+
export declare class InMemoryPublicationStore implements PublicationStore {
|
|
28
|
+
private readonly byRecordId;
|
|
29
|
+
private readonly byOldAddress;
|
|
30
|
+
putRecord(r: MigrationRecord): Promise<void>;
|
|
31
|
+
getByOldAddress(oldAddress: string): Promise<MigrationRecord | null>;
|
|
32
|
+
getByRecordId(recordId: string): Promise<MigrationRecord | null>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=publication_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication_store.d.ts","sourceRoot":"","sources":["../../src/migration/publication_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,SAAS,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAErE,+DAA+D;IAC/D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CAClE;AAED,+DAA+D;AAC/D,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IAE7D,SAAS,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAQpE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAOvE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence interface for published migration records per
|
|
3
|
+
* MIGRATION.md §3.4 + §6.2.
|
|
4
|
+
*
|
|
5
|
+
* Even after the local-part is reassigned, the published migration
|
|
6
|
+
* record stays accessible as historical evidence. The store keys
|
|
7
|
+
* records by both `old_address` (for sender-side address lookups
|
|
8
|
+
* after a delivery failure) and by `record_id` (for direct fetches
|
|
9
|
+
* via `record_url`).
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
/** Reference {@link PublicationStore}. Single-process only. */
|
|
14
|
+
export class InMemoryPublicationStore {
|
|
15
|
+
byRecordId = new Map();
|
|
16
|
+
byOldAddress = new Map();
|
|
17
|
+
async putRecord(r) {
|
|
18
|
+
if (r.record_id === "") {
|
|
19
|
+
throw new Error("migration: empty record_id");
|
|
20
|
+
}
|
|
21
|
+
if (r.old_address === "") {
|
|
22
|
+
throw new Error("migration: empty old_address");
|
|
23
|
+
}
|
|
24
|
+
const cp = JSON.parse(JSON.stringify(r));
|
|
25
|
+
this.byRecordId.set(r.record_id, cp);
|
|
26
|
+
// The most recent record for an address wins (later put overrides).
|
|
27
|
+
this.byOldAddress.set(r.old_address.toLowerCase(), cp);
|
|
28
|
+
}
|
|
29
|
+
async getByOldAddress(oldAddress) {
|
|
30
|
+
const r = this.byOldAddress.get(oldAddress.toLowerCase());
|
|
31
|
+
if (r === undefined) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return JSON.parse(JSON.stringify(r));
|
|
35
|
+
}
|
|
36
|
+
async getByRecordId(recordId) {
|
|
37
|
+
const r = this.byRecordId.get(recordId);
|
|
38
|
+
if (r === undefined) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return JSON.parse(JSON.stringify(r));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=publication_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication_store.js","sourceRoot":"","sources":["../../src/migration/publication_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH,+DAA+D;AAC/D,MAAM,OAAO,wBAAwB;IAClB,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAChD,YAAY,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnE,KAAK,CAAC,SAAS,CAAC,CAAkB;QAChC,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,EAAE,GAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrC,oEAAoE;QACpE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAoB,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAoB,CAAC;IAC1D,CAAC;CACF"}
|