diff --git a/build/compile-validators.js b/build/compile-validators.js index a6f416f98..6bf5c1ed3 100644 --- a/build/compile-validators.js +++ b/build/compile-validators.js @@ -26,8 +26,8 @@ import GeneralJws from '../json-schemas/general-jws.json' assert { type: 'json' import GenericSignaturePayload from '../json-schemas/signature-payloads/generic-signature-payload.json' assert { type: 'json' }; import JwkVerificationMethod from '../json-schemas/jwk-verification-method.json' assert { type: 'json' }; import MessagesFilter from '../json-schemas/interface-methods/messages-filter.json' assert { type: 'json' }; -import MessagesGet from '../json-schemas/interface-methods/messages-get.json' assert { type: 'json' }; import MessagesQuery from '../json-schemas/interface-methods/messages-query.json' assert { type: 'json' }; +import MessagesRead from '../json-schemas/interface-methods/messages-read.json' assert { type: 'json' }; import MessagesSubscribe from '../json-schemas/interface-methods/messages-subscribe.json' assert { type: 'json' }; import NumberRangeFilter from '../json-schemas/interface-methods/number-range-filter.json' assert { type: 'json' }; import PaginationCursor from '../json-schemas/interface-methods/pagination-cursor.json' assert { type: 'json' }; @@ -67,8 +67,8 @@ const schemas = { GeneralJws, JwkVerificationMethod, MessagesFilter, - MessagesGet, MessagesQuery, + MessagesRead, MessagesSubscribe, NumberRangeFilter, PaginationCursor, diff --git a/json-schemas/interface-methods/messages-get.json b/json-schemas/interface-methods/messages-read.json similarity index 96% rename from json-schemas/interface-methods/messages-get.json rename to json-schemas/interface-methods/messages-read.json index 365491b7a..a0959edc5 100644 --- a/json-schemas/interface-methods/messages-get.json +++ b/json-schemas/interface-methods/messages-read.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://identity.foundation/dwn/json-schemas/messages-get.json", + "$id": "https://identity.foundation/dwn/json-schemas/messages-read.json", "type": "object", "additionalProperties": false, "required": [ @@ -28,7 +28,7 @@ }, "method": { "enum": [ - "Get" + "Read" ], "type": "string" }, diff --git a/json-schemas/permissions/permissions-definitions.json b/json-schemas/permissions/permissions-definitions.json index 6a7ed4280..e561ceb04 100644 --- a/json-schemas/permissions/permissions-definitions.json +++ b/json-schemas/permissions/permissions-definitions.json @@ -6,10 +6,10 @@ "scope": { "oneOf": [ { - "$ref": "https://identity.foundation/dwn/json-schemas/permissions/scopes.json#/$defs/messages-get-scope" + "$ref": "https://identity.foundation/dwn/json-schemas/permissions/scopes.json#/$defs/messages-query-scope" }, { - "$ref": "https://identity.foundation/dwn/json-schemas/permissions/scopes.json#/$defs/messages-query-scope" + "$ref": "https://identity.foundation/dwn/json-schemas/permissions/scopes.json#/$defs/messages-read-scope" }, { "$ref": "https://identity.foundation/dwn/json-schemas/permissions/scopes.json#/$defs/messages-subscribe-scope" diff --git a/json-schemas/permissions/scopes.json b/json-schemas/permissions/scopes.json index 69850ec47..4be1b0d5e 100644 --- a/json-schemas/permissions/scopes.json +++ b/json-schemas/permissions/scopes.json @@ -22,10 +22,10 @@ } } }, - "messages-subscribe-scope": { + "messages-read-scope": { "type": "object", "additionalProperties": false, - "required" : [ + "required": [ "interface", "method" ], @@ -34,17 +34,17 @@ "const": "Messages" }, "method": { - "const": "Subscribe" + "const": "Read" }, "protocol": { "type": "string" } } }, - "messages-get-scope": { + "messages-subscribe-scope": { "type": "object", "additionalProperties": false, - "required": [ + "required" : [ "interface", "method" ], @@ -53,7 +53,7 @@ "const": "Messages" }, "method": { - "const": "Get" + "const": "Subscribe" }, "protocol": { "type": "string" diff --git a/src/core/dwn-error.ts b/src/core/dwn-error.ts index 3749a02ec..981029378 100644 --- a/src/core/dwn-error.ts +++ b/src/core/dwn-error.ts @@ -42,11 +42,11 @@ export enum DwnErrorCode { IndexInvalidSortPropertyInMemory = 'IndexInvalidSortPropertyInMemory', IndexMissingIndexableProperty = 'IndexMissingIndexableProperty', JwsDecodePlainObjectPayloadInvalid = 'JwsDecodePlainObjectPayloadInvalid', - MessagesGetInvalidCid = 'MessagesGetInvalidCid', - MessagesGetAuthorizationFailed = 'MessagesGetAuthorizationFailed', - MessagesGetVerifyScopeFailed = 'MessagesGetVerifyScopeFailed', + MessagesReadInvalidCid = 'MessagesReadInvalidCid', + MessagesReadAuthorizationFailed = 'MessagesReadAuthorizationFailed', MessageGetInvalidCid = 'MessageGetInvalidCid', MessagesQueryAuthorizationFailed = 'MessagesQueryAuthorizationFailed', + MessagesReadVerifyScopeFailed = 'MessagesReadVerifyScopeFailed', ParseCidCodecNotSupported = 'ParseCidCodecNotSupported', ParseCidMultihashNotSupported = 'ParseCidMultihashNotSupported', PermissionsProtocolCreateGrantRecordsScopeMissingProtocol = 'PermissionsProtocolCreateGrantRecordsScopeMissingProtocol', diff --git a/src/core/message-reply.ts b/src/core/message-reply.ts index 7d8ad8cab..2a8e1b4ce 100644 --- a/src/core/message-reply.ts +++ b/src/core/message-reply.ts @@ -1,4 +1,4 @@ -import type { MessagesGetReplyEntry } from '../types/messages-types.js'; +import type { MessagesReadReplyEntry } from '../types/messages-types.js'; import type { PaginationCursor } from '../types/query-types.js'; import type { ProtocolsConfigureMessage } from '../types/protocols-types.js'; import type { Readable } from 'readable-stream'; @@ -21,7 +21,7 @@ export type UnionMessageReply = GenericMessageReply & { * e.g. the resulting messages from a RecordsQuery, or array of messageCid strings for MessagesQuery * Mutually exclusive with `record`. */ - entries?: QueryResultEntry[] | ProtocolsConfigureMessage[] | MessagesGetReplyEntry[] | string[]; + entries?: QueryResultEntry[] | ProtocolsConfigureMessage[] | MessagesReadReplyEntry[] | string[]; /** * Record corresponding to the message received if applicable (e.g. RecordsRead). diff --git a/src/core/messages-grant-authorization.ts b/src/core/messages-grant-authorization.ts index 3d8d5e923..23404e74c 100644 --- a/src/core/messages-grant-authorization.ts +++ b/src/core/messages-grant-authorization.ts @@ -4,7 +4,7 @@ import type { MessageStore } from '../types/message-store.js'; import type { PermissionGrant } from '../protocols/permission-grant.js'; import type { ProtocolsConfigureMessage } from '../types/protocols-types.js'; import type { DataEncodedRecordsWriteMessage, RecordsDeleteMessage, RecordsWriteMessage } from '../types/records-types.js'; -import type { MessagesGetMessage, MessagesQueryMessage, MessagesSubscribeMessage } from '../types/messages-types.js'; +import type { MessagesQueryMessage, MessagesReadMessage, MessagesSubscribeMessage } from '../types/messages-types.js'; import { DwnInterfaceName } from '../enums/dwn-interface-method.js'; import { GrantAuthorization } from './grant-authorization.js'; @@ -16,23 +16,23 @@ import { DwnError, DwnErrorCode } from './dwn-error.js'; export class MessagesGrantAuthorization { /** - * Authorizes a MessagesGetMessage using the given permission grant. + * Authorizes a MessagesReadMessage using the given permission grant. * @param messageStore Used to check if the given grant has been revoked; and to fetch related RecordsWrites if needed. */ - public static async authorizeMessagesGet(input: { - messagesGetMessage: MessagesGetMessage, - messageToGet: GenericMessage, + public static async authorizeMessagesRead(input: { + messagesReadMessage: MessagesReadMessage, + messageToRead: GenericMessage, expectedGrantor: string, expectedGrantee: string, permissionGrant: PermissionGrant, messageStore: MessageStore, }): Promise { const { - messagesGetMessage, messageToGet, expectedGrantor, expectedGrantee, permissionGrant, messageStore + messagesReadMessage, messageToRead, expectedGrantor, expectedGrantee, permissionGrant, messageStore } = input; await GrantAuthorization.performBaseValidation({ - incomingMessage: messagesGetMessage, + incomingMessage: messagesReadMessage, expectedGrantor, expectedGrantee, permissionGrant, @@ -40,7 +40,7 @@ export class MessagesGrantAuthorization { }); const scope = permissionGrant.scope as MessagesPermissionScope; - await MessagesGrantAuthorization.verifyScope(expectedGrantor, messageToGet, scope, messageStore); + await MessagesGrantAuthorization.verifyScope(expectedGrantor, messageToRead, scope, messageStore); } /** @@ -129,6 +129,6 @@ export class MessagesGrantAuthorization { } } - throw new DwnError(DwnErrorCode.MessagesGetVerifyScopeFailed, 'record message failed scope authorization'); + throw new DwnError(DwnErrorCode.MessagesReadVerifyScopeFailed, 'record message failed scope authorization'); } } \ No newline at end of file diff --git a/src/dwn.ts b/src/dwn.ts index c8361532f..0e19e3d11 100644 --- a/src/dwn.ts +++ b/src/dwn.ts @@ -10,15 +10,15 @@ import type { ResumableTaskStore } from './types/resumable-task-store.js'; import type { TenantGate } from './core/tenant-gate.js'; import type { UnionMessageReply } from './core/message-reply.js'; import type { GenericMessage, GenericMessageReply } from './types/message-types.js'; -import type { MessagesGetMessage, MessagesGetReply, MessagesQueryMessage, MessagesQueryReply, MessagesSubscribeMessage, MessagesSubscribeMessageOptions, MessagesSubscribeReply, MessageSubscriptionHandler } from './types/messages-types.js'; +import type { MessagesQueryMessage, MessagesQueryReply, MessagesReadMessage, MessagesReadReply, MessagesSubscribeMessage, MessagesSubscribeMessageOptions, MessagesSubscribeReply, MessageSubscriptionHandler } from './types/messages-types.js'; import type { ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js'; import type { RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsReadMessage, RecordsReadReply, RecordsSubscribeMessage, RecordsSubscribeMessageOptions, RecordsSubscribeReply, RecordSubscriptionHandler, RecordsWriteMessage, RecordsWriteMessageOptions } from './types/records-types.js'; import { AllowAllTenantGate } from './core/tenant-gate.js'; import { Message } from './core/message.js'; import { messageReplyFromError } from './core/message-reply.js'; -import { MessagesGetHandler } from './handlers/messages-get.js'; import { MessagesQueryHandler } from './handlers/messages-query.js'; +import { MessagesReadHandler } from './handlers/messages-read.js'; import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js'; import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js'; import { ProtocolsQueryHandler } from './handlers/protocols-query.js'; @@ -65,15 +65,15 @@ export class Dwn { ); this.methodHandlers = { - [DwnInterfaceName.Messages + DwnMethodName.Get]: new MessagesGetHandler( + [DwnInterfaceName.Messages + DwnMethodName.Query]: new MessagesQueryHandler( this.didResolver, this.messageStore, - this.dataStore, + this.eventLog, ), - [DwnInterfaceName.Messages + DwnMethodName.Query]: new MessagesQueryHandler( + [DwnInterfaceName.Messages + DwnMethodName.Read]: new MessagesReadHandler( this.didResolver, this.messageStore, - this.eventLog, + this.dataStore, ), [DwnInterfaceName.Messages + DwnMethodName.Subscribe]: new MessagesSubscribeHandler( this.didResolver, @@ -164,7 +164,7 @@ export class Dwn { public async processMessage(tenant: string, rawMessage: MessagesQueryMessage): Promise; public async processMessage( tenant: string, rawMessage: MessagesSubscribeMessage, options?: MessagesSubscribeMessageOptions): Promise; - public async processMessage(tenant: string, rawMessage: MessagesGetMessage): Promise; + public async processMessage(tenant: string, rawMessage: MessagesReadMessage): Promise; public async processMessage(tenant: string, rawMessage: ProtocolsConfigureMessage): Promise; public async processMessage(tenant: string, rawMessage: ProtocolsQueryMessage): Promise; public async processMessage(tenant: string, rawMessage: RecordsDeleteMessage): Promise; diff --git a/src/enums/dwn-interface-method.ts b/src/enums/dwn-interface-method.ts index 3a654c02d..5275ddd84 100644 --- a/src/enums/dwn-interface-method.ts +++ b/src/enums/dwn-interface-method.ts @@ -6,7 +6,6 @@ export enum DwnInterfaceName { export enum DwnMethodName { Configure = 'Configure', - Get = 'Get', Query = 'Query', Read = 'Read', Write = 'Write', diff --git a/src/handlers/messages-get.ts b/src/handlers/messages-read.ts similarity index 70% rename from src/handlers/messages-get.ts rename to src/handlers/messages-read.ts index af8c9a2ca..05c4e1cbf 100644 --- a/src/handlers/messages-get.ts +++ b/src/handlers/messages-read.ts @@ -4,28 +4,28 @@ import type { GenericMessage } from '../types/message-types.js'; import type { MessageStore } from '../types/message-store.js'; import type { MethodHandler } from '../types/method-handler.js'; import type { RecordsQueryReplyEntry } from '../types/records-types.js'; -import type { MessagesGetMessage, MessagesGetReply, MessagesGetReplyEntry } from '../types/messages-types.js'; +import type { MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry } from '../types/messages-types.js'; import { authenticate } from '../core/auth.js'; import { DataStream } from '../utils/data-stream.js'; import { Encoder } from '../utils/encoder.js'; import { messageReplyFromError } from '../core/message-reply.js'; -import { MessagesGet } from '../interfaces/messages-get.js'; import { MessagesGrantAuthorization } from '../core/messages-grant-authorization.js'; +import { MessagesRead } from '../interfaces/messages-read.js'; import { PermissionsProtocol } from '../protocols/permissions.js'; import { Records } from '../utils/records.js'; import { DwnError, DwnErrorCode } from '../core/dwn-error.js'; -type HandleArgs = { tenant: string, message: MessagesGetMessage }; +type HandleArgs = { tenant: string, message: MessagesReadMessage }; -export class MessagesGetHandler implements MethodHandler { +export class MessagesReadHandler implements MethodHandler { constructor(private didResolver: DidResolver, private messageStore: MessageStore, private dataStore: DataStore) {} - public async handle({ tenant, message }: HandleArgs): Promise { - let messagesGet: MessagesGet; + public async handle({ tenant, message }: HandleArgs): Promise { + let messagesRead: MessagesRead; try { - messagesGet = await MessagesGet.parse(message); + messagesRead = await MessagesRead.parse(message); } catch (e) { return messageReplyFromError(e, 400); } @@ -42,13 +42,13 @@ export class MessagesGetHandler implements MethodHandler { } try { - await MessagesGetHandler.authorizeMessagesGet(tenant, messagesGet, messageResult, this.messageStore); + await MessagesReadHandler.authorizeMessagesRead(tenant, messagesRead, messageResult, this.messageStore); } catch (error) { return messageReplyFromError(error, 401); } // If the message is a RecordsWrite, we include the data in the response if it is available - const entry: MessagesGetReplyEntry = { message: messageResult, messageCid: message.descriptor.messageCid }; + const entry: MessagesReadReplyEntry = { message: messageResult, messageCid: message.descriptor.messageCid }; if (Records.isRecordsWrite(messageResult)) { const recordsWrite = entry.message as RecordsQueryReplyEntry; // RecordsWrite specific handling, if MessageStore has embedded `encodedData` return it with the entry. @@ -75,29 +75,29 @@ export class MessagesGetHandler implements MethodHandler { /** * @param messageStore Used to fetch related permission grant, permission revocation, and/or RecordsWrites for permission scope validation. */ - private static async authorizeMessagesGet( + private static async authorizeMessagesRead( tenant: string, - messagesGet: MessagesGet, + messagesRead: MessagesRead, matchedMessage: GenericMessage, messageStore: MessageStore ): Promise { - if (messagesGet.author === tenant) { + if (messagesRead.author === tenant) { // If the author is the tenant, no further authorization is needed return; - } else if (messagesGet.author !== undefined && messagesGet.signaturePayload!.permissionGrantId !== undefined) { + } else if (messagesRead.author !== undefined && messagesRead.signaturePayload!.permissionGrantId !== undefined) { // if the author is not the tenant and the message has a permissionGrantId, we need to authorize the grant - const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, messagesGet.signaturePayload!.permissionGrantId); - await MessagesGrantAuthorization.authorizeMessagesGet({ - messagesGetMessage : messagesGet.message, - messageToGet : matchedMessage, - expectedGrantor : tenant, - expectedGrantee : messagesGet.author, + const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, messagesRead.signaturePayload!.permissionGrantId); + await MessagesGrantAuthorization.authorizeMessagesRead({ + messagesReadMessage : messagesRead.message, + messageToRead : matchedMessage, + expectedGrantor : tenant, + expectedGrantee : messagesRead.author, permissionGrant, messageStore }); } else { - throw new DwnError(DwnErrorCode.MessagesGetAuthorizationFailed, 'protocol message failed authorization'); + throw new DwnError(DwnErrorCode.MessagesReadAuthorizationFailed, 'protocol message failed authorization'); } } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 032fc0d7d..bac9d8fb0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ export type { DwnConfig } from './dwn.js'; export type { EventLog } from './types/event-log.js'; export type { EventListener, EventStream, EventSubscription, MessageEvent, SubscriptionReply } from './types/subscriptions.js'; export type { GenericMessage, GenericMessageReply, MessageSort, MessageSubscription, Pagination, QueryResultEntry } from './types/message-types.js'; -export type { MessagesFilter, MessagesGetMessage, MessagesGetReply, MessagesGetReplyEntry, MessagesQueryMessage, MessagesQueryReply, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessageSubscriptionHandler } from './types/messages-types.js'; +export type { MessagesFilter, MessagesReadMessage as MessagesReadMessage, MessagesReadReply as MessagesReadReply, MessagesReadReplyEntry as MessagesReadReplyEntry, MessagesQueryMessage, MessagesQueryReply, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessageSubscriptionHandler } from './types/messages-types.js'; export type { Filter, EqualFilter, OneOfFilter, RangeFilter, RangeCriterion, PaginationCursor, QueryOptions } from './types/query-types.js'; export type { ProtocolsConfigureDescriptor, ProtocolDefinition, ProtocolTypes, ProtocolRuleSet, ProtocolsQueryFilter, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js'; export type { EncryptionProperty, RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsQueryReplyEntry, RecordsReadMessage, RecordsReadReply, RecordsSubscribeDescriptor, RecordsSubscribeMessage, RecordsSubscribeReply, RecordSubscriptionHandler, RecordsWriteDescriptor, RecordsWriteTags, RecordsWriteTagValue, RecordsWriteMessage } from './types/records-types.js'; @@ -28,7 +28,7 @@ export { executeUnlessAborted } from './utils/abort.js'; export { Jws } from './utils/jws.js'; export { KeyMaterial, PrivateJwk, PublicJwk } from './types/jose-types.js'; export { Message } from './core/message.js'; -export { MessagesGet, MessagesGetOptions } from './interfaces/messages-get.js'; +export { MessagesRead as MessagesRead, MessagesReadOptions as MessagesReadOptions } from './interfaces/messages-read.js'; export { MessagesQuery, MessagesQueryOptions } from './interfaces/messages-query.js'; export { UnionMessageReply } from './core/message-reply.js'; export { MessageStore, MessageStoreOptions } from './types/message-store.js'; diff --git a/src/interfaces/messages-get.ts b/src/interfaces/messages-read.ts similarity index 68% rename from src/interfaces/messages-get.ts rename to src/interfaces/messages-read.ts index c75115052..7450f0710 100644 --- a/src/interfaces/messages-get.ts +++ b/src/interfaces/messages-read.ts @@ -1,5 +1,5 @@ import type { Signer } from '../types/signer.js'; -import type { MessagesGetDescriptor, MessagesGetMessage } from '../types/messages-types.js'; +import type { MessagesReadDescriptor, MessagesReadMessage } from '../types/messages-types.js'; import { AbstractMessage } from '../core/abstract-message.js'; import { Cid } from '../utils/cid.js'; @@ -8,28 +8,28 @@ import { Time } from '../utils/time.js'; import { DwnError, DwnErrorCode } from '../core/dwn-error.js'; import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js'; -export type MessagesGetOptions = { +export type MessagesReadOptions = { messageCid: string; signer: Signer; messageTimestamp?: string; permissionGrantId?: string; }; -export class MessagesGet extends AbstractMessage { - public static async parse(message: MessagesGetMessage): Promise { +export class MessagesRead extends AbstractMessage { + public static async parse(message: MessagesReadMessage): Promise { Message.validateJsonSchema(message); this.validateMessageCid(message.descriptor.messageCid); await Message.validateSignatureStructure(message.authorization.signature, message.descriptor); Time.validateTimestamp(message.descriptor.messageTimestamp); - return new MessagesGet(message); + return new MessagesRead(message); } - public static async create(options: MessagesGetOptions): Promise { - const descriptor: MessagesGetDescriptor = { + public static async create(options: MessagesReadOptions): Promise { + const descriptor: MessagesReadDescriptor = { interface : DwnInterfaceName.Messages, - method : DwnMethodName.Get, + method : DwnMethodName.Read, messageCid : options.messageCid, messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(), }; @@ -43,9 +43,9 @@ export class MessagesGet extends AbstractMessage { const message = { descriptor, authorization }; Message.validateJsonSchema(message); - MessagesGet.validateMessageCid(options.messageCid); + MessagesRead.validateMessageCid(options.messageCid); - return new MessagesGet(message); + return new MessagesRead(message); } /** @@ -57,7 +57,7 @@ export class MessagesGet extends AbstractMessage { try { Cid.parseCid(messageCid); } catch (_) { - throw new DwnError(DwnErrorCode.MessagesGetInvalidCid, `${messageCid} is not a valid CID`); + throw new DwnError(DwnErrorCode.MessagesReadInvalidCid, `${messageCid} is not a valid CID`); } } } \ No newline at end of file diff --git a/src/types/messages-types.ts b/src/types/messages-types.ts index 65d51ad27..12198af08 100644 --- a/src/types/messages-types.ts +++ b/src/types/messages-types.ts @@ -14,25 +14,25 @@ export type MessagesFilter = { messageTimestamp?: RangeCriterion; }; -export type MessagesGetDescriptor = { +export type MessagesReadDescriptor = { interface : DwnInterfaceName.Messages; - method: DwnMethodName.Get; + method: DwnMethodName.Read; messageCid: string; messageTimestamp: string; }; -export type MessagesGetMessage = GenericMessage & { +export type MessagesReadMessage = GenericMessage & { authorization: AuthorizationModel; // overriding `GenericMessage` with `authorization` being required - descriptor: MessagesGetDescriptor; + descriptor: MessagesReadDescriptor; }; -export type MessagesGetReplyEntry = { +export type MessagesReadReplyEntry = { messageCid: string; message: (GenericMessage & { data?: Readable }); }; -export type MessagesGetReply = GenericMessageReply & { - entry?: MessagesGetReplyEntry; +export type MessagesReadReply = GenericMessageReply & { + entry?: MessagesReadReplyEntry; }; export type MessagesQueryDescriptor = { diff --git a/src/types/permission-types.ts b/src/types/permission-types.ts index 12fb20f4a..723ff72bb 100644 --- a/src/types/permission-types.ts +++ b/src/types/permission-types.ts @@ -77,7 +77,7 @@ export type ProtocolPermissionScope = { export type MessagesPermissionScope = { interface: DwnInterfaceName.Messages; - method: DwnMethodName.Get | DwnMethodName.Query | DwnMethodName.Subscribe; + method: DwnMethodName.Query | DwnMethodName.Read | DwnMethodName.Subscribe; protocol?: string; }; diff --git a/tests/handlers/messages-get.spec.ts b/tests/handlers/messages-read.spec.ts similarity index 79% rename from tests/handlers/messages-get.spec.ts rename to tests/handlers/messages-read.spec.ts index 41339a91a..2425ae4e0 100644 --- a/tests/handlers/messages-get.spec.ts +++ b/tests/handlers/messages-read.spec.ts @@ -3,7 +3,7 @@ import type { EventStream } from '../../src/types/subscriptions.js'; import type { DataStore, EventLog, - MessagesGetReply, + MessagesReadReply, MessageStore, ResumableTaskStore, } from '../../src/index.js'; @@ -20,8 +20,8 @@ import { DidKey, UniversalResolver } from '@web5/dids'; import sinon from 'sinon'; -export function testMessagesGetHandler(): void { - describe('MessagesGetHandler.handle()', () => { +export function testMessagesReadHandler(): void { + describe('MessagesReadHandler.handle()', () => { let dwn: Dwn; let didResolver: DidResolver; let messageStore: MessageStore; @@ -66,7 +66,7 @@ export function testMessagesGetHandler(): void { sinon.stub(GeneralJwsVerifier, 'verifySignatures').throws(new Error('Invalid signature')); // alice creates a record - const { message } = await TestDataGenerator.generateMessagesGet({ + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : await TestDataGenerator.randomCborSha256Cid() }); @@ -81,7 +81,7 @@ export function testMessagesGetHandler(): void { const alice = await TestDataGenerator.generateDidKeyPersona(); const { recordsWrite } = await TestDataGenerator.generateRecordsWrite({ author: alice }); - const { message } = await TestDataGenerator.generateMessagesGet({ + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : await Message.getCid(recordsWrite.message) }); @@ -97,14 +97,14 @@ export function testMessagesGetHandler(): void { const alice = await TestDataGenerator.generateDidKeyPersona(); const { recordsWrite } = await TestDataGenerator.generateRecordsWrite({ author: alice }); - const { message } = await TestDataGenerator.generateMessagesGet({ + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : await Message.getCid(recordsWrite.message) }); message.descriptor.messageCid = 'hehetroll'; - const reply: MessagesGetReply = await dwn.processMessage(alice.did, message); + const reply: MessagesReadReply = await dwn.processMessage(alice.did, message); expect(reply.status.code).to.equal(400); expect(reply.status.detail).to.include('is not a valid CID'); @@ -116,13 +116,13 @@ export function testMessagesGetHandler(): void { const { recordsWrite } = await TestDataGenerator.generateRecordsWrite({ author: alice }); const recordsWriteMessageCid = await Message.getCid(recordsWrite.message); - const { message } = await TestDataGenerator.generateMessagesGet({ + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : recordsWriteMessageCid }); // returns a 404 because the RecordsWrite created above was never stored - const reply: MessagesGetReply = await dwn.processMessage(alice.did, message); + const reply: MessagesReadReply = await dwn.processMessage(alice.did, message); expect(reply.status.code).to.equal(404); expect(reply.entry).to.be.undefined; }); @@ -138,15 +138,15 @@ export function testMessagesGetHandler(): void { const { status } = await dwn.processMessage(bob.did, recordsWrite, { dataStream }); expect(status.code).to.equal(202); - // alice tries to get the message - const { message } = await TestDataGenerator.generateMessagesGet({ + // alice tries to read the message + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : await Message.getCid(recordsWrite) }); const reply = await dwn.processMessage(bob.did, message); expect(reply.status.code).to.equal(401); - expect(reply.status.detail).to.include(DwnErrorCode.MessagesGetAuthorizationFailed); + expect(reply.status.detail).to.include(DwnErrorCode.MessagesReadAuthorizationFailed); }); describe('gets record data in the reply entry', () => { @@ -162,16 +162,16 @@ export function testMessagesGetHandler(): void { expect(reply.status.code).to.equal(202); const recordsWriteMessageCid = await Message.getCid(recordsWrite); - const { message } = await TestDataGenerator.generateMessagesGet({ + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : recordsWriteMessageCid }); - const messagesGetReply: MessagesGetReply = await dwn.processMessage(alice.did, message); - expect(messagesGetReply.status.code).to.equal(200); - expect(messagesGetReply.entry).to.exist; + const messagesReadReply: MessagesReadReply = await dwn.processMessage(alice.did, message); + expect(messagesReadReply.status.code).to.equal(200); + expect(messagesReadReply.entry).to.exist; - const messageReply = messagesGetReply.entry!; + const messageReply = messagesReadReply.entry!; expect(messageReply.messageCid).to.exist; expect(messageReply.messageCid).to.equal(recordsWriteMessageCid); @@ -193,16 +193,16 @@ export function testMessagesGetHandler(): void { expect(reply.status.code).to.equal(202); const recordsWriteMessageCid = await Message.getCid(recordsWrite); - const { message } = await TestDataGenerator.generateMessagesGet({ + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : recordsWriteMessageCid }); - const messagesGetReply: MessagesGetReply = await dwn.processMessage(alice.did, message); - expect(messagesGetReply.status.code).to.equal(200); - expect(messagesGetReply.entry).to.exist; + const messagesReadReply: MessagesReadReply = await dwn.processMessage(alice.did, message); + expect(messagesReadReply.status.code).to.equal(200); + expect(messagesReadReply.entry).to.exist; - const messageReply = messagesGetReply.entry!; + const messageReply = messagesReadReply.entry!; expect(messageReply.messageCid).to.exist; expect(messageReply.messageCid).to.equal(recordsWriteMessageCid); @@ -235,16 +235,16 @@ export function testMessagesGetHandler(): void { reply = await dwn.processMessage(alice.did, updateMessage.toJSON(), { dataStream: updateDataStream }); expect(reply.status.code).to.equal(202); - const { message } = await TestDataGenerator.generateMessagesGet({ + const { message } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : initialMessageCid }); - const messagesGetReply: MessagesGetReply = await dwn.processMessage(alice.did, message); - expect(messagesGetReply.status.code).to.equal(200); - expect(messagesGetReply.entry).to.exist; + const messagesReadReply: MessagesReadReply = await dwn.processMessage(alice.did, message); + expect(messagesReadReply.status.code).to.equal(200); + expect(messagesReadReply.entry).to.exist; - const messageReply = messagesGetReply.entry!; + const messageReply = messagesReadReply.entry!; expect(messageReply.messageCid).to.exist; expect(messageReply.messageCid).to.equal(initialMessageCid); @@ -257,7 +257,7 @@ export function testMessagesGetHandler(): void { describe('Protocol interface messages', () => { it('returns a 401 if the tenant is not the author', async () => { // scenario: Alice configures both a published and non-published protocol and writes it to her DWN. - // Bob is unable to get either of the ProtocolConfigure messages because he is not the author. + // Bob is unable to read either of the ProtocolConfigure messages because he is not the author. const alice = await TestDataGenerator.generateDidKeyPersona(); const bob = await TestDataGenerator.generateDidKeyPersona(); @@ -292,28 +292,28 @@ export function testMessagesGetHandler(): void { const unpublishedProtocolMessageCid = await Message.getCid(unpublishedProtocolsConfigure); const publishedProtocolMessageCid = await Message.getCid(publishedProtocolsConfigure); - // bob attempts to get the unpublished protocol configuration - const { message: getUnpublishedProtocolConfigure } = await TestDataGenerator.generateMessagesGet({ + // bob attempts to read the unpublished protocol configuration + const { message: getUnpublishedProtocolConfigure } = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : unpublishedProtocolMessageCid, }); const getUnpublishedProtocolConfigureReply = await dwn.processMessage(alice.did, getUnpublishedProtocolConfigure); expect(getUnpublishedProtocolConfigureReply.status.code).to.equal(401); - expect(getUnpublishedProtocolConfigureReply.status.detail).to.include(DwnErrorCode.MessagesGetAuthorizationFailed); + expect(getUnpublishedProtocolConfigureReply.status.detail).to.include(DwnErrorCode.MessagesReadAuthorizationFailed); expect(getUnpublishedProtocolConfigureReply.entry).to.be.undefined; - // bob attempts to get the published protocol configuration - const { message: getPublishedProtocolConfigure } = await TestDataGenerator.generateMessagesGet({ + // bob attempts to read the published protocol configuration + const { message: getPublishedProtocolConfigure } = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : publishedProtocolMessageCid, }); const getPublishedProtocolConfigureReply = await dwn.processMessage(alice.did, getPublishedProtocolConfigure); expect(getPublishedProtocolConfigureReply.status.code).to.equal(401); - expect(getPublishedProtocolConfigureReply.status.detail).to.include(DwnErrorCode.MessagesGetAuthorizationFailed); + expect(getPublishedProtocolConfigureReply.status.detail).to.include(DwnErrorCode.MessagesReadAuthorizationFailed); expect(getPublishedProtocolConfigureReply.entry).to.be.undefined; - // control: alice is able to get both the published and unpublished protocol configurations - const { message: getUnpublishedProtocolConfigureAlice } = await TestDataGenerator.generateMessagesGet({ + // control: alice is able to read both the published and unpublished protocol configurations + const { message: getUnpublishedProtocolConfigureAlice } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : unpublishedProtocolMessageCid, }); @@ -323,7 +323,7 @@ export function testMessagesGetHandler(): void { expect(getUnpublishedProtocolConfigureAliceReply.entry!.messageCid).to.equal(unpublishedProtocolMessageCid); expect(getUnpublishedProtocolConfigureAliceReply.entry!.message).to.deep.equal(unpublishedProtocolsConfigure); - const { message: getPublishedProtocolConfigureAlice } = await TestDataGenerator.generateMessagesGet({ + const { message: getPublishedProtocolConfigureAlice } = await TestDataGenerator.generateMessagesRead({ author : alice, messageCid : publishedProtocolMessageCid, }); @@ -338,7 +338,7 @@ export function testMessagesGetHandler(): void { describe('with a grant', () => { it('returns a 401 if grant has different DWN interface scope', async () => { - // scenario: Alice grants Bob access to RecordsWrite, then Bob tries to invoke the grant with MessagesGet + // scenario: Alice grants Bob access to RecordsWrite, then Bob tries to invoke the grant with MessagesRead const alice = await TestDataGenerator.generateDidKeyPersona(); const bob = await TestDataGenerator.generateDidKeyPersona(); @@ -379,20 +379,20 @@ export function testMessagesGetHandler(): void { ); expect(permissionGrantWriteReply.status.code).to.equal(202); - // Bob tries to MessagesGet using the RecordsWrite grant - const messagesGet = await TestDataGenerator.generateMessagesGet({ + // Bob tries to MessagesRead using the RecordsWrite grant + const messagesRead = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : await Message.getCid(recordsWrite.message), permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetReply = await dwn.processMessage(alice.did, messagesGet.message); - expect(messagesGetReply.status.code).to.equal(401); - expect(messagesGetReply.status.detail).to.contain(DwnErrorCode.GrantAuthorizationInterfaceMismatch); + const messagesReadReply = await dwn.processMessage(alice.did, messagesRead.message); + expect(messagesReadReply.status.code).to.equal(401); + expect(messagesReadReply.status.detail).to.contain(DwnErrorCode.GrantAuthorizationInterfaceMismatch); }); - it('allows external parties to get a message using a grant with unrestricted scope', async () => { - // scenario: Alice gives Bob a grant allowing him to get any message in her DWN. - // Bob invokes that grant to get a message. + it('allows external parties to read a message using a grant with unrestricted scope', async () => { + // scenario: Alice gives Bob a grant allowing him to read any message in her DWN. + // Bob invokes that grant to read a message. const alice = await TestDataGenerator.generateDidKeyPersona(); const bob = await TestDataGenerator.generateDidKeyPersona(); @@ -412,7 +412,7 @@ export function testMessagesGetHandler(): void { dateExpires : Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours scope : { interface : DwnInterfaceName.Messages, - method : DwnMethodName.Get, + method : DwnMethodName.Read, } }); const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes); @@ -420,12 +420,12 @@ export function testMessagesGetHandler(): void { expect(grantReply.status.code).to.equal(202); // Bob invokes that grant to read a record from Alice's DWN - const messagesGet = await TestDataGenerator.generateMessagesGet({ + const messagesRead = await TestDataGenerator.generateMessagesRead({ author : bob, permissionGrantId : permissionGrant.recordsWrite.message.recordId, messageCid, }); - const readReply = await dwn.processMessage(alice.did, messagesGet.message); + const readReply = await dwn.processMessage(alice.did, messagesRead.message); expect(readReply.status.code).to.equal(200); expect(readReply.entry).to.not.be.undefined; expect(readReply.entry!.messageCid).to.equal(messageCid); @@ -439,7 +439,7 @@ export function testMessagesGetHandler(): void { // and any PermissionProtocol RecordsWrite messages associated with the protocol. // scenario: Alice configures a protocol that is unpublished and writes it to her DWN. - // Alice then gives Bob a grant to get messages from that protocol. + // Alice then gives Bob a grant to read messages from that protocol. // Carol requests a grant to RecordsWrite to the protocol, and Alice grants it. // Alice and Carol write records associated with the protocol. // Alice also deletes a record associated with the protocol. @@ -540,14 +540,14 @@ export function testMessagesGetHandler(): void { ); expect(permissionRevocationCarolReply.status.code).to.equal(202); - // Alice gives Bob a permission grant with scope MessagesGet + // Alice gives Bob a permission grant with scope MessagesRead const permissionGrant = await PermissionsProtocol.createGrant({ signer : Jws.createSigner(alice), grantedTo : bob.did, dateExpires : Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours scope : { interface : DwnInterfaceName.Messages, - method : DwnMethodName.Get, + method : DwnMethodName.Read, protocol : protocolDefinition.protocol, } }); @@ -559,16 +559,16 @@ export function testMessagesGetHandler(): void { ); expect(permissionGrantWriteReply.status.code).to.equal(202); - // Bob is unable to get the message without using the permission grant - const messagesGetWithoutGrant = await TestDataGenerator.generateMessagesGet({ + // Bob is unable to read the message without using the permission grant + const messagesReadWithoutGrant = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : aliceRecordMessageCid, }); - const messagesGetWithoutGrantReply = await dwn.processMessage(alice.did, messagesGetWithoutGrant.message); - expect(messagesGetWithoutGrantReply.status.code).to.equal(401); - expect(messagesGetWithoutGrantReply.status.detail).to.contain(DwnErrorCode.MessagesGetAuthorizationFailed); + const messagesReadWithoutGrantReply = await dwn.processMessage(alice.did, messagesReadWithoutGrant.message); + expect(messagesReadWithoutGrantReply.status.code).to.equal(401); + expect(messagesReadWithoutGrantReply.status.detail).to.contain(DwnErrorCode.MessagesReadAuthorizationFailed); - // Bob is able to get all the associated messages when using the permission grant + // Bob is able to read all the associated messages when using the permission grant // Expected Messages: // - Protocol Configuration // - Alice's RecordsWrite @@ -579,91 +579,91 @@ export function testMessagesGetHandler(): void { // - Alice's Revocation of Carol's Grant // Protocol configuration - const messagesGetProtocolConfigure = await TestDataGenerator.generateMessagesGet({ + const messagesReadProtocolConfigure = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : protocolConfigureMessageCid, permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetProtocolConfigureReply = await dwn.processMessage(alice.did, messagesGetProtocolConfigure.message); - expect(messagesGetProtocolConfigureReply.status.code).to.equal(200); - expect(messagesGetProtocolConfigureReply.entry).to.exist; - expect(messagesGetProtocolConfigureReply.entry!.message).to.deep.equal(protocolsConfig.message); + const messagesReadProtocolConfigureReply = await dwn.processMessage(alice.did, messagesReadProtocolConfigure.message); + expect(messagesReadProtocolConfigureReply.status.code).to.equal(200); + expect(messagesReadProtocolConfigureReply.entry).to.exist; + expect(messagesReadProtocolConfigureReply.entry!.message).to.deep.equal(protocolsConfig.message); // alice RecordsWrite - const messagesGetWithGrant = await TestDataGenerator.generateMessagesGet({ + const messagesReadWithGrant = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : aliceRecordMessageCid, permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetWithGrantReply = await dwn.processMessage(alice.did, messagesGetWithGrant.message); - expect(messagesGetWithGrantReply.status.code).to.equal(200); - expect(messagesGetWithGrantReply.entry).to.exist; + const messagesReadWithGrantReply = await dwn.processMessage(alice.did, messagesReadWithGrant.message); + expect(messagesReadWithGrantReply.status.code).to.equal(200); + expect(messagesReadWithGrantReply.entry).to.exist; // delete the data field from the message for comparison of the message - delete messagesGetWithGrantReply.entry!.message.data; - expect(messagesGetWithGrantReply.entry!.message).to.deep.equal(recordsWrite.message); + delete messagesReadWithGrantReply.entry!.message.data; + expect(messagesReadWithGrantReply.entry!.message).to.deep.equal(recordsWrite.message); // alice RecordsDelete - const messagesGetDelete = await TestDataGenerator.generateMessagesGet({ + const messagesReadDelete = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : await Message.getCid(recordsDelete.message), permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetDeleteReply = await dwn.processMessage(alice.did, messagesGetDelete.message); - expect(messagesGetDeleteReply.status.code).to.equal(200); - expect(messagesGetDeleteReply.entry).to.exist; - expect(messagesGetDeleteReply.entry!.message).to.deep.equal(recordsDelete.message); + const messagesReadDeleteReply = await dwn.processMessage(alice.did, messagesReadDelete.message); + expect(messagesReadDeleteReply.status.code).to.equal(200); + expect(messagesReadDeleteReply.entry).to.exist; + expect(messagesReadDeleteReply.entry!.message).to.deep.equal(recordsDelete.message); // carol's Permission Request - const messagesGetCarolRequest = await TestDataGenerator.generateMessagesGet({ + const messagesReadCarolRequest = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : await Message.getCid(permissionRequestCarol.recordsWrite.message), permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetCarolRequestReply = await dwn.processMessage(alice.did, messagesGetCarolRequest.message); - expect(messagesGetCarolRequestReply.status.code).to.equal(200); - expect(messagesGetCarolRequestReply.entry).to.exist; + const messagesReadCarolRequestReply = await dwn.processMessage(alice.did, messagesReadCarolRequest.message); + expect(messagesReadCarolRequestReply.status.code).to.equal(200); + expect(messagesReadCarolRequestReply.entry).to.exist; // delete the data field from the message for comparison of the message - delete messagesGetCarolRequestReply.entry!.message.data; - expect(messagesGetCarolRequestReply.entry!.message).to.deep.equal(permissionRequestCarol.recordsWrite.message); + delete messagesReadCarolRequestReply.entry!.message.data; + expect(messagesReadCarolRequestReply.entry!.message).to.deep.equal(permissionRequestCarol.recordsWrite.message); // carol's Permission Grant - const messagesGetCarolGrant = await TestDataGenerator.generateMessagesGet({ + const messagesReadCarolGrant = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : carolGrantMessageCiD, permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetCarolGrantReply = await dwn.processMessage(alice.did, messagesGetCarolGrant.message); - expect(messagesGetCarolGrantReply.status.code).to.equal(200); - expect(messagesGetCarolGrantReply.entry).to.exist; + const messagesReadCarolGrantReply = await dwn.processMessage(alice.did, messagesReadCarolGrant.message); + expect(messagesReadCarolGrantReply.status.code).to.equal(200); + expect(messagesReadCarolGrantReply.entry).to.exist; // delete the data field from the message for comparison of the message - delete messagesGetCarolGrantReply.entry!.message.data; - expect(messagesGetCarolGrantReply.entry!.message).to.deep.equal(permissionGrantCarol.recordsWrite.message); + delete messagesReadCarolGrantReply.entry!.message.data; + expect(messagesReadCarolGrantReply.entry!.message).to.deep.equal(permissionGrantCarol.recordsWrite.message); // carol's RecordsWrite - const messagesGetCarolRecord = await TestDataGenerator.generateMessagesGet({ + const messagesReadCarolRecord = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : carolRecordMessageCid, permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetCarolRecordReply = await dwn.processMessage(alice.did, messagesGetCarolRecord.message); - expect(messagesGetCarolRecordReply.status.code).to.equal(200); - expect(messagesGetCarolRecordReply.entry).to.exist; + const messagesReadCarolRecordReply = await dwn.processMessage(alice.did, messagesReadCarolRecord.message); + expect(messagesReadCarolRecordReply.status.code).to.equal(200); + expect(messagesReadCarolRecordReply.entry).to.exist; // delete the data field from the message for comparison of the message - delete messagesGetCarolRecordReply.entry!.message.data; - expect(messagesGetCarolRecordReply.entry!.message).to.deep.equal(recordsWriteCarol.message); + delete messagesReadCarolRecordReply.entry!.message.data; + expect(messagesReadCarolRecordReply.entry!.message).to.deep.equal(recordsWriteCarol.message); // carol's Grant Revocation - const messagesGetCarolGrantRevocation = await TestDataGenerator.generateMessagesGet({ + const messagesReadCarolGrantRevocation = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : await Message.getCid(permissionRevocationCarol.recordsWrite.message), permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetCarolGrantRevocationReply = await dwn.processMessage(alice.did, messagesGetCarolGrantRevocation.message); - expect(messagesGetCarolGrantRevocationReply.status.code).to.equal(200); - expect(messagesGetCarolGrantRevocationReply.entry).to.exist; + const messagesReadCarolGrantRevocationReply = await dwn.processMessage(alice.did, messagesReadCarolGrantRevocation.message); + expect(messagesReadCarolGrantRevocationReply.status.code).to.equal(200); + expect(messagesReadCarolGrantRevocationReply.entry).to.exist; // delete the data field from the message for comparison of the message - delete messagesGetCarolGrantRevocationReply.entry!.message.data; - expect(messagesGetCarolGrantRevocationReply.entry!.message).to.deep.equal(permissionRevocationCarol.recordsWrite.message); + delete messagesReadCarolGrantRevocationReply.entry!.message.data; + expect(messagesReadCarolGrantRevocationReply.entry!.message).to.deep.equal(permissionRevocationCarol.recordsWrite.message); // CONTROL: Alice writes a record not associated with the protocol const { recordsWrite: recordsWriteControl, dataStream: dataStreamControl } = await TestDataGenerator.generateRecordsWrite({ @@ -672,19 +672,19 @@ export function testMessagesGetHandler(): void { const recordsWriteControlReply = await dwn.processMessage(alice.did, recordsWriteControl.message, { dataStream: dataStreamControl }); expect(recordsWriteControlReply.status.code).to.equal(202); - // Bob is unable to get the control message - const messagesGetControl = await TestDataGenerator.generateMessagesGet({ + // Bob is unable to read the control message + const messagesReadControl = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : await Message.getCid(recordsWriteControl.message), permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetControlReply = await dwn.processMessage(alice.did, messagesGetControl.message); - expect(messagesGetControlReply.status.code).to.equal(401); + const messagesReadControlReply = await dwn.processMessage(alice.did, messagesReadControl.message); + expect(messagesReadControlReply.status.code).to.equal(401); }); - it('rejects message get of protocol messages with mismatching protocol grant scopes', async () => { - // scenario: Alice writes a protocol record. Alice gives Bob a grant to get messages from a different protocol - // Bob invokes that grant to get the protocol message, but fails. + it('rejects message read of protocol messages with mismatching protocol grant scopes', async () => { + // scenario: Alice writes a protocol record. Alice gives Bob a grant to read messages from a different protocol + // Bob invokes that grant to read the protocol message, but fails. const alice = await TestDataGenerator.generateDidKeyPersona(); const bob = await TestDataGenerator.generateDidKeyPersona(); @@ -708,14 +708,14 @@ export function testMessagesGetHandler(): void { const recordsWriteReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream }); expect(recordsWriteReply.status.code).to.equal(202); - // Alice gives Bob a permission grant with scope MessagesGet + // Alice gives Bob a permission grant with scope MessagesRead const permissionGrant = await PermissionsProtocol.createGrant({ signer : Jws.createSigner(alice), grantedTo : bob.did, dateExpires : Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours scope : { interface : DwnInterfaceName.Messages, - method : DwnMethodName.Get, + method : DwnMethodName.Read, protocol : 'a-different-protocol' } }); @@ -728,14 +728,14 @@ export function testMessagesGetHandler(): void { expect(permissionGrantWriteReply.status.code).to.equal(202); // Bob is unable to read the record using the mismatched permission grant - const messagesGetWithoutGrant = await TestDataGenerator.generateMessagesGet({ + const messagesReadWithoutGrant = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : await Message.getCid(recordsWrite.message), permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetWithoutGrantReply = await dwn.processMessage(alice.did, messagesGetWithoutGrant.message); - expect(messagesGetWithoutGrantReply.status.code).to.equal(401); - expect(messagesGetWithoutGrantReply.status.detail).to.contain(DwnErrorCode.MessagesGetVerifyScopeFailed); + const messagesReadWithoutGrantReply = await dwn.processMessage(alice.did, messagesReadWithoutGrant.message); + expect(messagesReadWithoutGrantReply.status.code).to.equal(401); + expect(messagesReadWithoutGrantReply.status.detail).to.contain(DwnErrorCode.MessagesReadVerifyScopeFailed); }); it('rejects message if the RecordsWrite message is not found for a RecordsDelete being retrieved', async () => { @@ -761,7 +761,7 @@ export function testMessagesGetHandler(): void { dateExpires : Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours scope : { interface : DwnInterfaceName.Messages, - method : DwnMethodName.Get, + method : DwnMethodName.Read, protocol : protocolDefinition.protocol, } }); @@ -790,15 +790,15 @@ export function testMessagesGetHandler(): void { const indexes = recordsDelete.constructIndexes(recordsWrite.message); await messageStore.put(alice.did, recordsDelete.message, indexes); - // Bob tries to get the message - const messagesGet = await TestDataGenerator.generateMessagesGet({ + // Bob tries to read the message + const messagesRead = await TestDataGenerator.generateMessagesRead({ author : bob, messageCid : recordsDeleteCid, permissionGrantId : permissionGrant.recordsWrite.message.recordId, }); - const messagesGetReply = await dwn.processMessage(alice.did, messagesGet.message); - expect(messagesGetReply.status.code).to.equal(401); - expect(messagesGetReply.status.detail).to.contain(DwnErrorCode.RecordsWriteGetNewestWriteRecordNotFound); + const messagesReadReply = await dwn.processMessage(alice.did, messagesRead.message); + expect(messagesReadReply.status.code).to.equal(401); + expect(messagesReadReply.status.detail).to.contain(DwnErrorCode.RecordsWriteGetNewestWriteRecordNotFound); }); }); }); diff --git a/tests/interfaces/messages-get.spec.ts b/tests/interfaces/messages-get.spec.ts index ce8b5fd9e..2149b6643 100644 --- a/tests/interfaces/messages-get.spec.ts +++ b/tests/interfaces/messages-get.spec.ts @@ -1,60 +1,60 @@ -import type { MessagesGetMessage } from '../../src/index.js'; +import type { MessagesReadMessage } from '../../src/index.js'; import { expect } from 'chai'; import { Message } from '../../src/core/message.js'; -import { MessagesGet } from '../../src/index.js'; +import { MessagesRead } from '../../src/index.js'; import { TestDataGenerator } from '../utils/test-data-generator.js'; import { DwnErrorCode, Jws } from '../../src/index.js'; -describe('MessagesGet Message', () => { +describe('MessagesRead Message', () => { describe('create', () => { - it('creates a MessagesGet message', async () => { + it('creates a MessagesRead message', async () => { const { author, message } = await TestDataGenerator.generateRecordsWrite(); const messageCid = await Message.getCid(message); const messageTimestamp = TestDataGenerator.randomTimestamp(); - const messagesGet = await MessagesGet.create({ + const messagesRead = await MessagesRead.create({ signer : await Jws.createSigner(author), messageCid : messageCid, messageTimestamp, }); - expect(messagesGet.message.authorization).to.exist; - expect(messagesGet.message.descriptor).to.exist; - expect(messagesGet.message.descriptor.messageCid).to.equal(messageCid); - expect(messagesGet.message.descriptor.messageTimestamp).to.equal(messageTimestamp); + expect(messagesRead.message.authorization).to.exist; + expect(messagesRead.message.descriptor).to.exist; + expect(messagesRead.message.descriptor.messageCid).to.equal(messageCid); + expect(messagesRead.message.descriptor.messageTimestamp).to.equal(messageTimestamp); }); it('throws an error if an invalid CID is provided', async () => { const alice = await TestDataGenerator.generatePersona(); try { - await MessagesGet.create({ + await MessagesRead.create({ signer : await Jws.createSigner(alice), messageCid : 'abcd' }); expect.fail(); } catch (e: any) { - expect(e.message).to.include(DwnErrorCode.MessagesGetInvalidCid); + expect(e.message).to.include(DwnErrorCode.MessagesReadInvalidCid); } }); }); describe('parse', () => { - it('parses a message into a MessagesGet instance', async () => { + it('parses a message into a MessagesRead instance', async () => { const { author, message } = await TestDataGenerator.generateRecordsWrite(); let messageCid = await Message.getCid(message); - const messagesGet = await MessagesGet.create({ + const messagesRead = await MessagesRead.create({ signer : await Jws.createSigner(author), messageCid : messageCid }); - const parsed = await MessagesGet.parse(messagesGet.message); - expect(parsed).to.be.instanceof(MessagesGet); + const parsed = await MessagesRead.parse(messagesRead.message); + expect(parsed).to.be.instanceof(MessagesRead); - const expectedMessageCid = await Message.getCid(messagesGet.message); + const expectedMessageCid = await Message.getCid(messagesRead.message); messageCid = await Message.getCid(parsed.message); expect(messageCid).to.equal(expectedMessageCid); @@ -64,16 +64,16 @@ describe('MessagesGet Message', () => { const { author, message: recordsWriteMessage } = await TestDataGenerator.generateRecordsWrite(); const messageCid = await Message.getCid(recordsWriteMessage); - const messagesGet = await MessagesGet.create({ + const messagesRead = await MessagesRead.create({ signer : await Jws.createSigner(author), messageCid : messageCid }); - const message = messagesGet.toJSON() as MessagesGetMessage; + const message = messagesRead.toJSON() as MessagesReadMessage; message.descriptor.messageCid = 'abcd'; try { - await MessagesGet.parse(message); + await MessagesRead.parse(message); expect.fail(); } catch (e: any) { diff --git a/tests/test-suite.ts b/tests/test-suite.ts index a9ba9c9c2..9e73f0e46 100644 --- a/tests/test-suite.ts +++ b/tests/test-suite.ts @@ -6,9 +6,9 @@ import { testEndToEndScenarios } from './scenarios/end-to-end-tests.spec.js'; import { testEventLog } from './event-log/event-log.spec.js'; import { testEventStream } from './event-log/event-stream.spec.js'; import { TestEventStream } from './test-event-stream.js'; -import { testMessagesGetHandler } from './handlers/messages-get.spec.js'; import { testMessagesQueryHandler } from './handlers/messages-query.spec.js'; import { testMessagesQueryScenarios } from './scenarios/messages-query.spec.js'; +import { testMessagesReadHandler } from './handlers/messages-read.spec.js'; import { testMessagesSubscribeHandler } from './handlers/messages-subscribe.spec.js'; import { testMessageStore } from './store/message-store.spec.js'; import { testNestedRoleScenarios } from './scenarios/nested-roles.spec.js'; @@ -59,8 +59,8 @@ export class TestSuite { testEventStream(); // handler tests - testMessagesGetHandler(); testMessagesQueryHandler(); + testMessagesReadHandler(); testMessagesSubscribeHandler(); testProtocolsConfigureHandler(); testProtocolsQueryHandler(); diff --git a/tests/utils/test-data-generator.ts b/tests/utils/test-data-generator.ts index 89b4d87a4..12b358469 100644 --- a/tests/utils/test-data-generator.ts +++ b/tests/utils/test-data-generator.ts @@ -1,8 +1,8 @@ import type { DerivedPrivateJwk } from '../../src/utils/hd-key.js'; import type { DidResolutionResult } from '@web5/dids'; import type { GeneralJws } from '../../src/types/jws-types.js'; -import type { MessagesGetOptions } from '../../src/interfaces/messages-get.js'; import type { MessagesQueryOptions } from '../../src/interfaces/messages-query.js'; +import type { MessagesReadOptions } from '../../src/interfaces/messages-read.js'; import type { MessagesSubscribeOptions } from '../../src/interfaces/messages-subscribe.js'; import type { PaginationCursor } from '../../src/types/query-types.js'; import type { PermissionGrantCreateOptions } from '../../src/protocols/permissions.js'; @@ -15,7 +15,7 @@ import type { Signer } from '../../src/types/signer.js'; import type { AuthorizationModel, Pagination } from '../../src/types/message-types.js'; import type { CreateFromOptions, EncryptionInput, KeyEncryptionInput, RecordsWriteOptions } from '../../src/interfaces/records-write.js'; import type { DataEncodedRecordsWriteMessage, DateSort, RecordsDeleteMessage, RecordsFilter, RecordsQueryMessage, RecordsWriteTags } from '../../src/types/records-types.js'; -import type { MessagesFilter, MessagesGetMessage, MessagesQueryMessage, MessagesSubscribeMessage } from '../../src/types/messages-types.js'; +import type { MessagesFilter, MessagesQueryMessage, MessagesReadMessage, MessagesSubscribeMessage } from '../../src/types/messages-types.js'; import type { PermissionConditions, PermissionScope } from '../../src/types/permission-types.js'; import type { PrivateJwk, PublicJwk } from '../../src/types/jose-types.js'; import type { ProtocolDefinition, ProtocolsConfigureMessage, ProtocolsQueryMessage } from '../../src/types/protocols-types.js'; @@ -29,8 +29,8 @@ import { ed25519 } from '../../src/jose/algorithms/signing/ed25519.js'; import { Encoder } from '../../src/utils/encoder.js'; import { Encryption } from '../../src/utils/encryption.js'; import { Jws } from '../../src/utils/jws.js'; -import { MessagesGet } from '../../src/interfaces/messages-get.js'; import { MessagesQuery } from '../../src/interfaces/messages-query.js'; +import { MessagesRead } from '../../src/interfaces/messages-read.js'; import { MessagesSubscribe } from '../../src/interfaces/messages-subscribe.js'; import { PermissionsProtocol } from '../../src/protocols/permissions.js'; import { PrivateKeySigner } from '../../src/utils/private-key-signer.js'; @@ -239,16 +239,16 @@ export type GenerateMessagesSubscribeOutput = { message: MessagesSubscribeMessage; }; -export type GenerateMessagesGetInput = { +export type GenerateMessagesReadInput = { author?: Persona; messageCid: string; permissionGrantId?: string; }; -export type GenerateMessagesGetOutput = { +export type GenerateMessagesReadOutput = { author: Persona; - message: MessagesGetMessage; - messagesGet: MessagesGet; + message: MessagesReadMessage; + messagesRead: MessagesRead; }; /** @@ -761,22 +761,22 @@ export class TestDataGenerator { }; } - public static async generateMessagesGet(input: GenerateMessagesGetInput): Promise { + public static async generateMessagesRead(input: GenerateMessagesReadInput): Promise { const author = input?.author ?? await TestDataGenerator.generatePersona(); const signer = Jws.createSigner(author); - const options: MessagesGetOptions = { + const options: MessagesReadOptions = { signer, messageCid : input.messageCid, permissionGrantId : input.permissionGrantId }; - const messagesGet = await MessagesGet.create(options); + const messagesRead = await MessagesRead.create(options); return { author, - messagesGet, - message: messagesGet.message, + messagesRead, + message: messagesRead.message, }; }