@enbox/dwn-sdk-js 0.0.1 → 0.0.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/README.md +52 -301
- package/dist/bundles/dwn.js +19 -21
- package/dist/esm/generated/precompiled-validators.js +2764 -1773
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +27 -3
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +17 -6
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization.js +245 -69
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +4 -4
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/dwn.js +10 -8
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/enums/dwn-interface-method.js +4 -2
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +1 -0
- package/dist/esm/src/handlers/messages-subscribe.js +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +116 -0
- package/dist/esm/src/handlers/messages-sync.js.map +1 -0
- package/dist/esm/src/handlers/protocols-configure.js +149 -16
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +2 -2
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +143 -0
- package/dist/esm/src/handlers/records-count.js.map +1 -0
- package/dist/esm/src/handlers/records-query.js +4 -0
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +4 -6
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +17 -18
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +9 -5
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-read.js +2 -7
- package/dist/esm/src/interfaces/messages-read.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +1 -0
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/{messages-query.js → messages-sync.js} +11 -12
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +153 -30
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +1 -0
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +91 -0
- package/dist/esm/src/interfaces/records-count.js.map +1 -0
- package/dist/esm/src/interfaces/records-read.js +15 -1
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +64 -15
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +30 -0
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +24 -0
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +1 -1
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/schema-validator.js +0 -1
- package/dist/esm/src/schema-validator.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js +125 -0
- package/dist/esm/src/smt/smt-store-level.js.map +1 -0
- package/dist/esm/src/smt/smt-store-memory.js +67 -0
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -0
- package/dist/esm/src/smt/smt-utils.js +146 -0
- package/dist/esm/src/smt/smt-utils.js.map +1 -0
- package/dist/esm/src/smt/sparse-merkle-tree.js +622 -0
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -0
- package/dist/esm/src/state-index/state-index-level.js +228 -0
- package/dist/esm/src/state-index/state-index-level.js.map +1 -0
- package/dist/esm/src/store/data-store-level.js +6 -6
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level.js +375 -17
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +56 -0
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +19 -16
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/encryption-types.js +2 -0
- package/dist/esm/src/types/encryption-types.js.map +1 -0
- package/dist/esm/src/types/message-types.js.map +1 -1
- package/dist/esm/src/types/protocols-types.js +0 -2
- package/dist/esm/src/types/protocols-types.js.map +1 -1
- package/dist/esm/src/types/records-types.js +2 -0
- package/dist/esm/src/types/records-types.js.map +1 -1
- package/dist/esm/src/types/smt-types.js +5 -0
- package/dist/esm/src/types/smt-types.js.map +1 -0
- package/dist/esm/src/types/state-index.js +2 -0
- package/dist/esm/src/types/state-index.js.map +1 -0
- package/dist/esm/src/utils/cid.js +2 -1
- package/dist/esm/src/utils/cid.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +84 -29
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +22 -31
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +3 -3
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +4 -4
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js +4 -3
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +82 -9
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/records.js +82 -26
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +4 -3
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +3 -2
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +1 -1
- package/dist/esm/src/utils/url.js +1 -1
- package/dist/esm/src/utils/url.js.map +1 -1
- package/dist/esm/tests/core/auth.spec.js +2 -2
- package/dist/esm/tests/core/auth.spec.js.map +1 -1
- package/dist/esm/tests/core/message-reply.spec.js +3 -3
- package/dist/esm/tests/core/message-reply.spec.js.map +1 -1
- package/dist/esm/tests/core/message.spec.js +13 -13
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +3 -3
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +27 -37
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/{event-log → event-stream}/event-emitter-stream.spec.js +14 -15
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +1 -0
- package/dist/esm/tests/{event-log → event-stream}/event-stream.spec.js +13 -15
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +1 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js +281 -135
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +57 -59
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +32 -34
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +73 -95
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +1645 -0
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -0
- package/dist/esm/tests/features/protocol-create-action.spec.js +25 -27
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +42 -44
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +53 -55
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune.spec.js +126 -100
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-tags.spec.js +272 -272
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +35 -37
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +112 -112
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +78 -76
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +528 -0
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js +545 -152
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +70 -72
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +313 -0
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-delete.spec.js +106 -109
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +863 -463
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +439 -209
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +292 -97
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +481 -483
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-get.spec.js +31 -11
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +5 -5
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +64 -134
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-query.spec.js +4 -6
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +3 -5
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-query.spec.js +9 -11
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-read.spec.js +76 -7
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +7 -9
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +244 -48
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +15 -18
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +114 -0
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -0
- package/dist/esm/tests/protocols/permission-request.spec.js +43 -7
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +9 -11
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +90 -92
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +17 -19
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +27 -29
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +37 -39
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +163 -163
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +143 -0
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -0
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +741 -0
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -0
- package/dist/esm/tests/state-index/state-index-level.spec.js +254 -0
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -0
- package/dist/esm/tests/store/blockstore-level.spec.js +136 -0
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -0
- package/dist/esm/tests/store/blockstore-mock.spec.js +29 -28
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +23 -25
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +544 -194
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +4 -4
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +147 -73
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/store-dependent-tests.spec.js +1 -0
- package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -1
- package/dist/esm/tests/test-stores.js +5 -5
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +9 -8
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +8 -11
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +167 -13
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-callbacks.spec.js +233 -0
- package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -0
- package/dist/esm/tests/utils/encryption.spec.js +34 -85
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/filters.spec.js +67 -69
- package/dist/esm/tests/utils/filters.spec.js.map +1 -1
- package/dist/esm/tests/utils/hd-key.spec.js +3 -3
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
- package/dist/esm/tests/utils/jws.spec.js +54 -3
- package/dist/esm/tests/utils/jws.spec.js.map +1 -1
- package/dist/esm/tests/utils/memory-cache.spec.js +6 -9
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +63 -29
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/object.spec.js +3 -3
- package/dist/esm/tests/utils/object.spec.js.map +1 -1
- package/dist/esm/tests/utils/poller.js +1 -1
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/private-key-signer.spec.js +6 -6
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +37 -5
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256k1.spec.js +7 -7
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +7 -7
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +47 -28
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/utils/time.spec.js +7 -7
- package/dist/esm/tests/utils/time.spec.js.map +1 -1
- package/dist/esm/tests/utils/url.spec.js +25 -27
- package/dist/esm/tests/utils/url.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +4 -4
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +15 -3
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -8
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +8 -18
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +3 -3
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +9 -9
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +106 -0
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +18 -18
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/esm/tests/vectors/protocol-definitions/email.json +1 -1
- package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +2 -4
- package/dist/esm/tests/vectors/protocol-definitions/slack.json +2 -6
- package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +2 -6
- package/dist/types/generated/precompiled-validators.d.ts +82 -64
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +27 -3
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/message-reply.d.ts +1 -1
- package/dist/types/src/core/message.d.ts +3 -3
- package/dist/types/src/core/message.d.ts.map +1 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts +4 -4
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization.d.ts +43 -2
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/records-grant-authorization.d.ts +2 -2
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/resumable-task-manager.d.ts +1 -0
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts +8 -8
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/enums/dwn-interface-method.d.ts +5 -3
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-sync.d.ts +21 -0
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-configure.d.ts +24 -4
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +43 -0
- package/dist/types/src/handlers/records-count.d.ts.map +1 -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-write.d.ts +5 -5
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +72 -37
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-read.d.ts +2 -2
- package/dist/types/src/interfaces/messages-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-subscribe.d.ts +2 -2
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-sync.d.ts +16 -0
- package/dist/types/src/interfaces/messages-sync.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +22 -2
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
- package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-count.d.ts +27 -0
- package/dist/types/src/interfaces/records-count.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-delete.d.ts +2 -2
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-query.d.ts +2 -2
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-read.d.ts +4 -2
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +2 -2
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +37 -15
- 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/jose/algorithms/signing/signature-algorithms.d.ts +5 -1
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -1
- package/dist/types/src/jose/jws/general/builder.d.ts +3 -3
- package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts +11 -0
- package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-request.d.ts +11 -0
- package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +4 -4
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/schema-validator.d.ts +1 -1
- package/dist/types/src/schema-validator.d.ts.map +1 -1
- package/dist/types/src/smt/smt-store-level.d.ts +32 -0
- package/dist/types/src/smt/smt-store-level.d.ts.map +1 -0
- package/dist/types/src/smt/smt-store-memory.d.ts +22 -0
- package/dist/types/src/smt/smt-store-memory.d.ts.map +1 -0
- package/dist/types/src/smt/smt-utils.d.ts +58 -0
- package/dist/types/src/smt/smt-utils.d.ts.map +1 -0
- package/dist/types/src/smt/sparse-merkle-tree.d.ts +124 -0
- package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +1 -0
- package/dist/types/src/state-index/state-index-level.d.ts +83 -0
- package/dist/types/src/state-index/state-index-level.d.ts.map +1 -0
- package/dist/types/src/store/data-store-level.d.ts +1 -2
- package/dist/types/src/store/data-store-level.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +98 -2
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
- package/dist/types/src/store/message-store-level.d.ts +5 -0
- package/dist/types/src/store/message-store-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +7 -7
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/data-store.d.ts +2 -3
- package/dist/types/src/types/data-store.d.ts.map +1 -1
- package/dist/types/src/types/encryption-types.d.ts +48 -0
- package/dist/types/src/types/encryption-types.d.ts.map +1 -0
- package/dist/types/src/types/jose-types.d.ts +9 -40
- package/dist/types/src/types/jose-types.d.ts.map +1 -1
- package/dist/types/src/types/message-store.d.ts +5 -0
- package/dist/types/src/types/message-store.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +19 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +16 -11
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +1 -2
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +2 -2
- package/dist/types/src/types/permission-types.d.ts.map +1 -1
- package/dist/types/src/types/protocols-types.d.ts +49 -5
- package/dist/types/src/types/protocols-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +23 -7
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/types/signer.d.ts +1 -1
- package/dist/types/src/types/signer.d.ts.map +1 -1
- package/dist/types/src/types/smt-types.d.ts +81 -0
- package/dist/types/src/types/smt-types.d.ts.map +1 -0
- package/dist/types/src/types/state-index.d.ts +90 -0
- package/dist/types/src/types/state-index.d.ts.map +1 -0
- package/dist/types/src/utils/cid.d.ts +1 -2
- package/dist/types/src/utils/cid.d.ts.map +1 -1
- package/dist/types/src/utils/data-stream.d.ts +14 -7
- package/dist/types/src/utils/data-stream.d.ts.map +1 -1
- package/dist/types/src/utils/encryption.d.ts +2 -3
- package/dist/types/src/utils/encryption.d.ts.map +1 -1
- package/dist/types/src/utils/hd-key.d.ts +4 -4
- package/dist/types/src/utils/hd-key.d.ts.map +1 -1
- package/dist/types/src/utils/jws.d.ts +7 -7
- package/dist/types/src/utils/jws.d.ts.map +1 -1
- package/dist/types/src/utils/private-key-signer.d.ts +4 -4
- package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
- package/dist/types/src/utils/protocols.d.ts +46 -3
- package/dist/types/src/utils/protocols.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +33 -6
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/src/utils/secp256k1.d.ts +11 -11
- package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
- package/dist/types/src/utils/secp256r1.d.ts +8 -8
- package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
- package/dist/types/src/utils/time.d.ts +1 -1
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-composition.spec.d.ts +5 -0
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -0
- package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
- package/dist/types/tests/features/resumable-tasks.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/messages-sync.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -0
- 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/protocols/permission-grant.spec.d.ts +2 -0
- package/dist/types/tests/protocols/permission-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/deleted-record.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/scenarios/nested-roles.spec.d.ts.map +1 -1
- package/dist/types/tests/smt/smt-store-level.spec.d.ts +2 -0
- package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +1 -0
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +2 -0
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +1 -0
- package/dist/types/tests/state-index/state-index-level.spec.d.ts +2 -0
- package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/blockstore-level.spec.d.ts +2 -0
- package/dist/types/tests/store/blockstore-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
- package/dist/types/tests/test-stores.d.ts +4 -4
- package/dist/types/tests/test-stores.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts +2 -2
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/dist/types/tests/utils/encryption-callbacks.spec.d.ts +2 -0
- package/dist/types/tests/utils/encryption-callbacks.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/test-data-generator.d.ts +31 -28
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts.map +1 -0
- package/package.json +26 -45
- package/src/core/dwn-error.ts +27 -3
- package/src/core/message-reply.ts +1 -1
- package/src/core/message.ts +5 -5
- package/src/core/messages-grant-authorization.ts +22 -8
- package/src/core/protocol-authorization.ts +345 -68
- package/src/core/records-grant-authorization.ts +2 -2
- package/src/core/resumable-task-manager.ts +4 -5
- package/src/dwn.ts +25 -20
- package/src/enums/dwn-interface-method.ts +5 -3
- package/src/handlers/messages-subscribe.ts +1 -1
- package/src/handlers/messages-sync.ts +129 -0
- package/src/handlers/protocols-configure.ts +195 -17
- package/src/handlers/protocols-query.ts +7 -5
- package/src/handlers/records-count.ts +184 -0
- package/src/handlers/records-query.ts +4 -0
- package/src/handlers/records-read.ts +4 -8
- package/src/handlers/records-write.ts +20 -21
- package/src/index.ts +74 -37
- package/src/interfaces/messages-read.ts +6 -5
- package/src/interfaces/messages-subscribe.ts +7 -6
- package/src/interfaces/messages-sync.ts +59 -0
- package/src/interfaces/protocols-configure.ts +211 -33
- package/src/interfaces/protocols-query.ts +7 -6
- package/src/interfaces/records-count.ts +106 -0
- package/src/interfaces/records-delete.ts +2 -2
- package/src/interfaces/records-query.ts +2 -2
- package/src/interfaces/records-read.ts +26 -3
- package/src/interfaces/records-subscribe.ts +2 -2
- package/src/interfaces/records-write.ts +115 -46
- package/src/jose/algorithms/signing/ed25519.ts +13 -12
- package/src/jose/algorithms/signing/signature-algorithms.ts +6 -1
- package/src/jose/jws/general/builder.ts +3 -3
- package/src/jose/jws/general/verifier.ts +3 -3
- package/src/protocols/permission-grant.ts +51 -0
- package/src/protocols/permission-request.ts +37 -0
- package/src/protocols/permissions.ts +5 -5
- package/src/schema-validator.ts +11 -3
- package/src/smt/smt-store-level.ts +143 -0
- package/src/smt/smt-store-memory.ts +53 -0
- package/src/smt/smt-utils.ts +149 -0
- package/src/smt/sparse-merkle-tree.ts +698 -0
- package/src/state-index/state-index-level.ts +241 -0
- package/src/store/data-store-level.ts +8 -7
- package/src/store/index-level.ts +415 -19
- package/src/store/level-wrapper.ts +1 -1
- package/src/store/message-store-level.ts +62 -0
- package/src/store/storage-controller.ts +21 -19
- package/src/types/data-store.ts +2 -4
- package/src/types/encryption-types.ts +52 -0
- package/src/types/jose-types.ts +10 -42
- package/src/types/message-store.ts +11 -0
- package/src/types/message-types.ts +21 -0
- package/src/types/messages-types.ts +21 -15
- package/src/types/method-handler.ts +1 -2
- package/src/types/permission-types.ts +2 -2
- package/src/types/protocols-types.ts +55 -6
- package/src/types/records-types.ts +26 -7
- package/src/types/signer.ts +1 -1
- package/src/types/smt-types.ts +95 -0
- package/src/types/state-index.ts +100 -0
- package/src/utils/cid.ts +3 -4
- package/src/utils/data-stream.ts +75 -38
- package/src/utils/encryption.ts +24 -39
- package/src/utils/hd-key.ts +6 -6
- package/src/utils/jws.ts +9 -9
- package/src/utils/private-key-signer.ts +9 -8
- package/src/utils/protocols.ts +132 -6
- package/src/utils/records.ts +118 -29
- package/src/utils/secp256k1.ts +23 -21
- package/src/utils/secp256r1.ts +17 -15
- package/src/utils/time.ts +1 -1
- package/src/utils/url.ts +1 -1
- package/dist/cjs/index.js +0 -36749
- package/dist/cjs/package.json +0 -1
- package/dist/esm/src/event-log/event-emitter-stream.js.map +0 -1
- package/dist/esm/src/event-log/event-log-level.js +0 -63
- package/dist/esm/src/event-log/event-log-level.js.map +0 -1
- package/dist/esm/src/handlers/messages-query.js +0 -71
- package/dist/esm/src/handlers/messages-query.js.map +0 -1
- package/dist/esm/src/interfaces/messages-query.js.map +0 -1
- package/dist/esm/src/types/event-log.js +0 -2
- package/dist/esm/src/types/event-log.js.map +0 -1
- package/dist/esm/tests/event-log/event-emitter-stream.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-log-level.spec.js +0 -44
- package/dist/esm/tests/event-log/event-log-level.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-log.spec.js +0 -236
- package/dist/esm/tests/event-log/event-log.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-stream.spec.js.map +0 -1
- package/dist/esm/tests/handlers/messages-query.spec.js +0 -349
- package/dist/esm/tests/handlers/messages-query.spec.js.map +0 -1
- package/dist/esm/tests/interfaces/messagess-query.spec.js +0 -127
- package/dist/esm/tests/interfaces/messagess-query.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/messages-query.spec.js +0 -395
- package/dist/esm/tests/scenarios/messages-query.spec.js.map +0 -1
- package/dist/types/src/event-log/event-emitter-stream.d.ts.map +0 -1
- package/dist/types/src/event-log/event-log-level.d.ts +0 -35
- package/dist/types/src/event-log/event-log-level.d.ts.map +0 -1
- package/dist/types/src/handlers/messages-query.d.ts +0 -17
- package/dist/types/src/handlers/messages-query.d.ts.map +0 -1
- package/dist/types/src/interfaces/messages-query.d.ts +0 -16
- package/dist/types/src/interfaces/messages-query.d.ts.map +0 -1
- package/dist/types/src/types/event-log.d.ts +0 -52
- package/dist/types/src/types/event-log.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-emitter-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-log-level.spec.d.ts +0 -2
- package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-log.spec.d.ts +0 -2
- package/dist/types/tests/event-log/event-log.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/handlers/messages-query.spec.d.ts +0 -2
- package/dist/types/tests/handlers/messages-query.spec.d.ts.map +0 -1
- package/dist/types/tests/interfaces/messagess-query.spec.d.ts +0 -2
- package/dist/types/tests/interfaces/messagess-query.spec.d.ts.map +0 -1
- package/dist/types/tests/scenarios/messages-query.spec.d.ts +0 -2
- package/dist/types/tests/scenarios/messages-query.spec.d.ts.map +0 -1
- package/src/event-log/event-log-level.ts +0 -72
- package/src/handlers/messages-query.ts +0 -67
- package/src/interfaces/messages-query.ts +0 -60
- package/src/types/event-log.ts +0 -52
- /package/dist/esm/src/{event-log → event-stream}/event-emitter-stream.js +0 -0
- /package/dist/types/src/{event-log → event-stream}/event-emitter-stream.d.ts +0 -0
- /package/dist/types/tests/{event-log → event-stream}/event-emitter-stream.spec.d.ts +0 -0
- /package/dist/types/tests/{event-log → event-stream}/event-stream.spec.d.ts +0 -0
- /package/src/{event-log → event-stream}/event-emitter-stream.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { MessageStore } from '../types/message-store.js';
|
|
2
2
|
import type { PermissionGrant } from '../protocols/permission-grant.js';
|
|
3
3
|
import type { PermissionConditions, RecordsPermissionScope } from '../types/permission-types.js';
|
|
4
|
-
import type { RecordsDeleteMessage, RecordsQueryMessage, RecordsReadMessage, RecordsSubscribeMessage, RecordsWriteMessage } from '../types/records-types.js';
|
|
4
|
+
import type { RecordsCountMessage, RecordsDeleteMessage, RecordsQueryMessage, RecordsReadMessage, RecordsSubscribeMessage, RecordsWriteMessage } from '../types/records-types.js';
|
|
5
5
|
|
|
6
6
|
import { GrantAuthorization } from './grant-authorization.js';
|
|
7
7
|
import { PermissionConditionPublication } from '../types/permission-types.js';
|
|
@@ -69,7 +69,7 @@ export class RecordsGrantAuthorization {
|
|
|
69
69
|
* @param messageStore Used to check if the grant has been revoked.
|
|
70
70
|
*/
|
|
71
71
|
public static async authorizeQueryOrSubscribe(input: {
|
|
72
|
-
incomingMessage: RecordsQueryMessage | RecordsSubscribeMessage,
|
|
72
|
+
incomingMessage: RecordsCountMessage | RecordsQueryMessage | RecordsSubscribeMessage,
|
|
73
73
|
expectedGrantor: string,
|
|
74
74
|
expectedGrantee: string,
|
|
75
75
|
permissionGrant: PermissionGrant,
|
|
@@ -90,6 +90,7 @@ export class ResumableTaskManager {
|
|
|
90
90
|
|
|
91
91
|
/**
|
|
92
92
|
* Repeatedly retry the given tasks until all are completed successfully.
|
|
93
|
+
* Tasks are processed sequentially to avoid concurrent database write contention (e.g. SQLite's single-writer lock).
|
|
93
94
|
*/
|
|
94
95
|
private async retryTasksUntilCompletion(resumableTasks: ManagedResumableTask[]): Promise<void> {
|
|
95
96
|
|
|
@@ -98,17 +99,15 @@ export class ResumableTaskManager {
|
|
|
98
99
|
const managedTasksCopy = managedTasks;
|
|
99
100
|
managedTasks = [];
|
|
100
101
|
|
|
101
|
-
const
|
|
102
|
+
for (const managedTask of managedTasksCopy) {
|
|
102
103
|
try {
|
|
103
104
|
await this.runWithAutomaticTimeoutExtension(managedTask);
|
|
104
105
|
} catch (error) {
|
|
105
106
|
console.error('Error while running resumable task:', error);
|
|
106
|
-
console.error('Resumable task:',
|
|
107
|
+
console.error('Resumable task:', managedTask);
|
|
107
108
|
managedTasks.push(managedTask);
|
|
108
109
|
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
await Promise.all(allTaskPromises);
|
|
110
|
+
}
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
113
|
}
|
package/src/dwn.ts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
|
|
2
2
|
import type { DataStore } from './types/data-store.js';
|
|
3
3
|
import type { DidResolver } from '@enbox/dids';
|
|
4
|
-
import type { EventLog } from './types/event-log.js';
|
|
5
4
|
import type { EventStream } from './types/subscriptions.js';
|
|
6
5
|
import type { MessageStore } from './types/message-store.js';
|
|
7
6
|
import type { MethodHandler } from './types/method-handler.js';
|
|
8
|
-
import type { Readable } from 'readable-stream';
|
|
9
7
|
import type { ResumableTaskStore } from './types/resumable-task-store.js';
|
|
8
|
+
import type { StateIndex } from './types/state-index.js';
|
|
10
9
|
import type { TenantGate } from './core/tenant-gate.js';
|
|
11
10
|
import type { UnionMessageReply } from './core/message-reply.js';
|
|
12
11
|
import type { GenericMessage, GenericMessageReply } from './types/message-types.js';
|
|
13
|
-
import type {
|
|
12
|
+
import type { MessagesReadMessage, MessagesReadReply, MessagesSubscribeMessage, MessagesSubscribeMessageOptions, MessagesSubscribeReply, MessagesSyncMessage, MessagesSyncReply, MessageSubscriptionHandler } from './types/messages-types.js';
|
|
14
13
|
import type { ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js';
|
|
15
|
-
import type { RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsReadMessage, RecordsReadReply, RecordsSubscribeMessage, RecordsSubscribeMessageOptions, RecordsSubscribeReply, RecordSubscriptionHandler, RecordsWriteMessage, RecordsWriteMessageOptions } from './types/records-types.js';
|
|
14
|
+
import type { RecordsCountMessage, RecordsCountReply, RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsReadMessage, RecordsReadReply, RecordsSubscribeMessage, RecordsSubscribeMessageOptions, RecordsSubscribeReply, RecordSubscriptionHandler, RecordsWriteMessage, RecordsWriteMessageOptions } from './types/records-types.js';
|
|
16
15
|
|
|
17
16
|
import { AllowAllTenantGate } from './core/tenant-gate.js';
|
|
18
17
|
import { Message } from './core/message.js';
|
|
19
18
|
import { messageReplyFromError } from './core/message-reply.js';
|
|
20
|
-
import { MessagesQueryHandler } from './handlers/messages-query.js';
|
|
21
19
|
import { MessagesReadHandler } from './handlers/messages-read.js';
|
|
22
20
|
import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
|
|
21
|
+
import { MessagesSyncHandler } from './handlers/messages-sync.js';
|
|
23
22
|
import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
|
|
24
23
|
import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
|
|
24
|
+
import { RecordsCountHandler } from './handlers/records-count.js';
|
|
25
25
|
import { RecordsDeleteHandler } from './handlers/records-delete.js';
|
|
26
26
|
import { RecordsQueryHandler } from './handlers/records-query.js';
|
|
27
27
|
import { RecordsReadHandler } from './handlers/records-read.js';
|
|
@@ -38,7 +38,7 @@ export class Dwn {
|
|
|
38
38
|
private messageStore: MessageStore;
|
|
39
39
|
private dataStore: DataStore;
|
|
40
40
|
private resumableTaskStore: ResumableTaskStore;
|
|
41
|
-
private
|
|
41
|
+
private stateIndex: StateIndex;
|
|
42
42
|
private tenantGate: TenantGate;
|
|
43
43
|
private eventStream?: EventStream;
|
|
44
44
|
private storageController: StorageController;
|
|
@@ -51,12 +51,12 @@ export class Dwn {
|
|
|
51
51
|
this.messageStore = config.messageStore;
|
|
52
52
|
this.dataStore = config.dataStore;
|
|
53
53
|
this.resumableTaskStore = config.resumableTaskStore;
|
|
54
|
-
this.
|
|
54
|
+
this.stateIndex = config.stateIndex;
|
|
55
55
|
this.eventStream = config.eventStream;
|
|
56
56
|
this.storageController = new StorageController({
|
|
57
57
|
messageStore : this.messageStore,
|
|
58
58
|
dataStore : this.dataStore,
|
|
59
|
-
|
|
59
|
+
stateIndex : this.stateIndex,
|
|
60
60
|
eventStream : this.eventStream
|
|
61
61
|
});
|
|
62
62
|
this.resumableTaskManager = new ResumableTaskManager(
|
|
@@ -65,11 +65,6 @@ export class Dwn {
|
|
|
65
65
|
);
|
|
66
66
|
|
|
67
67
|
this.methodHandlers = {
|
|
68
|
-
[DwnInterfaceName.Messages + DwnMethodName.Query]: new MessagesQueryHandler(
|
|
69
|
-
this.didResolver,
|
|
70
|
-
this.messageStore,
|
|
71
|
-
this.eventLog,
|
|
72
|
-
),
|
|
73
68
|
[DwnInterfaceName.Messages + DwnMethodName.Read]: new MessagesReadHandler(
|
|
74
69
|
this.didResolver,
|
|
75
70
|
this.messageStore,
|
|
@@ -80,10 +75,15 @@ export class Dwn {
|
|
|
80
75
|
this.messageStore,
|
|
81
76
|
this.eventStream,
|
|
82
77
|
),
|
|
78
|
+
[DwnInterfaceName.Messages + DwnMethodName.Sync]: new MessagesSyncHandler(
|
|
79
|
+
this.didResolver,
|
|
80
|
+
this.messageStore,
|
|
81
|
+
this.stateIndex,
|
|
82
|
+
),
|
|
83
83
|
[DwnInterfaceName.Protocols + DwnMethodName.Configure]: new ProtocolsConfigureHandler(
|
|
84
84
|
this.didResolver,
|
|
85
85
|
this.messageStore,
|
|
86
|
-
this.
|
|
86
|
+
this.stateIndex,
|
|
87
87
|
this.eventStream
|
|
88
88
|
),
|
|
89
89
|
[DwnInterfaceName.Protocols + DwnMethodName.Query]: new ProtocolsQueryHandler(
|
|
@@ -91,6 +91,10 @@ export class Dwn {
|
|
|
91
91
|
this.messageStore,
|
|
92
92
|
this.dataStore
|
|
93
93
|
),
|
|
94
|
+
[DwnInterfaceName.Records + DwnMethodName.Count]: new RecordsCountHandler(
|
|
95
|
+
this.didResolver,
|
|
96
|
+
this.messageStore,
|
|
97
|
+
),
|
|
94
98
|
[DwnInterfaceName.Records + DwnMethodName.Delete]: new RecordsDeleteHandler(
|
|
95
99
|
this.didResolver,
|
|
96
100
|
this.messageStore,
|
|
@@ -115,7 +119,7 @@ export class Dwn {
|
|
|
115
119
|
this.didResolver,
|
|
116
120
|
this.messageStore,
|
|
117
121
|
this.dataStore,
|
|
118
|
-
this.
|
|
122
|
+
this.stateIndex,
|
|
119
123
|
this.eventStream
|
|
120
124
|
)
|
|
121
125
|
};
|
|
@@ -143,7 +147,7 @@ export class Dwn {
|
|
|
143
147
|
await this.messageStore.open();
|
|
144
148
|
await this.dataStore.open();
|
|
145
149
|
await this.resumableTaskStore.open();
|
|
146
|
-
await this.
|
|
150
|
+
await this.stateIndex.open();
|
|
147
151
|
await this.eventStream?.open();
|
|
148
152
|
|
|
149
153
|
await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
|
|
@@ -154,19 +158,20 @@ export class Dwn {
|
|
|
154
158
|
await this.messageStore.close();
|
|
155
159
|
await this.dataStore.close();
|
|
156
160
|
await this.resumableTaskStore.close();
|
|
157
|
-
await this.
|
|
161
|
+
await this.stateIndex.close();
|
|
158
162
|
}
|
|
159
163
|
|
|
160
164
|
/**
|
|
161
165
|
* Processes the given DWN message and returns with a reply.
|
|
162
166
|
* @param tenant The tenant DID to route the given message to.
|
|
163
167
|
*/
|
|
164
|
-
public async processMessage(tenant: string, rawMessage: MessagesQueryMessage): Promise<MessagesQueryReply>;
|
|
165
168
|
public async processMessage(
|
|
166
169
|
tenant: string, rawMessage: MessagesSubscribeMessage, options?: MessagesSubscribeMessageOptions): Promise<MessagesSubscribeReply>;
|
|
167
170
|
public async processMessage(tenant: string, rawMessage: MessagesReadMessage): Promise<MessagesReadReply>;
|
|
171
|
+
public async processMessage(tenant: string, rawMessage: MessagesSyncMessage): Promise<MessagesSyncReply>;
|
|
168
172
|
public async processMessage(tenant: string, rawMessage: ProtocolsConfigureMessage): Promise<GenericMessageReply>;
|
|
169
173
|
public async processMessage(tenant: string, rawMessage: ProtocolsQueryMessage): Promise<ProtocolsQueryReply>;
|
|
174
|
+
public async processMessage(tenant: string, rawMessage: RecordsCountMessage): Promise<RecordsCountReply>;
|
|
170
175
|
public async processMessage(tenant: string, rawMessage: RecordsDeleteMessage): Promise<GenericMessageReply>;
|
|
171
176
|
public async processMessage(tenant: string, rawMessage: RecordsQueryMessage): Promise<RecordsQueryReply>;
|
|
172
177
|
public async processMessage(
|
|
@@ -243,7 +248,7 @@ export class Dwn {
|
|
|
243
248
|
* MessageOptions that are used when processing a message.
|
|
244
249
|
*/
|
|
245
250
|
export interface MessageOptions {
|
|
246
|
-
dataStream?:
|
|
251
|
+
dataStream?: ReadableStream<Uint8Array>;
|
|
247
252
|
subscriptionHandler?: MessageSubscriptionHandler | RecordSubscriptionHandler;
|
|
248
253
|
};
|
|
249
254
|
|
|
@@ -259,6 +264,6 @@ export type DwnConfig = {
|
|
|
259
264
|
|
|
260
265
|
messageStore: MessageStore;
|
|
261
266
|
dataStore: DataStore;
|
|
262
|
-
|
|
267
|
+
stateIndex: StateIndex;
|
|
263
268
|
resumableTaskStore: ResumableTaskStore;
|
|
264
269
|
};
|
|
@@ -6,9 +6,11 @@ export enum DwnInterfaceName {
|
|
|
6
6
|
|
|
7
7
|
export enum DwnMethodName {
|
|
8
8
|
Configure = 'Configure',
|
|
9
|
+
Count = 'Count',
|
|
10
|
+
Delete = 'Delete',
|
|
9
11
|
Query = 'Query',
|
|
10
12
|
Read = 'Read',
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
Subscribe = 'Subscribe',
|
|
14
|
+
Sync = 'Sync',
|
|
15
|
+
Write = 'Write'
|
|
14
16
|
}
|
|
@@ -75,7 +75,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
75
75
|
return;
|
|
76
76
|
} else if (messagesSubscribe.author !== undefined && messagesSubscribe.signaturePayload!.permissionGrantId !== undefined) {
|
|
77
77
|
const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, messagesSubscribe.signaturePayload!.permissionGrantId);
|
|
78
|
-
await MessagesGrantAuthorization.
|
|
78
|
+
await MessagesGrantAuthorization.authorizeSubscribeOrSync({
|
|
79
79
|
incomingMessage : messagesSubscribe.message,
|
|
80
80
|
expectedGrantor : tenant,
|
|
81
81
|
expectedGrantee : messagesSubscribe.author,
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { DidResolver } from '@enbox/dids';
|
|
2
|
+
import type { MessageStore } from '../types/message-store.js';
|
|
3
|
+
import type { MethodHandler } from '../types/method-handler.js';
|
|
4
|
+
import type { StateIndex } from '../types/state-index.js';
|
|
5
|
+
import type { MessagesSyncMessage, MessagesSyncReply } from '../types/messages-types.js';
|
|
6
|
+
|
|
7
|
+
import { authenticate } from '../core/auth.js';
|
|
8
|
+
import { hashToHex } from '../smt/smt-utils.js';
|
|
9
|
+
import { messageReplyFromError } from '../core/message-reply.js';
|
|
10
|
+
import { MessagesGrantAuthorization } from '../core/messages-grant-authorization.js';
|
|
11
|
+
import { MessagesSync } from '../interfaces/messages-sync.js';
|
|
12
|
+
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
13
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
export class MessagesSyncHandler implements MethodHandler {
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
private didResolver: DidResolver,
|
|
20
|
+
private messageStore: MessageStore,
|
|
21
|
+
private stateIndex: StateIndex,
|
|
22
|
+
) { }
|
|
23
|
+
|
|
24
|
+
public async handle({
|
|
25
|
+
tenant,
|
|
26
|
+
message
|
|
27
|
+
}: { tenant: string, message: MessagesSyncMessage }): Promise<MessagesSyncReply> {
|
|
28
|
+
let messagesSync: MessagesSync;
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
messagesSync = await MessagesSync.parse(message);
|
|
32
|
+
} catch (e) {
|
|
33
|
+
return messageReplyFromError(e, 400);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
await authenticate(message.authorization, this.didResolver);
|
|
38
|
+
await MessagesSyncHandler.authorizeMessagesSync(tenant, messagesSync, this.messageStore);
|
|
39
|
+
} catch (e) {
|
|
40
|
+
return messageReplyFromError(e, 401);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const { action, protocol, prefix } = message.descriptor;
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
switch (action) {
|
|
47
|
+
case 'root': {
|
|
48
|
+
const rootHash = protocol !== undefined
|
|
49
|
+
? await this.stateIndex.getProtocolRoot(tenant, protocol)
|
|
50
|
+
: await this.stateIndex.getRoot(tenant);
|
|
51
|
+
return {
|
|
52
|
+
status : { code: 200, detail: 'OK' },
|
|
53
|
+
root : hashToHex(rootHash),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
case 'subtree': {
|
|
58
|
+
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
|
|
59
|
+
const hash = protocol !== undefined
|
|
60
|
+
? await this.stateIndex.getProtocolSubtreeHash(tenant, protocol, bitPath)
|
|
61
|
+
: await this.stateIndex.getSubtreeHash(tenant, bitPath);
|
|
62
|
+
return {
|
|
63
|
+
status : { code: 200, detail: 'OK' },
|
|
64
|
+
hash : hashToHex(hash),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
case 'leaves': {
|
|
69
|
+
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
|
|
70
|
+
const leaves = protocol !== undefined
|
|
71
|
+
? await this.stateIndex.getProtocolLeaves(tenant, protocol, bitPath)
|
|
72
|
+
: await this.stateIndex.getLeaves(tenant, bitPath);
|
|
73
|
+
return {
|
|
74
|
+
status : { code: 200, detail: 'OK' },
|
|
75
|
+
entries : leaves,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
default: {
|
|
80
|
+
return {
|
|
81
|
+
status: { code: 400, detail: `Unknown action: ${action as string}` },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} catch (e) {
|
|
86
|
+
return messageReplyFromError(e, 500);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Parse a bit prefix string (e.g. "0110101") into a boolean array.
|
|
92
|
+
*/
|
|
93
|
+
private static parseBitPrefix(prefix: string): boolean[] {
|
|
94
|
+
if (!/^[01]*$/.test(prefix)) {
|
|
95
|
+
throw new DwnError(
|
|
96
|
+
DwnErrorCode.MessagesSyncInvalidPrefix,
|
|
97
|
+
`Invalid prefix: must contain only '0' and '1' characters, got: ${prefix}`
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
if (prefix.length > 256) {
|
|
101
|
+
throw new DwnError(
|
|
102
|
+
DwnErrorCode.MessagesSyncInvalidPrefix,
|
|
103
|
+
`Invalid prefix: length must be <= 256, got: ${prefix.length}`
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
return Array.from(prefix, (ch): boolean => ch === '1');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private static async authorizeMessagesSync(
|
|
110
|
+
tenant: string,
|
|
111
|
+
messagesSync: MessagesSync,
|
|
112
|
+
messageStore: MessageStore
|
|
113
|
+
): Promise<void> {
|
|
114
|
+
if (messagesSync.author === tenant) {
|
|
115
|
+
return;
|
|
116
|
+
} else if (messagesSync.author !== undefined && messagesSync.signaturePayload!.permissionGrantId !== undefined) {
|
|
117
|
+
const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, messagesSync.signaturePayload!.permissionGrantId);
|
|
118
|
+
await MessagesGrantAuthorization.authorizeSubscribeOrSync({
|
|
119
|
+
incomingMessage : messagesSync.message,
|
|
120
|
+
expectedGrantor : tenant,
|
|
121
|
+
expectedGrantee : messagesSync.author,
|
|
122
|
+
permissionGrant,
|
|
123
|
+
messageStore
|
|
124
|
+
});
|
|
125
|
+
} else {
|
|
126
|
+
throw new DwnError(DwnErrorCode.MessagesSyncAuthorizationFailed, 'message failed authorization');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { DidResolver } from '@enbox/dids';
|
|
2
|
-
import type { EventLog } from '../types/event-log.js';
|
|
3
2
|
import type { EventStream } from '../types/subscriptions.js';
|
|
4
3
|
import type { GenericMessageReply } from '../types/message-types.js';
|
|
5
4
|
import type { MessageStore } from '../types//message-store.js';
|
|
6
5
|
import type { MethodHandler } from '../types/method-handler.js';
|
|
7
|
-
import type {
|
|
6
|
+
import type { StateIndex } from '../types/state-index.js';
|
|
7
|
+
import type { ProtocolDefinition, ProtocolsConfigureMessage } from '../types/protocols-types.js';
|
|
8
8
|
|
|
9
9
|
import { authenticate } from '../core/auth.js';
|
|
10
10
|
import { Message } from '../core/message.js';
|
|
@@ -14,13 +14,14 @@ import { ProtocolsConfigure } from '../interfaces/protocols-configure.js';
|
|
|
14
14
|
import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
|
|
15
15
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
16
16
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
17
|
+
import { getRuleSetAtPath, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
17
18
|
|
|
18
19
|
export class ProtocolsConfigureHandler implements MethodHandler {
|
|
19
20
|
|
|
20
21
|
constructor(
|
|
21
22
|
private didResolver: DidResolver,
|
|
22
23
|
private messageStore: MessageStore,
|
|
23
|
-
private
|
|
24
|
+
private stateIndex: StateIndex,
|
|
24
25
|
private eventStream?: EventStream
|
|
25
26
|
) { }
|
|
26
27
|
|
|
@@ -43,6 +44,16 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
43
44
|
return messageReplyFromError(e, 401);
|
|
44
45
|
}
|
|
45
46
|
|
|
47
|
+
// validate composition dependencies: all `uses` protocols must already be installed,
|
|
48
|
+
// `$ref` paths must exist in the referenced protocols, and cross-protocol roles must exist.
|
|
49
|
+
try {
|
|
50
|
+
await ProtocolsConfigureHandler.validateCompositionDependencies(
|
|
51
|
+
tenant, message.descriptor.definition, this.messageStore
|
|
52
|
+
);
|
|
53
|
+
} catch (e) {
|
|
54
|
+
return messageReplyFromError(e, 400);
|
|
55
|
+
}
|
|
56
|
+
|
|
46
57
|
// attempt to get existing protocol
|
|
47
58
|
const query = {
|
|
48
59
|
interface : DwnInterfaceName.Protocols,
|
|
@@ -62,11 +73,11 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
62
73
|
// write the incoming message to DB if incoming message is newest
|
|
63
74
|
let messageReply: GenericMessageReply;
|
|
64
75
|
if (incomingMessageIsNewest) {
|
|
65
|
-
const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure);
|
|
76
|
+
const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, true);
|
|
66
77
|
|
|
67
78
|
await this.messageStore.put(tenant, message, indexes);
|
|
68
79
|
const messageCid = await Message.getCid(message);
|
|
69
|
-
await this.
|
|
80
|
+
await this.stateIndex.insert(tenant, messageCid, indexes);
|
|
70
81
|
|
|
71
82
|
// only emit if the event stream is set
|
|
72
83
|
if (this.eventStream !== undefined) {
|
|
@@ -77,28 +88,35 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
77
88
|
status: { code: 202, detail: 'Accepted' }
|
|
78
89
|
};
|
|
79
90
|
} else {
|
|
91
|
+
// incoming message is older — still store it as a historical version (not the latest)
|
|
92
|
+
const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, false);
|
|
93
|
+
|
|
94
|
+
await this.messageStore.put(tenant, message, indexes);
|
|
95
|
+
const messageCid = await Message.getCid(message);
|
|
96
|
+
await this.stateIndex.insert(tenant, messageCid, indexes);
|
|
97
|
+
|
|
80
98
|
messageReply = {
|
|
81
|
-
status: { code:
|
|
99
|
+
status: { code: 202, detail: 'Accepted' }
|
|
82
100
|
};
|
|
83
101
|
}
|
|
84
102
|
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
for (const
|
|
88
|
-
if (
|
|
89
|
-
const
|
|
90
|
-
|
|
103
|
+
// re-index previously-latest messages as no longer the latest base state.
|
|
104
|
+
// We must delete and re-put (not just put) to properly replace old index entries.
|
|
105
|
+
for (const existingMessage of existingMessages) {
|
|
106
|
+
if (existingMessage !== newestMessage) {
|
|
107
|
+
const existingProtocolsConfigure = await ProtocolsConfigure.parse(existingMessage as ProtocolsConfigureMessage);
|
|
108
|
+
const updatedIndexes = ProtocolsConfigureHandler.constructIndexes(existingProtocolsConfigure, false);
|
|
109
|
+
const existingCid = await Message.getCid(existingMessage);
|
|
91
110
|
|
|
92
|
-
await this.messageStore.delete(tenant,
|
|
111
|
+
await this.messageStore.delete(tenant, existingCid);
|
|
112
|
+
await this.messageStore.put(tenant, existingMessage, updatedIndexes);
|
|
93
113
|
}
|
|
94
114
|
}
|
|
95
115
|
|
|
96
|
-
await this.eventLog.deleteEventsByCid(tenant, deletedMessageCids);
|
|
97
|
-
|
|
98
116
|
return messageReply;
|
|
99
117
|
};
|
|
100
118
|
|
|
101
|
-
static constructIndexes(protocolsConfigure: ProtocolsConfigure): { [key: string]: string | boolean } {
|
|
119
|
+
static constructIndexes(protocolsConfigure: ProtocolsConfigure, isLatestBaseState: boolean): { [key: string]: string | boolean } {
|
|
102
120
|
// strip out `definition` as it is not indexable
|
|
103
121
|
const { definition, ...propertiesToIndex } = protocolsConfigure.message.descriptor;
|
|
104
122
|
const { author } = protocolsConfigure;
|
|
@@ -107,7 +125,8 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
107
125
|
...propertiesToIndex,
|
|
108
126
|
author : author!,
|
|
109
127
|
protocol : definition.protocol, // retain protocol url from `definition`,
|
|
110
|
-
published : definition.published // retain published state from definition
|
|
128
|
+
published : definition.published, // retain published state from definition
|
|
129
|
+
isLatestBaseState,
|
|
111
130
|
};
|
|
112
131
|
|
|
113
132
|
return indexes;
|
|
@@ -134,4 +153,163 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
134
153
|
throw new DwnError(DwnErrorCode.ProtocolsConfigureAuthorizationFailed, 'message failed authorization');
|
|
135
154
|
}
|
|
136
155
|
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Validates composition dependencies at install time:
|
|
159
|
+
* 1. All `uses` protocols must already be installed for the tenant.
|
|
160
|
+
* 2. Each `$ref` path must exist in the referenced protocol's structure.
|
|
161
|
+
* 3. Cross-protocol role references must point to valid role paths in the referenced protocol.
|
|
162
|
+
*
|
|
163
|
+
* This is a no-op if the protocol definition has no `uses` map.
|
|
164
|
+
*/
|
|
165
|
+
private static async validateCompositionDependencies(
|
|
166
|
+
tenant: string, definition: ProtocolDefinition, messageStore: MessageStore
|
|
167
|
+
): Promise<void> {
|
|
168
|
+
const { uses } = definition;
|
|
169
|
+
if (uses === undefined) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Fetch all referenced protocol definitions
|
|
174
|
+
const referencedDefinitions = new Map<string, ProtocolDefinition>();
|
|
175
|
+
for (const alias in uses) {
|
|
176
|
+
const protocolUri = uses[alias];
|
|
177
|
+
const refDefinition = await ProtocolsConfigureHandler.fetchInstalledProtocolDefinition(tenant, protocolUri, messageStore);
|
|
178
|
+
|
|
179
|
+
if (refDefinition === undefined) {
|
|
180
|
+
throw new DwnError(
|
|
181
|
+
DwnErrorCode.ProtocolsConfigureComposedProtocolNotInstalled,
|
|
182
|
+
`composed protocol '${protocolUri}' (alias '${alias}') is not installed for tenant '${tenant}'.`
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
referencedDefinitions.set(alias, refDefinition);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Walk the structure and validate all $ref paths and cross-protocol role references
|
|
190
|
+
ProtocolsConfigureHandler.validateRefsAndRolesRecursively(definition.structure, '', referencedDefinitions);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Fetches the latest installed protocol definition for the given protocol URI.
|
|
195
|
+
* @returns The protocol definition, or `undefined` if not installed.
|
|
196
|
+
*/
|
|
197
|
+
private static async fetchInstalledProtocolDefinition(
|
|
198
|
+
tenant: string, protocolUri: string, messageStore: MessageStore
|
|
199
|
+
): Promise<ProtocolDefinition | undefined> {
|
|
200
|
+
const query = {
|
|
201
|
+
interface : DwnInterfaceName.Protocols,
|
|
202
|
+
method : DwnMethodName.Configure,
|
|
203
|
+
protocol : protocolUri,
|
|
204
|
+
isLatestBaseState : true
|
|
205
|
+
};
|
|
206
|
+
const { messages } = await messageStore.query(tenant, [query]);
|
|
207
|
+
|
|
208
|
+
if (messages.length === 0) {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return (messages[0] as ProtocolsConfigureMessage).descriptor.definition;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Recursively walks the structure tree to validate:
|
|
217
|
+
* - `$ref` type paths exist in the referenced protocol's structure
|
|
218
|
+
* - Cross-protocol `role` references point to valid `$role: true` paths in the referenced protocol
|
|
219
|
+
*/
|
|
220
|
+
private static validateRefsAndRolesRecursively(
|
|
221
|
+
ruleSet: { [key: string]: any },
|
|
222
|
+
protocolPath: string,
|
|
223
|
+
referencedDefinitions: Map<string, ProtocolDefinition>
|
|
224
|
+
): void {
|
|
225
|
+
for (const key in ruleSet) {
|
|
226
|
+
if (key.startsWith('$')) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const childRuleSet = ruleSet[key];
|
|
231
|
+
const childProtocolPath = protocolPath === '' ? key : `${protocolPath}/${key}`;
|
|
232
|
+
|
|
233
|
+
// Validate $ref path exists in the referenced protocol
|
|
234
|
+
if (childRuleSet.$ref !== undefined) {
|
|
235
|
+
const parsed = parseCrossProtocolRef(childRuleSet.$ref);
|
|
236
|
+
if (parsed !== undefined) {
|
|
237
|
+
const refDefinition = referencedDefinitions.get(parsed.alias);
|
|
238
|
+
if (refDefinition === undefined) {
|
|
239
|
+
// Defensive: alias was validated by validateRefNode() and definition was fetched by validateCompositionDependencies()
|
|
240
|
+
throw new DwnError(
|
|
241
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
|
|
242
|
+
`'$ref' alias '${parsed.alias}' at protocol path '${childProtocolPath}' ` +
|
|
243
|
+
`was not found in the referenced definitions map.`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const targetRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
|
|
248
|
+
if (targetRuleSet === undefined) {
|
|
249
|
+
throw new DwnError(
|
|
250
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefProtocolPath,
|
|
251
|
+
`'$ref' at protocol path '${childProtocolPath}' references type path '${parsed.protocolPath}' ` +
|
|
252
|
+
`which does not exist in protocol '${refDefinition.protocol}'.`
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Validate cross-protocol references in $actions (roles and `of` paths)
|
|
259
|
+
const actionRules = childRuleSet.$actions ?? [];
|
|
260
|
+
for (const actionRule of actionRules) {
|
|
261
|
+
// Validate cross-protocol role references
|
|
262
|
+
if (actionRule.role !== undefined) {
|
|
263
|
+
const parsed = parseCrossProtocolRef(actionRule.role);
|
|
264
|
+
if (parsed !== undefined) {
|
|
265
|
+
const refDefinition = referencedDefinitions.get(parsed.alias);
|
|
266
|
+
if (refDefinition === undefined) {
|
|
267
|
+
throw new DwnError(
|
|
268
|
+
DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole,
|
|
269
|
+
`cross-protocol role alias '${parsed.alias}' in '${actionRule.role}' at protocol path '${childProtocolPath}' ` +
|
|
270
|
+
`was not found in the referenced definitions map.`
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Check that the role path exists and is marked $role: true in the referenced protocol
|
|
275
|
+
const roleRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
|
|
276
|
+
if (roleRuleSet === undefined || !roleRuleSet.$role) {
|
|
277
|
+
throw new DwnError(
|
|
278
|
+
DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole,
|
|
279
|
+
`cross-protocol role '${actionRule.role}' at protocol path '${childProtocolPath}' ` +
|
|
280
|
+
`does not point to a valid role ($role: true) in protocol '${refDefinition.protocol}'.`
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Validate cross-protocol `of` references: the path must exist in the referenced protocol's structure
|
|
287
|
+
if (actionRule.of !== undefined) {
|
|
288
|
+
const parsed = parseCrossProtocolRef(actionRule.of);
|
|
289
|
+
if (parsed !== undefined) {
|
|
290
|
+
const refDefinition = referencedDefinitions.get(parsed.alias);
|
|
291
|
+
if (refDefinition === undefined) {
|
|
292
|
+
throw new DwnError(
|
|
293
|
+
DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf,
|
|
294
|
+
`cross-protocol 'of' alias '${parsed.alias}' in '${actionRule.of}' at protocol path '${childProtocolPath}' ` +
|
|
295
|
+
`was not found in the referenced definitions map.`
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const ofRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
|
|
300
|
+
if (ofRuleSet === undefined) {
|
|
301
|
+
throw new DwnError(
|
|
302
|
+
DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf,
|
|
303
|
+
`cross-protocol 'of' reference '${actionRule.of}' at protocol path '${childProtocolPath}' ` +
|
|
304
|
+
`does not point to a valid type path in protocol '${refDefinition.protocol}'.`
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Recurse into children
|
|
312
|
+
ProtocolsConfigureHandler.validateRefsAndRolesRecursively(childRuleSet, childProtocolPath, referencedDefinitions);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
137
315
|
}
|
|
@@ -52,8 +52,9 @@ export class ProtocolsQueryHandler implements MethodHandler {
|
|
|
52
52
|
|
|
53
53
|
const query = {
|
|
54
54
|
...message.descriptor.filter,
|
|
55
|
-
interface
|
|
56
|
-
method
|
|
55
|
+
interface : DwnInterfaceName.Protocols,
|
|
56
|
+
method : DwnMethodName.Configure,
|
|
57
|
+
isLatestBaseState : true,
|
|
57
58
|
};
|
|
58
59
|
removeUndefinedProperties(query);
|
|
59
60
|
|
|
@@ -72,9 +73,10 @@ export class ProtocolsQueryHandler implements MethodHandler {
|
|
|
72
73
|
// fetch all published `ProtocolConfigure` matching the query
|
|
73
74
|
const filter = {
|
|
74
75
|
...protocolsQuery.message.descriptor.filter,
|
|
75
|
-
interface
|
|
76
|
-
method
|
|
77
|
-
published
|
|
76
|
+
interface : DwnInterfaceName.Protocols,
|
|
77
|
+
method : DwnMethodName.Configure,
|
|
78
|
+
published : true,
|
|
79
|
+
isLatestBaseState : true,
|
|
78
80
|
};
|
|
79
81
|
const { messages: publishedProtocolsConfigure } = await this.messageStore.query(tenant, [ filter ]);
|
|
80
82
|
return publishedProtocolsConfigure as ProtocolsConfigureMessage[];
|