diff --git a/.changeset/shaggy-ladybugs-sort.md b/.changeset/shaggy-ladybugs-sort.md new file mode 100644 index 0000000000..7863ee3ca9 --- /dev/null +++ b/.changeset/shaggy-ladybugs-sort.md @@ -0,0 +1,8 @@ +--- +"@credo-ts/didcomm": minor +"@credo-ts/core": minor +--- + +`MessagePickupRepository` has been refactored to `QueueTransportRepository`, and now belongs to DIDComm module configuration. As a result, MessagePickupRepository injection symbol has been dropped. If you want to retrieve current QueueTransportRepository instance, resolve DidCommModuleConfig and get `queueTransportRepository`. + +All methods in QueueTransportRepository now include `AgentContext` as their first argument. diff --git a/packages/core/src/agent/__tests__/Agent.test.ts b/packages/core/src/agent/__tests__/Agent.test.ts index 20b14e29eb..aa68f657c2 100644 --- a/packages/core/src/agent/__tests__/Agent.test.ts +++ b/packages/core/src/agent/__tests__/Agent.test.ts @@ -19,7 +19,7 @@ import { BasicMessagesApi } from '../../../../didcomm/src/modules/basic-messages import { ConnectionRepository, ConnectionsApi } from '../../../../didcomm/src/modules/connections' import { CredentialRepository } from '../../../../didcomm/src/modules/credentials' import { CredentialsApi } from '../../../../didcomm/src/modules/credentials/CredentialsApi' -import { InMemoryMessagePickupRepository, MessagePickupApi } from '../../../../didcomm/src/modules/message-pickup' +import { MessagePickupApi } from '../../../../didcomm/src/modules/message-pickup' import { ProofRepository, ProofsApi } from '../../../../didcomm/src/modules/proofs' import { MediationRecipientApi, @@ -140,9 +140,6 @@ describe('Agent', () => { // Symbols, interface based expect(container.resolve(InjectionSymbols.Logger)).toBe(agentOptions.config.logger) - expect(container.resolve(InjectionSymbols.MessagePickupRepository)).toBeInstanceOf( - InMemoryMessagePickupRepository - ) // Agent expect(container.resolve(MessageSender)).toBeInstanceOf(MessageSender) @@ -181,9 +178,6 @@ describe('Agent', () => { // Symbols, interface based expect(container.resolve(InjectionSymbols.Logger)).toBe(container.resolve(InjectionSymbols.Logger)) - expect(container.resolve(InjectionSymbols.MessagePickupRepository)).toBe( - container.resolve(InjectionSymbols.MessagePickupRepository) - ) expect(container.resolve(InjectionSymbols.StorageService)).toBe( container.resolve(InjectionSymbols.StorageService) ) diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts index 51179c0a22..5cbb76c53d 100644 --- a/packages/core/src/constants.ts +++ b/packages/core/src/constants.ts @@ -1,5 +1,4 @@ export const InjectionSymbols = { - MessagePickupRepository: Symbol('MessagePickupRepository'), // TODO: Move to DIDComm StorageService: Symbol('StorageService'), Logger: Symbol('Logger'), AgentContextProvider: Symbol('AgentContextProvider'), diff --git a/packages/didcomm/src/DidCommModuleConfig.ts b/packages/didcomm/src/DidCommModuleConfig.ts index c2dface42b..f429414be7 100644 --- a/packages/didcomm/src/DidCommModuleConfig.ts +++ b/packages/didcomm/src/DidCommModuleConfig.ts @@ -1,4 +1,5 @@ import { DID_COMM_TRANSPORT_QUEUE } from './constants' +import { InMemoryQueueTransportRepository, QueueTransportRepository } from './transport' import { DidCommMimeType } from './types' /** @@ -12,15 +13,18 @@ export interface DidCommModuleConfigOptions { processDidCommMessagesConcurrently?: boolean didCommMimeType?: string useDidKeyInProtocols?: boolean + queueTransportRepository?: QueueTransportRepository } export class DidCommModuleConfig { private options: DidCommModuleConfigOptions private _endpoints?: string[] + private _queueTransportRepository: QueueTransportRepository public constructor(options?: DidCommModuleConfigOptions) { this.options = options ?? {} this._endpoints = options?.endpoints + this._queueTransportRepository = options?.queueTransportRepository ?? new InMemoryQueueTransportRepository() } public get endpoints(): [string, ...string[]] { @@ -65,4 +69,12 @@ export class DidCommModuleConfig { public get useDidKeyInProtocols() { return this.options.useDidKeyInProtocols ?? true } + + /** + * Allows to specify a custom queue transport queue. It defaults to an in-memory queue + * + */ + public get queueTransportRepository() { + return this._queueTransportRepository + } } diff --git a/packages/didcomm/src/MessageSender.ts b/packages/didcomm/src/MessageSender.ts index 8ff422d83d..6dace961c0 100644 --- a/packages/didcomm/src/MessageSender.ts +++ b/packages/didcomm/src/MessageSender.ts @@ -13,19 +13,17 @@ import { DidKey, DidsApi, EventEmitter, - InjectionSymbols, Kms, - Logger, MessageValidator, ResolvedDidCommService, didKeyToEd25519PublicJwk, getPublicJwkFromVerificationMethod, - inject, injectable, utils, verkeyToDidKey, } from '@credo-ts/core' +import { DidCommModuleConfig } from './DidCommModuleConfig' import { EnvelopeService } from './EnvelopeService' import { AgentEventTypes } from './Events' import { TransportService } from './TransportService' @@ -33,8 +31,8 @@ import { DID_COMM_TRANSPORT_QUEUE } from './constants' import { ReturnRouteTypes } from './decorators/transport/TransportDecorator' import { MessageSendingError } from './errors' import { OutboundMessageContext, OutboundMessageSendStatus } from './models' -import { MessagePickupRepository } from './modules/message-pickup/storage' import { DidCommDocumentService } from './services/DidCommDocumentService' +import { QueueTransportRepository } from './transport' export interface TransportPriorityOptions { schemes: string[] @@ -45,8 +43,7 @@ export interface TransportPriorityOptions { export class MessageSender { private envelopeService: EnvelopeService private transportService: TransportService - private messagePickupRepository: MessagePickupRepository - private logger: Logger + private queueTransportRepository: QueueTransportRepository private didCommDocumentService: DidCommDocumentService private eventEmitter: EventEmitter private _outboundTransports: OutboundTransport[] = [] @@ -54,15 +51,13 @@ export class MessageSender { public constructor( envelopeService: EnvelopeService, transportService: TransportService, - @inject(InjectionSymbols.MessagePickupRepository) messagePickupRepository: MessagePickupRepository, - @inject(InjectionSymbols.Logger) logger: Logger, + didCommModuleConfig: DidCommModuleConfig, didCommDocumentService: DidCommDocumentService, eventEmitter: EventEmitter ) { this.envelopeService = envelopeService this.transportService = transportService - this.messagePickupRepository = messagePickupRepository - this.logger = logger + this.queueTransportRepository = didCommModuleConfig.queueTransportRepository this.didCommDocumentService = didCommDocumentService this.eventEmitter = eventEmitter this._outboundTransports = [] @@ -103,12 +98,12 @@ export class MessageSender { } private async sendMessageToSession(agentContext: AgentContext, session: TransportSession, message: AgentMessage) { - this.logger.debug(`Packing message and sending it via existing session ${session.type}...`) + agentContext.config.logger.debug(`Packing message and sending it via existing session ${session.type}...`) if (!session.keys) { throw new CredoError(`There are no keys for the given ${session.type} transport session.`) } const encryptedMessage = await this.envelopeService.packMessage(agentContext, message, session.keys) - this.logger.debug('Sending message') + agentContext.config.logger.debug('Sending message') await session.send(agentContext, encryptedMessage) } @@ -136,7 +131,10 @@ export class MessageSender { return } catch (error) { errors.push(error) - this.logger.debug(`Sending packed message via session failed with error: ${error.message}.`, error) + agentContext.config.logger.debug( + `Sending packed message via session failed with error: ${error.message}.`, + error + ) } } @@ -153,7 +151,7 @@ export class MessageSender { // Loop trough all available services and try to send the message for await (const service of services) { - this.logger.debug('Sending outbound message to service:', { service }) + agentContext.config.logger.debug('Sending outbound message to service:', { service }) try { const protocolScheme = utils.getProtocolScheme(service.serviceEndpoint) for (const transport of this.outboundTransports) { @@ -168,7 +166,7 @@ export class MessageSender { } return } catch (error) { - this.logger.debug( + agentContext.config.logger.debug( `Sending outbound message to service with id ${service.id} failed with the following error:`, { message: error.message, @@ -181,8 +179,10 @@ export class MessageSender { // We didn't succeed to send the message over open session, or directly to serviceEndpoint // If the other party shared a queue service endpoint in their did doc we queue the message if (queueService) { - this.logger.debug(`Queue packed message for connection ${connection.id} (${connection.theirLabel})`) - await this.messagePickupRepository.addMessage({ + agentContext.config.logger.debug( + `Queue packed message for connection ${connection.id} (${connection.theirLabel})` + ) + await this.queueTransportRepository.addMessage(agentContext, { connectionId: connection.id, recipientDids: [verkeyToDidKey(recipientKey)], payload: encryptedMessage, @@ -191,11 +191,14 @@ export class MessageSender { } // Message is undeliverable - this.logger.error(`Message is undeliverable to connection ${connection.id} (${connection.theirLabel})`, { - message: encryptedMessage, - errors, - connection, - }) + agentContext.config.logger.error( + `Message is undeliverable to connection ${connection.id} (${connection.theirLabel})`, + { + message: encryptedMessage, + errors, + connection, + } + ) throw new CredoError(`Message is undeliverable to connection ${connection.id} (${connection.theirLabel})`) } @@ -213,14 +216,14 @@ export class MessageSender { } if (!connection) { - this.logger.error('Outbound message has no associated connection') + agentContext.config.logger.error('Outbound message has no associated connection') this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.Undeliverable) throw new MessageSendingError('Outbound message has no associated connection', { outboundMessageContext, }) } - this.logger.debug('Send outbound message', { + agentContext.config.logger.debug('Send outbound message', { message, connectionId: connection.id, }) @@ -228,7 +231,9 @@ export class MessageSender { const session = this.findSessionForOutboundContext(outboundMessageContext) if (session) { - this.logger.debug(`Found session with return routing for message '${message.id}' (connection '${connection.id}'`) + agentContext.config.logger.debug( + `Found session with return routing for message '${message.id}' (connection '${connection.id}'` + ) try { await this.sendMessageToSession(agentContext, session, message) @@ -236,7 +241,10 @@ export class MessageSender { return } catch (error) { errors.push(error) - this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) + agentContext.config.logger.debug( + `Sending an outbound message via session failed with error: ${error.message}.`, + error + ) } } @@ -252,7 +260,7 @@ export class MessageSender { outOfBand )) } catch (error) { - this.logger.error(`Unable to retrieve services for connection '${connection.id}. ${error.message}`) + agentContext.config.logger.error(`Unable to retrieve services for connection '${connection.id}. ${error.message}`) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.Undeliverable) throw new MessageSendingError(`Unable to retrieve services for connection '${connection.id}`, { outboundMessageContext, @@ -261,7 +269,9 @@ export class MessageSender { } if (!connection.did) { - this.logger.error(`Unable to send message using connection '${connection.id}' that doesn't have a did`) + agentContext.config.logger.error( + `Unable to send message using connection '${connection.id}' that doesn't have a did` + ) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.Undeliverable) throw new MessageSendingError( `Unable to send message using connection '${connection.id}' that doesn't have a did`, @@ -271,9 +281,12 @@ export class MessageSender { const dids = agentContext.resolve(DidsApi) const { didDocument, keys } = await dids.resolveCreatedDidDocumentWithKeys(connection.did).catch((error) => { - this.logger.error(`Unable to send message using connection '${connection.id}', unable to resolve did`, { - error, - }) + agentContext.config.logger.error( + `Unable to send message using connection '${connection.id}', unable to resolve did`, + { + error, + } + ) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.Undeliverable) throw new MessageSendingError( `Unable to send message using connection '${connection.id}'. Unble to resolve did`, @@ -330,7 +343,7 @@ export class MessageSender { return } catch (error) { errors.push(error) - this.logger.debug( + agentContext.config.logger.debug( `Sending outbound message to service with id ${service.id} failed with the following error:`, { message: error.message, @@ -343,7 +356,7 @@ export class MessageSender { // We didn't succeed to send the message over open session, or directly to serviceEndpoint // If the other party shared a queue service endpoint in their did doc we queue the message if (queueService && message.allowQueueTransport) { - this.logger.debug(`Queue message for connection ${connection.id} (${connection.theirLabel})`) + agentContext.config.logger.debug(`Queue message for connection ${connection.id} (${connection.theirLabel})`) const keys = { recipientKeys: queueService.recipientKeys, @@ -352,7 +365,7 @@ export class MessageSender { } const encryptedMessage = await this.envelopeService.packMessage(agentContext, message, keys) - await this.messagePickupRepository.addMessage({ + await this.queueTransportRepository.addMessage(agentContext, { connectionId: connection.id, recipientDids: keys.recipientKeys.map((item) => new DidKey(item).did), payload: encryptedMessage, @@ -364,11 +377,14 @@ export class MessageSender { } // Message is undeliverable - this.logger.error(`Message is undeliverable to connection ${connection.id} (${connection.theirLabel})`, { - message, - errors, - connection, - }) + agentContext.config.logger.error( + `Message is undeliverable to connection ${connection.id} (${connection.theirLabel})`, + { + message, + errors, + connection, + } + ) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.Undeliverable) throw new MessageSendingError( @@ -381,13 +397,18 @@ export class MessageSender { const session = this.findSessionForOutboundContext(outboundMessageContext) if (session) { - this.logger.debug(`Found session with return routing for message '${outboundMessageContext.message.id}'`) + outboundMessageContext.agentContext.config.logger.debug( + `Found session with return routing for message '${outboundMessageContext.message.id}'` + ) try { await this.sendMessageToSession(outboundMessageContext.agentContext, session, outboundMessageContext.message) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) return } catch (error) { - this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) + outboundMessageContext.agentContext.config.logger.debug( + `Sending an outbound message via session failed with error: ${error.message}.`, + error + ) } } @@ -396,7 +417,7 @@ export class MessageSender { await this.sendToService(outboundMessageContext) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) } catch (error) { - this.logger.error( + outboundMessageContext.agentContext.config.logger.error( `Message is undeliverable to service with id ${outboundMessageContext.serviceParams?.service.id}: ${error.message}`, { message: outboundMessageContext.message, @@ -424,7 +445,7 @@ export class MessageSender { throw new CredoError('Agent has no outbound transport!') } - this.logger.debug('Sending outbound message to service:', { + agentContext.config.logger.debug('Sending outbound message to service:', { messageId: message.id, service: { ...service, recipientKeys: 'omitted...', routingKeys: 'omitted...' }, }) @@ -443,7 +464,7 @@ export class MessageSender { try { MessageValidator.validateSync(message) } catch (error) { - this.logger.error( + agentContext.config.logger.error( `Aborting sending outbound message ${message.type} to ${service.serviceEndpoint}. Message validation failed`, { errors: error, @@ -460,7 +481,7 @@ export class MessageSender { for (const transport of this.outboundTransports) { const protocolScheme = utils.getProtocolScheme(service.serviceEndpoint) if (!protocolScheme) { - this.logger.warn('Service does not have a protocol scheme.') + agentContext.config.logger.warn('Service does not have a protocol scheme.') } else if (transport.supportedSchemes.includes(protocolScheme)) { await transport.sendMessage(outboundPackage) return @@ -496,23 +517,26 @@ export class MessageSender { transportPriority?: TransportPriorityOptions, outOfBand?: OutOfBandRecord ) { - this.logger.debug(`Retrieving services for connection '${connection.id}' (${connection.theirLabel})`, { - transportPriority, - connection, - }) + agentContext.config.logger.debug( + `Retrieving services for connection '${connection.id}' (${connection.theirLabel})`, + { + transportPriority, + connection, + } + ) let didCommServices: ResolvedDidCommService[] = [] if (connection.theirDid) { - this.logger.debug(`Resolving services for connection theirDid ${connection.theirDid}.`) + agentContext.config.logger.debug(`Resolving services for connection theirDid ${connection.theirDid}.`) didCommServices = await this.didCommDocumentService.resolveServicesFromDid(agentContext, connection.theirDid) } else if (outOfBand) { - this.logger.debug(`Resolving services from out-of-band record ${outOfBand.id}.`) + agentContext.config.logger.debug(`Resolving services from out-of-band record ${outOfBand.id}.`) if (connection.isRequester) { for (const service of outOfBand.outOfBandInvitation.getServices()) { // Resolve dids to DIDDocs to retrieve services if (typeof service === 'string') { - this.logger.debug(`Resolving services for did ${service}.`) + agentContext.config.logger.debug(`Resolving services for did ${service}.`) didCommServices.push(...(await this.didCommDocumentService.resolveServicesFromDid(agentContext, service))) } else { // Out of band inline service contains keys encoded as did:key references @@ -548,7 +572,7 @@ export class MessageSender { }) } - this.logger.debug( + agentContext.config.logger.debug( `Retrieved ${services.length} services for message to connection '${connection.id}'(${connection.theirLabel})'`, { hasQueueService: queueService !== undefined } ) diff --git a/packages/didcomm/src/__tests__/MessageSender.test.ts b/packages/didcomm/src/__tests__/MessageSender.test.ts index 76f576d050..b4d5b36635 100644 --- a/packages/didcomm/src/__tests__/MessageSender.test.ts +++ b/packages/didcomm/src/__tests__/MessageSender.test.ts @@ -2,8 +2,7 @@ import type { DidDocumentService, IndyAgentService } from '../../../core/src/mod import type { ResolvedDidCommService } from '../../../core/src/types' import type { AgentMessageSentEvent } from '../Events' import type { ConnectionRecord } from '../modules' -import type { MessagePickupRepository } from '../modules/message-pickup/storage' -import type { OutboundTransport } from '../transport' +import { InMemoryQueueTransportRepository, type OutboundTransport } from '../transport' import type { EncryptedMessage } from '../types' import { Subject } from 'rxjs' @@ -21,17 +20,16 @@ import { getMockConnection, mockFunction, } from '../../../core/tests/helpers' -import testLogger from '../../../core/tests/logger' import { EnvelopeService as EnvelopeServiceImpl } from '../EnvelopeService' import { AgentEventTypes } from '../Events' import { MessageSender } from '../MessageSender' import { TransportService } from '../TransportService' import { ReturnRouteTypes } from '../decorators/transport/TransportDecorator' import { OutboundMessageContext, OutboundMessageSendStatus } from '../models' -import { InMemoryMessagePickupRepository } from '../modules/message-pickup/storage' import { DidCommDocumentService } from '../services/DidCommDocumentService' -import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { AgentConfig, Kms, TypedArrayEncoder } from '@credo-ts/core' +import { DidCommModuleConfig } from '../DidCommModuleConfig' import { DummyTransportSession } from './stubs' jest.mock('../TransportService') @@ -39,8 +37,6 @@ jest.mock('../EnvelopeService') jest.mock('../../../core/src/modules/dids/DidsApi') jest.mock('../services/DidCommDocumentService') -const logger = testLogger - const TransportServiceMock = TransportService as jest.MockedClass const DidsApiMock = DidsApi as jest.Mock const DidCommDocumentServiceMock = DidCommDocumentService as jest.Mock @@ -141,12 +137,14 @@ describe('MessageSender', () => { let messageSender: MessageSender let outboundTransport: OutboundTransport - let messagePickupRepository: MessagePickupRepository let connection: ConnectionRecord let outboundMessageContext: OutboundMessageContext const agentConfig = getAgentConfig('MessageSender') const agentContext = getAgentContext({ - registerInstances: [[DidsApi, didsApi]], + registerInstances: [ + [DidsApi, didsApi], + [AgentConfig, agentConfig], + ], }) const eventListenerMock = jest.fn() @@ -158,12 +156,10 @@ describe('MessageSender', () => { eventEmitter.on(AgentEventTypes.AgentMessageSent, eventListenerMock) outboundTransport = new DummyHttpOutboundTransport() - messagePickupRepository = new InMemoryMessagePickupRepository(agentConfig.logger) messageSender = new MessageSender( enveloperService, transportService, - messagePickupRepository, - logger, + new DidCommModuleConfig({ queueTransportRepository: new InMemoryQueueTransportRepository() }), didCommDocumentService, eventEmitter ) @@ -523,8 +519,7 @@ describe('MessageSender', () => { messageSender = new MessageSender( enveloperService, transportService, - new InMemoryMessagePickupRepository(agentConfig.logger), - logger, + new DidCommModuleConfig({ queueTransportRepository: new InMemoryQueueTransportRepository() }), didCommDocumentService, eventEmitter ) @@ -661,12 +656,10 @@ describe('MessageSender', () => { describe('packMessage', () => { beforeEach(() => { outboundTransport = new DummyHttpOutboundTransport() - messagePickupRepository = new InMemoryMessagePickupRepository(agentConfig.logger) messageSender = new MessageSender( enveloperService, transportService, - messagePickupRepository, - logger, + new DidCommModuleConfig({ queueTransportRepository: new InMemoryQueueTransportRepository() }), didCommDocumentService, eventEmitter ) diff --git a/packages/didcomm/src/modules/message-pickup/MessagePickupApi.ts b/packages/didcomm/src/modules/message-pickup/MessagePickupApi.ts index 974bfbd049..ce9cb7b4ed 100644 --- a/packages/didcomm/src/modules/message-pickup/MessagePickupApi.ts +++ b/packages/didcomm/src/modules/message-pickup/MessagePickupApi.ts @@ -14,7 +14,6 @@ import type { MessagePickupCompletedEvent } from './MessagePickupEvents' import type { MessagePickupSession, MessagePickupSessionRole } from './MessagePickupSession' import type { V1MessagePickupProtocol, V2MessagePickupProtocol } from './protocol' import type { MessagePickupProtocol } from './protocol/MessagePickupProtocol' -import type { MessagePickupRepository } from './storage/MessagePickupRepository' import { AgentContext, CredoError, EventEmitter, InjectionSymbols, Logger, inject, injectable } from '@credo-ts/core' import { ReplaySubject, Subject, filter, first, firstValueFrom, takeUntil, timeout } from 'rxjs' @@ -23,6 +22,7 @@ import { MessageSender } from '../../MessageSender' import { OutboundMessageContext } from '../../models' import { ConnectionService } from '../connections/services' +import { DidCommModuleConfig } from '../../DidCommModuleConfig' import { MessagePickupEventTypes } from './MessagePickupEvents' import { MessagePickupModuleConfig } from './MessagePickupModuleConfig' import { MessagePickupSessionService } from './services/MessagePickupSessionService' @@ -94,11 +94,14 @@ export class MessagePickupApi( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + this.agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository - await messagePickupRepository.addMessage({ connectionId: connectionRecord.id, recipientDids, payload: message }) + await queueTransportRepository.addMessage(this.agentContext, { + connectionId: connectionRecord.id, + recipientDids, + payload: message, + }) } /** diff --git a/packages/didcomm/src/modules/message-pickup/MessagePickupApiOptions.ts b/packages/didcomm/src/modules/message-pickup/MessagePickupApiOptions.ts index bf712daba4..b71ffcf671 100644 --- a/packages/didcomm/src/modules/message-pickup/MessagePickupApiOptions.ts +++ b/packages/didcomm/src/modules/message-pickup/MessagePickupApiOptions.ts @@ -1,6 +1,6 @@ import type { EncryptedMessage } from '../../types' +import type { QueuedMessage } from './../../transport/queue' import type { MessagePickupProtocol } from './protocol/MessagePickupProtocol' -import type { QueuedMessage } from './storage' /** * Get the supported protocol versions based on the provided message pickup protocols diff --git a/packages/didcomm/src/modules/message-pickup/MessagePickupModule.ts b/packages/didcomm/src/modules/message-pickup/MessagePickupModule.ts index 7f4da42617..ea4ef4b072 100644 --- a/packages/didcomm/src/modules/message-pickup/MessagePickupModule.ts +++ b/packages/didcomm/src/modules/message-pickup/MessagePickupModule.ts @@ -2,8 +2,6 @@ import type { AgentContext, ApiModule, Constructor, DependencyManager, Optional import type { MessagePickupModuleConfigOptions } from './MessagePickupModuleConfig' import type { MessagePickupProtocol } from './protocol/MessagePickupProtocol' -import { InjectionSymbols } from '@credo-ts/core' - import { FeatureRegistry } from '../../FeatureRegistry' import { MessageHandlerRegistry } from '../../MessageHandlerRegistry' @@ -11,7 +9,6 @@ import { MessagePickupApi } from './MessagePickupApi' import { MessagePickupModuleConfig } from './MessagePickupModuleConfig' import { V1MessagePickupProtocol, V2MessagePickupProtocol } from './protocol' import { MessagePickupSessionService } from './services' -import { InMemoryMessagePickupRepository } from './storage' /** * Default protocols that will be registered if the `protocols` property is not configured. @@ -48,15 +45,6 @@ export class MessagePickupModule { diff --git a/packages/didcomm/src/modules/message-pickup/MessagePickupModuleConfig.ts b/packages/didcomm/src/modules/message-pickup/MessagePickupModuleConfig.ts index 1a2d9adc83..f2f7d9372f 100644 --- a/packages/didcomm/src/modules/message-pickup/MessagePickupModuleConfig.ts +++ b/packages/didcomm/src/modules/message-pickup/MessagePickupModuleConfig.ts @@ -1,5 +1,4 @@ import type { MessagePickupProtocol } from './protocol/MessagePickupProtocol' -import type { MessagePickupRepository } from './storage/MessagePickupRepository' /** * MessagePickupModuleConfigOptions defines the interface for the options of the MessagePickupModuleConfig class. @@ -25,12 +24,6 @@ export interface MessagePickupModuleConfigOptions { @@ -49,9 +42,4 @@ export class MessagePickupModuleConfig { test('registers dependencies on the dependency manager', () => { @@ -26,11 +24,7 @@ describe('MessagePickupModule', () => { expect(dependencyManager.registerInstance).toHaveBeenCalledTimes(1) expect(dependencyManager.registerInstance).toHaveBeenCalledWith(MessagePickupModuleConfig, module.config) - expect(dependencyManager.registerSingleton).toHaveBeenCalledTimes(2) - expect(dependencyManager.registerSingleton).toHaveBeenCalledWith( - InjectionSymbols.MessagePickupRepository, - InMemoryMessagePickupRepository - ) + expect(dependencyManager.registerSingleton).toHaveBeenCalledTimes(1) expect(dependencyManager.registerSingleton).toHaveBeenCalledWith(MessagePickupSessionService) }) diff --git a/packages/didcomm/src/modules/message-pickup/index.ts b/packages/didcomm/src/modules/message-pickup/index.ts index b2b05ba8ee..9074bfcad5 100644 --- a/packages/didcomm/src/modules/message-pickup/index.ts +++ b/packages/didcomm/src/modules/message-pickup/index.ts @@ -4,5 +4,4 @@ export * from './MessagePickupEvents' export * from './MessagePickupModule' export * from './MessagePickupModuleConfig' export * from './protocol' -export * from './storage' export { MessagePickupSessionService } from './services' diff --git a/packages/didcomm/src/modules/message-pickup/protocol/MessagePickupProtocolOptions.ts b/packages/didcomm/src/modules/message-pickup/protocol/MessagePickupProtocolOptions.ts index 0e4528f8a3..e64c84eea0 100644 --- a/packages/didcomm/src/modules/message-pickup/protocol/MessagePickupProtocolOptions.ts +++ b/packages/didcomm/src/modules/message-pickup/protocol/MessagePickupProtocolOptions.ts @@ -1,6 +1,6 @@ import type { AgentMessage } from '../../../AgentMessage' +import type { QueuedMessage } from '../../../transport/queue' import type { ConnectionRecord } from '../../connections/repository' -import type { QueuedMessage } from '../storage' export interface PickupMessagesProtocolOptions { connectionRecord: ConnectionRecord diff --git a/packages/didcomm/src/modules/message-pickup/protocol/v1/V1MessagePickupProtocol.ts b/packages/didcomm/src/modules/message-pickup/protocol/v1/V1MessagePickupProtocol.ts index 7ae2ccbcc2..56ff937587 100644 --- a/packages/didcomm/src/modules/message-pickup/protocol/v1/V1MessagePickupProtocol.ts +++ b/packages/didcomm/src/modules/message-pickup/protocol/v1/V1MessagePickupProtocol.ts @@ -5,7 +5,6 @@ import type { FeatureRegistry } from '../../../../FeatureRegistry' import type { MessageHandlerRegistry } from '../../../../MessageHandlerRegistry' import type { InboundMessageContext } from '../../../../models' import type { MessagePickupCompletedEvent } from '../../MessagePickupEvents' -import type { MessagePickupRepository } from '../../storage/MessagePickupRepository' import type { DeliverMessagesProtocolOptions, DeliverMessagesProtocolReturnType, @@ -14,7 +13,7 @@ import type { SetLiveDeliveryModeProtocolReturnType, } from '../MessagePickupProtocolOptions' -import { CredoError, EventEmitter, InjectionSymbols, injectable } from '@credo-ts/core' +import { CredoError, EventEmitter, injectable } from '@credo-ts/core' import { AgentEventTypes } from '../../../../Events' import { OutboundMessageContext, Protocol } from '../../../../models' @@ -22,6 +21,7 @@ import { MessagePickupEventTypes } from '../../MessagePickupEvents' import { MessagePickupModuleConfig } from '../../MessagePickupModuleConfig' import { BaseMessagePickupProtocol } from '../BaseMessagePickupProtocol' +import { DidCommModuleConfig } from '../../../../DidCommModuleConfig' import { V1BatchHandler, V1BatchPickupHandler } from './handlers' import { BatchMessageMessage, V1BatchMessage, V1BatchPickupMessage } from './messages' @@ -68,13 +68,12 @@ export class V1MessagePickupProtocol extends BaseMessagePickupProtocol { const { connectionRecord, batchSize, messages } = options connectionRecord.assertReady() - const pickupMessageQueue = agentContext.dependencyManager.resolve( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository const messagesToDeliver = messages ?? - (await pickupMessageQueue.takeFromQueue({ + (await queueTransportRepository.takeFromQueue(agentContext, { connectionId: connectionRecord.id, limit: batchSize, // TODO: Define as config parameter for message holder side deleteMessages: true, @@ -105,13 +104,12 @@ export class V1MessagePickupProtocol extends BaseMessagePickupProtocol { // Assert ready connection const connection = messageContext.assertReadyConnection() - const { message } = messageContext + const { message, agentContext } = messageContext - const pickupMessageQueue = messageContext.agentContext.dependencyManager.resolve( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository - const messages = await pickupMessageQueue.takeFromQueue({ + const messages = await queueTransportRepository.takeFromQueue(agentContext, { connectionId: connection.id, limit: message.batchSize, deleteMessages: true, diff --git a/packages/didcomm/src/modules/message-pickup/protocol/v2/V2MessagePickupProtocol.ts b/packages/didcomm/src/modules/message-pickup/protocol/v2/V2MessagePickupProtocol.ts index 29e97bf98d..6f22cb6073 100644 --- a/packages/didcomm/src/modules/message-pickup/protocol/v2/V2MessagePickupProtocol.ts +++ b/packages/didcomm/src/modules/message-pickup/protocol/v2/V2MessagePickupProtocol.ts @@ -6,7 +6,6 @@ import type { MessageHandlerRegistry } from '../../../../MessageHandlerRegistry' import type { InboundMessageContext } from '../../../../models' import type { EncryptedMessage } from '../../../../types' import type { MessagePickupCompletedEvent } from '../../MessagePickupEvents' -import type { MessagePickupRepository } from '../../storage/MessagePickupRepository' import type { DeliverMessagesProtocolOptions, DeliverMessagesProtocolReturnType, @@ -16,7 +15,7 @@ import type { SetLiveDeliveryModeProtocolReturnType, } from '../MessagePickupProtocolOptions' -import { EventEmitter, InjectionSymbols, injectable, verkeyToDidKey } from '@credo-ts/core' +import { EventEmitter, injectable, verkeyToDidKey } from '@credo-ts/core' import { AgentEventTypes } from '../../../../Events' import { Attachment } from '../../../../decorators/attachment/Attachment' @@ -29,6 +28,7 @@ import { MessagePickupSessionRole } from '../../MessagePickupSession' import { MessagePickupSessionService } from '../../services' import { BaseMessagePickupProtocol } from '../BaseMessagePickupProtocol' +import { DidCommModuleConfig } from '../../../../DidCommModuleConfig' import { V2DeliveryRequestHandler, V2LiveDeliveryChangeHandler, @@ -95,14 +95,13 @@ export class V2MessagePickupProtocol extends BaseMessagePickupProtocol { const { connectionRecord, recipientKey, messages } = options connectionRecord.assertReady() - const messagePickupRepository = agentContext.dependencyManager.resolve( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository // Get available messages from queue, but don't delete them const messagesToDeliver = messages ?? - (await messagePickupRepository.takeFromQueue({ + (await queueTransportRepository.takeFromQueue(agentContext, { connectionId: connectionRecord.id, recipientDid: recipientKey, limit: 10, // TODO: Define as config parameter @@ -147,15 +146,15 @@ export class V2MessagePickupProtocol extends BaseMessagePickupProtocol { // Assert ready connection const connection = messageContext.assertReadyConnection() const recipientKey = messageContext.message.recipientKey + const agentContext = messageContext.agentContext - const messagePickupRepository = messageContext.agentContext.dependencyManager.resolve( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository const statusMessage = new V2StatusMessage({ threadId: messageContext.message.threadId, recipientKey, - messageCount: await messagePickupRepository.getAvailableMessageCount({ + messageCount: await queueTransportRepository.getAvailableMessageCount(agentContext, { connectionId: connection.id, recipientDid: recipientKey ? verkeyToDidKey(recipientKey) : undefined, }), @@ -172,14 +171,13 @@ export class V2MessagePickupProtocol extends BaseMessagePickupProtocol { const connection = messageContext.assertReadyConnection() const recipientKey = messageContext.message.recipientKey - const { message } = messageContext + const { agentContext, message } = messageContext - const messagePickupRepository = messageContext.agentContext.dependencyManager.resolve( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository // Get available messages from queue, but don't delete them - const messages = await messagePickupRepository.takeFromQueue({ + const messages = await queueTransportRepository.takeFromQueue(agentContext, { connectionId: connection.id, recipientDid: recipientKey ? verkeyToDidKey(recipientKey) : undefined, limit: message.limit, @@ -219,19 +217,23 @@ export class V2MessagePickupProtocol extends BaseMessagePickupProtocol { // Assert ready connection const connection = messageContext.assertReadyConnection() - const { message } = messageContext + const { agentContext, message } = messageContext - const messageRepository = messageContext.agentContext.dependencyManager.resolve( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository if (message.messageIdList.length) { - await messageRepository.removeMessages({ connectionId: connection.id, messageIds: message.messageIdList }) + await queueTransportRepository.removeMessages(agentContext, { + connectionId: connection.id, + messageIds: message.messageIdList, + }) } const statusMessage = new V2StatusMessage({ threadId: messageContext.message.threadId, - messageCount: await messageRepository.getAvailableMessageCount({ connectionId: connection.id }), + messageCount: await queueTransportRepository.getAvailableMessageCount(agentContext, { + connectionId: connection.id, + }), }) return new OutboundMessageContext(statusMessage, { @@ -278,9 +280,9 @@ export class V2MessagePickupProtocol extends BaseMessagePickupProtocol { const connection = messageContext.assertReadyConnection() - const messagePickupRepository = messageContext.agentContext.dependencyManager.resolve( - InjectionSymbols.MessagePickupRepository - ) + const queueTransportRepository = + agentContext.dependencyManager.resolve(DidCommModuleConfig).queueTransportRepository + const sessionService = messageContext.agentContext.dependencyManager.resolve(MessagePickupSessionService) if (message.liveDelivery) { @@ -296,7 +298,9 @@ export class V2MessagePickupProtocol extends BaseMessagePickupProtocol { const statusMessage = new V2StatusMessage({ threadId: message.threadId, liveDelivery: message.liveDelivery, - messageCount: await messagePickupRepository.getAvailableMessageCount({ connectionId: connection.id }), + messageCount: await queueTransportRepository.getAvailableMessageCount(agentContext, { + connectionId: connection.id, + }), }) return new OutboundMessageContext(statusMessage, { agentContext: messageContext.agentContext, connection }) diff --git a/packages/didcomm/src/modules/message-pickup/protocol/v2/__tests__/V2MessagePickupProtocol.test.ts b/packages/didcomm/src/modules/message-pickup/protocol/v2/__tests__/V2MessagePickupProtocol.test.ts index 8520eec7e6..1def9ca429 100644 --- a/packages/didcomm/src/modules/message-pickup/protocol/v2/__tests__/V2MessagePickupProtocol.test.ts +++ b/packages/didcomm/src/modules/message-pickup/protocol/v2/__tests__/V2MessagePickupProtocol.test.ts @@ -1,18 +1,18 @@ import type { EncryptedMessage } from '../../../../../types' import { EventEmitter } from '../../../../../../../core/src/agent/EventEmitter' -import { InjectionSymbols } from '../../../../../../../core/src/constants' import { CredoError } from '../../../../../../../core/src/error' import { verkeyToDidKey } from '../../../../../../../core/src/modules/dids/helpers' import { uuid } from '../../../../../../../core/src/utils/uuid' import { getAgentContext, getMockConnection, mockFunction } from '../../../../../../../core/tests/helpers' +import { DidCommModuleConfig } from '../../../../../DidCommModuleConfig' import { AgentEventTypes } from '../../../../../Events' import { MessageSender } from '../../../../../MessageSender' import { Attachment } from '../../../../../decorators/attachment/Attachment' import { InboundMessageContext } from '../../../../../models' +import { InMemoryQueueTransportRepository } from '../../../../../transport/queue/InMemoryQueueTransportRepository' import { ConnectionService, DidExchangeState, TrustPingMessage } from '../../../../connections' import { MessagePickupModuleConfig } from '../../../MessagePickupModuleConfig' -import { InMemoryMessagePickupRepository } from '../../../storage/InMemoryMessagePickupRepository' import { V1MessagePickupProtocol } from '../../v1' import { V2MessagePickupProtocol } from '../V2MessagePickupProtocol' import { @@ -28,17 +28,20 @@ const mockConnection = getMockConnection({ }) // Mock classes -jest.mock('../../../storage/InMemoryMessagePickupRepository') +jest.mock('../../../../../transport/queue/InMemoryQueueTransportRepository') jest.mock('../../../../../../../core/src/agent/EventEmitter') jest.mock('../../../../../MessageSender') jest.mock('../../../../connections/services/ConnectionService') // Mock typed object -const InMessageRepositoryMock = InMemoryMessagePickupRepository as jest.Mock +const InMessageRepositoryMock = InMemoryQueueTransportRepository as jest.Mock const EventEmitterMock = EventEmitter as jest.Mock const MessageSenderMock = MessageSender as jest.Mock const ConnectionServiceMock = ConnectionService as jest.Mock +const queueTransportRepository = new InMessageRepositoryMock() + +const didCommModuleConfig = new DidCommModuleConfig({ queueTransportRepository }) const messagePickupModuleConfig = new MessagePickupModuleConfig({ maximumBatchSize: 10, protocols: [new V1MessagePickupProtocol(), new V2MessagePickupProtocol()], @@ -46,14 +49,13 @@ const messagePickupModuleConfig = new MessagePickupModuleConfig({ const messageSender = new MessageSenderMock() const eventEmitter = new EventEmitterMock() const connectionService = new ConnectionServiceMock() -const messagePickupRepository = new InMessageRepositoryMock() const agentContext = getAgentContext({ registerInstances: [ - [InjectionSymbols.MessagePickupRepository, messagePickupRepository], [EventEmitter, eventEmitter], [MessageSender, messageSender], [ConnectionService, connectionService], + [DidCommModuleConfig, didCommModuleConfig], [MessagePickupModuleConfig, messagePickupModuleConfig], ], }) @@ -79,7 +81,7 @@ describe('V2MessagePickupProtocol', () => { describe('processStatusRequest', () => { test('no available messages in queue', async () => { - mockFunction(messagePickupRepository.getAvailableMessageCount).mockResolvedValue(0) + mockFunction(queueTransportRepository.getAvailableMessageCount).mockResolvedValue(0) const statusRequest = new V2StatusRequestMessage({}) @@ -95,11 +97,13 @@ describe('V2MessagePickupProtocol', () => { messageCount: 0, }) ) - expect(messagePickupRepository.getAvailableMessageCount).toHaveBeenCalledWith({ connectionId: mockConnection.id }) + expect(queueTransportRepository.getAvailableMessageCount).toHaveBeenCalledWith(agentContext, { + connectionId: mockConnection.id, + }) }) test('multiple messages in queue', async () => { - mockFunction(messagePickupRepository.getAvailableMessageCount).mockResolvedValue(5) + mockFunction(queueTransportRepository.getAvailableMessageCount).mockResolvedValue(5) const statusRequest = new V2StatusRequestMessage({}) const messageContext = new InboundMessageContext(statusRequest, { connection: mockConnection, agentContext }) @@ -114,11 +118,13 @@ describe('V2MessagePickupProtocol', () => { messageCount: 5, }) ) - expect(messagePickupRepository.getAvailableMessageCount).toHaveBeenCalledWith({ connectionId: mockConnection.id }) + expect(queueTransportRepository.getAvailableMessageCount).toHaveBeenCalledWith(agentContext, { + connectionId: mockConnection.id, + }) }) test('status request specifying recipient key', async () => { - mockFunction(messagePickupRepository.getAvailableMessageCount).mockResolvedValue(10) + mockFunction(queueTransportRepository.getAvailableMessageCount).mockResolvedValue(10) const statusRequest = new V2StatusRequestMessage({ recipientKey: '79CXkde3j8TNuMXxPdV7nLUrT2g7JAEjH5TreyVY7GEZ', @@ -127,13 +133,15 @@ describe('V2MessagePickupProtocol', () => { const messageContext = new InboundMessageContext(statusRequest, { connection: mockConnection, agentContext }) await pickupProtocol.processStatusRequest(messageContext) - expect(messagePickupRepository.getAvailableMessageCount).toHaveBeenCalledWith({ connectionId: mockConnection.id }) + expect(queueTransportRepository.getAvailableMessageCount).toHaveBeenCalledWith(agentContext, { + connectionId: mockConnection.id, + }) }) }) describe('processDeliveryRequest', () => { test('no available messages in queue', async () => { - mockFunction(messagePickupRepository.takeFromQueue).mockReturnValue([]) + mockFunction(queueTransportRepository.takeFromQueue).mockReturnValue([]) const deliveryRequest = new V2DeliveryRequestMessage({ limit: 10 }) @@ -149,14 +157,14 @@ describe('V2MessagePickupProtocol', () => { messageCount: 0, }) ) - expect(messagePickupRepository.takeFromQueue).toHaveBeenCalledWith({ + expect(queueTransportRepository.takeFromQueue).toHaveBeenCalledWith(agentContext, { connectionId: mockConnection.id, limit: 10, }) }) test('less messages in queue than limit', async () => { - mockFunction(messagePickupRepository.takeFromQueue).mockReturnValue(queuedMessages) + mockFunction(queueTransportRepository.takeFromQueue).mockReturnValue(queuedMessages) const deliveryRequest = new V2DeliveryRequestMessage({ limit: 10 }) @@ -180,14 +188,14 @@ describe('V2MessagePickupProtocol', () => { ) ) ) - expect(messagePickupRepository.takeFromQueue).toHaveBeenCalledWith({ + expect(queueTransportRepository.takeFromQueue).toHaveBeenCalledWith(agentContext, { connectionId: mockConnection.id, limit: 10, }) }) test('more messages in queue than limit', async () => { - mockFunction(messagePickupRepository.takeFromQueue).mockReturnValue(queuedMessages.slice(0, 2)) + mockFunction(queueTransportRepository.takeFromQueue).mockReturnValue(queuedMessages.slice(0, 2)) const deliveryRequest = new V2DeliveryRequestMessage({ limit: 2 }) @@ -211,14 +219,14 @@ describe('V2MessagePickupProtocol', () => { ) ) ) - expect(messagePickupRepository.takeFromQueue).toHaveBeenCalledWith({ + expect(queueTransportRepository.takeFromQueue).toHaveBeenCalledWith(agentContext, { connectionId: mockConnection.id, limit: 2, }) }) test('delivery request specifying recipient key', async () => { - mockFunction(messagePickupRepository.takeFromQueue).mockReturnValue(queuedMessages) + mockFunction(queueTransportRepository.takeFromQueue).mockReturnValue(queuedMessages) const deliveryRequest = new V2DeliveryRequestMessage({ limit: 10, @@ -229,7 +237,7 @@ describe('V2MessagePickupProtocol', () => { await pickupProtocol.processDeliveryRequest(messageContext) - expect(messagePickupRepository.takeFromQueue).toHaveBeenCalledWith({ + expect(queueTransportRepository.takeFromQueue).toHaveBeenCalledWith(agentContext, { connectionId: mockConnection.id, limit: 10, recipientDid: verkeyToDidKey('recipientKey'), @@ -239,8 +247,8 @@ describe('V2MessagePickupProtocol', () => { describe('processMessagesReceived', () => { test('messages received partially', async () => { - mockFunction(messagePickupRepository.takeFromQueue).mockReturnValue(queuedMessages) - mockFunction(messagePickupRepository.getAvailableMessageCount).mockResolvedValue(4) + mockFunction(queueTransportRepository.takeFromQueue).mockReturnValue(queuedMessages) + mockFunction(queueTransportRepository.getAvailableMessageCount).mockResolvedValue(4) const messagesReceived = new V2MessagesReceivedMessage({ messageIdList: ['1', '2'], @@ -258,16 +266,18 @@ describe('V2MessagePickupProtocol', () => { messageCount: 4, }) ) - expect(messagePickupRepository.getAvailableMessageCount).toHaveBeenCalledWith({ connectionId: mockConnection.id }) - expect(messagePickupRepository.removeMessages).toHaveBeenCalledWith({ + expect(queueTransportRepository.getAvailableMessageCount).toHaveBeenCalledWith(agentContext, { + connectionId: mockConnection.id, + }) + expect(queueTransportRepository.removeMessages).toHaveBeenCalledWith(agentContext, { connectionId: mockConnection.id, messageIds: ['1', '2'], }) }) test('all messages have been received', async () => { - mockFunction(messagePickupRepository.takeFromQueue).mockReturnValue(queuedMessages) - mockFunction(messagePickupRepository.getAvailableMessageCount).mockResolvedValue(0) + mockFunction(queueTransportRepository.takeFromQueue).mockReturnValue(queuedMessages) + mockFunction(queueTransportRepository.getAvailableMessageCount).mockResolvedValue(0) const messagesReceived = new V2MessagesReceivedMessage({ messageIdList: ['1', '2'], @@ -286,8 +296,10 @@ describe('V2MessagePickupProtocol', () => { }) ) - expect(messagePickupRepository.getAvailableMessageCount).toHaveBeenCalledWith({ connectionId: mockConnection.id }) - expect(messagePickupRepository.removeMessages).toHaveBeenCalledWith({ + expect(queueTransportRepository.getAvailableMessageCount).toHaveBeenCalledWith(agentContext, { + connectionId: mockConnection.id, + }) + expect(queueTransportRepository.removeMessages).toHaveBeenCalledWith(agentContext, { connectionId: mockConnection.id, messageIds: ['1', '2'], }) diff --git a/packages/didcomm/src/modules/message-pickup/storage/MessagePickupRepository.ts b/packages/didcomm/src/modules/message-pickup/storage/MessagePickupRepository.ts deleted file mode 100644 index 6b234918ce..0000000000 --- a/packages/didcomm/src/modules/message-pickup/storage/MessagePickupRepository.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { - AddMessageOptions, - GetAvailableMessageCountOptions, - RemoveMessagesOptions, - TakeFromQueueOptions, -} from './MessagePickupRepositoryOptions' -import type { QueuedMessage } from './QueuedMessage' - -export interface MessagePickupRepository { - getAvailableMessageCount(options: GetAvailableMessageCountOptions): number | Promise - takeFromQueue(options: TakeFromQueueOptions): QueuedMessage[] | Promise - addMessage(options: AddMessageOptions): string | Promise - removeMessages(options: RemoveMessagesOptions): void | Promise -} diff --git a/packages/didcomm/src/modules/message-pickup/storage/index.ts b/packages/didcomm/src/modules/message-pickup/storage/index.ts deleted file mode 100644 index 1894b67d72..0000000000 --- a/packages/didcomm/src/modules/message-pickup/storage/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './InMemoryMessagePickupRepository' -export * from './MessagePickupRepository' -export * from './MessagePickupRepositoryOptions' -export * from './QueuedMessage' diff --git a/packages/didcomm/src/modules/routing/MediatorModuleConfig.ts b/packages/didcomm/src/modules/routing/MediatorModuleConfig.ts index e20fc8422c..75f9f26d04 100644 --- a/packages/didcomm/src/modules/routing/MediatorModuleConfig.ts +++ b/packages/didcomm/src/modules/routing/MediatorModuleConfig.ts @@ -16,8 +16,8 @@ export interface MediatorModuleConfigOptions { * Strategy to use when a Forward message is received. * * - * - `MessageForwardingStrategy.QueueOnly` - simply queue encrypted message into MessagePickupRepository. It will be in charge of manually trigering MessagePickupApi.deliver() afterwards. - * - `MessageForwardingStrategy.QueueAndLiveModeDelivery` - Queue message into MessagePickupRepository and deliver it (along any other queued message). + * - `MessageForwardingStrategy.QueueOnly` - simply queue encrypted message into QueueTransportRepository. It will be in charge of manually trigering MessagePickupApi.deliver() afterwards. + * - `MessageForwardingStrategy.QueueAndLiveModeDelivery` - Queue message into QueueTransportRepository and deliver it (along any other queued message). * - `MessageForwardingStrategy.DirectDelivery` - Deliver message directly. Do not add into queue (it might be manually added after, e.g. in case of failure) * * @default MessageForwardingStrategy.DirectDelivery diff --git a/packages/didcomm/src/modules/routing/MessageForwardingStrategy.ts b/packages/didcomm/src/modules/routing/MessageForwardingStrategy.ts index 06ce1e05c9..d4577a697a 100644 --- a/packages/didcomm/src/modules/routing/MessageForwardingStrategy.ts +++ b/packages/didcomm/src/modules/routing/MessageForwardingStrategy.ts @@ -1,9 +1,9 @@ export enum MessageForwardingStrategy { - // When a forward is received, simply queue encrypted message. MessagePickupRepository + // When a forward is received, simply queue encrypted message. QueueTransportRepository // will be in charge of manually triggering MessagePickupApi.deliverMessages() QueueOnly = 'QueueOnly', - // Queue message into MessagePickupRepository and, if a Message Pickup Live mode session is active, + // Queue message into QueueTransportRepository and, if a Message Pickup Live mode session is active, // deliver it along any other queued message QueueAndLiveModeDelivery = 'QueueAndLiveModeDelivery', diff --git a/packages/didcomm/src/transport/index.ts b/packages/didcomm/src/transport/index.ts index 9ab7390fae..1f5834bf5c 100644 --- a/packages/didcomm/src/transport/index.ts +++ b/packages/didcomm/src/transport/index.ts @@ -1,3 +1,4 @@ +export * from './queue' export * from './InboundTransport' export * from './OutboundTransport' export * from './HttpOutboundTransport' diff --git a/packages/didcomm/src/modules/message-pickup/storage/InMemoryMessagePickupRepository.ts b/packages/didcomm/src/transport/queue/InMemoryQueueTransportRepository.ts similarity index 68% rename from packages/didcomm/src/modules/message-pickup/storage/InMemoryMessagePickupRepository.ts rename to packages/didcomm/src/transport/queue/InMemoryQueueTransportRepository.ts index effe6ef41f..cda7bd6a17 100644 --- a/packages/didcomm/src/modules/message-pickup/storage/InMemoryMessagePickupRepository.ts +++ b/packages/didcomm/src/transport/queue/InMemoryQueueTransportRepository.ts @@ -1,13 +1,13 @@ -import type { MessagePickupRepository } from './MessagePickupRepository' +import type { QueueTransportRepository } from './QueueTransportRepository' import type { AddMessageOptions, GetAvailableMessageCountOptions, RemoveMessagesOptions, TakeFromQueueOptions, -} from './MessagePickupRepositoryOptions' +} from './QueueTransportRepositoryOptions' import type { QueuedMessage } from './QueuedMessage' -import { InjectionSymbols, Logger, inject, injectable, utils } from '@credo-ts/core' +import { AgentContext, injectable, utils } from '@credo-ts/core' interface InMemoryQueuedMessage extends QueuedMessage { connectionId: string @@ -16,16 +16,17 @@ interface InMemoryQueuedMessage extends QueuedMessage { } @injectable() -export class InMemoryMessagePickupRepository implements MessagePickupRepository { - private logger: Logger +export class InMemoryQueueTransportRepository implements QueueTransportRepository { private messages: InMemoryQueuedMessage[] - public constructor(@inject(InjectionSymbols.Logger) logger: Logger) { - this.logger = logger + public constructor() { this.messages = [] } - public getAvailableMessageCount(options: GetAvailableMessageCountOptions): number | Promise { + public getAvailableMessageCount( + _agentContext: AgentContext, + options: GetAvailableMessageCountOptions + ): number | Promise { const { connectionId, recipientDid } = options const messages = this.messages.filter( @@ -37,7 +38,7 @@ export class InMemoryMessagePickupRepository implements MessagePickupRepository return messages.length } - public takeFromQueue(options: TakeFromQueueOptions): QueuedMessage[] { + public takeFromQueue(agentContext: AgentContext, options: TakeFromQueueOptions): QueuedMessage[] { const { connectionId, recipientDid, limit, deleteMessages } = options let messages = this.messages.filter( @@ -51,7 +52,7 @@ export class InMemoryMessagePickupRepository implements MessagePickupRepository messages = messages.slice(0, messagesToTake) - this.logger.debug(`Taking ${messagesToTake} messages from queue for connection ${connectionId}`) + agentContext.config.logger.debug(`Taking ${messagesToTake} messages from queue for connection ${connectionId}`) // Mark taken messages in order to prevent them of being retrieved again for (const msg of messages) { @@ -60,13 +61,13 @@ export class InMemoryMessagePickupRepository implements MessagePickupRepository } if (deleteMessages) { - this.removeMessages({ connectionId, messageIds: messages.map((msg) => msg.id) }) + this.removeMessages(agentContext, { connectionId, messageIds: messages.map((msg) => msg.id) }) } return messages } - public addMessage(options: AddMessageOptions) { + public addMessage(_agentContext: AgentContext, options: AddMessageOptions) { const { connectionId, recipientDids, payload } = options const id = utils.uuid() @@ -82,7 +83,7 @@ export class InMemoryMessagePickupRepository implements MessagePickupRepository return id } - public removeMessages(options: RemoveMessagesOptions) { + public removeMessages(_agentContext: AgentContext, options: RemoveMessagesOptions) { const { messageIds } = options for (const messageId of messageIds) { diff --git a/packages/didcomm/src/transport/queue/QueueTransportRepository.ts b/packages/didcomm/src/transport/queue/QueueTransportRepository.ts new file mode 100644 index 0000000000..913d15df43 --- /dev/null +++ b/packages/didcomm/src/transport/queue/QueueTransportRepository.ts @@ -0,0 +1,18 @@ +import { AgentContext } from '@credo-ts/core' +import type { + AddMessageOptions, + GetAvailableMessageCountOptions, + RemoveMessagesOptions, + TakeFromQueueOptions, +} from './QueueTransportRepositoryOptions' +import type { QueuedMessage } from './QueuedMessage' + +export interface QueueTransportRepository { + getAvailableMessageCount( + agentContext: AgentContext, + options: GetAvailableMessageCountOptions + ): number | Promise + takeFromQueue(agentContext: AgentContext, options: TakeFromQueueOptions): QueuedMessage[] | Promise + addMessage(agentContext: AgentContext, options: AddMessageOptions): string | Promise + removeMessages(agentContext: AgentContext, options: RemoveMessagesOptions): void | Promise +} diff --git a/packages/didcomm/src/modules/message-pickup/storage/MessagePickupRepositoryOptions.ts b/packages/didcomm/src/transport/queue/QueueTransportRepositoryOptions.ts similarity index 89% rename from packages/didcomm/src/modules/message-pickup/storage/MessagePickupRepositoryOptions.ts rename to packages/didcomm/src/transport/queue/QueueTransportRepositoryOptions.ts index bf03989593..6482435f5d 100644 --- a/packages/didcomm/src/modules/message-pickup/storage/MessagePickupRepositoryOptions.ts +++ b/packages/didcomm/src/transport/queue/QueueTransportRepositoryOptions.ts @@ -1,4 +1,4 @@ -import type { EncryptedMessage } from '../../../types' +import { EncryptedMessage } from '../../types' export interface GetAvailableMessageCountOptions { connectionId: string diff --git a/packages/didcomm/src/modules/message-pickup/storage/QueuedMessage.ts b/packages/didcomm/src/transport/queue/QueuedMessage.ts similarity index 88% rename from packages/didcomm/src/modules/message-pickup/storage/QueuedMessage.ts rename to packages/didcomm/src/transport/queue/QueuedMessage.ts index 3706114e84..df0ee3cda4 100644 --- a/packages/didcomm/src/modules/message-pickup/storage/QueuedMessage.ts +++ b/packages/didcomm/src/transport/queue/QueuedMessage.ts @@ -1,4 +1,4 @@ -import type { EncryptedMessage } from '../../../types' +import type { EncryptedMessage } from '../../types' /** * Basic representation of an encrypted message in a Message Pickup Queue diff --git a/packages/didcomm/src/transport/queue/index.ts b/packages/didcomm/src/transport/queue/index.ts new file mode 100644 index 0000000000..a253197189 --- /dev/null +++ b/packages/didcomm/src/transport/queue/index.ts @@ -0,0 +1,4 @@ +export * from './InMemoryQueueTransportRepository' +export * from './QueueTransportRepository' +export * from './QueueTransportRepositoryOptions' +export * from './QueuedMessage'