Skip to content

Commit

Permalink
feat: initial eMRTD data messages
Browse files Browse the repository at this point in the history
  • Loading branch information
genaris committed Oct 9, 2024
1 parent ef5d43d commit 3bba3fa
Show file tree
Hide file tree
Showing 12 changed files with 174 additions and 5 deletions.
4 changes: 3 additions & 1 deletion packages/mrtd/src/DidCommMrtdApi.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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),
])
}

Expand Down
20 changes: 20 additions & 0 deletions packages/mrtd/src/DidCommMrtdEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
}
Expand All @@ -23,3 +25,21 @@ export interface MrzDataRequestedEvent extends BaseEvent {
parentThreadId?: string
}
}

export interface EMrtdDataReceivedEvent extends BaseEvent {
type: MrtdEventTypes.EMrtdDataReceived
payload: {
connection: ConnectionRecord
dataGroups: Record<string, string>
threadId: string
}
}

export interface EMtdDataRequestedEvent extends BaseEvent {
type: MrtdEventTypes.EMrtdDataRequested
payload: {
connection: ConnectionRecord
threadId: string
parentThreadId?: string
}
}
7 changes: 6 additions & 1 deletion packages/mrtd/src/DidCommMrtdModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
],
}),
)
}
Expand Down
50 changes: 48 additions & 2 deletions packages/mrtd/src/DidCommMrtdService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -56,4 +62,44 @@ export class DidCommMrtdService {
},
})
}

public async processEMrtdData(messageContext: InboundMessageContext<EMrtdDataMessage>) {
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<EMrtdDataReceivedEvent>(agentContext, {
type: MrtdEventTypes.EMrtdDataReceived,
payload: {
connection,
dataGroups: message.dataGroups,
threadId: message.threadId,
},
})
}

public async processEMrtdDataRequest(messageContext: InboundMessageContext<EMrtdDataRequestMessage>) {
const connection = messageContext.assertReadyConnection()
const { agentContext, message } = messageContext

const eventEmitter = agentContext.dependencyManager.resolve(EventEmitter)
eventEmitter.emit<EMtdDataRequestedEvent>(agentContext, {
type: MrtdEventTypes.EMrtdDataRequested,
payload: {
connection,
parentThreadId: message.thread?.parentThreadId,
threadId: message.threadId,
},
})
}
}
21 changes: 21 additions & 0 deletions packages/mrtd/src/handlers/EMrtdDataHandler.ts
Original file line number Diff line number Diff line change
@@ -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<EMrtdDataHandler>) {
await this.mrtdService.processEMrtdData(inboundMessage)
}
}
21 changes: 21 additions & 0 deletions packages/mrtd/src/handlers/EMrtdDataRequestHandler.ts
Original file line number Diff line number Diff line change
@@ -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<EMrtdDataRequestHandler>) {
await this.mrtdService.processEMrtdDataRequest(inboundMessage)
}
}
2 changes: 1 addition & 1 deletion packages/mrtd/src/handlers/MrzDataHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ export class MrzDataHandler implements MessageHandler {
}

public async handle(inboundMessage: MessageHandlerInboundMessage<MrzDataHandler>) {
await this.mrtdService.processMrzData(inboundMessage)
await this.mrtdService.processEMrtdData(inboundMessage)
}
}
2 changes: 2 additions & 0 deletions packages/mrtd/src/handlers/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export { EMrtdDataHandler } from './EMrtdDataHandler'
export { EMrtdDataRequestHandler } from './EMrtdDataRequestHandler'
export { MrzDataHandler } from './MrzDataHandler'
export { MrzDataRequestHandler } from './MrzDataRequestHandler'
25 changes: 25 additions & 0 deletions packages/mrtd/src/messages/EMrtdDataMessage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { AgentMessage, IsValidMessageType, parseMessageType } from '@credo-ts/core'

interface EMrtdDataMessageOptions {
id?: string
threadId?: string
dataGroups: Record<string, string>
}

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<string, string>

@IsValidMessageType(EMrtdDataMessage.type)
public static readonly type = parseMessageType('https://didcomm.org/mrtd/1.0/emrtd-data')
public readonly type = EMrtdDataMessage.type.messageTypeUri
}
23 changes: 23 additions & 0 deletions packages/mrtd/src/messages/EmrtdDataRequestMessage.ts
Original file line number Diff line number Diff line change
@@ -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
}
2 changes: 2 additions & 0 deletions packages/mrtd/src/messages/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export { MrzDataMessage } from './MrzDataMessage'
export { MrzDataRequestMessage } from './MrzDataRequestMessage'
export { EMrtdDataMessage } from './EMrtdDataMessage'
export { EMrtdDataRequestMessage } from './EmrtdDataRequestMessage'
2 changes: 2 additions & 0 deletions packages/mrtd/src/models/DidCommMrtdRole.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export enum DidCommMrtdRole {
MrzRequester = 'mrz-requester',
MrzResponder = 'mrz-responder',
EMrtdDataRequester = 'emrtd-data-requester',
EMrtdDataResponder = 'emrtd-data-responder',
}

0 comments on commit 3bba3fa

Please sign in to comment.