@veramo/did-comm
Version:
Veramo messaging plugin implementing DIDComm v2.
102 lines (93 loc) • 3.34 kB
text/typescript
import { IAgentContext, IDIDManager, IKeyManager } from '@veramo/core-types'
import { AbstractMessageHandler, Message } from '@veramo/message-handler'
import Debug from 'debug'
import { v4 } from 'uuid'
import { IDIDComm } from '../types/IDIDComm.js'
import { DIDCommMessageMediaType, IDIDCommMessage } from '../types/message-types.js'
const debug = Debug('veramo:did-comm:trust-ping-message-handler')
type IContext = IAgentContext<IDIDManager & IKeyManager & IDIDComm>
const TRUST_PING_MESSAGE_TYPE = 'https://didcomm.org/trust-ping/2.0/ping'
const TRUST_PING_RESPONSE_MESSAGE_TYPE = 'https://didcomm.org/trust-ping/2.0/ping-response'
export function createTrustPingMessage(senderDidUrl: string, recipientDidUrl: string): IDIDCommMessage {
return {
type: TRUST_PING_MESSAGE_TYPE,
from: senderDidUrl,
to: [recipientDidUrl],
id: v4(),
body: {
responseRequested: true,
},
}
}
export function createTrustPingResponse(
senderDidUrl: string,
recipientDidUrl: string,
pingId: string,
): IDIDCommMessage {
return {
type: TRUST_PING_RESPONSE_MESSAGE_TYPE,
from: senderDidUrl,
to: [recipientDidUrl],
id: `${pingId}-response`,
thid: pingId,
body: {},
}
}
/**
* A plugin for the {@link @veramo/message-handler#MessageHandler} that handles Trust Ping messages.
* @beta This API may change without a BREAKING CHANGE notice.
*/
export class TrustPingMessageHandler extends AbstractMessageHandler {
constructor() {
super()
}
/**
* Handles a Trust Ping Message
* https://identity.foundation/didcomm-messaging/spec/#trust-ping-protocol-10
*/
public async handle(message: Message, context: IContext): Promise<Message> {
if (message.type === TRUST_PING_MESSAGE_TYPE) {
debug('TrustPing Message Received')
try {
const { from, to, id } = message
if (!from) {
throw new Error('invalid_argument: Trust Ping Message received without `from` set')
}
if (!to) {
throw new Error('invalid_argument: Trust Ping Message received without `to` set')
}
const response = createTrustPingResponse(to!, from!, id)
const packedResponse = await context.agent.packDIDCommMessage({
message: response,
packing: 'authcrypt',
})
try {
const sent = await context.agent.sendDIDCommMessage({
messageId: response.id,
packedMessage: packedResponse,
recipientDidUrl: from!,
})
message.addMetaData({ type: 'TrustPingResponseSent', value: JSON.stringify(sent) })
} catch (e: any) {
debug(e)
}
if (message.returnRoute === 'all') {
const returnResponse = {
id: response.id,
message: packedResponse.message,
contentType: DIDCommMessageMediaType.ENCRYPTED,
}
message.addMetaData({ type: 'ReturnRouteResponse', value: JSON.stringify(returnResponse) })
}
} catch (ex) {
debug(ex)
}
return message
} else if (message.type === TRUST_PING_RESPONSE_MESSAGE_TYPE) {
debug('TrustPingResponse Message Received')
message.addMetaData({ type: 'TrustPingResponseReceived', value: 'true' })
return message
}
return super.handle(message, context)
}
}