@enbox/dwn-sdk-js 0.4.6 → 0.4.8
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/README.md +3 -1
- package/dist/browser.mjs +19 -78
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +2324 -1525
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/constants.js +50 -0
- package/dist/esm/src/core/constants.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +29 -11
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/encryption-control.js +785 -0
- package/dist/esm/src/core/encryption-control.js.map +1 -0
- package/dist/esm/src/core/message.js +6 -0
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +36 -5
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +3 -12
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-validation.js +31 -30
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization.js +6 -0
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/recording-validation-state-reader.js +3 -3
- package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -1
- package/dist/esm/src/core/replication-apply.js +62 -108
- package/dist/esm/src/core/replication-apply.js.map +1 -1
- package/dist/esm/src/core/validation-state-reader.js +5 -6
- package/dist/esm/src/core/validation-state-reader.js.map +1 -1
- package/dist/esm/src/dwn.js +1 -2
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +11 -11
- package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -1
- package/dist/esm/src/handlers/messages-query.js +6 -16
- package/dist/esm/src/handlers/messages-query.js.map +1 -1
- package/dist/esm/src/handlers/messages-read.js +4 -3
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +26 -30
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +6 -4
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +85 -10
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +11 -0
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +140 -18
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +20 -4
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +127 -11
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +15 -0
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +8 -11
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-configure.js +66 -9
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +43 -36
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +5 -5
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/encryption.js +60 -270
- package/dist/esm/src/protocols/encryption.js.map +1 -1
- package/dist/esm/src/store/blockstore-level.js +14 -23
- package/dist/esm/src/store/blockstore-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-mock.js +10 -27
- package/dist/esm/src/store/blockstore-mock.js.map +1 -1
- package/dist/esm/src/store/blockstore-utils.js +45 -0
- package/dist/esm/src/store/blockstore-utils.js.map +1 -0
- package/dist/esm/src/store/blockstore.js +2 -0
- package/dist/esm/src/store/blockstore.js.map +1 -0
- package/dist/esm/src/store/data-store-level.js +4 -12
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/level.js +7 -0
- package/dist/esm/src/store/level.js.map +1 -0
- package/dist/esm/src/types/encryption-types.js +4 -1
- package/dist/esm/src/types/encryption-types.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +25 -0
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +107 -19
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/grant-key-coverage.js +180 -0
- package/dist/esm/src/utils/grant-key-coverage.js.map +1 -0
- package/dist/esm/src/utils/hd-key.js +1 -2
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +7 -1
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/memory-cache.js +29 -8
- package/dist/esm/src/utils/memory-cache.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +27 -0
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/record-limit-occupancy.js +23 -3
- package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -1
- package/dist/esm/src/utils/records.js +29 -0
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +12 -11
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +12 -20
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +103 -25
- package/dist/esm/src/utils/time.js.map +1 -1
- package/dist/esm/tests/core/constants.spec.js +35 -0
- package/dist/esm/tests/core/constants.spec.js.map +1 -0
- package/dist/esm/tests/core/encryption-control.spec.js +100 -0
- package/dist/esm/tests/core/encryption-control.spec.js.map +1 -0
- package/dist/esm/tests/core/message.spec.js +35 -0
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/core/replication-apply.spec.js +157 -74
- package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
- package/dist/esm/tests/core/replication-replay-property.spec.js +2 -1
- package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -1
- package/dist/esm/tests/core/validation-read-closure.spec.js +14 -28
- package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -1
- package/dist/esm/tests/core/validation-state-reader.spec.js +19 -23
- package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +2 -1
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/event-emitter-wake-publisher.spec.js +51 -0
- package/dist/esm/tests/event-emitter-wake-publisher.spec.js.map +1 -0
- package/dist/esm/tests/features/protocol-composition.spec.js +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/encryption.fuzz.spec.js +9 -1
- package/dist/esm/tests/fuzz/encryption.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +1 -1
- package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/protocols-utils.fuzz.spec.js +29 -1
- package/dist/esm/tests/fuzz/protocols-utils.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/secp256k1.fuzz.spec.js +2 -2
- package/dist/esm/tests/fuzz/secp256k1.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/time.fuzz.spec.js +7 -1
- package/dist/esm/tests/fuzz/time.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-query.spec.js +123 -11
- package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +95 -0
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +90 -0
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +66 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +370 -0
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +70 -1
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +562 -1
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +140 -2
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +241 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +1187 -29
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +290 -2
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +47 -5
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/protocols/encryption.spec.js +187 -452
- package/dist/esm/tests/protocols/encryption.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +13 -27
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-level.spec.js +33 -10
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-mock.spec.js +31 -7
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-utils.spec.js +115 -0
- package/dist/esm/tests/store/blockstore-utils.spec.js.map +1 -0
- package/dist/esm/tests/store/index-level.spec.js +3 -3
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/test-stores.js +2 -1
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +15 -0
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +30 -0
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-control-test-utils.js +111 -0
- package/dist/esm/tests/utils/encryption-control-test-utils.js.map +1 -0
- package/dist/esm/tests/utils/encryption.spec.js +198 -5
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/grant-key-coverage.spec.js +262 -0
- package/dist/esm/tests/utils/grant-key-coverage.spec.js.map +1 -0
- package/dist/esm/tests/utils/memory-cache.spec.js +12 -0
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +2 -2
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +2 -1
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/utils/test-validation-state-reader.js +1 -1
- package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -1
- package/dist/esm/tests/utils/time.spec.js +26 -0
- package/dist/esm/tests/utils/time.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/encryption/audience.spec.js +45 -0
- package/dist/esm/tests/validation/json-schemas/encryption/audience.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/encryption/delivery.spec.js +47 -0
- package/dist/esm/tests/validation/json-schemas/encryption/delivery.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js +43 -0
- package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +152 -0
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +46 -1
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/types/generated/precompiled-validators.d.ts +20 -4
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/constants.d.ts +39 -0
- package/dist/types/src/core/constants.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +29 -11
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/encryption-control.d.ts +128 -0
- package/dist/types/src/core/encryption-control.d.ts.map +1 -0
- package/dist/types/src/core/message.d.ts +4 -0
- package/dist/types/src/core/message.d.ts.map +1 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts +11 -0
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/recording-validation-state-reader.d.ts +2 -3
- package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -1
- package/dist/types/src/core/replication-apply.d.ts +10 -1
- package/dist/types/src/core/replication-apply.d.ts.map +1 -1
- package/dist/types/src/core/validation-state-reader.d.ts +2 -3
- package/dist/types/src/core/validation-state-reader.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +1 -1
- package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-query.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts +1 -0
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +2 -0
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
- package/dist/types/src/handlers/records-query.d.ts +3 -0
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +2 -0
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +12 -18
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-configure.d.ts +13 -1
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +5 -1
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
- package/dist/types/src/protocols/encryption.d.ts +15 -19
- package/dist/types/src/protocols/encryption.d.ts.map +1 -1
- package/dist/types/src/store/blockstore-level.d.ts +11 -11
- package/dist/types/src/store/blockstore-level.d.ts.map +1 -1
- package/dist/types/src/store/blockstore-mock.d.ts +12 -12
- package/dist/types/src/store/blockstore-mock.d.ts.map +1 -1
- package/dist/types/src/store/blockstore-utils.d.ts +23 -0
- package/dist/types/src/store/blockstore-utils.d.ts.map +1 -0
- package/dist/types/src/store/blockstore.d.ts +3 -0
- package/dist/types/src/store/blockstore.d.ts.map +1 -0
- package/dist/types/src/store/data-store-level.d.ts.map +1 -1
- package/dist/types/src/store/level.d.ts +13 -0
- package/dist/types/src/store/level.d.ts.map +1 -0
- package/dist/types/src/types/cache.d.ts +2 -2
- package/dist/types/src/types/cache.d.ts.map +1 -1
- package/dist/types/src/types/encryption-types.d.ts +31 -2
- package/dist/types/src/types/encryption-types.d.ts.map +1 -1
- package/dist/types/src/types/validation-state-reader.d.ts +3 -5
- package/dist/types/src/types/validation-state-reader.d.ts.map +1 -1
- package/dist/types/src/utils/data-stream.d.ts +5 -0
- package/dist/types/src/utils/data-stream.d.ts.map +1 -1
- package/dist/types/src/utils/encryption.d.ts +53 -24
- package/dist/types/src/utils/encryption.d.ts.map +1 -1
- package/dist/types/src/utils/grant-key-coverage.d.ts +36 -0
- package/dist/types/src/utils/grant-key-coverage.d.ts.map +1 -0
- package/dist/types/src/utils/hd-key.d.ts.map +1 -1
- package/dist/types/src/utils/jws.d.ts.map +1 -1
- package/dist/types/src/utils/memory-cache.d.ts +4 -2
- package/dist/types/src/utils/memory-cache.d.ts.map +1 -1
- package/dist/types/src/utils/protocols.d.ts +11 -0
- package/dist/types/src/utils/protocols.d.ts.map +1 -1
- package/dist/types/src/utils/record-limit-occupancy.d.ts +7 -0
- package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +2 -0
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
- package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
- package/dist/types/src/utils/time.d.ts +21 -13
- package/dist/types/src/utils/time.d.ts.map +1 -1
- package/dist/types/tests/core/constants.spec.d.ts +2 -0
- package/dist/types/tests/core/constants.spec.d.ts.map +1 -0
- package/dist/types/tests/core/encryption-control.spec.d.ts +2 -0
- package/dist/types/tests/core/encryption-control.spec.d.ts.map +1 -0
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts +2 -0
- package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
- package/dist/types/tests/store/blockstore-utils.spec.d.ts +2 -0
- package/dist/types/tests/store/blockstore-utils.spec.d.ts.map +1 -0
- package/dist/types/tests/test-stores.d.ts.map +1 -1
- package/dist/types/tests/utils/encryption-control-test-utils.d.ts +46 -0
- package/dist/types/tests/utils/encryption-control-test-utils.d.ts.map +1 -0
- package/dist/types/tests/utils/grant-key-coverage.spec.d.ts +2 -0
- package/dist/types/tests/utils/grant-key-coverage.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts.map +1 -0
- package/package.json +47 -28
- package/src/core/constants.ts +61 -0
- package/src/core/dwn-error.ts +29 -11
- package/src/core/encryption-control.ts +1249 -0
- package/src/core/message.ts +7 -0
- package/src/core/messages-grant-authorization.ts +60 -9
- package/src/core/protocol-authorization-action.ts +3 -13
- package/src/core/protocol-authorization-validation.ts +66 -46
- package/src/core/protocol-authorization.ts +7 -0
- package/src/core/recording-validation-state-reader.ts +4 -5
- package/src/core/replication-apply.ts +77 -133
- package/src/core/validation-state-reader.ts +6 -8
- package/src/dwn.ts +1 -2
- package/src/event-stream/event-emitter-wake-publisher.ts +10 -14
- package/src/handlers/messages-query.ts +6 -22
- package/src/handlers/messages-read.ts +4 -3
- package/src/handlers/messages-subscribe.ts +34 -30
- package/src/handlers/protocols-configure.ts +7 -4
- package/src/handlers/records-count.ts +111 -10
- package/src/handlers/records-delete.ts +15 -0
- package/src/handlers/records-query.ts +176 -20
- package/src/handlers/records-read.ts +19 -6
- package/src/handlers/records-subscribe.ts +158 -8
- package/src/handlers/records-write.ts +19 -0
- package/src/index.ts +50 -22
- package/src/interfaces/protocols-configure.ts +102 -11
- package/src/interfaces/records-write.ts +49 -43
- package/src/jose/algorithms/signing/ed25519.ts +7 -6
- package/src/jose/jws/general/verifier.ts +3 -3
- package/src/protocols/encryption.ts +94 -411
- package/src/store/blockstore-level.ts +33 -37
- package/src/store/blockstore-mock.ts +24 -38
- package/src/store/blockstore-utils.ts +85 -0
- package/src/store/blockstore.ts +8 -0
- package/src/store/data-store-level.ts +5 -12
- package/src/store/level.ts +19 -0
- package/src/types/cache.ts +3 -3
- package/src/types/encryption-types.ts +39 -2
- package/src/types/validation-state-reader.ts +3 -5
- package/src/utils/data-stream.ts +29 -1
- package/src/utils/encryption.ts +190 -60
- package/src/utils/grant-key-coverage.ts +303 -0
- package/src/utils/hd-key.ts +1 -2
- package/src/utils/jws.ts +8 -2
- package/src/utils/memory-cache.ts +42 -11
- package/src/utils/protocols.ts +32 -0
- package/src/utils/record-limit-occupancy.ts +34 -5
- package/src/utils/records.ts +36 -2
- package/src/utils/secp256k1.ts +12 -12
- package/src/utils/secp256r1.ts +12 -22
- package/src/utils/time.ts +145 -27
- package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js +0 -40
- package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js.map +0 -1
- package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts +0 -2
- package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts.map +0 -1
- package/src/types/mitt.d.ts +0 -28
package/src/core/message.ts
CHANGED
|
@@ -49,6 +49,13 @@ export class Message {
|
|
|
49
49
|
return author;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Gets the DID whose authority is being exercised by the request.
|
|
54
|
+
*/
|
|
55
|
+
public static getRequester(message: GenericMessage): string | undefined {
|
|
56
|
+
return Message.isSignedByAuthorDelegate(message) ? Message.getSigner(message) : Message.getAuthor(message);
|
|
57
|
+
}
|
|
58
|
+
|
|
52
59
|
/**
|
|
53
60
|
* Validates the given message against the corresponding JSON schema.
|
|
54
61
|
* @throws {Error} if fails validation.
|
|
@@ -10,11 +10,18 @@ import type { MessagesQueryMessage, MessagesReadMessage, MessagesSubscribeMessag
|
|
|
10
10
|
import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
|
|
11
11
|
import { EncryptionProtocol } from '../protocols/encryption.js';
|
|
12
12
|
import { GrantAuthorization } from './grant-authorization.js';
|
|
13
|
+
import { Jws } from '../utils/jws.js';
|
|
14
|
+
import { Message } from './message.js';
|
|
13
15
|
import { PermissionScopeMatcher } from '../utils/permission-scope.js';
|
|
14
16
|
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
15
17
|
import { Records } from '../utils/records.js';
|
|
16
18
|
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
17
19
|
|
|
20
|
+
export type MessagesQueryOrSubscribeGrantSet = {
|
|
21
|
+
permissionGrants: PermissionGrant[];
|
|
22
|
+
requester: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
18
25
|
export class MessagesGrantAuthorization {
|
|
19
26
|
|
|
20
27
|
public static async fetchPermissionGrants(
|
|
@@ -53,7 +60,12 @@ export class MessagesGrantAuthorization {
|
|
|
53
60
|
|
|
54
61
|
for (const permissionGrant of permissionGrants) {
|
|
55
62
|
const scope = permissionGrant.scope as MessagesPermissionScope;
|
|
56
|
-
if (await MessagesGrantAuthorization.isScopeAuthorized(
|
|
63
|
+
if (await MessagesGrantAuthorization.isScopeAuthorized({
|
|
64
|
+
tenant : expectedGrantor,
|
|
65
|
+
messageToGet : messageToRead,
|
|
66
|
+
incomingScope : scope,
|
|
67
|
+
validationStateReader : validationStateReader,
|
|
68
|
+
})) {
|
|
57
69
|
return;
|
|
58
70
|
}
|
|
59
71
|
}
|
|
@@ -89,6 +101,36 @@ export class MessagesGrantAuthorization {
|
|
|
89
101
|
MessagesGrantAuthorization.authorizeFilterScope(incomingMessage, scopes);
|
|
90
102
|
}
|
|
91
103
|
|
|
104
|
+
public static async authorizeQueryOrSubscribeInvocation(input: {
|
|
105
|
+
tenant: string;
|
|
106
|
+
incomingMessage: MessagesQueryMessage | MessagesSubscribeMessage;
|
|
107
|
+
validationStateReader: ValidationStateReader;
|
|
108
|
+
failureCode: DwnErrorCode;
|
|
109
|
+
}): Promise<MessagesQueryOrSubscribeGrantSet | undefined> {
|
|
110
|
+
const {
|
|
111
|
+
tenant, incomingMessage, validationStateReader, failureCode
|
|
112
|
+
} = input;
|
|
113
|
+
const requester = Message.getRequester(incomingMessage);
|
|
114
|
+
if (Message.getAuthor(incomingMessage) === tenant && requester === tenant) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const permissionGrantIds = Message.getPermissionGrantIds(Jws.decodePlainObjectPayload(incomingMessage.authorization.signature));
|
|
119
|
+
if (requester !== undefined && permissionGrantIds.length > 0) {
|
|
120
|
+
const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, validationStateReader, permissionGrantIds);
|
|
121
|
+
await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
|
|
122
|
+
incomingMessage : incomingMessage,
|
|
123
|
+
expectedGrantor : tenant,
|
|
124
|
+
expectedGrantee : requester,
|
|
125
|
+
permissionGrants : permissionGrants,
|
|
126
|
+
validationStateReader : validationStateReader,
|
|
127
|
+
});
|
|
128
|
+
return { permissionGrants, requester };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
throw new DwnError(failureCode, 'message failed authorization');
|
|
132
|
+
}
|
|
133
|
+
|
|
92
134
|
private static authorizeFilterScope(
|
|
93
135
|
messagesMessage: MessagesQueryMessage | MessagesSubscribeMessage,
|
|
94
136
|
scopes: MessagesPermissionScope[]
|
|
@@ -192,15 +234,16 @@ export class MessagesGrantAuthorization {
|
|
|
192
234
|
* Determines whether the given record is inside a grant scope.
|
|
193
235
|
*/
|
|
194
236
|
private static async isScopeAuthorized(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
237
|
+
input: {
|
|
238
|
+
tenant: string;
|
|
239
|
+
messageToGet: GenericMessage;
|
|
240
|
+
incomingScope: MessagesPermissionScope;
|
|
241
|
+
validationStateReader: ValidationStateReader;
|
|
242
|
+
},
|
|
199
243
|
): Promise<boolean> {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
244
|
+
const {
|
|
245
|
+
tenant, messageToGet, incomingScope, validationStateReader
|
|
246
|
+
} = input;
|
|
204
247
|
if (messageToGet.descriptor.interface === DwnInterfaceName.Records) {
|
|
205
248
|
return MessagesGrantAuthorization.isRecordsMessageScopeAuthorized(
|
|
206
249
|
tenant,
|
|
@@ -210,6 +253,10 @@ export class MessagesGrantAuthorization {
|
|
|
210
253
|
);
|
|
211
254
|
}
|
|
212
255
|
|
|
256
|
+
if (incomingScope.protocol === undefined) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
|
|
213
260
|
if (messageToGet.descriptor.interface === DwnInterfaceName.Protocols) {
|
|
214
261
|
return MessagesGrantAuthorization.isProtocolsConfigureScopeAuthorized(
|
|
215
262
|
messageToGet as ProtocolsConfigureMessage,
|
|
@@ -232,6 +279,10 @@ export class MessagesGrantAuthorization {
|
|
|
232
279
|
validationStateReader
|
|
233
280
|
);
|
|
234
281
|
|
|
282
|
+
if (incomingScope.protocol === undefined) {
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
|
|
235
286
|
if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
|
|
236
287
|
return MessagesGrantAuthorization.isPermissionRecordScopeAuthorized(
|
|
237
288
|
tenant,
|
|
@@ -10,7 +10,7 @@ import type { ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet } from '..
|
|
|
10
10
|
import { DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
11
11
|
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
12
12
|
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
13
|
-
import { getRuleSetAtPath, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
13
|
+
import { getRoleContextPrefix, getRuleSetAtPath, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
14
14
|
import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
|
|
15
15
|
|
|
16
16
|
/**
|
|
@@ -80,24 +80,14 @@ export async function verifyInvokedRole(
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
83
|
+
const contextIdPrefix = getRoleContextPrefix(roleProtocolPath, contextId);
|
|
84
|
+
if (contextIdPrefix === undefined && roleProtocolPath.includes('/')) {
|
|
85
85
|
throw new DwnError(
|
|
86
86
|
DwnErrorCode.ProtocolAuthorizationMissingContextId,
|
|
87
87
|
'Could not verify role because contextId is missing.'
|
|
88
88
|
);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
// Compute `contextId` prefix for fetching the invoked role record if the role path is not at the root level.
|
|
92
|
-
// e.g. if invoked role path is `Thread/Participant`, and the `contextId` of the message is `threadX/messageY/attachmentZ`,
|
|
93
|
-
// then we need to use the prefix `threadX` for the `contextId`
|
|
94
|
-
// because the `contextId` of the Participant record would be in the form of be `threadX/participantA`
|
|
95
|
-
let contextIdPrefix: string | undefined;
|
|
96
|
-
if (ancestorSegmentCountOfRolePath > 0) {
|
|
97
|
-
const contextIdSegments = contextId!.split('/'); // NOTE: currently contextId segment count is never shorter than the role path count.
|
|
98
|
-
contextIdPrefix = contextIdSegments.slice(0, ancestorSegmentCountOfRolePath).join('/');
|
|
99
|
-
}
|
|
100
|
-
|
|
101
91
|
// fetch the invoked role record
|
|
102
92
|
const matchingRoleRecordExists = await validationStateReader.hasMatchingRoleRecord({
|
|
103
93
|
tenant,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RecordsWrite } from '../interfaces/records-write.js';
|
|
2
2
|
import type { RecordsWriteMessage } from '../types/records-types.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { SourceRoleAudienceKeyEncryption } from '../utils/encryption.js';
|
|
4
4
|
import type { ValidationStateReader } from '../types/validation-state-reader.js';
|
|
5
5
|
import type { ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet, ProtocolType, ProtocolTypes } from '../types/protocols-types.js';
|
|
6
6
|
|
|
@@ -9,9 +9,20 @@ import { Records } from '../utils/records.js';
|
|
|
9
9
|
import { validateProtocolTags } from '../utils/protocol-tags.js';
|
|
10
10
|
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
11
11
|
import { Encryption, ROLE_AUDIENCE_DERIVATION_SCHEME } from '../utils/encryption.js';
|
|
12
|
-
import { getRuleSetAtPath, getTypeName, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
12
|
+
import { getRoleAudienceContextId, getRuleSetAtPath, getTypeName, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
13
13
|
import { ProtocolAction, ProtocolRecordLimitStrategy } from '../types/protocols-types.js';
|
|
14
14
|
|
|
15
|
+
type ResolvedRoleAudience = {
|
|
16
|
+
contextId: string;
|
|
17
|
+
protocol: string;
|
|
18
|
+
rolePath: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
type RoleAudienceEntryValidationResult = {
|
|
22
|
+
hasAudience: boolean;
|
|
23
|
+
hasEntry: boolean;
|
|
24
|
+
};
|
|
25
|
+
|
|
15
26
|
/**
|
|
16
27
|
* Verifies the `protocolPath` declared in the given message matches the path of actual record chain.
|
|
17
28
|
* For cross-protocol composition, the parent record may belong to a different protocol (resolved via `$ref` in the composing protocol).
|
|
@@ -319,42 +330,73 @@ async function verifyRoleAudienceEncryptionIfNeeded(
|
|
|
319
330
|
continue;
|
|
320
331
|
}
|
|
321
332
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
333
|
+
await verifyResolvedRoleAudienceEncryption(tenant, inboundMessage, roleAudience, validationStateReader);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
async function verifyResolvedRoleAudienceEncryption(
|
|
338
|
+
tenant: string,
|
|
339
|
+
inboundMessage: RecordsWriteMessage,
|
|
340
|
+
roleAudience: ResolvedRoleAudience,
|
|
341
|
+
validationStateReader: ValidationStateReader,
|
|
342
|
+
): Promise<void> {
|
|
343
|
+
const sourceEntryValidation = await validateSourceRoleAudienceEntry(tenant, roleAudience, inboundMessage, validationStateReader);
|
|
344
|
+
if (sourceEntryValidation.hasAudience) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (!sourceEntryValidation.hasEntry) {
|
|
349
|
+
throw new DwnError(
|
|
350
|
+
DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceEntryMissing,
|
|
351
|
+
`encrypted record is missing a roleAudience keyEncryption entry for role '${roleAudience.rolePath}'`
|
|
326
352
|
);
|
|
353
|
+
}
|
|
327
354
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
}
|
|
355
|
+
throw new DwnError(
|
|
356
|
+
DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceMissing,
|
|
357
|
+
`encrypted record references a missing audience for role '${roleAudience.rolePath}'`
|
|
358
|
+
);
|
|
359
|
+
}
|
|
334
360
|
|
|
335
|
-
|
|
361
|
+
async function validateSourceRoleAudienceEntry(
|
|
362
|
+
tenant: string,
|
|
363
|
+
roleAudience: ResolvedRoleAudience,
|
|
364
|
+
inboundMessage: RecordsWriteMessage,
|
|
365
|
+
validationStateReader: ValidationStateReader,
|
|
366
|
+
): Promise<RoleAudienceEntryValidationResult> {
|
|
367
|
+
const matchingEntries = inboundMessage.encryption!.keyEncryption.filter((entry): entry is SourceRoleAudienceKeyEncryption =>
|
|
368
|
+
entry.derivationScheme === ROLE_AUDIENCE_DERIVATION_SCHEME &&
|
|
369
|
+
entry.protocol === roleAudience.protocol &&
|
|
370
|
+
'rolePath' in entry &&
|
|
371
|
+
entry.rolePath === roleAudience.rolePath
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
if (matchingEntries.length === 0) {
|
|
375
|
+
return { hasAudience: false, hasEntry: false };
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
for (const matchingEntry of matchingEntries) {
|
|
379
|
+
const matchingAudienceRecords = await validationStateReader.queryAudienceRecords({
|
|
336
380
|
tenant,
|
|
337
381
|
protocol : roleAudience.protocol,
|
|
338
382
|
contextId : roleAudience.contextId,
|
|
339
|
-
|
|
340
|
-
epoch : matchingEntry.epoch,
|
|
383
|
+
rolePath : roleAudience.rolePath,
|
|
341
384
|
keyId : matchingEntry.keyId,
|
|
342
385
|
});
|
|
343
386
|
|
|
344
|
-
if (
|
|
345
|
-
|
|
346
|
-
DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceEpochMissing,
|
|
347
|
-
`encrypted record references a missing audienceEpoch for role '${roleAudience.role}'`
|
|
348
|
-
);
|
|
387
|
+
if (matchingAudienceRecords.length > 0) {
|
|
388
|
+
return { hasAudience: true, hasEntry: true };
|
|
349
389
|
}
|
|
350
390
|
}
|
|
391
|
+
|
|
392
|
+
return { hasAudience: false, hasEntry: true };
|
|
351
393
|
}
|
|
352
394
|
|
|
353
395
|
function resolveRoleAudience(
|
|
354
396
|
actionRule: ProtocolActionRule,
|
|
355
397
|
inboundMessage: RecordsWriteMessage,
|
|
356
398
|
protocolDefinition: ProtocolDefinition,
|
|
357
|
-
):
|
|
399
|
+
): ResolvedRoleAudience | undefined {
|
|
358
400
|
const roleRef = actionRule.role;
|
|
359
401
|
if (roleRef === undefined) {
|
|
360
402
|
return undefined;
|
|
@@ -364,35 +406,13 @@ function resolveRoleAudience(
|
|
|
364
406
|
const protocol = parsed === undefined
|
|
365
407
|
? inboundMessage.descriptor.protocol
|
|
366
408
|
: protocolDefinition.uses?.[parsed.alias];
|
|
367
|
-
const
|
|
409
|
+
const rolePath = parsed === undefined ? roleRef : parsed.protocolPath;
|
|
368
410
|
if (protocol === undefined) {
|
|
369
411
|
return undefined;
|
|
370
412
|
}
|
|
371
413
|
|
|
372
|
-
const contextId = getRoleAudienceContextId(
|
|
373
|
-
return contextId === undefined ? undefined : { protocol,
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
function getRoleAudienceContextId(
|
|
377
|
-
inboundMessage: RecordsWriteMessage,
|
|
378
|
-
rolePath: string,
|
|
379
|
-
): string | undefined {
|
|
380
|
-
const parentDepth = rolePath.split('/').length - 1;
|
|
381
|
-
if (parentDepth === 0) {
|
|
382
|
-
return '';
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
const contextId = inboundMessage.contextId;
|
|
386
|
-
if (typeof contextId !== 'string') {
|
|
387
|
-
return undefined;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
const contextSegments = contextId.split('/');
|
|
391
|
-
if (contextSegments.length < parentDepth) {
|
|
392
|
-
return undefined;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
return contextSegments.slice(0, parentDepth).join('/');
|
|
414
|
+
const contextId = getRoleAudienceContextId(rolePath, inboundMessage.contextId);
|
|
415
|
+
return contextId === undefined ? undefined : { protocol, rolePath, contextId };
|
|
396
416
|
}
|
|
397
417
|
|
|
398
418
|
/**
|
|
@@ -8,7 +8,9 @@ import type { RecordsWriteMessage } from '../types/records-types.js';
|
|
|
8
8
|
import type { ValidationStateReader } from '../types/validation-state-reader.js';
|
|
9
9
|
import type { ProtocolDefinition, ProtocolRuleSet } from '../types/protocols-types.js';
|
|
10
10
|
|
|
11
|
+
import { EncryptionControl } from './encryption-control.js';
|
|
11
12
|
import { getRuleSetAtPath } from '../utils/protocols.js';
|
|
13
|
+
import { isEncryptionControlPath } from './constants.js';
|
|
12
14
|
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
13
15
|
import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
|
|
14
16
|
|
|
@@ -35,6 +37,11 @@ export class ProtocolAuthorization {
|
|
|
35
37
|
incomingMessage: RecordsWrite,
|
|
36
38
|
validationStateReader: ValidationStateReader,
|
|
37
39
|
): Promise<ProtocolRuleSet> {
|
|
40
|
+
if (isEncryptionControlPath(incomingMessage.message.descriptor.protocolPath)) {
|
|
41
|
+
await EncryptionControl.validateReferentialIntegrity(tenant, incomingMessage, validationStateReader);
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
|
|
38
45
|
const protocolDefinitionTimestamp = incomingMessage.message.descriptor.messageTimestamp;
|
|
39
46
|
|
|
40
47
|
// fetch the protocol definition active at the incoming message timestamp
|
|
@@ -88,16 +88,15 @@ export class RecordingValidationStateReader implements ValidationStateReader {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/** @inheritdoc */
|
|
91
|
-
public async
|
|
91
|
+
public async queryAudienceRecords(input: {
|
|
92
92
|
tenant: string;
|
|
93
93
|
protocol: string;
|
|
94
|
+
rolePath: string;
|
|
94
95
|
contextId: string;
|
|
95
|
-
role: string;
|
|
96
|
-
epoch: number;
|
|
97
96
|
keyId?: string;
|
|
98
97
|
}): Promise<RecordsWriteMessage[]> {
|
|
99
|
-
this.recordedReads.push({ method: '
|
|
100
|
-
return this.inner.
|
|
98
|
+
this.recordedReads.push({ method: 'queryAudienceRecords' });
|
|
99
|
+
return this.inner.queryAudienceRecords(input);
|
|
101
100
|
}
|
|
102
101
|
|
|
103
102
|
/** @inheritdoc */
|