diff --git a/packages/mrtd/src/DidCommMrtdApi.ts b/packages/mrtd/src/DidCommMrtdApi.ts index 27886cf..09d38e6 100644 --- a/packages/mrtd/src/DidCommMrtdApi.ts +++ b/packages/mrtd/src/DidCommMrtdApi.ts @@ -1,7 +1,7 @@ import { OutboundMessageContext, AgentContext, ConnectionService, injectable, MessageSender } from '@credo-ts/core' import { DidCommMrtdService } from './DidCommMrtdService' -import { MrzDataHandler, MrzDataRequestHandler } from './handlers' +import { EMrtdDataHandler, EMrtdDataRequestHandler, MrzDataHandler, MrzDataRequestHandler } from './handlers' @injectable() export class DidCommMrtdApi { @@ -24,6 +24,8 @@ export class DidCommMrtdApi { this.agentContext.dependencyManager.registerMessageHandlers([ new MrzDataHandler(this.didcommMrtdService), new MrzDataRequestHandler(this.didcommMrtdService), + new EMrtdDataHandler(this.didcommMrtdService), + new EMrtdDataRequestHandler(this.didcommMrtdService), ]) } diff --git a/packages/mrtd/src/DidCommMrtdEvents.ts b/packages/mrtd/src/DidCommMrtdEvents.ts index f1e5023..ba62cc9 100644 --- a/packages/mrtd/src/DidCommMrtdEvents.ts +++ b/packages/mrtd/src/DidCommMrtdEvents.ts @@ -2,6 +2,8 @@ import type { MrzData } from './models/MrzData' import type { BaseEvent, ConnectionRecord } from '@credo-ts/core' export enum MrtdEventTypes { + EMrtdDataReceived = 'EMrtdDataReceived', + EMrtdDataRequested = 'EMrtdDataRequested', MrzDataReceived = 'MrzDataReceived', MrzDataRequested = 'MrzDataRequested', } @@ -23,3 +25,21 @@ export interface MrzDataRequestedEvent extends BaseEvent { parentThreadId?: string } } + +export interface EMrtdDataReceivedEvent extends BaseEvent { + type: MrtdEventTypes.EMrtdDataReceived + payload: { + connection: ConnectionRecord + dataGroups: Record + threadId: string + } +} + +export interface EMtdDataRequestedEvent extends BaseEvent { + type: MrtdEventTypes.EMrtdDataRequested + payload: { + connection: ConnectionRecord + threadId: string + parentThreadId?: string + } +} diff --git a/packages/mrtd/src/DidCommMrtdModule.ts b/packages/mrtd/src/DidCommMrtdModule.ts index e56bea4..44d2481 100644 --- a/packages/mrtd/src/DidCommMrtdModule.ts +++ b/packages/mrtd/src/DidCommMrtdModule.ts @@ -17,7 +17,12 @@ export class DidCommMrtdModule implements Module { featureRegistry.register( new Protocol({ id: 'https://didcomm.org/mrtd/1.0', - roles: [DidCommMrtdRole.MrzRequester, DidCommMrtdRole.MrzResponder], + roles: [ + DidCommMrtdRole.MrzRequester, + DidCommMrtdRole.MrzResponder, + DidCommMrtdRole.EMrtdDataRequester, + DidCommMrtdRole.EMrtdDataResponder, + ], }), ) } diff --git a/packages/mrtd/src/DidCommMrtdService.ts b/packages/mrtd/src/DidCommMrtdService.ts index f1f211f..fb8515f 100644 --- a/packages/mrtd/src/DidCommMrtdService.ts +++ b/packages/mrtd/src/DidCommMrtdService.ts @@ -2,8 +2,14 @@ import { EventEmitter, InboundMessageContext } from '@credo-ts/core' import * as Mrz from 'mrz' import { Lifecycle, scoped } from 'tsyringe' -import { MrtdEventTypes, MrzDataReceivedEvent, MrzDataRequestedEvent } from './DidCommMrtdEvents' -import { MrzDataMessage, MrzDataRequestMessage } from './messages' +import { + EMrtdDataReceivedEvent, + EMtdDataRequestedEvent, + MrtdEventTypes, + MrzDataReceivedEvent, + MrzDataRequestedEvent, +} from './DidCommMrtdEvents' +import { EMrtdDataMessage, EMrtdDataRequestMessage, MrzDataMessage, MrzDataRequestMessage } from './messages' @scoped(Lifecycle.ContainerScoped) export class DidCommMrtdService { @@ -56,4 +62,44 @@ export class DidCommMrtdService { }, }) } + + public async processEMrtdData(messageContext: InboundMessageContext) { + const connection = messageContext.assertReadyConnection() + const { agentContext, message } = messageContext + + /*let parsed + try { + const parseResult = Mrz.parse(message.mrzData) + + parsed = { valid: parseResult.valid, fields: parseResult.fields, format: parseResult.format } + } catch (error) { + // Unsupported format. Send raw data anyway + parsed = { valid: false, fields: {} } + }*/ + + const eventEmitter = agentContext.dependencyManager.resolve(EventEmitter) + eventEmitter.emit(agentContext, { + type: MrtdEventTypes.EMrtdDataReceived, + payload: { + connection, + dataGroups: message.dataGroups, + threadId: message.threadId, + }, + }) + } + + public async processEMrtdDataRequest(messageContext: InboundMessageContext) { + const connection = messageContext.assertReadyConnection() + const { agentContext, message } = messageContext + + const eventEmitter = agentContext.dependencyManager.resolve(EventEmitter) + eventEmitter.emit(agentContext, { + type: MrtdEventTypes.EMrtdDataRequested, + payload: { + connection, + parentThreadId: message.thread?.parentThreadId, + threadId: message.threadId, + }, + }) + } } diff --git a/packages/mrtd/src/handlers/EMrtdDataHandler.ts b/packages/mrtd/src/handlers/EMrtdDataHandler.ts new file mode 100644 index 0000000..c2c9086 --- /dev/null +++ b/packages/mrtd/src/handlers/EMrtdDataHandler.ts @@ -0,0 +1,21 @@ +import type { DidCommMrtdService } from '../DidCommMrtdService' +import type { MessageHandler, MessageHandlerInboundMessage } from '@credo-ts/core' + +import { EMrtdDataMessage } from '../messages' + +/** + * Handler for incoming mrtd-data messages + */ +export class EMrtdDataHandler implements MessageHandler { + public supportedMessages = [EMrtdDataMessage] + + private mrtdService: DidCommMrtdService + + public constructor(mrtdService: DidCommMrtdService) { + this.mrtdService = mrtdService + } + + public async handle(inboundMessage: MessageHandlerInboundMessage) { + await this.mrtdService.processEMrtdData(inboundMessage) + } +} diff --git a/packages/mrtd/src/handlers/EMrtdDataRequestHandler.ts b/packages/mrtd/src/handlers/EMrtdDataRequestHandler.ts new file mode 100644 index 0000000..f680cb6 --- /dev/null +++ b/packages/mrtd/src/handlers/EMrtdDataRequestHandler.ts @@ -0,0 +1,21 @@ +import type { DidCommMrtdService } from '../DidCommMrtdService' +import type { MessageHandler, MessageHandlerInboundMessage } from '@credo-ts/core' + +import { MrzDataRequestMessage } from '../messages' + +/** + * Handler for incoming emrtd-data-request messages + */ +export class EMrtdDataRequestHandler implements MessageHandler { + public supportedMessages = [MrzDataRequestMessage] + + private mrtdService: DidCommMrtdService + + public constructor(mrtdService: DidCommMrtdService) { + this.mrtdService = mrtdService + } + + public async handle(inboundMessage: MessageHandlerInboundMessage) { + await this.mrtdService.processEMrtdDataRequest(inboundMessage) + } +} diff --git a/packages/mrtd/src/handlers/MrzDataHandler.ts b/packages/mrtd/src/handlers/MrzDataHandler.ts index b7319c7..5652c32 100644 --- a/packages/mrtd/src/handlers/MrzDataHandler.ts +++ b/packages/mrtd/src/handlers/MrzDataHandler.ts @@ -16,6 +16,6 @@ export class MrzDataHandler implements MessageHandler { } public async handle(inboundMessage: MessageHandlerInboundMessage) { - await this.mrtdService.processMrzData(inboundMessage) + await this.mrtdService.processEMrtdData(inboundMessage) } } diff --git a/packages/mrtd/src/handlers/index.ts b/packages/mrtd/src/handlers/index.ts index d9c17de..9c3cb1d 100644 --- a/packages/mrtd/src/handlers/index.ts +++ b/packages/mrtd/src/handlers/index.ts @@ -1,2 +1,4 @@ +export { EMrtdDataHandler } from './EMrtdDataHandler' +export { EMrtdDataRequestHandler } from './EMrtdDataRequestHandler' export { MrzDataHandler } from './MrzDataHandler' export { MrzDataRequestHandler } from './MrzDataRequestHandler' diff --git a/packages/mrtd/src/messages/EMrtdDataMessage.ts b/packages/mrtd/src/messages/EMrtdDataMessage.ts new file mode 100644 index 0000000..e701643 --- /dev/null +++ b/packages/mrtd/src/messages/EMrtdDataMessage.ts @@ -0,0 +1,25 @@ +import { AgentMessage, IsValidMessageType, parseMessageType } from '@credo-ts/core' + +interface EMrtdDataMessageOptions { + id?: string + threadId?: string + dataGroups: Record +} + +export class EMrtdDataMessage extends AgentMessage { + public constructor(options: EMrtdDataMessageOptions) { + super() + + if (options) { + this.id = options.id ?? this.generateId() + this.dataGroups = options.dataGroups + this.setThread({ threadId: options.threadId }) + } + } + + public dataGroups!: Record + + @IsValidMessageType(EMrtdDataMessage.type) + public static readonly type = parseMessageType('https://didcomm.org/mrtd/1.0/emrtd-data') + public readonly type = EMrtdDataMessage.type.messageTypeUri +} diff --git a/packages/mrtd/src/messages/EmrtdDataRequestMessage.ts b/packages/mrtd/src/messages/EmrtdDataRequestMessage.ts new file mode 100644 index 0000000..8a013e2 --- /dev/null +++ b/packages/mrtd/src/messages/EmrtdDataRequestMessage.ts @@ -0,0 +1,23 @@ +import { AgentMessage, IsValidMessageType, parseMessageType } from '@credo-ts/core' + +interface EMrtdDataRequestOptions { + id?: string + parentThreadId?: string +} + +export class EMrtdDataRequestMessage extends AgentMessage { + public constructor(options: EMrtdDataRequestOptions) { + super() + + if (options) { + this.id = options.id ?? this.generateId() + if (options.parentThreadId) { + this.setThread({ parentThreadId: options.parentThreadId }) + } + } + } + + @IsValidMessageType(EMrtdDataRequestMessage.type) + public static readonly type = parseMessageType('https://didcomm.org/mrtd/1.0/emrtd-data-request') + public readonly type = EMrtdDataRequestMessage.type.messageTypeUri +} diff --git a/packages/mrtd/src/messages/index.ts b/packages/mrtd/src/messages/index.ts index 537af4a..754c530 100644 --- a/packages/mrtd/src/messages/index.ts +++ b/packages/mrtd/src/messages/index.ts @@ -1,2 +1,4 @@ export { MrzDataMessage } from './MrzDataMessage' export { MrzDataRequestMessage } from './MrzDataRequestMessage' +export { EMrtdDataMessage } from './EMrtdDataMessage' +export { EMrtdDataRequestMessage } from './EmrtdDataRequestMessage' diff --git a/packages/mrtd/src/models/DidCommMrtdRole.ts b/packages/mrtd/src/models/DidCommMrtdRole.ts index a7a3fdd..a9ed947 100644 --- a/packages/mrtd/src/models/DidCommMrtdRole.ts +++ b/packages/mrtd/src/models/DidCommMrtdRole.ts @@ -1,4 +1,6 @@ export enum DidCommMrtdRole { MrzRequester = 'mrz-requester', MrzResponder = 'mrz-responder', + EMrtdDataRequester = 'emrtd-data-requester', + EMrtdDataResponder = 'emrtd-data-responder', }