@abaxxtech/id 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +31 -0
- package/README.npm.md +31 -0
- package/dist/bundles/dwn.js +83 -0
- package/dist/cjs/index.js +31250 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/generated/precompiled-validators.js +7820 -0
- package/dist/esm/generated/precompiled-validators.js.map +1 -0
- package/dist/esm/json-schemas/definitions.json +23 -0
- package/dist/esm/src/core/abstract-message.js +37 -0
- package/dist/esm/src/core/abstract-message.js.map +1 -0
- package/dist/esm/src/core/auth.js +97 -0
- package/dist/esm/src/core/auth.js.map +1 -0
- package/dist/esm/src/core/dwn-constant.js +8 -0
- package/dist/esm/src/core/dwn-constant.js.map +1 -0
- package/dist/esm/src/core/dwn-error.js +138 -0
- package/dist/esm/src/core/dwn-error.js.map +1 -0
- package/dist/esm/src/core/grant-authorization.js +108 -0
- package/dist/esm/src/core/grant-authorization.js.map +1 -0
- package/dist/esm/src/core/message-reply.js +5 -0
- package/dist/esm/src/core/message-reply.js.map +1 -0
- package/dist/esm/src/core/message.js +200 -0
- package/dist/esm/src/core/message.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +449 -0
- package/dist/esm/src/core/protocol-authorization.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +106 -0
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -0
- package/dist/esm/src/core/tenant-gate.js +20 -0
- package/dist/esm/src/core/tenant-gate.js.map +1 -0
- package/dist/esm/src/did/did-dht-resolver.js +241 -0
- package/dist/esm/src/did/did-dht-resolver.js.map +1 -0
- package/dist/esm/src/did/did-ion-resolver.js +53 -0
- package/dist/esm/src/did/did-ion-resolver.js.map +1 -0
- package/dist/esm/src/did/did-key-resolver.js +135 -0
- package/dist/esm/src/did/did-key-resolver.js.map +1 -0
- package/dist/esm/src/did/did-resolver.js +70 -0
- package/dist/esm/src/did/did-resolver.js.map +1 -0
- package/dist/esm/src/did/did.js +36 -0
- package/dist/esm/src/did/did.js.map +1 -0
- package/dist/esm/src/dwn.js +164 -0
- package/dist/esm/src/dwn.js.map +1 -0
- package/dist/esm/src/enums/dwn-interface-method.js +22 -0
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -0
- package/dist/esm/src/event-log/event-log-level.js +112 -0
- package/dist/esm/src/event-log/event-log-level.js.map +1 -0
- package/dist/esm/src/handlers/events-get.js +48 -0
- package/dist/esm/src/handlers/events-get.js.map +1 -0
- package/dist/esm/src/handlers/messages-get.js +76 -0
- package/dist/esm/src/handlers/messages-get.js.map +1 -0
- package/dist/esm/src/handlers/permissions-grant.js +62 -0
- package/dist/esm/src/handlers/permissions-grant.js.map +1 -0
- package/dist/esm/src/handlers/permissions-request.js +63 -0
- package/dist/esm/src/handlers/permissions-request.js.map +1 -0
- package/dist/esm/src/handlers/permissions-revoke.js +114 -0
- package/dist/esm/src/handlers/permissions-revoke.js.map +1 -0
- package/dist/esm/src/handlers/protocols-configure.js +102 -0
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -0
- package/dist/esm/src/handlers/protocols-query.js +72 -0
- package/dist/esm/src/handlers/protocols-query.js.map +1 -0
- package/dist/esm/src/handlers/records-delete.js +119 -0
- package/dist/esm/src/handlers/records-delete.js.map +1 -0
- package/dist/esm/src/handlers/records-query.js +206 -0
- package/dist/esm/src/handlers/records-query.js.map +1 -0
- package/dist/esm/src/handlers/records-read.js +118 -0
- package/dist/esm/src/handlers/records-read.js.map +1 -0
- package/dist/esm/src/handlers/records-write.js +252 -0
- package/dist/esm/src/handlers/records-write.js.map +1 -0
- package/dist/esm/src/index.js +43 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/interfaces/events-get.js +41 -0
- package/dist/esm/src/interfaces/events-get.js.map +1 -0
- package/dist/esm/src/interfaces/messages-get.js +58 -0
- package/dist/esm/src/interfaces/messages-get.js.map +1 -0
- package/dist/esm/src/interfaces/permissions-grant.js +130 -0
- package/dist/esm/src/interfaces/permissions-grant.js.map +1 -0
- package/dist/esm/src/interfaces/permissions-request.js +47 -0
- package/dist/esm/src/interfaces/permissions-request.js.map +1 -0
- package/dist/esm/src/interfaces/permissions-revoke.js +47 -0
- package/dist/esm/src/interfaces/permissions-revoke.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +149 -0
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-query.js +80 -0
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-delete.js +56 -0
- package/dist/esm/src/interfaces/records-delete.js.map +1 -0
- package/dist/esm/src/interfaces/records-query.js +81 -0
- package/dist/esm/src/interfaces/records-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-read.js +65 -0
- package/dist/esm/src/interfaces/records-read.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +677 -0
- package/dist/esm/src/interfaces/records-write.js.map +1 -0
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +54 -0
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -0
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js +13 -0
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -0
- package/dist/esm/src/jose/jws/general/builder.js +47 -0
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -0
- package/dist/esm/src/jose/jws/general/signer.js +36 -0
- package/dist/esm/src/jose/jws/general/signer.js.map +1 -0
- package/dist/esm/src/jose/jws/general/verifier.js +97 -0
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -0
- package/dist/esm/src/schema-validator.js +28 -0
- package/dist/esm/src/schema-validator.js.map +1 -0
- package/dist/esm/src/store/blockstore-level.js +187 -0
- package/dist/esm/src/store/blockstore-level.js.map +1 -0
- package/dist/esm/src/store/data-store-level.js +192 -0
- package/dist/esm/src/store/data-store-level.js.map +1 -0
- package/dist/esm/src/store/index-level.js +302 -0
- package/dist/esm/src/store/index-level.js.map +1 -0
- package/dist/esm/src/store/level-wrapper.js +296 -0
- package/dist/esm/src/store/level-wrapper.js.map +1 -0
- package/dist/esm/src/store/message-store-level.js +236 -0
- package/dist/esm/src/store/message-store-level.js.map +1 -0
- package/dist/esm/src/store/storage-controller.js +69 -0
- package/dist/esm/src/store/storage-controller.js.map +1 -0
- package/dist/esm/src/types/cache.js +2 -0
- package/dist/esm/src/types/cache.js.map +1 -0
- package/dist/esm/src/types/data-store.js +2 -0
- package/dist/esm/src/types/data-store.js.map +1 -0
- package/dist/esm/src/types/delegated-grant-message.js +2 -0
- package/dist/esm/src/types/delegated-grant-message.js.map +1 -0
- package/dist/esm/src/types/did-types.js +2 -0
- package/dist/esm/src/types/did-types.js.map +1 -0
- package/dist/esm/src/types/event-log.js +2 -0
- package/dist/esm/src/types/event-log.js.map +1 -0
- package/dist/esm/src/types/event-types.js +2 -0
- package/dist/esm/src/types/event-types.js.map +1 -0
- package/dist/esm/src/types/jose-types.js +2 -0
- package/dist/esm/src/types/jose-types.js.map +1 -0
- package/dist/esm/src/types/jws-types.js +2 -0
- package/dist/esm/src/types/jws-types.js.map +1 -0
- package/dist/esm/src/types/message-interface.js +2 -0
- package/dist/esm/src/types/message-interface.js.map +1 -0
- package/dist/esm/src/types/message-store.js +2 -0
- package/dist/esm/src/types/message-store.js.map +1 -0
- package/dist/esm/src/types/message-types.js +6 -0
- package/dist/esm/src/types/message-types.js.map +1 -0
- package/dist/esm/src/types/messages-types.js +2 -0
- package/dist/esm/src/types/messages-types.js.map +1 -0
- package/dist/esm/src/types/method-handler.js +2 -0
- package/dist/esm/src/types/method-handler.js.map +1 -0
- package/dist/esm/src/types/permissions-grant-descriptor.js +6 -0
- package/dist/esm/src/types/permissions-grant-descriptor.js.map +1 -0
- package/dist/esm/src/types/permissions-types.js +2 -0
- package/dist/esm/src/types/permissions-types.js.map +1 -0
- package/dist/esm/src/types/protocols-types.js +15 -0
- package/dist/esm/src/types/protocols-types.js.map +1 -0
- package/dist/esm/src/types/records-types.js +8 -0
- package/dist/esm/src/types/records-types.js.map +1 -0
- package/dist/esm/src/types/signer.js +2 -0
- package/dist/esm/src/types/signer.js.map +1 -0
- package/dist/esm/src/utils/abort.js +40 -0
- package/dist/esm/src/utils/abort.js.map +1 -0
- package/dist/esm/src/utils/array.js +72 -0
- package/dist/esm/src/utils/array.js.map +1 -0
- package/dist/esm/src/utils/cid.js +130 -0
- package/dist/esm/src/utils/cid.js.map +1 -0
- package/dist/esm/src/utils/data-stream.js +88 -0
- package/dist/esm/src/utils/data-stream.js.map +1 -0
- package/dist/esm/src/utils/encoder.js +45 -0
- package/dist/esm/src/utils/encoder.js.map +1 -0
- package/dist/esm/src/utils/encryption.js +128 -0
- package/dist/esm/src/utils/encryption.js.map +1 -0
- package/dist/esm/src/utils/hd-key.js +60 -0
- package/dist/esm/src/utils/hd-key.js.map +1 -0
- package/dist/esm/src/utils/jws.js +89 -0
- package/dist/esm/src/utils/jws.js.map +1 -0
- package/dist/esm/src/utils/memory-cache.js +41 -0
- package/dist/esm/src/utils/memory-cache.js.map +1 -0
- package/dist/esm/src/utils/object.js +50 -0
- package/dist/esm/src/utils/object.js.map +1 -0
- package/dist/esm/src/utils/private-key-signer.js +43 -0
- package/dist/esm/src/utils/private-key-signer.js.map +1 -0
- package/dist/esm/src/utils/protocols.js +51 -0
- package/dist/esm/src/utils/protocols.js.map +1 -0
- package/dist/esm/src/utils/records.js +267 -0
- package/dist/esm/src/utils/records.js.map +1 -0
- package/dist/esm/src/utils/secp256k1.js +219 -0
- package/dist/esm/src/utils/secp256k1.js.map +1 -0
- package/dist/esm/src/utils/string.js +16 -0
- package/dist/esm/src/utils/string.js.map +1 -0
- package/dist/esm/src/utils/time.js +84 -0
- package/dist/esm/src/utils/time.js.map +1 -0
- package/dist/esm/src/utils/url.js +63 -0
- package/dist/esm/src/utils/url.js.map +1 -0
- package/dist/esm/tests/core/auth.spec.js +25 -0
- package/dist/esm/tests/core/auth.spec.js.map +1 -0
- package/dist/esm/tests/core/message-reply.spec.js +19 -0
- package/dist/esm/tests/core/message-reply.spec.js.map +1 -0
- package/dist/esm/tests/core/message.spec.js +85 -0
- package/dist/esm/tests/core/message.spec.js.map +1 -0
- package/dist/esm/tests/did/did-ion-resolver.spec.js +82 -0
- package/dist/esm/tests/did/did-ion-resolver.spec.js.map +1 -0
- package/dist/esm/tests/did/did-key-resolver.spec.js +74 -0
- package/dist/esm/tests/did/did-key-resolver.spec.js.map +1 -0
- package/dist/esm/tests/did/did-resolver.spec.js +84 -0
- package/dist/esm/tests/did/did-resolver.spec.js.map +1 -0
- package/dist/esm/tests/did/did.spec.js +22 -0
- package/dist/esm/tests/did/did.spec.js.map +1 -0
- package/dist/esm/tests/dwn.spec.js +252 -0
- package/dist/esm/tests/dwn.spec.js.map +1 -0
- package/dist/esm/tests/end-to-end-tests.spec.js +218 -0
- package/dist/esm/tests/end-to-end-tests.spec.js.map +1 -0
- package/dist/esm/tests/event-log/event-log-level.spec.js +137 -0
- package/dist/esm/tests/event-log/event-log-level.spec.js.map +1 -0
- package/dist/esm/tests/handlers/events-get.spec.js +108 -0
- package/dist/esm/tests/handlers/events-get.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-get.spec.js +209 -0
- package/dist/esm/tests/handlers/messages-get.spec.js.map +1 -0
- package/dist/esm/tests/handlers/permissions-grant.spec.js +249 -0
- package/dist/esm/tests/handlers/permissions-grant.spec.js.map +1 -0
- package/dist/esm/tests/handlers/permissions-request.spec.js +132 -0
- package/dist/esm/tests/handlers/permissions-request.spec.js.map +1 -0
- package/dist/esm/tests/handlers/permissions-revoke.spec.js +311 -0
- package/dist/esm/tests/handlers/permissions-revoke.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js +254 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-query.spec.js +373 -0
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-delete.spec.js +630 -0
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-query.spec.js +1937 -0
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-read.spec.js +1729 -0
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-write.spec.js +3381 -0
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/events-get.spec.js +73 -0
- package/dist/esm/tests/interfaces/events-get.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/messages-get.spec.js +93 -0
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/permissions-grant.spec.js +216 -0
- package/dist/esm/tests/interfaces/permissions-grant.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/permissions-request.spec.js +45 -0
- package/dist/esm/tests/interfaces/permissions-request.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +334 -0
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/protocols-query.spec.js +49 -0
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-delete.spec.js +42 -0
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-query.spec.js +75 -0
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-read.spec.js +65 -0
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-write.spec.js +369 -0
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -0
- package/dist/esm/tests/jose/jws/general.spec.js +185 -0
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/delegated-grant.spec.js +490 -0
- package/dist/esm/tests/scenarios/delegated-grant.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +218 -0
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -0
- package/dist/esm/tests/store/data-store-level.spec.js +192 -0
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -0
- package/dist/esm/tests/store/index-level.spec.js +428 -0
- package/dist/esm/tests/store/index-level.spec.js.map +1 -0
- package/dist/esm/tests/store/message-store-level.spec.js +51 -0
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -0
- package/dist/esm/tests/store/message-store.spec.js +395 -0
- package/dist/esm/tests/store/message-store.spec.js.map +1 -0
- package/dist/esm/tests/store-dependent-tests.spec.js +8 -0
- package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -0
- package/dist/esm/tests/test-stores.js +40 -0
- package/dist/esm/tests/test-stores.js.map +1 -0
- package/dist/esm/tests/test-suite.js +51 -0
- package/dist/esm/tests/test-suite.js.map +1 -0
- package/dist/esm/tests/utils/cid.spec.js +83 -0
- package/dist/esm/tests/utils/cid.spec.js.map +1 -0
- package/dist/esm/tests/utils/data-stream.spec.js +30 -0
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -0
- package/dist/esm/tests/utils/encryption.spec.js +151 -0
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -0
- package/dist/esm/tests/utils/jws.spec.js +11 -0
- package/dist/esm/tests/utils/jws.spec.js.map +1 -0
- package/dist/esm/tests/utils/memory-cache.spec.js +38 -0
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -0
- package/dist/esm/tests/utils/object.spec.js +39 -0
- package/dist/esm/tests/utils/object.spec.js.map +1 -0
- package/dist/esm/tests/utils/private-key-signer.spec.js +47 -0
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -0
- package/dist/esm/tests/utils/records.spec.js +56 -0
- package/dist/esm/tests/utils/records.spec.js.map +1 -0
- package/dist/esm/tests/utils/secp256k1.spec.js +77 -0
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -0
- package/dist/esm/tests/utils/test-data-generator.js +570 -0
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -0
- package/dist/esm/tests/utils/test-stub-generator.js +39 -0
- package/dist/esm/tests/utils/test-stub-generator.js.map +1 -0
- package/dist/esm/tests/utils/time.spec.js +67 -0
- package/dist/esm/tests/utils/time.spec.js.map +1 -0
- package/dist/esm/tests/utils/url.spec.js +46 -0
- package/dist/esm/tests/utils/url.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +36 -0
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +53 -0
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +39 -0
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +76 -0
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +74 -0
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +151 -0
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +389 -0
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -0
- package/dist/esm/tests/vectors/protocol-definitions/anyone-collaborate.json +25 -0
- package/dist/esm/tests/vectors/protocol-definitions/author-can.json +32 -0
- package/dist/esm/tests/vectors/protocol-definitions/chat.json +56 -0
- package/dist/esm/tests/vectors/protocol-definitions/credential-issuance.json +37 -0
- package/dist/esm/tests/vectors/protocol-definitions/dex.json +52 -0
- package/dist/esm/tests/vectors/protocol-definitions/email.json +50 -0
- package/dist/esm/tests/vectors/protocol-definitions/free-for-all.json +30 -0
- package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +48 -0
- package/dist/esm/tests/vectors/protocol-definitions/message.json +20 -0
- package/dist/esm/tests/vectors/protocol-definitions/minimal.json +10 -0
- package/dist/esm/tests/vectors/protocol-definitions/nested.json +31 -0
- package/dist/esm/tests/vectors/protocol-definitions/private-protocol.json +13 -0
- package/dist/esm/tests/vectors/protocol-definitions/recipient-can.json +36 -0
- package/dist/esm/tests/vectors/protocol-definitions/social-media.json +88 -0
- package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +68 -0
- package/dist/types/generated/precompiled-validators.d.ts +113 -0
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -0
- package/dist/types/src/core/abstract-message.d.ts +19 -0
- package/dist/types/src/core/abstract-message.d.ts.map +1 -0
- package/dist/types/src/core/auth.d.ts +30 -0
- package/dist/types/src/core/auth.d.ts.map +1 -0
- package/dist/types/src/core/dwn-constant.d.ts +8 -0
- package/dist/types/src/core/dwn-constant.d.ts.map +1 -0
- package/dist/types/src/core/dwn-error.d.ts +133 -0
- package/dist/types/src/core/dwn-error.d.ts.map +1 -0
- package/dist/types/src/core/grant-authorization.d.ts +35 -0
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/message-reply.d.ts +33 -0
- package/dist/types/src/core/message-reply.d.ts.map +1 -0
- package/dist/types/src/core/message.d.ts +79 -0
- package/dist/types/src/core/message.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +85 -0
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.d.ts +38 -0
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/tenant-gate.d.ts +16 -0
- package/dist/types/src/core/tenant-gate.d.ts.map +1 -0
- package/dist/types/src/did/did-dht-resolver.d.ts +26 -0
- package/dist/types/src/did/did-dht-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did-ion-resolver.d.ts +20 -0
- package/dist/types/src/did/did-ion-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did-key-resolver.d.ts +32 -0
- package/dist/types/src/did/did-key-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did-resolver.d.ts +20 -0
- package/dist/types/src/did/did-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did.d.ts +15 -0
- package/dist/types/src/did/did.d.ts.map +1 -0
- package/dist/types/src/dwn.d.ts +74 -0
- package/dist/types/src/dwn.d.ts.map +1 -0
- package/dist/types/src/enums/dwn-interface-method.d.ts +20 -0
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -0
- package/dist/types/src/event-log/event-log-level.d.ts +26 -0
- package/dist/types/src/event-log/event-log-level.d.ts.map +1 -0
- package/dist/types/src/handlers/events-get.d.ts +16 -0
- package/dist/types/src/handlers/events-get.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-get.d.ts +18 -0
- package/dist/types/src/handlers/messages-get.d.ts.map +1 -0
- package/dist/types/src/handlers/permissions-grant.d.ts +17 -0
- package/dist/types/src/handlers/permissions-grant.d.ts.map +1 -0
- package/dist/types/src/handlers/permissions-request.d.ts +17 -0
- package/dist/types/src/handlers/permissions-request.d.ts.map +1 -0
- package/dist/types/src/handlers/permissions-revoke.d.ts +17 -0
- package/dist/types/src/handlers/permissions-revoke.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-configure.d.ts +21 -0
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-query.d.ts +20 -0
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -0
- package/dist/types/src/handlers/records-delete.d.ts +22 -0
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -0
- package/dist/types/src/handlers/records-query.d.ts +78 -0
- package/dist/types/src/handlers/records-query.d.ts.map +1 -0
- package/dist/types/src/handlers/records-read.d.ts +17 -0
- package/dist/types/src/handlers/records-read.d.ts.map +1 -0
- package/dist/types/src/handlers/records-write.d.ts +61 -0
- package/dist/types/src/handlers/records-write.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +72 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/interfaces/events-get.d.ts +13 -0
- package/dist/types/src/interfaces/events-get.d.ts.map +1 -0
- package/dist/types/src/interfaces/messages-get.d.ts +19 -0
- package/dist/types/src/interfaces/messages-get.d.ts.map +1 -0
- package/dist/types/src/interfaces/permissions-grant.d.ts +59 -0
- package/dist/types/src/interfaces/permissions-grant.d.ts.map +1 -0
- package/dist/types/src/interfaces/permissions-request.d.ts +19 -0
- package/dist/types/src/interfaces/permissions-request.d.ts.map +1 -0
- package/dist/types/src/interfaces/permissions-revoke.d.ts +14 -0
- package/dist/types/src/interfaces/permissions-revoke.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +21 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-query.d.ts +17 -0
- package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-delete.d.ts +24 -0
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-query.d.ts +29 -0
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-read.d.ts +31 -0
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +259 -0
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -0
- package/dist/types/src/jose/algorithms/signing/ed25519.d.ts +3 -0
- package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -0
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts +3 -0
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -0
- package/dist/types/src/jose/jws/general/builder.d.ts +10 -0
- package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -0
- package/dist/types/src/jose/jws/general/signer.d.ts +8 -0
- package/dist/types/src/jose/jws/general/signer.d.ts.map +1 -0
- package/dist/types/src/jose/jws/general/verifier.d.ts +32 -0
- package/dist/types/src/jose/jws/general/verifier.d.ts.map +1 -0
- package/dist/types/src/schema-validator.d.ts +8 -0
- package/dist/types/src/schema-validator.d.ts.map +1 -0
- package/dist/types/src/store/blockstore-level.d.ts +35 -0
- package/dist/types/src/store/blockstore-level.d.ts.map +1 -0
- package/dist/types/src/store/data-store-level.d.ts +44 -0
- package/dist/types/src/store/data-store-level.d.ts.map +1 -0
- package/dist/types/src/store/index-level.d.ts +69 -0
- package/dist/types/src/store/index-level.d.ts.map +1 -0
- package/dist/types/src/store/level-wrapper.d.ts +44 -0
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -0
- package/dist/types/src/store/message-store-level.d.ts +70 -0
- package/dist/types/src/store/message-store-level.d.ts.map +1 -0
- package/dist/types/src/store/storage-controller.d.ts +19 -0
- package/dist/types/src/store/storage-controller.d.ts.map +1 -0
- package/dist/types/src/types/cache.d.ts +16 -0
- package/dist/types/src/types/cache.d.ts.map +1 -0
- package/dist/types/src/types/data-store.d.ts +69 -0
- package/dist/types/src/types/data-store.d.ts.map +1 -0
- package/dist/types/src/types/delegated-grant-message.d.ts +14 -0
- package/dist/types/src/types/delegated-grant-message.d.ts.map +1 -0
- package/dist/types/src/types/did-types.d.ts +68 -0
- package/dist/types/src/types/did-types.d.ts.map +1 -0
- package/dist/types/src/types/event-log.d.ts +39 -0
- package/dist/types/src/types/event-log.d.ts.map +1 -0
- package/dist/types/src/types/event-types.d.ts +18 -0
- package/dist/types/src/types/event-types.d.ts.map +1 -0
- package/dist/types/src/types/jose-types.d.ts +75 -0
- package/dist/types/src/types/jose-types.d.ts.map +1 -0
- package/dist/types/src/types/jws-types.d.ts +27 -0
- package/dist/types/src/types/jws-types.d.ts.map +1 -0
- package/dist/types/src/types/message-interface.d.ts +22 -0
- package/dist/types/src/types/message-interface.d.ts.map +1 -0
- package/dist/types/src/types/message-store.d.ts +43 -0
- package/dist/types/src/types/message-store.d.ts.map +1 -0
- package/dist/types/src/types/message-types.d.ts +113 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -0
- package/dist/types/src/types/messages-types.d.ts +23 -0
- package/dist/types/src/types/messages-types.d.ts.map +1 -0
- package/dist/types/src/types/method-handler.d.ts +17 -0
- package/dist/types/src/types/method-handler.d.ts.map +1 -0
- package/dist/types/src/types/permissions-grant-descriptor.d.ts +65 -0
- package/dist/types/src/types/permissions-grant-descriptor.d.ts.map +1 -0
- package/dist/types/src/types/permissions-types.d.ts +33 -0
- package/dist/types/src/types/permissions-types.d.ts.map +1 -0
- package/dist/types/src/types/protocols-types.d.ts +138 -0
- package/dist/types/src/types/protocols-types.d.ts.map +1 -0
- package/dist/types/src/types/records-types.d.ts +164 -0
- package/dist/types/src/types/records-types.d.ts.map +1 -0
- package/dist/types/src/types/signer.d.ts +26 -0
- package/dist/types/src/types/signer.d.ts.map +1 -0
- package/dist/types/src/utils/abort.d.ts +5 -0
- package/dist/types/src/utils/abort.d.ts.map +1 -0
- package/dist/types/src/utils/array.d.ts +18 -0
- package/dist/types/src/utils/array.d.ts.map +1 -0
- package/dist/types/src/utils/cid.d.ts +30 -0
- package/dist/types/src/utils/cid.d.ts.map +1 -0
- package/dist/types/src/utils/data-stream.d.ts +27 -0
- package/dist/types/src/utils/data-stream.d.ts.map +1 -0
- package/dist/types/src/utils/encoder.d.ts +14 -0
- package/dist/types/src/utils/encoder.d.ts.map +1 -0
- package/dist/types/src/utils/encryption.d.ts +44 -0
- package/dist/types/src/utils/encryption.d.ts.map +1 -0
- package/dist/types/src/utils/hd-key.d.ts +35 -0
- package/dist/types/src/utils/hd-key.d.ts.map +1 -0
- package/dist/types/src/utils/jws.d.ts +39 -0
- package/dist/types/src/utils/jws.d.ts.map +1 -0
- package/dist/types/src/utils/memory-cache.d.ts +15 -0
- package/dist/types/src/utils/memory-cache.d.ts.map +1 -0
- package/dist/types/src/utils/object.d.ts +18 -0
- package/dist/types/src/utils/object.d.ts.map +1 -0
- package/dist/types/src/utils/private-key-signer.d.ts +34 -0
- package/dist/types/src/utils/private-key-signer.d.ts.map +1 -0
- package/dist/types/src/utils/protocols.d.ts +14 -0
- package/dist/types/src/utils/protocols.d.ts.map +1 -0
- package/dist/types/src/utils/records.d.ts +68 -0
- package/dist/types/src/utils/records.d.ts.map +1 -0
- package/dist/types/src/utils/secp256k1.d.ts +78 -0
- package/dist/types/src/utils/secp256k1.d.ts.map +1 -0
- package/dist/types/src/utils/string.d.ts +6 -0
- package/dist/types/src/utils/string.d.ts.map +1 -0
- package/dist/types/src/utils/time.d.ts +49 -0
- package/dist/types/src/utils/time.d.ts.map +1 -0
- package/dist/types/src/utils/url.d.ts +5 -0
- package/dist/types/src/utils/url.d.ts.map +1 -0
- package/dist/types/tests/core/auth.spec.d.ts +2 -0
- package/dist/types/tests/core/auth.spec.d.ts.map +1 -0
- package/dist/types/tests/core/message-reply.spec.d.ts +2 -0
- package/dist/types/tests/core/message-reply.spec.d.ts.map +1 -0
- package/dist/types/tests/core/message.spec.d.ts +2 -0
- package/dist/types/tests/core/message.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did-ion-resolver.spec.d.ts +2 -0
- package/dist/types/tests/did/did-ion-resolver.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did-key-resolver.spec.d.ts +2 -0
- package/dist/types/tests/did/did-key-resolver.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did-resolver.spec.d.ts +2 -0
- package/dist/types/tests/did/did-resolver.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did.spec.d.ts +2 -0
- package/dist/types/tests/did/did.spec.d.ts.map +1 -0
- package/dist/types/tests/dwn.spec.d.ts +2 -0
- package/dist/types/tests/dwn.spec.d.ts.map +1 -0
- package/dist/types/tests/end-to-end-tests.spec.d.ts +2 -0
- package/dist/types/tests/end-to-end-tests.spec.d.ts.map +1 -0
- package/dist/types/tests/event-log/event-log-level.spec.d.ts +2 -0
- package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/events-get.spec.d.ts +2 -0
- package/dist/types/tests/handlers/events-get.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-get.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-get.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/permissions-grant.spec.d.ts +2 -0
- package/dist/types/tests/handlers/permissions-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/permissions-request.spec.d.ts +2 -0
- package/dist/types/tests/handlers/permissions-request.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/permissions-revoke.spec.d.ts +2 -0
- package/dist/types/tests/handlers/permissions-revoke.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts +2 -0
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/protocols-query.spec.d.ts +2 -0
- package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-delete.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-query.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-read.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-write.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/events-get.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/events-get.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/messages-get.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/messages-get.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/permissions-grant.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/permissions-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/permissions-request.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/permissions-request.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/protocols-configure.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/protocols-configure.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/protocols-query.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/protocols-query.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-delete.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-delete.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-query.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-query.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-read.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-read.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-write.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-write.spec.d.ts.map +1 -0
- package/dist/types/tests/jose/jws/general.spec.d.ts +2 -0
- package/dist/types/tests/jose/jws/general.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/delegated-grant.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/delegated-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -0
- package/dist/types/tests/store/data-store-level.spec.d.ts +2 -0
- package/dist/types/tests/store/data-store-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/index-level.spec.d.ts +2 -0
- package/dist/types/tests/store/index-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/message-store-level.spec.d.ts +2 -0
- package/dist/types/tests/store/message-store-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/message-store.spec.d.ts +2 -0
- package/dist/types/tests/store/message-store.spec.d.ts.map +1 -0
- package/dist/types/tests/store-dependent-tests.spec.d.ts +2 -0
- package/dist/types/tests/store-dependent-tests.spec.d.ts.map +1 -0
- package/dist/types/tests/test-stores.d.ts +30 -0
- package/dist/types/tests/test-stores.d.ts.map +1 -0
- package/dist/types/tests/test-suite.d.ts +16 -0
- package/dist/types/tests/test-suite.d.ts.map +1 -0
- package/dist/types/tests/utils/cid.spec.d.ts +2 -0
- package/dist/types/tests/utils/cid.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/data-stream.spec.d.ts +2 -0
- package/dist/types/tests/utils/data-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/encryption.spec.d.ts +2 -0
- package/dist/types/tests/utils/encryption.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/jws.spec.d.ts +2 -0
- package/dist/types/tests/utils/jws.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/memory-cache.spec.d.ts +2 -0
- package/dist/types/tests/utils/memory-cache.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/object.spec.d.ts +2 -0
- package/dist/types/tests/utils/object.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/private-key-signer.spec.d.ts +2 -0
- package/dist/types/tests/utils/private-key-signer.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/records.spec.d.ts +2 -0
- package/dist/types/tests/utils/records.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/secp256k1.spec.d.ts +2 -0
- package/dist/types/tests/utils/secp256k1.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/test-data-generator.d.ts +323 -0
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -0
- package/dist/types/tests/utils/test-stub-generator.d.ts +16 -0
- package/dist/types/tests/utils/test-stub-generator.d.ts.map +1 -0
- package/dist/types/tests/utils/time.spec.d.ts +2 -0
- package/dist/types/tests/utils/time.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/url.spec.d.ts +2 -0
- package/dist/types/tests/utils/url.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/definitions.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/definitions.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/jwk/general-jwk.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/jwk/general-jwk.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/jwk/public-jwk.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/jwk/public-jwk.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/jwk-verification-method.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/jwk-verification-method.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/protocols/protocols-configure.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/protocols/protocols-configure.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/records/records-query.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/records/records-query.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/records/records-write.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/records/records-write.spec.d.ts.map +1 -0
- package/package.json +156 -0
- package/src/core/abstract-message.ts +48 -0
- package/src/core/auth.ts +108 -0
- package/src/core/dwn-constant.ts +7 -0
- package/src/core/dwn-error.ts +136 -0
- package/src/core/grant-authorization.ts +163 -0
- package/src/core/message-reply.ts +42 -0
- package/src/core/message.ts +224 -0
- package/src/core/protocol-authorization.ts +691 -0
- package/src/core/records-grant-authorization.ts +167 -0
- package/src/core/tenant-gate.ts +18 -0
- package/src/did/did-dht-resolver.ts +241 -0
- package/src/did/did-ion-resolver.ts +52 -0
- package/src/did/did-key-resolver.ts +137 -0
- package/src/did/did-resolver.ts +77 -0
- package/src/did/did.ts +39 -0
- package/src/dwn.ts +213 -0
- package/src/enums/dwn-interface-method.ts +20 -0
- package/src/event-log/event-log-level.ts +116 -0
- package/src/handlers/events-get.ts +46 -0
- package/src/handlers/messages-get.ts +80 -0
- package/src/handlers/permissions-grant.ts +52 -0
- package/src/handlers/permissions-request.ts +54 -0
- package/src/handlers/permissions-revoke.ts +121 -0
- package/src/handlers/protocols-configure.ts +104 -0
- package/src/handlers/protocols-query.ts +81 -0
- package/src/handlers/records-delete.ts +139 -0
- package/src/handlers/records-query.ts +253 -0
- package/src/handlers/records-read.ts +127 -0
- package/src/handlers/records-write.ts +296 -0
- package/src/index.ts +81 -0
- package/src/interfaces/events-get.ts +43 -0
- package/src/interfaces/messages-get.ts +59 -0
- package/src/interfaces/permissions-grant.ts +175 -0
- package/src/interfaces/permissions-request.ts +55 -0
- package/src/interfaces/permissions-revoke.ts +46 -0
- package/src/interfaces/protocols-configure.ts +188 -0
- package/src/interfaces/protocols-query.ts +99 -0
- package/src/interfaces/records-delete.ts +67 -0
- package/src/interfaces/records-query.ts +100 -0
- package/src/interfaces/records-read.ts +82 -0
- package/src/interfaces/records-write.ts +924 -0
- package/src/jose/algorithms/signing/ed25519.ts +61 -0
- package/src/jose/algorithms/signing/signature-algorithms.ts +15 -0
- package/src/jose/jws/general/builder.ts +48 -0
- package/src/jose/jws/general/signer.ts +29 -0
- package/src/jose/jws/general/verifier.ts +113 -0
- package/src/schema-validator.ts +34 -0
- package/src/store/blockstore-level.ts +113 -0
- package/src/store/data-store-level.ts +188 -0
- package/src/store/index-level.ts +306 -0
- package/src/store/level-wrapper.ts +262 -0
- package/src/store/message-store-level.ts +284 -0
- package/src/store/storage-controller.ts +80 -0
- package/src/types/cache.ts +16 -0
- package/src/types/data-store.ts +78 -0
- package/src/types/delegated-grant-message.ts +15 -0
- package/src/types/did-types.ts +95 -0
- package/src/types/event-log.ts +46 -0
- package/src/types/event-types.ts +20 -0
- package/src/types/jose-types.ts +76 -0
- package/src/types/jws-types.ts +28 -0
- package/src/types/message-interface.ts +24 -0
- package/src/types/message-store.ts +56 -0
- package/src/types/message-types.ts +115 -0
- package/src/types/messages-types.ts +26 -0
- package/src/types/method-handler.ts +17 -0
- package/src/types/permissions-grant-descriptor.ts +79 -0
- package/src/types/permissions-types.ts +42 -0
- package/src/types/protocols-types.ts +154 -0
- package/src/types/records-types.ts +184 -0
- package/src/types/signer.ts +27 -0
- package/src/utils/abort.ts +31 -0
- package/src/utils/array.ts +39 -0
- package/src/utils/cid.ts +101 -0
- package/src/utils/data-stream.ts +85 -0
- package/src/utils/encoder.ts +54 -0
- package/src/utils/encryption.ts +145 -0
- package/src/utils/hd-key.ts +58 -0
- package/src/utils/jws.ts +95 -0
- package/src/utils/memory-cache.ts +31 -0
- package/src/utils/object.ts +55 -0
- package/src/utils/private-key-signer.ts +72 -0
- package/src/utils/protocols.ts +50 -0
- package/src/utils/records.ts +326 -0
- package/src/utils/secp256k1.ts +209 -0
- package/src/utils/string.ts +13 -0
- package/src/utils/time.ts +77 -0
- package/src/utils/url.ts +66 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import type { DataStore } from '../types/data-store.js';
|
|
2
|
+
import type { DidResolver } from '../did/did-resolver.js';
|
|
3
|
+
import type { MessageStore } from '../types//message-store.js';
|
|
4
|
+
import type { MethodHandler } from '../types/method-handler.js';
|
|
5
|
+
import type { Filter, GenericMessage, MessageSort } from '../types/message-types.js';
|
|
6
|
+
import type { RecordsQueryMessage, RecordsQueryReply, RecordsWriteMessageWithOptionalEncodedData } from '../types/records-types.js';
|
|
7
|
+
|
|
8
|
+
import { authenticate } from '../core/auth.js';
|
|
9
|
+
import { DateSort } from '../types/records-types.js';
|
|
10
|
+
import { messageReplyFromError } from '../core/message-reply.js';
|
|
11
|
+
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
12
|
+
import { Records } from '../utils/records.js';
|
|
13
|
+
import { RecordsQuery } from '../interfaces/records-query.js';
|
|
14
|
+
import { SortOrder } from '../types/message-types.js';
|
|
15
|
+
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
16
|
+
|
|
17
|
+
export class RecordsQueryHandler implements MethodHandler {
|
|
18
|
+
|
|
19
|
+
constructor(private didResolver: DidResolver, private messageStore: MessageStore, private dataStore: DataStore) { }
|
|
20
|
+
|
|
21
|
+
public async handle({
|
|
22
|
+
tenant,
|
|
23
|
+
message
|
|
24
|
+
}: {tenant: string, message: RecordsQueryMessage}): Promise<RecordsQueryReply> {
|
|
25
|
+
let recordsQuery: RecordsQuery;
|
|
26
|
+
try {
|
|
27
|
+
recordsQuery = await RecordsQuery.parse(message);
|
|
28
|
+
} catch (e) {
|
|
29
|
+
return messageReplyFromError(e, 400);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let recordsWrites: RecordsWriteMessageWithOptionalEncodedData[];
|
|
33
|
+
let cursor: string|undefined;
|
|
34
|
+
// if this is an anonymous query and the filter supports published records, query only published records
|
|
35
|
+
if (RecordsQueryHandler.filterIncludesPublishedRecords(recordsQuery) && recordsQuery.author === undefined) {
|
|
36
|
+
const results = await this.fetchPublishedRecords(tenant, recordsQuery);
|
|
37
|
+
recordsWrites = results.messages as RecordsWriteMessageWithOptionalEncodedData[];
|
|
38
|
+
cursor = results.cursor;
|
|
39
|
+
} else {
|
|
40
|
+
// authentication and authorization
|
|
41
|
+
try {
|
|
42
|
+
await authenticate(message.authorization!, this.didResolver);
|
|
43
|
+
|
|
44
|
+
// Only run protocol authz if message deliberately invokes it
|
|
45
|
+
if (RecordsQueryHandler.shouldProtocolAuthorizeQuery(recordsQuery)) {
|
|
46
|
+
await ProtocolAuthorization.authorizeQuery(tenant, recordsQuery, this.messageStore);
|
|
47
|
+
}
|
|
48
|
+
} catch (e) {
|
|
49
|
+
return messageReplyFromError(e, 401);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (recordsQuery.author === tenant) {
|
|
53
|
+
const results = await this.fetchRecordsAsOwner(tenant, recordsQuery);
|
|
54
|
+
recordsWrites = results.messages as RecordsWriteMessageWithOptionalEncodedData[];
|
|
55
|
+
cursor = results.cursor;
|
|
56
|
+
} else {
|
|
57
|
+
const results = await this.fetchRecordsAsNonOwner(tenant, recordsQuery);
|
|
58
|
+
recordsWrites = results.messages as RecordsWriteMessageWithOptionalEncodedData[];
|
|
59
|
+
cursor = results.cursor;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
status : { code: 200, detail: 'OK' },
|
|
65
|
+
entries : recordsWrites,
|
|
66
|
+
cursor
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Convert an incoming DateSort to a sort type accepted by MessageStore
|
|
72
|
+
* Defaults to 'dateCreated' in Descending order if no sort is supplied.
|
|
73
|
+
*
|
|
74
|
+
* @param dateSort the optional DateSort from the RecordsQuery message descriptor.
|
|
75
|
+
* @returns {MessageSort} for MessageStore sorting.
|
|
76
|
+
*/
|
|
77
|
+
private convertDateSort(dateSort?: DateSort): MessageSort {
|
|
78
|
+
switch (dateSort) {
|
|
79
|
+
case DateSort.CreatedAscending:
|
|
80
|
+
return { dateCreated: SortOrder.Ascending };
|
|
81
|
+
case DateSort.CreatedDescending:
|
|
82
|
+
return { dateCreated: SortOrder.Descending };
|
|
83
|
+
case DateSort.PublishedAscending:
|
|
84
|
+
return { datePublished: SortOrder.Ascending };
|
|
85
|
+
case DateSort.PublishedDescending:
|
|
86
|
+
return { datePublished: SortOrder.Descending };
|
|
87
|
+
default:
|
|
88
|
+
return { dateCreated: SortOrder.Ascending };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Fetches the records as the owner of the DWN with no additional filtering.
|
|
94
|
+
*/
|
|
95
|
+
private async fetchRecordsAsOwner(
|
|
96
|
+
tenant: string,
|
|
97
|
+
recordsQuery: RecordsQuery
|
|
98
|
+
): Promise<{ messages: GenericMessage[], cursor?: string }> {
|
|
99
|
+
const { dateSort, filter, pagination } = recordsQuery.message.descriptor;
|
|
100
|
+
|
|
101
|
+
// fetch all published records matching the query
|
|
102
|
+
const queryFilter = {
|
|
103
|
+
...Records.convertFilter(filter),
|
|
104
|
+
interface : DwnInterfaceName.Records,
|
|
105
|
+
method : DwnMethodName.Write,
|
|
106
|
+
isLatestBaseState : true
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
110
|
+
return this.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Fetches the records as a non-owner.
|
|
115
|
+
*
|
|
116
|
+
* Filters can support returning both published and unpublished records,
|
|
117
|
+
* as well as explicitly only published or only unpublished records.
|
|
118
|
+
*
|
|
119
|
+
* A) BOTH published and unpublished:
|
|
120
|
+
* 1. published records; and
|
|
121
|
+
* 2. unpublished records intended for the query author (where `recipient` is the query author); and
|
|
122
|
+
* 3. unpublished records authorized by a protocol rule.
|
|
123
|
+
*
|
|
124
|
+
* B) PUBLISHED:
|
|
125
|
+
* 1. only published records;
|
|
126
|
+
*
|
|
127
|
+
* C) UNPUBLISHED:
|
|
128
|
+
* 1. unpublished records intended for the query author (where `recipient` is the query author); and
|
|
129
|
+
* 2. unpublished records authorized by a protocol rule.
|
|
130
|
+
*
|
|
131
|
+
*/
|
|
132
|
+
private async fetchRecordsAsNonOwner(
|
|
133
|
+
tenant: string, recordsQuery: RecordsQuery
|
|
134
|
+
): Promise<{ messages: GenericMessage[], cursor?: string }> {
|
|
135
|
+
const { dateSort, pagination } = recordsQuery.message.descriptor;
|
|
136
|
+
const filters: any[] = [];
|
|
137
|
+
|
|
138
|
+
if (RecordsQueryHandler.filterIncludesPublishedRecords(recordsQuery)) {
|
|
139
|
+
filters.push(RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (RecordsQueryHandler.filterIncludesUnpublishedRecords(recordsQuery)) {
|
|
143
|
+
filters.push(RecordsQueryHandler.buildUnpublishedRecordsByQueryAuthorFilter(recordsQuery));
|
|
144
|
+
|
|
145
|
+
const recipientFilter = recordsQuery.message.descriptor.filter.recipient;
|
|
146
|
+
if (recipientFilter === undefined || recipientFilter === recordsQuery.author) {
|
|
147
|
+
filters.push(RecordsQueryHandler.buildUnpublishedRecordsForQueryAuthorFilter(recordsQuery));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (RecordsQueryHandler.shouldProtocolAuthorizeQuery(recordsQuery)) {
|
|
151
|
+
filters.push(RecordsQueryHandler.buildUnpublishedProtocolAuthorizedRecordsFilter(recordsQuery));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
156
|
+
return this.messageStore.query(tenant, filters, messageSort, pagination );
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Fetches only published records.
|
|
161
|
+
*/
|
|
162
|
+
private async fetchPublishedRecords(
|
|
163
|
+
tenant: string, recordsQuery: RecordsQuery
|
|
164
|
+
): Promise<{ messages: GenericMessage[], cursor?: string }> {
|
|
165
|
+
const { dateSort, pagination } = recordsQuery.message.descriptor;
|
|
166
|
+
const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
|
|
167
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
168
|
+
return this.messageStore.query(tenant, [ filter ], messageSort, pagination);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private static buildPublishedRecordsFilter(recordsQuery: RecordsQuery): Filter {
|
|
172
|
+
// fetch all published records matching the query
|
|
173
|
+
return {
|
|
174
|
+
...Records.convertFilter(recordsQuery.message.descriptor.filter),
|
|
175
|
+
interface : DwnInterfaceName.Records,
|
|
176
|
+
method : DwnMethodName.Write,
|
|
177
|
+
published : true,
|
|
178
|
+
isLatestBaseState : true
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Creates a filter for unpublished records that are intended for the query author (where `recipient` is the author).
|
|
184
|
+
*/
|
|
185
|
+
private static buildUnpublishedRecordsForQueryAuthorFilter(recordsQuery: RecordsQuery): Filter {
|
|
186
|
+
// include records where recipient is query author
|
|
187
|
+
return {
|
|
188
|
+
...Records.convertFilter(recordsQuery.message.descriptor.filter),
|
|
189
|
+
interface : DwnInterfaceName.Records,
|
|
190
|
+
method : DwnMethodName.Write,
|
|
191
|
+
recipient : recordsQuery.author!,
|
|
192
|
+
isLatestBaseState : true,
|
|
193
|
+
published : false
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Creates a filter for unpublished records that are within the specified protocol.
|
|
199
|
+
* Validation that `protocol` and other required protocol-related fields occurs before this method.
|
|
200
|
+
*/
|
|
201
|
+
private static buildUnpublishedProtocolAuthorizedRecordsFilter(recordsQuery: RecordsQuery): Filter {
|
|
202
|
+
return {
|
|
203
|
+
...Records.convertFilter(recordsQuery.message.descriptor.filter),
|
|
204
|
+
interface : DwnInterfaceName.Records,
|
|
205
|
+
method : DwnMethodName.Write,
|
|
206
|
+
isLatestBaseState : true,
|
|
207
|
+
published : false
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Creates a filter for only unpublished records where the author is the same as the query author.
|
|
213
|
+
*/
|
|
214
|
+
private static buildUnpublishedRecordsByQueryAuthorFilter(recordsQuery: RecordsQuery): Filter {
|
|
215
|
+
// include records where author is the same as the query author
|
|
216
|
+
return {
|
|
217
|
+
...Records.convertFilter(recordsQuery.message.descriptor.filter),
|
|
218
|
+
author : recordsQuery.author!,
|
|
219
|
+
interface : DwnInterfaceName.Records,
|
|
220
|
+
method : DwnMethodName.Write,
|
|
221
|
+
isLatestBaseState : true,
|
|
222
|
+
published : false
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Determines if ProtocolAuthorization.authorizeQuery should be run and if the corresponding filter should be used.
|
|
228
|
+
*/
|
|
229
|
+
private static shouldProtocolAuthorizeQuery(recordsQuery: RecordsQuery): boolean {
|
|
230
|
+
return recordsQuery.signaturePayload!.protocolRole !== undefined;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Checks if the recordQuery filter supports returning published records.
|
|
235
|
+
*/
|
|
236
|
+
private static filterIncludesPublishedRecords(recordsQuery: RecordsQuery): boolean {
|
|
237
|
+
const { filter } = recordsQuery.message.descriptor;
|
|
238
|
+
// When `published` and `datePublished` range are both undefined, published records can be returned.
|
|
239
|
+
return filter.datePublished !== undefined || filter.published !== false;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Checks if the recordQuery filter supports returning unpublished records.
|
|
244
|
+
*/
|
|
245
|
+
private static filterIncludesUnpublishedRecords(recordsQuery: RecordsQuery): boolean {
|
|
246
|
+
const { filter } = recordsQuery.message.descriptor;
|
|
247
|
+
// When `published` and `datePublished` range are both undefined, unpublished records can be returned.
|
|
248
|
+
if (filter.datePublished === undefined && filter.published === undefined) {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
return filter.published === false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { DataStore } from '../types/data-store.js';
|
|
2
|
+
import type { DidResolver } from '../did/did-resolver.js';
|
|
3
|
+
import type { Filter } from '../types/message-types.js';
|
|
4
|
+
import type { MessageStore } from '../types//message-store.js';
|
|
5
|
+
import type { MethodHandler } from '../types/method-handler.js';
|
|
6
|
+
import type { RecordsReadMessage, RecordsReadReply, RecordsWriteMessageWithOptionalEncodedData } from '../types/records-types.js';
|
|
7
|
+
|
|
8
|
+
import { authenticate } from '../core/auth.js';
|
|
9
|
+
import { DataStream } from '../utils/data-stream.js';
|
|
10
|
+
import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
|
|
11
|
+
import { Encoder } from '../utils/encoder.js';
|
|
12
|
+
import { GrantAuthorization } from '../core/grant-authorization.js';
|
|
13
|
+
import { Message } from '../core/message.js';
|
|
14
|
+
import { messageReplyFromError } from '../core/message-reply.js';
|
|
15
|
+
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
16
|
+
import { Records } from '../utils/records.js';
|
|
17
|
+
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
18
|
+
import { RecordsRead } from '../interfaces/records-read.js';
|
|
19
|
+
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
20
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
21
|
+
|
|
22
|
+
export class RecordsReadHandler implements MethodHandler {
|
|
23
|
+
|
|
24
|
+
constructor(private didResolver: DidResolver, private messageStore: MessageStore, private dataStore: DataStore) { }
|
|
25
|
+
|
|
26
|
+
public async handle({
|
|
27
|
+
tenant,
|
|
28
|
+
message
|
|
29
|
+
}: { tenant: string, message: RecordsReadMessage }): Promise<RecordsReadReply> {
|
|
30
|
+
|
|
31
|
+
let recordsRead: RecordsRead;
|
|
32
|
+
try {
|
|
33
|
+
recordsRead = await RecordsRead.parse(message);
|
|
34
|
+
} catch (e) {
|
|
35
|
+
return messageReplyFromError(e, 400);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// authentication
|
|
39
|
+
try {
|
|
40
|
+
if (recordsRead.author !== undefined) {
|
|
41
|
+
await authenticate(message.authorization!, this.didResolver);
|
|
42
|
+
}
|
|
43
|
+
} catch (e) {
|
|
44
|
+
return messageReplyFromError(e, 401);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// get the latest active messages matching the supplied filter
|
|
48
|
+
// only RecordsWrite messages will be returned due to 'isLatestBaseState' being set to true.
|
|
49
|
+
const query: Filter = {
|
|
50
|
+
interface : DwnInterfaceName.Records,
|
|
51
|
+
isLatestBaseState : true,
|
|
52
|
+
...Records.convertFilter(message.descriptor.filter)
|
|
53
|
+
};
|
|
54
|
+
const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ]);
|
|
55
|
+
if (existingMessages.length === 0) {
|
|
56
|
+
return {
|
|
57
|
+
status: { code: 404, detail: 'Not Found' }
|
|
58
|
+
};
|
|
59
|
+
} else if (existingMessages.length > 1) {
|
|
60
|
+
return messageReplyFromError(new DwnError(
|
|
61
|
+
DwnErrorCode.RecordsReadReturnedMultiple,
|
|
62
|
+
'Multiple records exist for the RecordsRead filter'
|
|
63
|
+
), 400);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const newestRecordsWrite = existingMessages[0] as RecordsWriteMessageWithOptionalEncodedData;
|
|
67
|
+
try {
|
|
68
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, await RecordsWrite.parse(newestRecordsWrite), this.messageStore);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
return messageReplyFromError(error, 401);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let data;
|
|
74
|
+
if (newestRecordsWrite.encodedData !== undefined) {
|
|
75
|
+
const dataBytes = Encoder.base64UrlToBytes(newestRecordsWrite.encodedData);
|
|
76
|
+
data = DataStream.fromBytes(dataBytes);
|
|
77
|
+
delete newestRecordsWrite.encodedData;
|
|
78
|
+
} else {
|
|
79
|
+
const messageCid = await Message.getCid(newestRecordsWrite);
|
|
80
|
+
const result = await this.dataStore.get(tenant, messageCid, newestRecordsWrite.descriptor.dataCid);
|
|
81
|
+
if (result?.dataStream === undefined) {
|
|
82
|
+
return {
|
|
83
|
+
status: { code: 404, detail: 'Not Found' }
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
data = result.dataStream;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const messageReply: RecordsReadReply = {
|
|
90
|
+
status : { code: 200, detail: 'OK' },
|
|
91
|
+
record : {
|
|
92
|
+
...newestRecordsWrite,
|
|
93
|
+
data,
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
return messageReply;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
private static async authorizeRecordsRead(
|
|
100
|
+
tenant: string,
|
|
101
|
+
recordsRead: RecordsRead,
|
|
102
|
+
newestRecordsWrite: RecordsWrite,
|
|
103
|
+
messageStore: MessageStore
|
|
104
|
+
): Promise<void> {
|
|
105
|
+
const { descriptor } = newestRecordsWrite.message;
|
|
106
|
+
|
|
107
|
+
// if author is the same as the target tenant, we can directly grant access
|
|
108
|
+
if (recordsRead.author === tenant) {
|
|
109
|
+
return;
|
|
110
|
+
} else if (descriptor.published === true) {
|
|
111
|
+
// authentication is not required for published data
|
|
112
|
+
return;
|
|
113
|
+
} else if (recordsRead.author !== undefined && recordsRead.author === descriptor.recipient) {
|
|
114
|
+
// The recipient of a message may always read it
|
|
115
|
+
return;
|
|
116
|
+
} else if (recordsRead.author !== undefined && recordsRead.signaturePayload!.permissionsGrantId !== undefined) {
|
|
117
|
+
const permissionsGrantMessage = await GrantAuthorization.fetchGrant(tenant, messageStore, recordsRead.signaturePayload!.permissionsGrantId);
|
|
118
|
+
await RecordsGrantAuthorization.authorizeRead(
|
|
119
|
+
tenant, recordsRead, newestRecordsWrite.message, recordsRead.author, permissionsGrantMessage, messageStore
|
|
120
|
+
);
|
|
121
|
+
} else if (descriptor.protocol !== undefined) {
|
|
122
|
+
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, newestRecordsWrite, messageStore);
|
|
123
|
+
} else {
|
|
124
|
+
throw new DwnError(DwnErrorCode.RecordsReadAuthorizationFailed, 'message failed authorization');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import type { DataStore } from '../types/data-store.js';
|
|
2
|
+
import type { DidResolver } from '../did/did-resolver.js';
|
|
3
|
+
import type { EventLog } from '../types/event-log.js';
|
|
4
|
+
import type { GenericMessageReply } from '../core/message-reply.js';
|
|
5
|
+
import type { MessageStore } from '../types//message-store.js';
|
|
6
|
+
import type { MethodHandler } from '../types/method-handler.js';
|
|
7
|
+
import type { RecordsDeleteMessage, RecordsWriteMessage, RecordsWriteMessageWithOptionalEncodedData } from '../types/records-types.js';
|
|
8
|
+
|
|
9
|
+
import { authenticate } from '../core/auth.js';
|
|
10
|
+
import { Cid } from '../utils/cid.js';
|
|
11
|
+
import { DataStream } from '../utils/data-stream.js';
|
|
12
|
+
import { DwnConstant } from '../core/dwn-constant.js';
|
|
13
|
+
import { Encoder } from '../utils/encoder.js';
|
|
14
|
+
import { GrantAuthorization } from '../core/grant-authorization.js';
|
|
15
|
+
import { Message } from '../core/message.js';
|
|
16
|
+
import { messageReplyFromError } from '../core/message-reply.js';
|
|
17
|
+
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
18
|
+
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
19
|
+
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
20
|
+
import { StorageController } from '../store/storage-controller.js';
|
|
21
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
22
|
+
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
23
|
+
|
|
24
|
+
export type RecordsWriteHandlerOptions = {
|
|
25
|
+
skipDataStorage?: boolean; // used for DWN sync
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type HandlerArgs = { tenant: string, message: RecordsWriteMessage, options?: RecordsWriteHandlerOptions, dataStream?: _Readable.Readable};
|
|
29
|
+
|
|
30
|
+
export class RecordsWriteHandler implements MethodHandler {
|
|
31
|
+
|
|
32
|
+
constructor(private didResolver: DidResolver, private messageStore: MessageStore, private dataStore: DataStore, private eventLog: EventLog) { }
|
|
33
|
+
|
|
34
|
+
public async handle({
|
|
35
|
+
tenant,
|
|
36
|
+
message,
|
|
37
|
+
options,
|
|
38
|
+
dataStream
|
|
39
|
+
}: HandlerArgs): Promise<GenericMessageReply> {
|
|
40
|
+
let recordsWrite: RecordsWrite;
|
|
41
|
+
try {
|
|
42
|
+
recordsWrite = await RecordsWrite.parse(message);
|
|
43
|
+
|
|
44
|
+
// Protocol record specific validation
|
|
45
|
+
if (message.descriptor.protocol !== undefined) {
|
|
46
|
+
await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.messageStore);
|
|
47
|
+
}
|
|
48
|
+
} catch (e) {
|
|
49
|
+
return messageReplyFromError(e, 400);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// authentication & authorization
|
|
53
|
+
try {
|
|
54
|
+
await authenticate(message.authorization, this.didResolver);
|
|
55
|
+
await RecordsWriteHandler.authorizeRecordsWrite(tenant, recordsWrite, this.messageStore);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
return messageReplyFromError(e, 401);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// get existing messages matching the `recordId`
|
|
61
|
+
const query = {
|
|
62
|
+
interface : DwnInterfaceName.Records,
|
|
63
|
+
recordId : message.recordId
|
|
64
|
+
};
|
|
65
|
+
const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ]);
|
|
66
|
+
|
|
67
|
+
// If this exact message already exists, treat as idempotent no-op.
|
|
68
|
+
// This makes sync convergent: receiving the same message twice is always safe.
|
|
69
|
+
const incomingMessageCid = await Message.getCid(message);
|
|
70
|
+
for (const existingMessage of existingMessages) {
|
|
71
|
+
const existingCid = await Message.getCid(existingMessage);
|
|
72
|
+
if (existingCid === incomingMessageCid) {
|
|
73
|
+
return { status: { code: 202, detail: 'Accepted' } };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
// if the incoming write is not the initial write, then it must not modify any immutable properties defined by the initial write
|
|
79
|
+
const newMessageIsInitialWrite = await recordsWrite.isInitialWrite();
|
|
80
|
+
if (!newMessageIsInitialWrite) {
|
|
81
|
+
try {
|
|
82
|
+
const initialWrite = await RecordsWrite.getInitialWrite(existingMessages);
|
|
83
|
+
RecordsWrite.verifyEqualityOfImmutableProperties(initialWrite, message);
|
|
84
|
+
} catch (e) {
|
|
85
|
+
return messageReplyFromError(e, 400);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const newestExistingMessage = await Message.getNewestMessage(existingMessages);
|
|
90
|
+
|
|
91
|
+
let incomingMessageIsNewest = false;
|
|
92
|
+
let newestMessage; // keep reference of newest message for pruning later
|
|
93
|
+
if (newestExistingMessage === undefined || await Message.isNewer(message, newestExistingMessage)) {
|
|
94
|
+
incomingMessageIsNewest = true;
|
|
95
|
+
newestMessage = message;
|
|
96
|
+
} else { // existing message is the same age or newer than the incoming message
|
|
97
|
+
newestMessage = newestExistingMessage;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (!incomingMessageIsNewest) {
|
|
101
|
+
return {
|
|
102
|
+
status: { code: 409, detail: 'Conflict' }
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const isLatestBaseState = true;
|
|
107
|
+
const indexes = await recordsWrite.constructRecordsWriteIndexes(isLatestBaseState);
|
|
108
|
+
|
|
109
|
+
// if data is below a certain threshold, we embed the data directly into the message for storage in MessageStore.
|
|
110
|
+
let messageWithOptionalEncodedData: RecordsWriteMessageWithOptionalEncodedData = message;
|
|
111
|
+
|
|
112
|
+
// try to store data, unless options explicitly say to skip storage
|
|
113
|
+
if (options === undefined || !options.skipDataStorage) {
|
|
114
|
+
if (dataStream === undefined && newestExistingMessage?.descriptor.method === DwnMethodName.Delete) {
|
|
115
|
+
return messageReplyFromError(new DwnError(DwnErrorCode.RecordsWriteMissingDataStream, 'No data stream was provided with the previous message being a delete'), 400);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
// if data is below the threshold, we store it within MessageStore
|
|
120
|
+
if (message.descriptor.dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
121
|
+
// processes and sets `encodedData` with appropriate data.
|
|
122
|
+
messageWithOptionalEncodedData = await this.processEncodedData(
|
|
123
|
+
message,
|
|
124
|
+
dataStream,
|
|
125
|
+
newestExistingMessage as (RecordsWriteMessage|RecordsDeleteMessage) | undefined
|
|
126
|
+
);
|
|
127
|
+
} else {
|
|
128
|
+
await this.putData(tenant, message, dataStream);
|
|
129
|
+
}
|
|
130
|
+
} catch (error) {
|
|
131
|
+
const e = error as any;
|
|
132
|
+
if (e.code === DwnErrorCode.RecordsWriteMissingDataInPrevious ||
|
|
133
|
+
e.code === DwnErrorCode.RecordsWriteMissingDataAssociation ||
|
|
134
|
+
e.code === DwnErrorCode.RecordsWriteDataCidMismatch ||
|
|
135
|
+
e.code === DwnErrorCode.RecordsWriteDataSizeMismatch) {
|
|
136
|
+
return messageReplyFromError(error, 400);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// else throw
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
await this.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
|
|
145
|
+
await this.eventLog.append(tenant, await Message.getCid(message));
|
|
146
|
+
|
|
147
|
+
const messageReply = {
|
|
148
|
+
status: { code: 202, detail: 'Accepted' }
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// delete all existing messages that are not newest, except for the initial write
|
|
152
|
+
await StorageController.deleteAllOlderMessagesButKeepInitialWrite(
|
|
153
|
+
tenant, existingMessages, newestMessage, this.messageStore, this.dataStore, this.eventLog
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
return messageReply;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Embeds the record's data into the `encodedData` property.
|
|
161
|
+
* If dataStream is present, it uses the dataStream. Otherwise, uses the `encodedData` from the most recent RecordsWrite.
|
|
162
|
+
*
|
|
163
|
+
* @returns {RecordsWriteMessageWithOptionalEncodedData} `encodedData` embedded.
|
|
164
|
+
*
|
|
165
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteMissingDataInPrevious`
|
|
166
|
+
* if `dataStream` is absent AND `encodedData` of previous message is missing
|
|
167
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataCidMismatch`
|
|
168
|
+
* if the data stream resulted in a data CID that mismatches with `dataCid` in the given message
|
|
169
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataSizeMismatch`
|
|
170
|
+
* if `dataSize` in `descriptor` given mismatches the actual data size
|
|
171
|
+
*/
|
|
172
|
+
public async processEncodedData(
|
|
173
|
+
message: RecordsWriteMessage,
|
|
174
|
+
dataStream?: _Readable.Readable,
|
|
175
|
+
newestExistingMessage?: RecordsWriteMessage | RecordsDeleteMessage
|
|
176
|
+
): Promise<RecordsWriteMessageWithOptionalEncodedData> {
|
|
177
|
+
let dataBytes;
|
|
178
|
+
if (dataStream === undefined) {
|
|
179
|
+
const newestWithData = newestExistingMessage as RecordsWriteMessageWithOptionalEncodedData | undefined;
|
|
180
|
+
if (newestWithData?.encodedData === undefined) {
|
|
181
|
+
throw new DwnError(
|
|
182
|
+
DwnErrorCode.RecordsWriteMissingDataInPrevious,
|
|
183
|
+
`No dataStream was provided and unable to get data from previous message`
|
|
184
|
+
);
|
|
185
|
+
} else {
|
|
186
|
+
dataBytes = Encoder.base64UrlToBytes(newestWithData.encodedData);
|
|
187
|
+
}
|
|
188
|
+
} else {
|
|
189
|
+
dataBytes = await DataStream.toBytes(dataStream);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
|
|
193
|
+
RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
|
|
194
|
+
|
|
195
|
+
const recordsWrite: RecordsWriteMessageWithOptionalEncodedData = { ...message };
|
|
196
|
+
recordsWrite.encodedData = Encoder.bytesToBase64Url(dataBytes);
|
|
197
|
+
return recordsWrite;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Puts the given data in storage unless tenant already has that data for the given recordId
|
|
202
|
+
*
|
|
203
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteMissingDataAssociation`
|
|
204
|
+
* if `dataStream` is absent AND unable to associate data given `dataCid`
|
|
205
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataCidMismatch`
|
|
206
|
+
* if the data stream resulted in a data CID that mismatches with `dataCid` in the given message
|
|
207
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataSizeMismatch`
|
|
208
|
+
* if `dataSize` in `descriptor` given mismatches the actual data size
|
|
209
|
+
*/
|
|
210
|
+
public async putData(
|
|
211
|
+
tenant: string,
|
|
212
|
+
message: RecordsWriteMessage,
|
|
213
|
+
dataStream?: _Readable.Readable,
|
|
214
|
+
): Promise<void> {
|
|
215
|
+
let result: { dataCid: string, dataSize: number };
|
|
216
|
+
const messageCid = await Message.getCid(message);
|
|
217
|
+
|
|
218
|
+
if (dataStream === undefined) {
|
|
219
|
+
const associateResult = await this.dataStore.associate(tenant, messageCid, message.descriptor.dataCid);
|
|
220
|
+
if (associateResult === undefined) {
|
|
221
|
+
throw new DwnError(DwnErrorCode.RecordsWriteMissingDataAssociation, `Unable to associate dataCid ${message.descriptor.dataCid} ` +
|
|
222
|
+
`to messageCid ${messageCid} because dataStream was not provided and data was not found in dataStore`);
|
|
223
|
+
}
|
|
224
|
+
result = associateResult;
|
|
225
|
+
} else {
|
|
226
|
+
result = await this.dataStore.put(tenant, messageCid, message.descriptor.dataCid, dataStream);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
try {
|
|
230
|
+
RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, result.dataCid, result.dataSize);
|
|
231
|
+
} catch (error) {
|
|
232
|
+
// delete data and throw error to caller
|
|
233
|
+
await this.dataStore.delete(tenant, messageCid, message.descriptor.dataCid);
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Validates the expected `dataCid` and `dataSize` in the descriptor vs the received data.
|
|
240
|
+
*
|
|
241
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataCidMismatch`
|
|
242
|
+
* if the data stream resulted in a data CID that mismatches with `dataCid` in the given message
|
|
243
|
+
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataSizeMismatch`
|
|
244
|
+
* if `dataSize` in `descriptor` given mismatches the actual data size
|
|
245
|
+
*/
|
|
246
|
+
static validateDataIntegrity(
|
|
247
|
+
expectedDataCid: string,
|
|
248
|
+
expectedDataSize: number,
|
|
249
|
+
actualDataCid: string,
|
|
250
|
+
actualDataSize: number
|
|
251
|
+
): void {
|
|
252
|
+
if (expectedDataCid !== actualDataCid) {
|
|
253
|
+
throw new DwnError(
|
|
254
|
+
DwnErrorCode.RecordsWriteDataCidMismatch,
|
|
255
|
+
`actual data CID ${actualDataCid} does not match dataCid in descriptor: ${expectedDataCid}`
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
if (expectedDataSize !== actualDataSize) {
|
|
259
|
+
throw new DwnError(
|
|
260
|
+
DwnErrorCode.RecordsWriteDataSizeMismatch,
|
|
261
|
+
`actual data size ${actualDataSize} bytes does not match dataSize in descriptor: ${expectedDataSize}`
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
private static async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite, messageStore: MessageStore): Promise<void> {
|
|
267
|
+
// if owner DID is specified, it must be the same as the tenant DID
|
|
268
|
+
if (recordsWrite.owner !== undefined && recordsWrite.owner !== tenant) {
|
|
269
|
+
throw new DwnError(
|
|
270
|
+
DwnErrorCode.RecordsWriteOwnerAndTenantMismatch,
|
|
271
|
+
`Owner ${recordsWrite.owner} must be the same as tenant ${tenant} when specified.`
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (recordsWrite.isSignedByDelegatee) {
|
|
276
|
+
await recordsWrite.authorizeDelegatee(messageStore);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (recordsWrite.owner !== undefined) {
|
|
280
|
+
// if incoming message is a write retained by this tenant, we by-design always allow
|
|
281
|
+
// NOTE: the "owner === tenant" check is already done earlier in this method
|
|
282
|
+
return;
|
|
283
|
+
} else if (recordsWrite.author === tenant) {
|
|
284
|
+
// if author is the same as the target tenant, we can directly grant access
|
|
285
|
+
return;
|
|
286
|
+
} else if (recordsWrite.author !== undefined && recordsWrite.signaturePayload!.permissionsGrantId !== undefined) {
|
|
287
|
+
const permissionsGrantMessage = await GrantAuthorization.fetchGrant(tenant, messageStore, recordsWrite.signaturePayload!.permissionsGrantId);
|
|
288
|
+
await RecordsGrantAuthorization.authorizeWrite(tenant, recordsWrite.message, recordsWrite.author, permissionsGrantMessage, messageStore);
|
|
289
|
+
} else if (recordsWrite.message.descriptor.protocol !== undefined) {
|
|
290
|
+
await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, messageStore);
|
|
291
|
+
} else {
|
|
292
|
+
throw new DwnError(DwnErrorCode.RecordsWriteAuthorizationFailed, 'message failed authorization');
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
}
|