@enbox/dwn-sdk-js 0.0.6 → 0.0.7
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/dist/browser.mjs +8 -8
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +1 -2
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/abstract-message.js +4 -0
- package/dist/esm/src/core/abstract-message.js.map +1 -1
- package/dist/esm/src/core/auth.js +22 -33
- package/dist/esm/src/core/auth.js.map +1 -1
- package/dist/esm/src/core/dwn-constant.js +7 -7
- package/dist/esm/src/core/dwn-constant.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +1 -0
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +37 -52
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/message.js +85 -116
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +63 -78
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +266 -0
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization-validation.js +254 -0
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +122 -740
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/protocols-grant-authorization.js +24 -38
- package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/record-chain.js +64 -0
- package/dist/esm/src/core/record-chain.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +55 -72
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +50 -65
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/core/tenant-gate.js +2 -13
- package/dist/esm/src/core/tenant-gate.js.map +1 -1
- package/dist/esm/src/dwn.js +69 -86
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-stream.js +17 -31
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +1 -1
- package/dist/esm/src/handlers/messages-read.js +67 -77
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +51 -61
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +75 -85
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +135 -155
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +52 -51
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +96 -82
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +78 -88
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +116 -101
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +124 -131
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +150 -103
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +250 -259
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/interfaces/messages-read.js +24 -32
- package/dist/esm/src/interfaces/messages-read.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +27 -41
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/messages-sync.js +26 -40
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-configure.js +63 -63
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +55 -68
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +50 -66
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +45 -55
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +60 -76
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +51 -67
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +52 -68
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write-query.js +102 -0
- package/dist/esm/src/interfaces/records-write-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-write-signing.js +92 -0
- package/dist/esm/src/interfaces/records-write-signing.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +407 -602
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +10 -19
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js +23 -35
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js +56 -69
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +44 -15
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +29 -15
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +216 -226
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js +42 -64
- package/dist/esm/src/smt/smt-store-level.js.map +1 -1
- package/dist/esm/src/smt/smt-store-memory.js +19 -45
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
- package/dist/esm/src/smt/smt-utils.js +28 -45
- package/dist/esm/src/smt/smt-utils.js.map +1 -1
- package/dist/esm/src/smt/sparse-merkle-tree.js +426 -471
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
- package/dist/esm/src/state-index/state-index-level.js +115 -150
- package/dist/esm/src/state-index/state-index-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-level.js +54 -156
- package/dist/esm/src/store/blockstore-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-mock.js +48 -153
- package/dist/esm/src/store/blockstore-mock.js.map +1 -1
- package/dist/esm/src/store/data-store-level.js +59 -99
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level-compound.js +246 -0
- package/dist/esm/src/store/index-level-compound.js.map +1 -0
- package/dist/esm/src/store/index-level.js +295 -713
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/level-wrapper.js +143 -244
- package/dist/esm/src/store/level-wrapper.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +71 -94
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/resumable-task-store-level.js +62 -101
- package/dist/esm/src/store/resumable-task-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +129 -144
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/utils/abort.js +8 -19
- package/dist/esm/src/utils/abort.js.map +1 -1
- package/dist/esm/src/utils/array.js +15 -49
- package/dist/esm/src/utils/array.js.map +1 -1
- package/dist/esm/src/utils/cid.js +29 -77
- package/dist/esm/src/utils/cid.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +37 -65
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +136 -162
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/filter.js +1 -12
- package/dist/esm/src/utils/filter.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +45 -63
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +9 -20
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/memory-cache.js +12 -23
- package/dist/esm/src/utils/memory-cache.js.map +1 -1
- package/dist/esm/src/utils/messages.js +9 -3
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js +9 -17
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +62 -70
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/records.js +100 -125
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +60 -96
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +54 -71
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +5 -18
- package/dist/esm/src/utils/time.js.map +1 -1
- package/dist/esm/src/utils/url.js +3 -3
- package/dist/esm/src/utils/url.js.map +1 -1
- package/dist/esm/tests/core/auth.spec.js +3 -12
- package/dist/esm/tests/core/auth.spec.js.map +1 -1
- package/dist/esm/tests/core/message.spec.js +50 -59
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +9 -18
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +45 -58
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +24 -33
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +1 -1
- package/dist/esm/tests/event-stream/event-stream.spec.js +46 -55
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +1 -1
- package/dist/esm/tests/features/author-delegated-grant.spec.js +326 -343
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +153 -169
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +67 -78
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +446 -181
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +346 -356
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +42 -51
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +94 -103
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +105 -114
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune.spec.js +175 -191
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-tags.spec.js +441 -460
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +82 -91
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +206 -207
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +145 -154
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +174 -183
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +244 -238
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +156 -169
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +93 -102
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +252 -264
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +917 -988
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +549 -564
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +269 -278
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +1057 -1082
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-get.spec.js +39 -48
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +4 -13
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +212 -88
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-query.spec.js +8 -17
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +8 -17
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-query.spec.js +20 -29
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-read.spec.js +42 -51
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +16 -25
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +152 -165
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +36 -45
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +44 -50
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-request.spec.js +23 -32
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +49 -55
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +124 -135
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +23 -32
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +52 -61
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +63 -73
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +377 -333
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +76 -87
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -1
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +344 -353
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -1
- package/dist/esm/tests/state-index/state-index-level.spec.js +117 -126
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-level.spec.js +44 -99
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-mock.spec.js +40 -120
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +86 -95
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +404 -414
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +13 -22
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +229 -238
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/test-event-stream.js +3 -3
- package/dist/esm/tests/test-event-stream.js.map +1 -1
- package/dist/esm/tests/test-stores.js +16 -13
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +2 -11
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +24 -33
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +48 -57
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-callbacks.spec.js +45 -54
- package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption.spec.js +229 -82
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/filters.spec.js +46 -55
- package/dist/esm/tests/utils/filters.spec.js.map +1 -1
- package/dist/esm/tests/utils/hd-key.spec.js +10 -19
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
- package/dist/esm/tests/utils/jws.spec.js +3 -12
- package/dist/esm/tests/utils/jws.spec.js.map +1 -1
- package/dist/esm/tests/utils/memory-cache.spec.js +9 -18
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +6 -15
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/poller.js +22 -33
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/private-key-signer.spec.js +15 -24
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +10 -19
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256k1.spec.js +16 -25
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +18 -27
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +414 -468
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +2 -11
- 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 +4 -13
- 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 -17
- 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 +3 -12
- 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 +4 -13
- 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 +2 -11
- 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 +2 -11
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +7 -16
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/types/src/core/protocol-authorization-action.d.ts +42 -0
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts +60 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +10 -100
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/record-chain.d.ts +24 -0
- package/dist/types/src/core/record-chain.d.ts.map +1 -0
- package/dist/types/src/handlers/records-write.d.ts +2 -1
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write-query.d.ts +33 -0
- package/dist/types/src/interfaces/records-write-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts +35 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +10 -44
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/store/index-level-compound.d.ts +70 -0
- package/dist/types/src/store/index-level-compound.d.ts.map +1 -0
- package/dist/types/src/store/index-level.d.ts +0 -58
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/utils/protocols.d.ts +5 -0
- package/dist/types/src/utils/protocols.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/core/protocol-authorization-action.ts +377 -0
- package/src/core/protocol-authorization-validation.ts +391 -0
- package/src/core/protocol-authorization.ts +60 -849
- package/src/core/record-chain.ts +99 -0
- package/src/handlers/records-read.ts +1 -1
- package/src/handlers/records-write.ts +37 -21
- package/src/interfaces/protocols-configure.ts +33 -5
- package/src/interfaces/records-write-query.ts +139 -0
- package/src/interfaces/records-write-signing.ts +143 -0
- package/src/interfaces/records-write.ts +49 -221
- package/src/store/index-level-compound.ts +324 -0
- package/src/store/index-level.ts +24 -306
- package/src/utils/protocols.ts +8 -0
- package/src/utils/records.ts +1 -1
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
11
2
|
import { lexicographicalCompare } from '../../src/utils/string.js';
|
|
12
3
|
import { Message } from '../../src/core/message.js';
|
|
@@ -19,370 +10,370 @@ export function testMessageStore() {
|
|
|
19
10
|
describe('put', function () {
|
|
20
11
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
21
12
|
// so that different test suites can reuse the same backend store for testing
|
|
22
|
-
beforeAll(() =>
|
|
13
|
+
beforeAll(async () => {
|
|
23
14
|
const stores = TestStores.get();
|
|
24
15
|
messageStore = stores.messageStore;
|
|
25
|
-
|
|
26
|
-
})
|
|
27
|
-
beforeEach(() =>
|
|
28
|
-
|
|
29
|
-
})
|
|
30
|
-
afterAll(() =>
|
|
31
|
-
|
|
32
|
-
})
|
|
33
|
-
it('stores messages as cbor/sha256 encoded blocks with CID as key', () =>
|
|
34
|
-
const alice =
|
|
35
|
-
const { message } =
|
|
16
|
+
await messageStore.open();
|
|
17
|
+
});
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
await messageStore.clear(); // clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
20
|
+
});
|
|
21
|
+
afterAll(async () => {
|
|
22
|
+
await messageStore.close();
|
|
23
|
+
});
|
|
24
|
+
it('stores messages as cbor/sha256 encoded blocks with CID as key', async () => {
|
|
25
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
26
|
+
const { message } = await TestDataGenerator.generateRecordsWrite();
|
|
36
27
|
const { messageTimestamp } = message.descriptor;
|
|
37
|
-
|
|
38
|
-
const expectedCid =
|
|
39
|
-
const jsonMessage = (
|
|
40
|
-
const resultCid =
|
|
28
|
+
await messageStore.put(alice.did, message, { messageTimestamp });
|
|
29
|
+
const expectedCid = await Message.getCid(message);
|
|
30
|
+
const jsonMessage = (await messageStore.get(alice.did, expectedCid));
|
|
31
|
+
const resultCid = await Message.getCid(jsonMessage);
|
|
41
32
|
expect(resultCid).toBe(expectedCid);
|
|
42
|
-
})
|
|
33
|
+
});
|
|
43
34
|
// https://github.com/enboxorg/enbox/issues/170
|
|
44
|
-
it('#170 - should be able to update (delete and insert new) indexes to an existing message', () =>
|
|
45
|
-
const alice =
|
|
46
|
-
const { message } =
|
|
35
|
+
it('#170 - should be able to update (delete and insert new) indexes to an existing message', async () => {
|
|
36
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
37
|
+
const { message } = await TestDataGenerator.generateRecordsWrite();
|
|
47
38
|
const { messageTimestamp } = message.descriptor;
|
|
48
39
|
// inserting the message indicating it is the latest base state
|
|
49
|
-
|
|
50
|
-
const { messages: results1 } =
|
|
40
|
+
await messageStore.put(alice.did, message, { isLatestBaseState: true, messageTimestamp });
|
|
41
|
+
const { messages: results1 } = await messageStore.query(alice.did, [{ isLatestBaseState: true }]);
|
|
51
42
|
expect(results1.length).toBe(1);
|
|
52
|
-
const { messages: results2 } =
|
|
43
|
+
const { messages: results2 } = await messageStore.query(alice.did, [{ isLatestBaseState: false }]);
|
|
53
44
|
expect(results2.length).toBe(0);
|
|
54
45
|
// deleting the existing indexes and replacing it indicating it is no longer the latest base state
|
|
55
|
-
const cid =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const { messages: results3 } =
|
|
46
|
+
const cid = await Message.getCid(message);
|
|
47
|
+
await messageStore.delete(alice.did, cid);
|
|
48
|
+
await messageStore.put(alice.did, message, { isLatestBaseState: false, messageTimestamp });
|
|
49
|
+
const { messages: results3 } = await messageStore.query(alice.did, [{ isLatestBaseState: true }]);
|
|
59
50
|
expect(results3.length).toBe(0);
|
|
60
|
-
const { messages: results4 } =
|
|
51
|
+
const { messages: results4 } = await messageStore.query(alice.did, [{ isLatestBaseState: false }]);
|
|
61
52
|
expect(results4.length).toBe(1);
|
|
62
|
-
})
|
|
63
|
-
it('should index properties with characters beyond just letters and digits', () =>
|
|
64
|
-
const alice =
|
|
53
|
+
});
|
|
54
|
+
it('should index properties with characters beyond just letters and digits', async () => {
|
|
55
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
65
56
|
const schema = 'http://my-awesome-schema/awesomeness_schema';
|
|
66
|
-
const { message } =
|
|
57
|
+
const { message } = await TestDataGenerator.generateRecordsWrite({ schema });
|
|
67
58
|
const { messageTimestamp } = message.descriptor;
|
|
68
|
-
|
|
69
|
-
const { messages: results } =
|
|
59
|
+
await messageStore.put(alice.did, message, { schema, messageTimestamp });
|
|
60
|
+
const { messages: results } = await messageStore.query(alice.did, [{ schema }]);
|
|
70
61
|
expect(results[0].descriptor.schema).toBe(schema);
|
|
71
|
-
})
|
|
72
|
-
it('should not store anything if aborted beforehand', () =>
|
|
73
|
-
const alice =
|
|
74
|
-
const { message } =
|
|
62
|
+
});
|
|
63
|
+
it('should not store anything if aborted beforehand', async () => {
|
|
64
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
65
|
+
const { message } = await TestDataGenerator.generateRecordsWrite();
|
|
75
66
|
const { messageTimestamp } = message.descriptor;
|
|
76
67
|
const controller = new AbortController();
|
|
77
68
|
controller.signal.throwIfAborted = () => { }; // simulate aborting happening async
|
|
78
69
|
controller.abort('reason');
|
|
79
70
|
try {
|
|
80
|
-
|
|
71
|
+
await messageStore.put(alice.did, message, { messageTimestamp }, { signal: controller.signal });
|
|
81
72
|
}
|
|
82
73
|
catch (e) {
|
|
83
74
|
expect(e).toBe('reason');
|
|
84
75
|
}
|
|
85
|
-
const expectedCid =
|
|
86
|
-
const jsonMessage =
|
|
76
|
+
const expectedCid = await Message.getCid(message);
|
|
77
|
+
const jsonMessage = await messageStore.get(alice.did, expectedCid);
|
|
87
78
|
expect(jsonMessage).toBe(undefined);
|
|
88
|
-
})
|
|
89
|
-
it('should not index anything if aborted during', () =>
|
|
90
|
-
const alice =
|
|
79
|
+
});
|
|
80
|
+
it('should not index anything if aborted during', async () => {
|
|
81
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
91
82
|
const schema = 'http://my-awesome-schema/awesomeness_schema#awesome-1?id=awesome_1';
|
|
92
|
-
const { message } =
|
|
83
|
+
const { message } = await TestDataGenerator.generateRecordsWrite({ schema });
|
|
93
84
|
const { messageTimestamp } = message.descriptor;
|
|
94
85
|
const controller = new AbortController();
|
|
95
86
|
queueMicrotask(() => {
|
|
96
87
|
controller.abort('reason');
|
|
97
88
|
});
|
|
98
89
|
try {
|
|
99
|
-
|
|
90
|
+
await messageStore.put(alice.did, message, { schema, messageTimestamp }, { signal: controller.signal });
|
|
100
91
|
}
|
|
101
92
|
catch (e) {
|
|
102
93
|
expect(e).toBe('reason');
|
|
103
94
|
}
|
|
104
95
|
// index should not return the message
|
|
105
|
-
const { messages: results } =
|
|
96
|
+
const { messages: results } = await messageStore.query(alice.did, [{ schema }]);
|
|
106
97
|
expect(results.length).toBe(0);
|
|
107
98
|
// check that message doesn't exist
|
|
108
|
-
const messageCid =
|
|
109
|
-
const fetchedMessage =
|
|
99
|
+
const messageCid = await Message.getCid(message);
|
|
100
|
+
const fetchedMessage = await messageStore.get(alice.did, messageCid);
|
|
110
101
|
expect(fetchedMessage).toBeUndefined();
|
|
111
|
-
})
|
|
112
|
-
it('should not store anything if aborted beforehand', () =>
|
|
113
|
-
const alice =
|
|
114
|
-
const { message } =
|
|
102
|
+
});
|
|
103
|
+
it('should not store anything if aborted beforehand', async () => {
|
|
104
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
105
|
+
const { message } = await TestDataGenerator.generateRecordsWrite();
|
|
115
106
|
const { messageTimestamp } = message.descriptor;
|
|
116
107
|
const controller = new AbortController();
|
|
117
108
|
controller.signal.throwIfAborted = () => { }; // simulate aborting happening async
|
|
118
109
|
controller.abort('reason');
|
|
119
110
|
try {
|
|
120
|
-
|
|
111
|
+
await messageStore.put(alice.did, message, { messageTimestamp }, { signal: controller.signal });
|
|
121
112
|
}
|
|
122
113
|
catch (e) {
|
|
123
114
|
expect(e).toBe('reason');
|
|
124
115
|
}
|
|
125
|
-
const expectedCid =
|
|
126
|
-
const jsonMessage =
|
|
116
|
+
const expectedCid = await Message.getCid(message);
|
|
117
|
+
const jsonMessage = await messageStore.get(alice.did, expectedCid);
|
|
127
118
|
expect(jsonMessage).toBe(undefined);
|
|
128
|
-
})
|
|
129
|
-
it('should not delete if aborted', () =>
|
|
130
|
-
const alice =
|
|
131
|
-
const { message } =
|
|
119
|
+
});
|
|
120
|
+
it('should not delete if aborted', async () => {
|
|
121
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
122
|
+
const { message } = await TestDataGenerator.generateRecordsWrite();
|
|
132
123
|
const { messageTimestamp } = message.descriptor;
|
|
133
|
-
|
|
134
|
-
const messageCid =
|
|
135
|
-
const resultsAlice1 =
|
|
124
|
+
await messageStore.put(alice.did, message, { isLatestBaseState: true, messageTimestamp });
|
|
125
|
+
const messageCid = await Message.getCid(message);
|
|
126
|
+
const resultsAlice1 = await messageStore.get(alice.did, messageCid);
|
|
136
127
|
expect(resultsAlice1.recordId).toBe(message.recordId);
|
|
137
128
|
const controller = new AbortController();
|
|
138
129
|
controller.signal.throwIfAborted = () => { }; // simulate aborting happening async
|
|
139
130
|
controller.abort('reason');
|
|
140
131
|
// aborted delete
|
|
141
132
|
const deletePromise = messageStore.delete(alice.did, messageCid, { signal: controller.signal });
|
|
142
|
-
|
|
143
|
-
})
|
|
144
|
-
it('should not delete the message of another tenant', () =>
|
|
145
|
-
const alice =
|
|
146
|
-
const bob =
|
|
147
|
-
const { message } =
|
|
133
|
+
await expect(deletePromise).rejects.toThrow('reason');
|
|
134
|
+
});
|
|
135
|
+
it('should not delete the message of another tenant', async () => {
|
|
136
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
137
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
138
|
+
const { message } = await TestDataGenerator.generateRecordsWrite();
|
|
148
139
|
const { messageTimestamp } = message.descriptor;
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const messageCid =
|
|
152
|
-
const resultsAlice1 =
|
|
140
|
+
await messageStore.put(alice.did, message, { isLatestBaseState: true, messageTimestamp });
|
|
141
|
+
await messageStore.put(bob.did, message, { isLatestBaseState: true, messageTimestamp });
|
|
142
|
+
const messageCid = await Message.getCid(message);
|
|
143
|
+
const resultsAlice1 = await messageStore.get(alice.did, messageCid);
|
|
153
144
|
expect(resultsAlice1.recordId).toBe(message.recordId);
|
|
154
|
-
const resultsBob1 =
|
|
145
|
+
const resultsBob1 = await messageStore.get(bob.did, messageCid);
|
|
155
146
|
expect(resultsBob1.recordId).toBe(message.recordId);
|
|
156
147
|
// bob deletes message
|
|
157
|
-
|
|
158
|
-
const resultsBob2 =
|
|
148
|
+
await messageStore.delete(bob.did, messageCid);
|
|
149
|
+
const resultsBob2 = await messageStore.get(bob.did, messageCid);
|
|
159
150
|
expect(resultsBob2).toBeUndefined();
|
|
160
151
|
//expect alice to retain the message
|
|
161
|
-
const resultsAlice2 =
|
|
152
|
+
const resultsAlice2 = await messageStore.get(alice.did, messageCid);
|
|
162
153
|
expect(resultsAlice2.recordId).toBe(message.recordId);
|
|
163
|
-
})
|
|
164
|
-
it('should not clear the MessageStore index of another tenant', () =>
|
|
165
|
-
const alice =
|
|
166
|
-
const bob =
|
|
167
|
-
const { message } =
|
|
154
|
+
});
|
|
155
|
+
it('should not clear the MessageStore index of another tenant', async () => {
|
|
156
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
157
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
158
|
+
const { message } = await TestDataGenerator.generateRecordsWrite();
|
|
168
159
|
const { messageTimestamp } = message.descriptor;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const messageCid =
|
|
172
|
-
const resultsAlice1 =
|
|
160
|
+
await messageStore.put(alice.did, message, { isLatestBaseState: true, messageTimestamp });
|
|
161
|
+
await messageStore.put(bob.did, message, { isLatestBaseState: true, messageTimestamp });
|
|
162
|
+
const messageCid = await Message.getCid(message);
|
|
163
|
+
const resultsAlice1 = await messageStore.query(alice.did, [{ isLatestBaseState: true }]);
|
|
173
164
|
expect(resultsAlice1.messages.length).toBe(1);
|
|
174
|
-
const resultsBob1 =
|
|
165
|
+
const resultsBob1 = await messageStore.query(bob.did, [{ isLatestBaseState: true }]);
|
|
175
166
|
expect(resultsBob1.messages.length).toBe(1);
|
|
176
167
|
// bob deletes message
|
|
177
|
-
|
|
178
|
-
const resultsBob2 =
|
|
168
|
+
await messageStore.delete(bob.did, messageCid);
|
|
169
|
+
const resultsBob2 = await messageStore.query(bob.did, [{ isLatestBaseState: true }]);
|
|
179
170
|
expect(resultsBob2.messages.length).toBe(0);
|
|
180
171
|
//expect alice to retain the message
|
|
181
|
-
const resultsAlice2 =
|
|
172
|
+
const resultsAlice2 = await messageStore.query(alice.did, [{ isLatestBaseState: true }]);
|
|
182
173
|
expect(resultsAlice2.messages.length).toBe(1);
|
|
183
|
-
})
|
|
174
|
+
});
|
|
184
175
|
});
|
|
185
176
|
describe('sort and pagination', () => {
|
|
186
177
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
187
178
|
// so that different test suites can reuse the same backend store for testing
|
|
188
|
-
beforeAll(() =>
|
|
179
|
+
beforeAll(async () => {
|
|
189
180
|
const stores = TestStores.get();
|
|
190
181
|
messageStore = stores.messageStore;
|
|
191
|
-
|
|
192
|
-
})
|
|
193
|
-
beforeEach(() =>
|
|
194
|
-
|
|
195
|
-
})
|
|
196
|
-
afterAll(() =>
|
|
197
|
-
|
|
198
|
-
})
|
|
182
|
+
await messageStore.open();
|
|
183
|
+
});
|
|
184
|
+
beforeEach(async () => {
|
|
185
|
+
await messageStore.clear(); // clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
186
|
+
});
|
|
187
|
+
afterAll(async () => {
|
|
188
|
+
await messageStore.close();
|
|
189
|
+
});
|
|
199
190
|
describe('sorting', () => {
|
|
200
|
-
it('should sort on messageTimestamp Ascending if no sort is specified', () =>
|
|
201
|
-
const alice =
|
|
202
|
-
const messages =
|
|
191
|
+
it('should sort on messageTimestamp Ascending if no sort is specified', async () => {
|
|
192
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
193
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
203
194
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
204
195
|
})));
|
|
205
196
|
for (const message of messages) {
|
|
206
|
-
|
|
197
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
207
198
|
}
|
|
208
|
-
const { messages: messageQuery } =
|
|
199
|
+
const { messages: messageQuery } = await messageStore.query(alice.did, [{}]);
|
|
209
200
|
expect(messageQuery.length).toBe(messages.length);
|
|
210
201
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(a.message.descriptor.messageTimestamp, b.message.descriptor.messageTimestamp));
|
|
211
202
|
for (let i = 0; i < sortedRecords.length; i++) {
|
|
212
203
|
expect(sortedRecords[i].message.descriptor.messageTimestamp).toBe(messageQuery[i].descriptor.messageTimestamp);
|
|
213
204
|
}
|
|
214
|
-
})
|
|
215
|
-
it('should sort on messageTimestamp Ascending', () =>
|
|
216
|
-
const alice =
|
|
217
|
-
const messages =
|
|
205
|
+
});
|
|
206
|
+
it('should sort on messageTimestamp Ascending', async () => {
|
|
207
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
208
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
218
209
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
219
210
|
})));
|
|
220
211
|
for (const message of messages) {
|
|
221
|
-
|
|
212
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
222
213
|
}
|
|
223
|
-
const { messages: messageQuery } =
|
|
214
|
+
const { messages: messageQuery } = await messageStore.query(alice.did, [{}], { messageTimestamp: SortDirection.Ascending });
|
|
224
215
|
expect(messageQuery.length).toBe(messages.length);
|
|
225
216
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(a.message.descriptor.messageTimestamp, b.message.descriptor.messageTimestamp));
|
|
226
217
|
for (let i = 0; i < messages.length; i++) {
|
|
227
218
|
expect(sortedRecords[i].message.descriptor.messageTimestamp).toBe(messageQuery[i].descriptor.messageTimestamp);
|
|
228
219
|
}
|
|
229
|
-
})
|
|
230
|
-
it('should sort on dateCreated Ascending', () =>
|
|
231
|
-
const alice =
|
|
232
|
-
const messages =
|
|
220
|
+
});
|
|
221
|
+
it('should sort on dateCreated Ascending', async () => {
|
|
222
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
223
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
233
224
|
dateCreated: TestDataGenerator.randomTimestamp(),
|
|
234
225
|
})));
|
|
235
226
|
for (const message of messages) {
|
|
236
|
-
|
|
227
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
237
228
|
}
|
|
238
|
-
const { messages: messageQuery } =
|
|
229
|
+
const { messages: messageQuery } = await messageStore.query(alice.did, [{}], { dateCreated: SortDirection.Ascending });
|
|
239
230
|
expect(messageQuery.length).toBe(messages.length);
|
|
240
231
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(a.message.descriptor.dateCreated, b.message.descriptor.dateCreated));
|
|
241
232
|
for (let i = 0; i < messages.length; i++) {
|
|
242
|
-
expect(
|
|
233
|
+
expect(await Message.getCid(sortedRecords[i].message)).toBe(await Message.getCid(messageQuery[i]));
|
|
243
234
|
}
|
|
244
|
-
})
|
|
245
|
-
it('should sort on dateCreated Descending', () =>
|
|
246
|
-
const alice =
|
|
247
|
-
const messages =
|
|
235
|
+
});
|
|
236
|
+
it('should sort on dateCreated Descending', async () => {
|
|
237
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
238
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
248
239
|
dateCreated: TestDataGenerator.randomTimestamp(),
|
|
249
240
|
})));
|
|
250
241
|
for (const message of messages) {
|
|
251
|
-
|
|
242
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
252
243
|
}
|
|
253
|
-
const { messages: messageQuery } =
|
|
244
|
+
const { messages: messageQuery } = await messageStore.query(alice.did, [{}], { dateCreated: SortDirection.Descending });
|
|
254
245
|
expect(messageQuery.length).toBe(messages.length);
|
|
255
246
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(b.message.descriptor.dateCreated, a.message.descriptor.dateCreated));
|
|
256
247
|
for (let i = 0; i < messages.length; i++) {
|
|
257
|
-
expect(
|
|
248
|
+
expect(await Message.getCid(sortedRecords[i].message)).toBe(await Message.getCid(messageQuery[i]));
|
|
258
249
|
}
|
|
259
|
-
})
|
|
260
|
-
it('should sort on datePublished Ascending', () =>
|
|
261
|
-
const alice =
|
|
262
|
-
const messages =
|
|
250
|
+
});
|
|
251
|
+
it('should sort on datePublished Ascending', async () => {
|
|
252
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
253
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
263
254
|
published: true,
|
|
264
255
|
datePublished: TestDataGenerator.randomTimestamp()
|
|
265
256
|
})));
|
|
266
257
|
for (const message of messages) {
|
|
267
|
-
|
|
258
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
268
259
|
}
|
|
269
|
-
const { messages: messageQuery } =
|
|
260
|
+
const { messages: messageQuery } = await messageStore.query(alice.did, [{}], { datePublished: SortDirection.Ascending });
|
|
270
261
|
expect(messageQuery.length).toBe(messages.length);
|
|
271
262
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(a.message.descriptor.datePublished, b.message.descriptor.datePublished));
|
|
272
263
|
for (let i = 0; i < messages.length; i++) {
|
|
273
|
-
expect(
|
|
264
|
+
expect(await Message.getCid(sortedRecords[i].message)).toBe(await Message.getCid(messageQuery[i]));
|
|
274
265
|
}
|
|
275
|
-
})
|
|
276
|
-
it('should sort on datePublished Descending', () =>
|
|
277
|
-
const alice =
|
|
278
|
-
const messages =
|
|
266
|
+
});
|
|
267
|
+
it('should sort on datePublished Descending', async () => {
|
|
268
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
269
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
279
270
|
published: true,
|
|
280
271
|
datePublished: TestDataGenerator.randomTimestamp()
|
|
281
272
|
})));
|
|
282
273
|
for (const message of messages) {
|
|
283
|
-
|
|
274
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
284
275
|
}
|
|
285
|
-
const { messages: messageQuery } =
|
|
276
|
+
const { messages: messageQuery } = await messageStore.query(alice.did, [{}], { datePublished: SortDirection.Descending });
|
|
286
277
|
expect(messageQuery.length).toBe(messages.length);
|
|
287
278
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(b.message.descriptor.datePublished, a.message.descriptor.datePublished));
|
|
288
279
|
for (let i = 0; i < messages.length; i++) {
|
|
289
|
-
expect(
|
|
280
|
+
expect(await Message.getCid(sortedRecords[i].message)).toBe(await Message.getCid(messageQuery[i]));
|
|
290
281
|
}
|
|
291
|
-
})
|
|
282
|
+
});
|
|
292
283
|
});
|
|
293
284
|
describe('pagination', () => {
|
|
294
|
-
it('should return all records if no limit is specified', () =>
|
|
295
|
-
const alice =
|
|
296
|
-
const messages =
|
|
285
|
+
it('should return all records if no limit is specified', async () => {
|
|
286
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
287
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
297
288
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
298
289
|
})));
|
|
299
290
|
for (const message of messages) {
|
|
300
|
-
|
|
291
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
301
292
|
}
|
|
302
|
-
const { messages: limitQuery } =
|
|
293
|
+
const { messages: limitQuery } = await messageStore.query(alice.did, [{}]);
|
|
303
294
|
expect(limitQuery.length).toBe(messages.length);
|
|
304
|
-
})
|
|
305
|
-
it('should limit records', () =>
|
|
306
|
-
const alice =
|
|
307
|
-
const messages =
|
|
295
|
+
});
|
|
296
|
+
it('should limit records', async () => {
|
|
297
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
298
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
308
299
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
309
300
|
})));
|
|
310
301
|
for (const message of messages) {
|
|
311
|
-
|
|
302
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
312
303
|
}
|
|
313
304
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(a.message.descriptor.messageTimestamp, b.message.descriptor.messageTimestamp));
|
|
314
305
|
const limit = 5;
|
|
315
|
-
const { messages: limitQuery } =
|
|
306
|
+
const { messages: limitQuery } = await messageStore.query(alice.did, [{}], {}, { limit });
|
|
316
307
|
expect(limitQuery.length).toBe(limit);
|
|
317
308
|
for (let i = 0; i < limitQuery.length; i++) {
|
|
318
|
-
expect(
|
|
309
|
+
expect(await Message.getCid(sortedRecords[i].message)).toBe(await Message.getCid(limitQuery[i]));
|
|
319
310
|
}
|
|
320
|
-
})
|
|
321
|
-
it('should only return a cursor if there are additional results', () =>
|
|
322
|
-
const alice =
|
|
323
|
-
const messages =
|
|
311
|
+
});
|
|
312
|
+
it('should only return a cursor if there are additional results', async () => {
|
|
313
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
314
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
324
315
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
325
316
|
})));
|
|
326
317
|
for (const message of messages) {
|
|
327
|
-
|
|
318
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
328
319
|
}
|
|
329
320
|
// get all of the records
|
|
330
|
-
const allRecords =
|
|
321
|
+
const allRecords = await messageStore.query(alice.did, [{}], {}, { limit: 10 });
|
|
331
322
|
expect(allRecords.cursor).toBeUndefined();
|
|
332
323
|
// get only partial records
|
|
333
|
-
const partialRecords =
|
|
324
|
+
const partialRecords = await messageStore.query(alice.did, [{}], {}, { limit: 5 });
|
|
334
325
|
expect(partialRecords.cursor).toBeDefined();
|
|
335
|
-
})
|
|
336
|
-
it('should return all records from the cursor onwards when no limit is provided', () =>
|
|
337
|
-
const alice =
|
|
338
|
-
const messages =
|
|
326
|
+
});
|
|
327
|
+
it('should return all records from the cursor onwards when no limit is provided', async () => {
|
|
328
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
329
|
+
const messages = await Promise.all(Array(13).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
339
330
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
340
331
|
})));
|
|
341
332
|
for (const message of messages) {
|
|
342
|
-
|
|
333
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
343
334
|
}
|
|
344
335
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(a.message.descriptor.messageTimestamp, b.message.descriptor.messageTimestamp));
|
|
345
336
|
// we make an initial request to get one record and a cursor.
|
|
346
|
-
const { cursor } =
|
|
347
|
-
const { messages: limitQuery } =
|
|
337
|
+
const { cursor } = await messageStore.query(alice.did, [{}], {}, { limit: 1 });
|
|
338
|
+
const { messages: limitQuery } = await messageStore.query(alice.did, [{}], {}, { cursor });
|
|
348
339
|
expect(limitQuery.length).toBe(sortedRecords.slice(1).length);
|
|
349
340
|
for (let i = 0; i < limitQuery.length; i++) {
|
|
350
341
|
const offsetIndex = i + 1; // offset for the initial request item
|
|
351
|
-
expect(
|
|
342
|
+
expect(await Message.getCid(sortedRecords[offsetIndex].message)).toBe(await Message.getCid(limitQuery[i]));
|
|
352
343
|
}
|
|
353
|
-
})
|
|
354
|
-
it('should limit records when a cursor and limit are provided', () =>
|
|
355
|
-
const alice =
|
|
356
|
-
const messages =
|
|
344
|
+
});
|
|
345
|
+
it('should limit records when a cursor and limit are provided', async () => {
|
|
346
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
347
|
+
const messages = await Promise.all(Array(10).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
357
348
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
358
349
|
})));
|
|
359
350
|
for (const message of messages) {
|
|
360
|
-
|
|
351
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
361
352
|
}
|
|
362
353
|
const sortedRecords = messages.sort((a, b) => lexicographicalCompare(a.message.descriptor.messageTimestamp, b.message.descriptor.messageTimestamp));
|
|
363
354
|
// we make an initial request to get one record and a cursor.
|
|
364
|
-
const { cursor } =
|
|
355
|
+
const { cursor } = await messageStore.query(alice.did, [{}], {}, { limit: 1 });
|
|
365
356
|
const limit = 3;
|
|
366
|
-
const { messages: limitQuery } =
|
|
357
|
+
const { messages: limitQuery } = await messageStore.query(alice.did, [{}], {}, { cursor, limit });
|
|
367
358
|
expect(limitQuery.length).toBe(limit);
|
|
368
359
|
for (let i = 0; i < limitQuery.length; i++) {
|
|
369
360
|
const offsetIndex = i + 1; // offset for the initial request item
|
|
370
|
-
expect(
|
|
361
|
+
expect(await Message.getCid(sortedRecords[offsetIndex].message)).toBe(await Message.getCid(limitQuery[i]));
|
|
371
362
|
}
|
|
372
|
-
})
|
|
373
|
-
it('should paginate through all of the records', () =>
|
|
374
|
-
const alice =
|
|
375
|
-
const messages =
|
|
363
|
+
});
|
|
364
|
+
it('should paginate through all of the records', async () => {
|
|
365
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
366
|
+
const messages = await Promise.all(Array(23).fill({}).map((_) => TestDataGenerator.generateRecordsWrite({
|
|
376
367
|
messageTimestamp: TestDataGenerator.randomTimestamp()
|
|
377
368
|
})));
|
|
378
369
|
for (const message of messages) {
|
|
379
|
-
|
|
370
|
+
await messageStore.put(alice.did, message.message, await message.recordsWrite.constructIndexes(true));
|
|
380
371
|
}
|
|
381
372
|
const limit = 6;
|
|
382
373
|
const results = [];
|
|
383
374
|
let cursor;
|
|
384
375
|
while (true) {
|
|
385
|
-
const { messages: limitQuery, cursor: queryCursor } =
|
|
376
|
+
const { messages: limitQuery, cursor: queryCursor } = await messageStore.query(alice.did, [{}], {}, { cursor, limit });
|
|
386
377
|
expect(limitQuery.length).toBeLessThanOrEqual(limit);
|
|
387
378
|
results.push(...limitQuery);
|
|
388
379
|
cursor = queryCursor;
|
|
@@ -391,87 +382,87 @@ export function testMessageStore() {
|
|
|
391
382
|
}
|
|
392
383
|
}
|
|
393
384
|
expect(results.length).toBe(messages.length);
|
|
394
|
-
const messageMessageIds =
|
|
395
|
-
const resultMessageIds =
|
|
385
|
+
const messageMessageIds = await Promise.all(messages.map(m => Message.getCid(m.message)));
|
|
386
|
+
const resultMessageIds = await Promise.all(results.map(m => Message.getCid(m)));
|
|
396
387
|
for (const recordId of messageMessageIds) {
|
|
397
388
|
expect(resultMessageIds.includes(recordId)).toBe(true);
|
|
398
389
|
}
|
|
399
|
-
})
|
|
390
|
+
});
|
|
400
391
|
});
|
|
401
392
|
});
|
|
402
393
|
describe('count', () => {
|
|
403
|
-
beforeAll(() =>
|
|
394
|
+
beforeAll(async () => {
|
|
404
395
|
const stores = TestStores.get();
|
|
405
396
|
messageStore = stores.messageStore;
|
|
406
|
-
|
|
407
|
-
})
|
|
408
|
-
beforeEach(() =>
|
|
409
|
-
|
|
410
|
-
})
|
|
411
|
-
afterAll(() =>
|
|
412
|
-
|
|
413
|
-
})
|
|
414
|
-
it('should return 0 when no messages match', () =>
|
|
415
|
-
const alice =
|
|
416
|
-
const count =
|
|
397
|
+
await messageStore.open();
|
|
398
|
+
});
|
|
399
|
+
beforeEach(async () => {
|
|
400
|
+
await messageStore.clear();
|
|
401
|
+
});
|
|
402
|
+
afterAll(async () => {
|
|
403
|
+
await messageStore.close();
|
|
404
|
+
});
|
|
405
|
+
it('should return 0 when no messages match', async () => {
|
|
406
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
407
|
+
const count = await messageStore.count(alice.did, [{ schema: 'nonexistent' }]);
|
|
417
408
|
expect(count).toBe(0);
|
|
418
|
-
})
|
|
419
|
-
it('should count all matching messages', () =>
|
|
420
|
-
const alice =
|
|
409
|
+
});
|
|
410
|
+
it('should count all matching messages', async () => {
|
|
411
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
421
412
|
const schema = 'https://schema.org/CountTest';
|
|
422
413
|
for (let i = 0; i < 10; i++) {
|
|
423
|
-
const { message, recordsWrite } =
|
|
424
|
-
|
|
414
|
+
const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema });
|
|
415
|
+
await messageStore.put(alice.did, message, await recordsWrite.constructIndexes(true));
|
|
425
416
|
}
|
|
426
417
|
// also insert messages with a different schema
|
|
427
418
|
for (let i = 0; i < 5; i++) {
|
|
428
|
-
const { message, recordsWrite } =
|
|
429
|
-
|
|
419
|
+
const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema: 'https://schema.org/Other' });
|
|
420
|
+
await messageStore.put(alice.did, message, await recordsWrite.constructIndexes(true));
|
|
430
421
|
}
|
|
431
|
-
const count =
|
|
422
|
+
const count = await messageStore.count(alice.did, [{ schema }]);
|
|
432
423
|
expect(count).toBe(10);
|
|
433
|
-
})
|
|
434
|
-
it('should count all messages when filter is empty', () =>
|
|
435
|
-
const alice =
|
|
424
|
+
});
|
|
425
|
+
it('should count all messages when filter is empty', async () => {
|
|
426
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
436
427
|
for (let i = 0; i < 7; i++) {
|
|
437
|
-
const { message, recordsWrite } =
|
|
438
|
-
|
|
428
|
+
const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite();
|
|
429
|
+
await messageStore.put(alice.did, message, await recordsWrite.constructIndexes(true));
|
|
439
430
|
}
|
|
440
|
-
const count =
|
|
431
|
+
const count = await messageStore.count(alice.did, [{}]);
|
|
441
432
|
expect(count).toBe(7);
|
|
442
|
-
})
|
|
443
|
-
it('should not count messages from another tenant', () =>
|
|
444
|
-
const alice =
|
|
445
|
-
const bob =
|
|
433
|
+
});
|
|
434
|
+
it('should not count messages from another tenant', async () => {
|
|
435
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
436
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
446
437
|
const schema = 'https://schema.org/TenantTest';
|
|
447
438
|
for (let i = 0; i < 3; i++) {
|
|
448
|
-
const { message, recordsWrite } =
|
|
449
|
-
|
|
439
|
+
const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema });
|
|
440
|
+
await messageStore.put(alice.did, message, await recordsWrite.constructIndexes(true));
|
|
450
441
|
}
|
|
451
442
|
for (let i = 0; i < 5; i++) {
|
|
452
|
-
const { message, recordsWrite } =
|
|
453
|
-
|
|
443
|
+
const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema });
|
|
444
|
+
await messageStore.put(bob.did, message, await recordsWrite.constructIndexes(true));
|
|
454
445
|
}
|
|
455
|
-
const aliceCount =
|
|
446
|
+
const aliceCount = await messageStore.count(alice.did, [{ schema }]);
|
|
456
447
|
expect(aliceCount).toBe(3);
|
|
457
|
-
const bobCount =
|
|
448
|
+
const bobCount = await messageStore.count(bob.did, [{ schema }]);
|
|
458
449
|
expect(bobCount).toBe(5);
|
|
459
|
-
})
|
|
460
|
-
it('should count with OR (multi-filter) queries', () =>
|
|
461
|
-
const alice =
|
|
450
|
+
});
|
|
451
|
+
it('should count with OR (multi-filter) queries', async () => {
|
|
452
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
462
453
|
const schema1 = 'https://schema.org/Type1';
|
|
463
454
|
const schema2 = 'https://schema.org/Type2';
|
|
464
455
|
for (let i = 0; i < 4; i++) {
|
|
465
|
-
const { message, recordsWrite } =
|
|
466
|
-
|
|
456
|
+
const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema: schema1 });
|
|
457
|
+
await messageStore.put(alice.did, message, await recordsWrite.constructIndexes(true));
|
|
467
458
|
}
|
|
468
459
|
for (let i = 0; i < 3; i++) {
|
|
469
|
-
const { message, recordsWrite } =
|
|
470
|
-
|
|
460
|
+
const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema: schema2 });
|
|
461
|
+
await messageStore.put(alice.did, message, await recordsWrite.constructIndexes(true));
|
|
471
462
|
}
|
|
472
|
-
const count =
|
|
463
|
+
const count = await messageStore.count(alice.did, [{ schema: schema1 }, { schema: schema2 }]);
|
|
473
464
|
expect(count).toBe(7);
|
|
474
|
-
})
|
|
465
|
+
});
|
|
475
466
|
});
|
|
476
467
|
});
|
|
477
468
|
}
|