@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
|
@@ -7,11 +7,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import chaiAsPromised from 'chai-as-promised';
|
|
11
10
|
import sinon from 'sinon';
|
|
12
|
-
import
|
|
13
|
-
import friendRoleProtocolDefinition from '../vectors/protocol-definitions/friend-role.json'
|
|
14
|
-
import threadRoleProtocolDefinition from '../vectors/protocol-definitions/thread-role.json'
|
|
11
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
12
|
+
import friendRoleProtocolDefinition from '../vectors/protocol-definitions/friend-role.json' with { type: 'json' };
|
|
13
|
+
import threadRoleProtocolDefinition from '../vectors/protocol-definitions/thread-role.json' with { type: 'json' };
|
|
15
14
|
import { Jws } from '../../src/utils/jws.js';
|
|
16
15
|
import { Message } from '../../src/core/message.js';
|
|
17
16
|
import { Poller } from '../utils/poller.js';
|
|
@@ -23,7 +22,6 @@ import { TestStores } from '../test-stores.js';
|
|
|
23
22
|
import { TestStubGenerator } from '../utils/test-stub-generator.js';
|
|
24
23
|
import { DidKey, UniversalResolver } from '@enbox/dids';
|
|
25
24
|
import { Dwn, DwnErrorCode, DwnMethodName, EventEmitterStream, MessageStoreLevel, Time } from '../../src/index.js';
|
|
26
|
-
chai.use(chaiAsPromised);
|
|
27
25
|
export function testRecordsSubscribeHandler() {
|
|
28
26
|
describe('RecordsSubscribeHandler.handle()', () => {
|
|
29
27
|
describe('EventStream disabled', () => {
|
|
@@ -31,23 +29,23 @@ export function testRecordsSubscribeHandler() {
|
|
|
31
29
|
let messageStore;
|
|
32
30
|
let resumableTaskStore;
|
|
33
31
|
let dataStore;
|
|
34
|
-
let
|
|
32
|
+
let stateIndex;
|
|
35
33
|
let dwn;
|
|
36
34
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
37
35
|
// so that different test suites can reuse the same backend store for testing
|
|
38
|
-
|
|
36
|
+
beforeAll(() => __awaiter(this, void 0, void 0, function* () {
|
|
39
37
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
40
38
|
const stores = TestStores.get();
|
|
41
39
|
messageStore = stores.messageStore;
|
|
42
40
|
dataStore = stores.dataStore;
|
|
43
41
|
resumableTaskStore = stores.resumableTaskStore;
|
|
44
|
-
|
|
42
|
+
stateIndex = stores.stateIndex;
|
|
45
43
|
dwn = yield Dwn.create({
|
|
46
44
|
didResolver,
|
|
47
45
|
messageStore,
|
|
48
46
|
dataStore,
|
|
49
47
|
resumableTaskStore,
|
|
50
|
-
|
|
48
|
+
stateIndex,
|
|
51
49
|
});
|
|
52
50
|
}));
|
|
53
51
|
beforeEach(() => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -56,22 +54,22 @@ export function testRecordsSubscribeHandler() {
|
|
|
56
54
|
yield messageStore.clear();
|
|
57
55
|
yield dataStore.clear();
|
|
58
56
|
yield resumableTaskStore.clear();
|
|
59
|
-
yield
|
|
57
|
+
yield stateIndex.clear();
|
|
60
58
|
}));
|
|
61
|
-
|
|
59
|
+
afterAll(() => __awaiter(this, void 0, void 0, function* () {
|
|
62
60
|
yield dwn.close();
|
|
63
61
|
}));
|
|
64
62
|
it('should respond with a 501 if subscriptions are not supported', () => __awaiter(this, void 0, void 0, function* () {
|
|
65
63
|
yield dwn.close(); // close the original dwn instance
|
|
66
|
-
dwn = yield Dwn.create({ didResolver, messageStore, dataStore,
|
|
64
|
+
dwn = yield Dwn.create({ didResolver, messageStore, dataStore, stateIndex, resumableTaskStore }); // leave out eventStream
|
|
67
65
|
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
68
66
|
// attempt to subscribe
|
|
69
67
|
const { message } = yield TestDataGenerator.generateRecordsSubscribe({
|
|
70
68
|
author: alice,
|
|
71
69
|
});
|
|
72
70
|
const subscriptionMessageReply = yield dwn.processMessage(alice.did, message, { subscriptionHandler: (_) => { } });
|
|
73
|
-
expect(subscriptionMessageReply.status.code).
|
|
74
|
-
expect(subscriptionMessageReply.status.detail).
|
|
71
|
+
expect(subscriptionMessageReply.status.code).toBe(501, subscriptionMessageReply.status.detail);
|
|
72
|
+
expect(subscriptionMessageReply.status.detail).toContain(DwnErrorCode.RecordsSubscribeEventStreamUnimplemented);
|
|
75
73
|
}));
|
|
76
74
|
});
|
|
77
75
|
describe('functional tests', () => {
|
|
@@ -79,20 +77,20 @@ export function testRecordsSubscribeHandler() {
|
|
|
79
77
|
let messageStore;
|
|
80
78
|
let dataStore;
|
|
81
79
|
let resumableTaskStore;
|
|
82
|
-
let
|
|
80
|
+
let stateIndex;
|
|
83
81
|
let eventStream;
|
|
84
82
|
let dwn;
|
|
85
83
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
86
84
|
// so that different test suites can reuse the same backend store for testing
|
|
87
|
-
|
|
85
|
+
beforeAll(() => __awaiter(this, void 0, void 0, function* () {
|
|
88
86
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
89
87
|
const stores = TestStores.get();
|
|
90
88
|
messageStore = stores.messageStore;
|
|
91
89
|
dataStore = stores.dataStore;
|
|
92
90
|
resumableTaskStore = stores.resumableTaskStore;
|
|
93
|
-
|
|
91
|
+
stateIndex = stores.stateIndex;
|
|
94
92
|
eventStream = TestEventStream.get();
|
|
95
|
-
dwn = yield Dwn.create({ didResolver, messageStore, dataStore,
|
|
93
|
+
dwn = yield Dwn.create({ didResolver, messageStore, dataStore, stateIndex, eventStream, resumableTaskStore });
|
|
96
94
|
}));
|
|
97
95
|
beforeEach(() => __awaiter(this, void 0, void 0, function* () {
|
|
98
96
|
sinon.restore(); // wipe all previous stubs/spies/mocks/fakes
|
|
@@ -100,9 +98,9 @@ export function testRecordsSubscribeHandler() {
|
|
|
100
98
|
yield messageStore.clear();
|
|
101
99
|
yield dataStore.clear();
|
|
102
100
|
yield resumableTaskStore.clear();
|
|
103
|
-
yield
|
|
101
|
+
yield stateIndex.clear();
|
|
104
102
|
}));
|
|
105
|
-
|
|
103
|
+
afterAll(() => __awaiter(this, void 0, void 0, function* () {
|
|
106
104
|
yield dwn.close();
|
|
107
105
|
}));
|
|
108
106
|
it('should return a subscription object', () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -113,8 +111,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
113
111
|
});
|
|
114
112
|
// Send records subscribe message
|
|
115
113
|
const reply = yield dwn.processMessage(alice.did, recordsSubscribe.message, { subscriptionHandler: () => { } });
|
|
116
|
-
expect(reply.status.code).
|
|
117
|
-
expect(reply.subscription).
|
|
114
|
+
expect(reply.status.code).toBe(200);
|
|
115
|
+
expect(reply.subscription).toBeDefined();
|
|
118
116
|
}));
|
|
119
117
|
it('should return 400 if protocol is not normalized', () => __awaiter(this, void 0, void 0, function* () {
|
|
120
118
|
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
@@ -132,8 +130,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
132
130
|
});
|
|
133
131
|
// Send records subscribe message
|
|
134
132
|
const reply = yield dwn.processMessage(alice.did, recordsSubscribe.message);
|
|
135
|
-
expect(reply.status.code).
|
|
136
|
-
expect(reply.status.detail).
|
|
133
|
+
expect(reply.status.code).toBe(400);
|
|
134
|
+
expect(reply.status.detail).toContain(DwnErrorCode.UrlProtocolNotNormalized);
|
|
137
135
|
}));
|
|
138
136
|
it('should return 400 if schema is not normalized', () => __awaiter(this, void 0, void 0, function* () {
|
|
139
137
|
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
@@ -151,8 +149,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
151
149
|
});
|
|
152
150
|
// Send records subscribe message
|
|
153
151
|
const reply = yield dwn.processMessage(alice.did, recordsSubscribe.message);
|
|
154
|
-
expect(reply.status.code).
|
|
155
|
-
expect(reply.status.detail).
|
|
152
|
+
expect(reply.status.code).toBe(400);
|
|
153
|
+
expect(reply.status.detail).toContain(DwnErrorCode.UrlSchemaNotNormalized);
|
|
156
154
|
}));
|
|
157
155
|
it('should return 400 if published is set to false and a datePublished range is provided', () => __awaiter(this, void 0, void 0, function* () {
|
|
158
156
|
const fromDatePublished = Time.getCurrentTimestamp();
|
|
@@ -165,26 +163,26 @@ export function testRecordsSubscribeHandler() {
|
|
|
165
163
|
// set to false
|
|
166
164
|
recordSubscribe.message.descriptor.filter.published = false;
|
|
167
165
|
const subscribeResponse = yield dwn.processMessage(alice.did, recordSubscribe.message);
|
|
168
|
-
expect(subscribeResponse.status.code).
|
|
169
|
-
expect(subscribeResponse.status.detail).
|
|
166
|
+
expect(subscribeResponse.status.code).toBe(400);
|
|
167
|
+
expect(subscribeResponse.status.detail).toContain('descriptor/filter/published: must be equal to one of the allowed values');
|
|
170
168
|
}));
|
|
171
169
|
it('should return 401 for anonymous subscriptions that filter explicitly for unpublished records', () => __awaiter(this, void 0, void 0, function* () {
|
|
172
170
|
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
173
171
|
// create an unpublished record
|
|
174
172
|
const draftWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'post' });
|
|
175
173
|
const draftWriteReply = yield dwn.processMessage(alice.did, draftWrite.message, { dataStream: draftWrite.dataStream });
|
|
176
|
-
expect(draftWriteReply.status.code).
|
|
174
|
+
expect(draftWriteReply.status.code).toBe(202);
|
|
177
175
|
// validate that alice can subscribe
|
|
178
176
|
const unpublishedPostSubscribe = yield TestDataGenerator.generateRecordsSubscribe({ author: alice, filter: { schema: 'post', published: false } });
|
|
179
177
|
const unpublishedPostReply = yield dwn.processMessage(alice.did, unpublishedPostSubscribe.message, { subscriptionHandler: () => { } });
|
|
180
|
-
expect(unpublishedPostReply.status.code).
|
|
181
|
-
expect(unpublishedPostReply.subscription).
|
|
178
|
+
expect(unpublishedPostReply.status.code).toBe(200);
|
|
179
|
+
expect(unpublishedPostReply.subscription).toBeDefined();
|
|
182
180
|
// anonymous subscribe for unpublished records
|
|
183
181
|
const unpublishedAnonymous = yield RecordsSubscribe.create({ filter: { schema: 'post', published: false } });
|
|
184
182
|
const anonymousPostReply = yield dwn.processMessage(alice.did, unpublishedAnonymous.message);
|
|
185
|
-
expect(anonymousPostReply.status.code).
|
|
186
|
-
expect(anonymousPostReply.status.detail).
|
|
187
|
-
expect(anonymousPostReply.subscription).
|
|
183
|
+
expect(anonymousPostReply.status.code).toBe(401);
|
|
184
|
+
expect(anonymousPostReply.status.detail).toContain('Missing JWS');
|
|
185
|
+
expect(anonymousPostReply.subscription).toBeUndefined();
|
|
188
186
|
}));
|
|
189
187
|
it('should return 401 if signature check fails', () => __awaiter(this, void 0, void 0, function* () {
|
|
190
188
|
const { author, message } = yield TestDataGenerator.generateRecordsSubscribe();
|
|
@@ -197,7 +195,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
197
195
|
const eventStreamStub = sinon.createStubInstance(EventEmitterStream);
|
|
198
196
|
const recordsSubscribeHandler = new RecordsSubscribeHandler(didResolver, messageStoreStub, eventStreamStub);
|
|
199
197
|
const reply = yield recordsSubscribeHandler.handle({ tenant, message, subscriptionHandler: () => { } });
|
|
200
|
-
expect(reply.status.code).
|
|
198
|
+
expect(reply.status.code).toBe(401);
|
|
201
199
|
}));
|
|
202
200
|
it('should return 400 if fail parsing the message', () => __awaiter(this, void 0, void 0, function* () {
|
|
203
201
|
const { author, message } = yield TestDataGenerator.generateRecordsSubscribe();
|
|
@@ -210,7 +208,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
210
208
|
// stub the `parse()` function to throw an error
|
|
211
209
|
sinon.stub(RecordsSubscribe, 'parse').throws('anyError');
|
|
212
210
|
const reply = yield recordsSubscribeHandler.handle({ tenant, message, subscriptionHandler: () => { } });
|
|
213
|
-
expect(reply.status.code).
|
|
211
|
+
expect(reply.status.code).toBe(400);
|
|
214
212
|
}));
|
|
215
213
|
describe('protocol based subscriptions', () => {
|
|
216
214
|
it('does not try protocol authorization if protocolRole is not invoked', () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -228,7 +226,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
228
226
|
protocolDefinition
|
|
229
227
|
});
|
|
230
228
|
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
231
|
-
expect(protocolsConfigureReply.status.code).
|
|
229
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
232
230
|
const bobMessages = [];
|
|
233
231
|
const handleForBob = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
234
232
|
const { message } = event;
|
|
@@ -243,8 +241,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
243
241
|
}
|
|
244
242
|
});
|
|
245
243
|
const subscriptionReply = yield dwn.processMessage(alice.did, bobSubscription.message, { subscriptionHandler: handleForBob });
|
|
246
|
-
expect(subscriptionReply.status.code).
|
|
247
|
-
expect(subscriptionReply.subscription).
|
|
244
|
+
expect(subscriptionReply.status.code).toBe(200);
|
|
245
|
+
expect(subscriptionReply.subscription).toBeDefined();
|
|
248
246
|
const carolMessages = [];
|
|
249
247
|
const handleForCarol = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
250
248
|
const { message } = event;
|
|
@@ -259,8 +257,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
259
257
|
}
|
|
260
258
|
});
|
|
261
259
|
const carolSubscriptionReply = yield dwn.processMessage(alice.did, carolSubscription.message, { subscriptionHandler: handleForCarol });
|
|
262
|
-
expect(carolSubscriptionReply.status.code).
|
|
263
|
-
expect(carolSubscriptionReply.subscription).
|
|
260
|
+
expect(carolSubscriptionReply.status.code).toBe(200);
|
|
261
|
+
expect(carolSubscriptionReply.subscription).toBeDefined();
|
|
264
262
|
// Alice writes a 'thread' record
|
|
265
263
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
266
264
|
author: alice,
|
|
@@ -268,7 +266,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
268
266
|
protocolPath: 'thread',
|
|
269
267
|
});
|
|
270
268
|
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
271
|
-
expect(threadRoleReply.status.code).
|
|
269
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
272
270
|
// Alice writes one 'chat' record addressed to Bob
|
|
273
271
|
const chatRecordForBob = yield TestDataGenerator.generateRecordsWrite({
|
|
274
272
|
author: alice,
|
|
@@ -280,7 +278,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
280
278
|
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
281
279
|
});
|
|
282
280
|
const chatRecordForBobReply = yield dwn.processMessage(alice.did, chatRecordForBob.message, { dataStream: chatRecordForBob.dataStream });
|
|
283
|
-
expect(chatRecordForBobReply.status.code).
|
|
281
|
+
expect(chatRecordForBobReply.status.code).toBe(202);
|
|
284
282
|
const chatRecordForBobCid = yield Message.getCid(chatRecordForBob.message);
|
|
285
283
|
// Alice writes two 'chat' records addressed to Carol
|
|
286
284
|
const chatRecordForCarol1 = yield TestDataGenerator.generateRecordsWrite({
|
|
@@ -293,7 +291,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
293
291
|
data: new TextEncoder().encode('Bob cannot read this'),
|
|
294
292
|
});
|
|
295
293
|
const chatRecordForCarol1Reply = yield dwn.processMessage(alice.did, chatRecordForCarol1.message, { dataStream: chatRecordForCarol1.dataStream });
|
|
296
|
-
expect(chatRecordForCarol1Reply.status.code).
|
|
294
|
+
expect(chatRecordForCarol1Reply.status.code).toBe(202);
|
|
297
295
|
const chatRecordForCarol1Cid = yield Message.getCid(chatRecordForCarol1.message);
|
|
298
296
|
const chatRecordForCarol2 = yield TestDataGenerator.generateRecordsWrite({
|
|
299
297
|
author: alice,
|
|
@@ -305,15 +303,15 @@ export function testRecordsSubscribeHandler() {
|
|
|
305
303
|
data: new TextEncoder().encode('Bob cannot read this either'),
|
|
306
304
|
});
|
|
307
305
|
const chatRecordForCarol2Reply = yield dwn.processMessage(alice.did, chatRecordForCarol2.message, { dataStream: chatRecordForCarol2.dataStream });
|
|
308
|
-
expect(chatRecordForCarol2Reply.status.code).
|
|
306
|
+
expect(chatRecordForCarol2Reply.status.code).toBe(202);
|
|
309
307
|
const chatRecordForCarol2Cid = yield Message.getCid(chatRecordForCarol2.message);
|
|
310
308
|
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
311
|
-
expect(bobMessages.length).
|
|
312
|
-
expect(bobMessages).
|
|
309
|
+
expect(bobMessages.length).toBe(1);
|
|
310
|
+
expect(bobMessages).toEqual(expect.arrayContaining([chatRecordForBobCid]));
|
|
313
311
|
}));
|
|
314
312
|
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
315
|
-
expect(carolMessages.length).
|
|
316
|
-
expect(carolMessages).
|
|
313
|
+
expect(carolMessages.length).toBe(2);
|
|
314
|
+
expect(carolMessages).toEqual(expect.arrayContaining([chatRecordForCarol1Cid, chatRecordForCarol2Cid]));
|
|
317
315
|
}));
|
|
318
316
|
}));
|
|
319
317
|
it('allows root-level role authorized subscriptions', () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -328,7 +326,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
328
326
|
protocolDefinition
|
|
329
327
|
});
|
|
330
328
|
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
331
|
-
expect(protocolsConfigureReply.status.code).
|
|
329
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
332
330
|
const filter = {
|
|
333
331
|
protocol: protocolDefinition.protocol,
|
|
334
332
|
protocolPath: 'chat'
|
|
@@ -350,8 +348,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
350
348
|
filter
|
|
351
349
|
});
|
|
352
350
|
const subscriptionReply = yield dwn.processMessage(alice.did, noRoleSubscription.message, { subscriptionHandler: addNoRole });
|
|
353
|
-
expect(subscriptionReply.status.code).
|
|
354
|
-
expect(subscriptionReply.subscription).
|
|
351
|
+
expect(subscriptionReply.status.code).toBe(200);
|
|
352
|
+
expect(subscriptionReply.subscription).toBeDefined();
|
|
355
353
|
// Alice writes a 'friend' root-level role record with Bob as recipient
|
|
356
354
|
const friendRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
357
355
|
author: alice,
|
|
@@ -361,7 +359,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
361
359
|
data: new TextEncoder().encode('Bob is my friend'),
|
|
362
360
|
});
|
|
363
361
|
const friendRoleReply = yield dwn.processMessage(alice.did, friendRoleRecord.message, { dataStream: friendRoleRecord.dataStream });
|
|
364
|
-
expect(friendRoleReply.status.code).
|
|
362
|
+
expect(friendRoleReply.status.code).toBe(202);
|
|
365
363
|
const recordIds = new Set();
|
|
366
364
|
const addRecord = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
367
365
|
const { message } = event;
|
|
@@ -380,8 +378,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
380
378
|
protocolRole: 'friend',
|
|
381
379
|
});
|
|
382
380
|
const subscriptionWithRoleReply = yield dwn.processMessage(alice.did, bobSubscriptionWithRole.message, { subscriptionHandler: addRecord });
|
|
383
|
-
expect(subscriptionWithRoleReply.status.code).
|
|
384
|
-
expect(subscriptionWithRoleReply.subscription).
|
|
381
|
+
expect(subscriptionWithRoleReply.status.code).toBe(200);
|
|
382
|
+
expect(subscriptionWithRoleReply.subscription).toBeDefined();
|
|
385
383
|
// Create one chat message for Bob as a control to show up in the `noRoleRecords` array
|
|
386
384
|
const chatRecordForBob = yield TestDataGenerator.generateRecordsWrite({
|
|
387
385
|
author: alice,
|
|
@@ -392,7 +390,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
392
390
|
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
393
391
|
});
|
|
394
392
|
const chatRecordForBobReply = yield dwn.processMessage(alice.did, chatRecordForBob.message, { dataStream: chatRecordForBob.dataStream });
|
|
395
|
-
expect(chatRecordForBobReply.status.code).
|
|
393
|
+
expect(chatRecordForBobReply.status.code).toBe(202);
|
|
396
394
|
// Alice writes three more 'chat' records for carol, Bob's friend role should allow him to see these messages.
|
|
397
395
|
const chatRecordIds = [];
|
|
398
396
|
for (let i = 0; i < 3; i++) {
|
|
@@ -405,20 +403,20 @@ export function testRecordsSubscribeHandler() {
|
|
|
405
403
|
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
406
404
|
});
|
|
407
405
|
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
408
|
-
expect(chatReply.status.code).
|
|
406
|
+
expect(chatReply.status.code).toBe(202);
|
|
409
407
|
chatRecordIds.push(chatRecord.message.recordId);
|
|
410
408
|
}
|
|
411
409
|
// there should only be the control message for bob in the subscription without a friend role.
|
|
412
410
|
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
413
|
-
expect(noRoleRecords.size).
|
|
414
|
-
expect([...noRoleRecords]).
|
|
411
|
+
expect(noRoleRecords.size).toBe(1);
|
|
412
|
+
expect([...noRoleRecords]).toEqual(expect.arrayContaining([chatRecordForBob.message.recordId]));
|
|
415
413
|
}));
|
|
416
414
|
// All chats should be in the subscription with the friend role.
|
|
417
415
|
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
418
|
-
expect(recordIds.size).
|
|
419
|
-
expect([...recordIds]).
|
|
416
|
+
expect(recordIds.size).toBe(4);
|
|
417
|
+
expect([...recordIds]).toEqual(expect.arrayContaining([chatRecordForBob.message.recordId, ...chatRecordIds]));
|
|
420
418
|
}));
|
|
421
|
-
// TODO: https://github.com/
|
|
419
|
+
// TODO: https://github.com/enboxorg/enbox/issues/759
|
|
422
420
|
// When `RecordsSubscribeHandler` builds up the matchFilters there are no matching filters for a delete within a context
|
|
423
421
|
// so the delete event is not being captured by the subscription handler. This is likely due to some of the filters including
|
|
424
422
|
// `published: false` which is a mutable property and not included with the delete event
|
|
@@ -430,18 +428,18 @@ export function testRecordsSubscribeHandler() {
|
|
|
430
428
|
// recordId : chatRecordForBob.message.recordId,
|
|
431
429
|
// });
|
|
432
430
|
// const chatForBobDeleteReply = await dwn.processMessage(alice.did, chatForBobDelete.message);
|
|
433
|
-
// expect(chatForBobDeleteReply.status.code).
|
|
431
|
+
// expect(chatForBobDeleteReply.status.code).toBe(202);
|
|
434
432
|
// // Delete one of the other chat messages
|
|
435
433
|
// const chatForCarolDelete = await TestDataGenerator.generateRecordsDelete({
|
|
436
434
|
// author : alice,
|
|
437
435
|
// recordId : chatRecordIds[0],
|
|
438
436
|
// });
|
|
439
437
|
// const chatForCarolDeleteReply = await dwn.processMessage(alice.did, chatForCarolDelete.message);
|
|
440
|
-
// expect(chatForCarolDeleteReply.status.code).
|
|
438
|
+
// expect(chatForCarolDeleteReply.status.code).toBe(202);
|
|
441
439
|
// await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
442
|
-
// expect(noRoleRecords.size).
|
|
443
|
-
// expect(recordIds.size).
|
|
444
|
-
// expect([ ...recordIds ]).
|
|
440
|
+
// expect(noRoleRecords.size).toBe(0); // chat record was removed from the set
|
|
441
|
+
// expect(recordIds.size).toBe(2); // both chat records were removed from the set
|
|
442
|
+
// expect([ ...recordIds ]).toEqual(expect.arrayContaining([ ...chatRecordIds.slice(1) ])); // only the last two chat records remain
|
|
445
443
|
// });
|
|
446
444
|
}));
|
|
447
445
|
it('can authorize subscriptions using a context role', () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -455,7 +453,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
455
453
|
protocolDefinition
|
|
456
454
|
});
|
|
457
455
|
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
458
|
-
expect(protocolsConfigureReply.status.code).
|
|
456
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
459
457
|
// Alice writes a 'thread' record
|
|
460
458
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
461
459
|
author: alice,
|
|
@@ -463,7 +461,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
463
461
|
protocolPath: 'thread',
|
|
464
462
|
});
|
|
465
463
|
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
466
|
-
expect(threadRoleReply.status.code).
|
|
464
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
467
465
|
const filter = {
|
|
468
466
|
protocol: protocolDefinition.protocol,
|
|
469
467
|
protocolPath: 'thread/chat',
|
|
@@ -483,8 +481,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
483
481
|
filter
|
|
484
482
|
});
|
|
485
483
|
const subscriptionReply = yield dwn.processMessage(alice.did, noRoleSubscription.message, { subscriptionHandler: addNoRole });
|
|
486
|
-
expect(subscriptionReply.status.code).
|
|
487
|
-
expect(subscriptionReply.subscription).
|
|
484
|
+
expect(subscriptionReply.status.code).toBe(200);
|
|
485
|
+
expect(subscriptionReply.subscription).toBeDefined();
|
|
488
486
|
// Alice writes a 'participant' role record with Bob as recipient
|
|
489
487
|
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
490
488
|
author: alice,
|
|
@@ -495,7 +493,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
495
493
|
data: new TextEncoder().encode('Bob is my friend'),
|
|
496
494
|
});
|
|
497
495
|
const participantRoleReply = yield dwn.processMessage(alice.did, participantRoleRecord.message, { dataStream: participantRoleRecord.dataStream });
|
|
498
|
-
expect(participantRoleReply.status.code).
|
|
496
|
+
expect(participantRoleReply.status.code).toBe(202);
|
|
499
497
|
const recordIds = [];
|
|
500
498
|
const addRecord = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
501
499
|
const { message } = event;
|
|
@@ -511,8 +509,8 @@ export function testRecordsSubscribeHandler() {
|
|
|
511
509
|
protocolRole: 'thread/participant',
|
|
512
510
|
});
|
|
513
511
|
const subscriptionWithRoleReply = yield dwn.processMessage(alice.did, bobSubscriptionWithRole.message, { subscriptionHandler: addRecord });
|
|
514
|
-
expect(subscriptionWithRoleReply.status.code).
|
|
515
|
-
expect(subscriptionWithRoleReply.subscription).
|
|
512
|
+
expect(subscriptionWithRoleReply.status.code).toBe(200);
|
|
513
|
+
expect(subscriptionWithRoleReply.subscription).toBeDefined();
|
|
516
514
|
// Alice writes three 'chat' records
|
|
517
515
|
const chatRecordIds = [];
|
|
518
516
|
for (let i = 0; i < 3; i++) {
|
|
@@ -526,14 +524,14 @@ export function testRecordsSubscribeHandler() {
|
|
|
526
524
|
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
527
525
|
});
|
|
528
526
|
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
529
|
-
expect(chatReply.status.code).
|
|
527
|
+
expect(chatReply.status.code).toBe(202);
|
|
530
528
|
chatRecordIds.push(chatRecord.message.recordId);
|
|
531
529
|
}
|
|
532
530
|
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
533
531
|
// should have all chat messages.
|
|
534
|
-
expect(recordIds).
|
|
532
|
+
expect(recordIds).toEqual(expect.arrayContaining(chatRecordIds));
|
|
535
533
|
// there should not be any messages in the subscription without a participant role.
|
|
536
|
-
expect(noRoleRecords.length).
|
|
534
|
+
expect(noRoleRecords.length).toBe(0);
|
|
537
535
|
}));
|
|
538
536
|
}));
|
|
539
537
|
it('does not execute protocol subscriptions where protocolPath is missing from the filter', () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -547,7 +545,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
547
545
|
protocolDefinition
|
|
548
546
|
});
|
|
549
547
|
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
550
|
-
expect(protocolsConfigureReply.status.code).
|
|
548
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
551
549
|
// Alice writes a 'friend' root-level role record with Bob as recipient
|
|
552
550
|
const friendRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
553
551
|
author: alice,
|
|
@@ -557,7 +555,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
557
555
|
data: new TextEncoder().encode('Bob is my friend'),
|
|
558
556
|
});
|
|
559
557
|
const friendRoleReply = yield dwn.processMessage(alice.did, friendRoleRecord.message, { dataStream: friendRoleRecord.dataStream });
|
|
560
|
-
expect(friendRoleReply.status.code).
|
|
558
|
+
expect(friendRoleReply.status.code).toBe(202);
|
|
561
559
|
// Bob invokes his friendRole to subscribe but does not have `protocolPath` in the filter
|
|
562
560
|
const chatSubscribe = yield TestDataGenerator.generateRecordsSubscribe({
|
|
563
561
|
author: bob,
|
|
@@ -568,9 +566,9 @@ export function testRecordsSubscribeHandler() {
|
|
|
568
566
|
protocolRole: 'friend',
|
|
569
567
|
});
|
|
570
568
|
const chatSubscribeReply = yield dwn.processMessage(alice.did, chatSubscribe.message);
|
|
571
|
-
expect(chatSubscribeReply.status.code).
|
|
572
|
-
expect(chatSubscribeReply.status.detail).
|
|
573
|
-
expect(chatSubscribeReply.subscription).
|
|
569
|
+
expect(chatSubscribeReply.status.code).toBe(400);
|
|
570
|
+
expect(chatSubscribeReply.status.detail).toContain(DwnErrorCode.RecordsSubscribeFilterMissingRequiredProperties);
|
|
571
|
+
expect(chatSubscribeReply.subscription).toBeUndefined();
|
|
574
572
|
}));
|
|
575
573
|
it('does not execute context role authorized subscriptions where contextId is missing from the filter', () => __awaiter(this, void 0, void 0, function* () {
|
|
576
574
|
// scenario: Alice gives Bob a role allowing him to access a particular chat thread.
|
|
@@ -583,7 +581,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
583
581
|
protocolDefinition
|
|
584
582
|
});
|
|
585
583
|
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
586
|
-
expect(protocolsConfigureReply.status.code).
|
|
584
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
587
585
|
// Alice writes a 'thread' record
|
|
588
586
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
589
587
|
author: alice,
|
|
@@ -591,7 +589,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
591
589
|
protocolPath: 'thread',
|
|
592
590
|
});
|
|
593
591
|
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
594
|
-
expect(threadRoleReply.status.code).
|
|
592
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
595
593
|
// Alice writes a 'friend' root-level role record with Bob as recipient
|
|
596
594
|
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
597
595
|
author: alice,
|
|
@@ -602,7 +600,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
602
600
|
data: new TextEncoder().encode('Bob is my friend'),
|
|
603
601
|
});
|
|
604
602
|
const participantRoleReply = yield dwn.processMessage(alice.did, participantRoleRecord.message, { dataStream: participantRoleRecord.dataStream });
|
|
605
|
-
expect(participantRoleReply.status.code).
|
|
603
|
+
expect(participantRoleReply.status.code).toBe(202);
|
|
606
604
|
// Bob invokes his thread participant role to subscribe but omits the contextId
|
|
607
605
|
const chatSubscribe = yield TestDataGenerator.generateRecordsSubscribe({
|
|
608
606
|
author: bob,
|
|
@@ -614,9 +612,9 @@ export function testRecordsSubscribeHandler() {
|
|
|
614
612
|
protocolRole: 'thread/participant',
|
|
615
613
|
});
|
|
616
614
|
const chatSubscribeReply = yield dwn.processMessage(alice.did, chatSubscribe.message);
|
|
617
|
-
expect(chatSubscribeReply.status.code).
|
|
618
|
-
expect(chatSubscribeReply.status.detail).
|
|
619
|
-
expect(chatSubscribeReply.subscription).
|
|
615
|
+
expect(chatSubscribeReply.status.code).toBe(401);
|
|
616
|
+
expect(chatSubscribeReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationMissingContextId);
|
|
617
|
+
expect(chatSubscribeReply.subscription).toBeUndefined();
|
|
620
618
|
}));
|
|
621
619
|
it('rejects role authorized subscriptions if the request author does not have a matching root-level role', () => __awaiter(this, void 0, void 0, function* () {
|
|
622
620
|
// scenario: Alice installs a chat protocol.
|
|
@@ -629,7 +627,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
629
627
|
protocolDefinition
|
|
630
628
|
});
|
|
631
629
|
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
632
|
-
expect(protocolsConfigureReply.status.code).
|
|
630
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
633
631
|
// Bob invokes a friendRole he does not have to subscribe to the records
|
|
634
632
|
const chatSubscribe = yield TestDataGenerator.generateRecordsSubscribe({
|
|
635
633
|
author: bob,
|
|
@@ -640,9 +638,9 @@ export function testRecordsSubscribeHandler() {
|
|
|
640
638
|
protocolRole: 'friend',
|
|
641
639
|
});
|
|
642
640
|
const chatSubscribeReply = yield dwn.processMessage(alice.did, chatSubscribe.message);
|
|
643
|
-
expect(chatSubscribeReply.status.code).
|
|
644
|
-
expect(chatSubscribeReply.status.detail).
|
|
645
|
-
expect(chatSubscribeReply.subscription).
|
|
641
|
+
expect(chatSubscribeReply.status.code).toBe(401);
|
|
642
|
+
expect(chatSubscribeReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound);
|
|
643
|
+
expect(chatSubscribeReply.subscription).toBeUndefined();
|
|
646
644
|
}));
|
|
647
645
|
it('rejects role authorized subscriptions where the subscription author does not have a matching context role', () => __awaiter(this, void 0, void 0, function* () {
|
|
648
646
|
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
@@ -653,7 +651,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
653
651
|
protocolDefinition
|
|
654
652
|
});
|
|
655
653
|
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
656
|
-
expect(protocolsConfigureReply.status.code).
|
|
654
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
657
655
|
// Alice writes a 'thread' record
|
|
658
656
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
659
657
|
author: alice,
|
|
@@ -661,7 +659,7 @@ export function testRecordsSubscribeHandler() {
|
|
|
661
659
|
protocolPath: 'thread',
|
|
662
660
|
});
|
|
663
661
|
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
664
|
-
expect(threadRoleReply.status.code).
|
|
662
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
665
663
|
// Bob invokes his a `thread/participant` role which he does not have to subscribe to the records
|
|
666
664
|
const chatSubscribe = yield TestDataGenerator.generateRecordsSubscribe({
|
|
667
665
|
author: bob,
|
|
@@ -673,10 +671,207 @@ export function testRecordsSubscribeHandler() {
|
|
|
673
671
|
protocolRole: 'thread/participant',
|
|
674
672
|
});
|
|
675
673
|
const chatSubscribeReply = yield dwn.processMessage(alice.did, chatSubscribe.message);
|
|
676
|
-
expect(chatSubscribeReply.status.code).
|
|
677
|
-
expect(chatSubscribeReply.status.detail).
|
|
678
|
-
expect(chatSubscribeReply.subscription).
|
|
674
|
+
expect(chatSubscribeReply.status.code).toBe(401);
|
|
675
|
+
expect(chatSubscribeReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound);
|
|
676
|
+
expect(chatSubscribeReply.subscription).toBeUndefined();
|
|
679
677
|
}));
|
|
678
|
+
describe('who-based query/subscribe action rules', () => {
|
|
679
|
+
const whoSubscribeProtocol = {
|
|
680
|
+
published: true,
|
|
681
|
+
protocol: 'http://who-subscribe-test.xyz',
|
|
682
|
+
types: {
|
|
683
|
+
message: {
|
|
684
|
+
dataFormats: ['text/plain'],
|
|
685
|
+
},
|
|
686
|
+
},
|
|
687
|
+
structure: {
|
|
688
|
+
message: {
|
|
689
|
+
$actions: [
|
|
690
|
+
{ who: 'anyone', can: ['create'] },
|
|
691
|
+
{ who: 'author', of: 'message', can: ['read'] },
|
|
692
|
+
{ who: 'recipient', of: 'message', can: ['read'] },
|
|
693
|
+
],
|
|
694
|
+
},
|
|
695
|
+
},
|
|
696
|
+
};
|
|
697
|
+
it('recipient receives only events for records addressed to them', () => __awaiter(this, void 0, void 0, function* () {
|
|
698
|
+
// scenario: Bob and Carol each subscribe to Alice's DWN. Alice writes messages
|
|
699
|
+
// to Bob and Carol. Each subscriber only receives their own messages.
|
|
700
|
+
// Dave subscribes and receives nothing.
|
|
701
|
+
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
702
|
+
const bob = yield TestDataGenerator.generateDidKeyPersona();
|
|
703
|
+
const carol = yield TestDataGenerator.generateDidKeyPersona();
|
|
704
|
+
const dave = yield TestDataGenerator.generateDidKeyPersona();
|
|
705
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
706
|
+
author: alice,
|
|
707
|
+
protocolDefinition: whoSubscribeProtocol,
|
|
708
|
+
});
|
|
709
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
710
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
711
|
+
// Bob subscribes — no role
|
|
712
|
+
const bobRecordIds = new Set();
|
|
713
|
+
const bobHandler = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
714
|
+
const { message } = event;
|
|
715
|
+
if (message.descriptor.method === DwnMethodName.Write) {
|
|
716
|
+
bobRecordIds.add(message.recordId);
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
const bobSub = yield TestDataGenerator.generateRecordsSubscribe({
|
|
720
|
+
author: bob,
|
|
721
|
+
filter: {
|
|
722
|
+
published: false,
|
|
723
|
+
protocol: whoSubscribeProtocol.protocol,
|
|
724
|
+
},
|
|
725
|
+
});
|
|
726
|
+
const bobSubReply = yield dwn.processMessage(alice.did, bobSub.message, { subscriptionHandler: bobHandler });
|
|
727
|
+
expect(bobSubReply.status.code).toBe(200);
|
|
728
|
+
// Carol subscribes — no role
|
|
729
|
+
const carolRecordIds = new Set();
|
|
730
|
+
const carolHandler = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
731
|
+
const { message } = event;
|
|
732
|
+
if (message.descriptor.method === DwnMethodName.Write) {
|
|
733
|
+
carolRecordIds.add(message.recordId);
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
const carolSub = yield TestDataGenerator.generateRecordsSubscribe({
|
|
737
|
+
author: carol,
|
|
738
|
+
filter: {
|
|
739
|
+
published: false,
|
|
740
|
+
protocol: whoSubscribeProtocol.protocol,
|
|
741
|
+
},
|
|
742
|
+
});
|
|
743
|
+
const carolSubReply = yield dwn.processMessage(alice.did, carolSub.message, { subscriptionHandler: carolHandler });
|
|
744
|
+
expect(carolSubReply.status.code).toBe(200);
|
|
745
|
+
// Dave subscribes — no role, not a participant at all
|
|
746
|
+
const daveRecordIds = new Set();
|
|
747
|
+
const daveHandler = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
748
|
+
const { message } = event;
|
|
749
|
+
if (message.descriptor.method === DwnMethodName.Write) {
|
|
750
|
+
daveRecordIds.add(message.recordId);
|
|
751
|
+
}
|
|
752
|
+
});
|
|
753
|
+
const daveSub = yield TestDataGenerator.generateRecordsSubscribe({
|
|
754
|
+
author: dave,
|
|
755
|
+
filter: {
|
|
756
|
+
published: false,
|
|
757
|
+
protocol: whoSubscribeProtocol.protocol,
|
|
758
|
+
},
|
|
759
|
+
});
|
|
760
|
+
const daveSubReply = yield dwn.processMessage(alice.did, daveSub.message, { subscriptionHandler: daveHandler });
|
|
761
|
+
expect(daveSubReply.status.code).toBe(200);
|
|
762
|
+
// Alice writes 2 messages for Bob
|
|
763
|
+
const expectedBobIds = [];
|
|
764
|
+
for (let i = 0; i < 2; i++) {
|
|
765
|
+
const msg = yield TestDataGenerator.generateRecordsWrite({
|
|
766
|
+
author: alice,
|
|
767
|
+
recipient: bob.did,
|
|
768
|
+
protocol: whoSubscribeProtocol.protocol,
|
|
769
|
+
protocolPath: 'message',
|
|
770
|
+
published: false,
|
|
771
|
+
dataFormat: 'text/plain',
|
|
772
|
+
data: new TextEncoder().encode(`for bob ${i}`),
|
|
773
|
+
});
|
|
774
|
+
const reply = yield dwn.processMessage(alice.did, msg.message, { dataStream: msg.dataStream });
|
|
775
|
+
expect(reply.status.code).toBe(202);
|
|
776
|
+
expectedBobIds.push(msg.message.recordId);
|
|
777
|
+
}
|
|
778
|
+
// Alice writes 1 message for Carol
|
|
779
|
+
const carolMsg = yield TestDataGenerator.generateRecordsWrite({
|
|
780
|
+
author: alice,
|
|
781
|
+
recipient: carol.did,
|
|
782
|
+
protocol: whoSubscribeProtocol.protocol,
|
|
783
|
+
protocolPath: 'message',
|
|
784
|
+
published: false,
|
|
785
|
+
dataFormat: 'text/plain',
|
|
786
|
+
data: new TextEncoder().encode('for carol'),
|
|
787
|
+
});
|
|
788
|
+
const carolWriteReply = yield dwn.processMessage(alice.did, carolMsg.message, { dataStream: carolMsg.dataStream });
|
|
789
|
+
expect(carolWriteReply.status.code).toBe(202);
|
|
790
|
+
// Alice writes 1 message addressed to herself (nobody else should see it)
|
|
791
|
+
const aliceMsg = yield TestDataGenerator.generateRecordsWrite({
|
|
792
|
+
author: alice,
|
|
793
|
+
recipient: alice.did,
|
|
794
|
+
protocol: whoSubscribeProtocol.protocol,
|
|
795
|
+
protocolPath: 'message',
|
|
796
|
+
published: false,
|
|
797
|
+
dataFormat: 'text/plain',
|
|
798
|
+
data: new TextEncoder().encode('private'),
|
|
799
|
+
});
|
|
800
|
+
const aliceWriteReply = yield dwn.processMessage(alice.did, aliceMsg.message, { dataStream: aliceMsg.dataStream });
|
|
801
|
+
expect(aliceWriteReply.status.code).toBe(202);
|
|
802
|
+
// Bob should receive exactly 2 events
|
|
803
|
+
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
804
|
+
expect(bobRecordIds.size).toBe(2);
|
|
805
|
+
expect([...bobRecordIds]).toEqual(expect.arrayContaining(expectedBobIds));
|
|
806
|
+
}));
|
|
807
|
+
// Carol should receive exactly 1 event
|
|
808
|
+
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
809
|
+
expect(carolRecordIds.size).toBe(1);
|
|
810
|
+
expect([...carolRecordIds]).toEqual(expect.arrayContaining([carolMsg.message.recordId]));
|
|
811
|
+
}));
|
|
812
|
+
// Dave should receive zero events
|
|
813
|
+
// Give a small window for any stray events to arrive, then assert empty
|
|
814
|
+
yield Time.sleep(200);
|
|
815
|
+
expect(daveRecordIds.size).toBe(0);
|
|
816
|
+
}));
|
|
817
|
+
it('who-based subscribe rules do not grant role-like broad access', () => __awaiter(this, void 0, void 0, function* () {
|
|
818
|
+
// scenario: Dave tries to invoke a protocolRole on a protocol with who-based
|
|
819
|
+
// subscribe rules. Should be rejected because he has no role record.
|
|
820
|
+
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
821
|
+
const dave = yield TestDataGenerator.generateDidKeyPersona();
|
|
822
|
+
const mixedProtocol = {
|
|
823
|
+
published: true,
|
|
824
|
+
protocol: 'http://mixed-sub-test.xyz',
|
|
825
|
+
types: {
|
|
826
|
+
thread: {},
|
|
827
|
+
participant: {},
|
|
828
|
+
chat: { dataFormats: ['text/plain'] },
|
|
829
|
+
},
|
|
830
|
+
structure: {
|
|
831
|
+
thread: {
|
|
832
|
+
participant: {
|
|
833
|
+
$role: true,
|
|
834
|
+
},
|
|
835
|
+
chat: {
|
|
836
|
+
$actions: [
|
|
837
|
+
{ who: 'anyone', can: ['create'] },
|
|
838
|
+
{ who: 'recipient', of: 'thread/chat', can: ['read'] },
|
|
839
|
+
{ role: 'thread/participant', can: ['read'] },
|
|
840
|
+
],
|
|
841
|
+
},
|
|
842
|
+
},
|
|
843
|
+
},
|
|
844
|
+
};
|
|
845
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
846
|
+
author: alice,
|
|
847
|
+
protocolDefinition: mixedProtocol,
|
|
848
|
+
});
|
|
849
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
850
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
851
|
+
// Alice creates a thread
|
|
852
|
+
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
853
|
+
author: alice,
|
|
854
|
+
protocol: mixedProtocol.protocol,
|
|
855
|
+
protocolPath: 'thread',
|
|
856
|
+
});
|
|
857
|
+
const threadReply = yield dwn.processMessage(alice.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
858
|
+
expect(threadReply.status.code).toBe(202);
|
|
859
|
+
// Dave tries to subscribe with a role he doesn't have — should be rejected
|
|
860
|
+
const daveRoleSub = yield TestDataGenerator.generateRecordsSubscribe({
|
|
861
|
+
author: dave,
|
|
862
|
+
filter: {
|
|
863
|
+
protocol: mixedProtocol.protocol,
|
|
864
|
+
protocolPath: 'thread/chat',
|
|
865
|
+
contextId: threadRecord.message.contextId,
|
|
866
|
+
},
|
|
867
|
+
protocolRole: 'thread/participant',
|
|
868
|
+
});
|
|
869
|
+
const daveRoleSubReply = yield dwn.processMessage(alice.did, daveRoleSub.message);
|
|
870
|
+
expect(daveRoleSubReply.status.code).toBe(401);
|
|
871
|
+
expect(daveRoleSubReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound);
|
|
872
|
+
expect(daveRoleSubReply.subscription).toBeUndefined();
|
|
873
|
+
}));
|
|
874
|
+
});
|
|
680
875
|
});
|
|
681
876
|
});
|
|
682
877
|
});
|