@veramo/did-comm
Version:
Veramo messaging plugin implementing DIDComm v2.
1,072 lines (1,005 loc) • 34.5 kB
text/typescript
import { DIDComm } from '../didcomm.js'
import {
createAgent,
IDIDManager,
IEventListener,
IIdentifier,
IKeyManager,
IMessageHandler,
IResolver,
TAgent,
} from '../../../core/src'
import { DIDManager, MemoryDIDStore } from '../../../did-manager/src'
import { KeyManager, MemoryKeyStore, MemoryPrivateKeyStore } from '../../../key-manager/src'
import { KeyManagementSystem } from '../../../kms-local/src'
import { DIDResolverPlugin } from '../../../did-resolver/src'
import { Resolver } from 'did-resolver'
import { DIDCommHttpTransport } from '../transports/transports.js'
import { IDIDComm } from '../types/IDIDComm.js'
import { MessageHandler } from '../../../message-handler/src'
import { IDIDCommMessage, DIDCommMessageMediaType, IPackedDIDCommMessage } from '../types/message-types.js'
import { QUEUE_MESSAGE_TYPE } from '../protocols/routing-message-handler.js'
import {
PickupMediatorMessageHandler,
PickupRecipientMessageHandler,
STATUS_REQUEST_MESSAGE_TYPE,
STATUS_MESSAGE_TYPE,
DELIVERY_MESSAGE_TYPE,
DELIVERY_REQUEST_MESSAGE_TYPE,
MESSAGES_RECEIVED_MESSAGE_TYPE,
} from '../protocols/messagepickup-message-handler.js'
import { FakeDidProvider, FakeDidResolver } from '../../../test-utils/src'
import { MessagingRouter, RequestWithAgentRouter } from '../../../remote-server/src'
import { Entities, IDataStore, migrations } from '../../../data-store/src'
// @ts-ignore
import express from 'express'
import { Server } from 'http'
import { DIDCommMessageHandler } from '../message-handler.js'
import { DataStore, DataStoreORM } from '../../../data-store/src'
import { DataSource } from 'typeorm'
import { v4 } from 'uuid'
import { Message } from '@veramo/message-handler'
import { jest } from '@jest/globals'
import 'cross-fetch/polyfill'
const DIDCommEventSniffer: IEventListener = {
eventTypes: [
'DIDCommV2Message-sent',
'DIDCommV2Message-received',
'DIDCommV2Message-forwardMessageQueued',
'DIDCommV2Message-forwardMessageDequeued',
],
onEvent: jest.fn(() => Promise.resolve()),
}
describe('messagepickup-message-handler', () => {
describe('PickupMediatorMessageHandler', () => {
let recipient: IIdentifier
let recipient2: IIdentifier
let mediator: IIdentifier
let agent: TAgent<IResolver & IKeyManager & IDIDManager & IDIDComm & IMessageHandler & IDataStore>
let didCommEndpointServer: Server
let listeningPort = Math.round(Math.random() * 32000 + 2048)
let dbConnection: DataSource
let messageToQueue: Message
let messageToQueue1: Message
let innerMessage: IPackedDIDCommMessage
beforeAll(async () => {
dbConnection = new DataSource({
name: 'test',
type: 'sqlite',
database: ':memory:',
synchronize: false,
migrations: migrations,
migrationsRun: true,
logging: false,
entities: Entities,
})
agent = createAgent({
plugins: [
new KeyManager({
store: new MemoryKeyStore(),
kms: {
// @ts-ignore
local: new KeyManagementSystem(new MemoryPrivateKeyStore()),
},
}),
new DIDManager({
providers: {
'did:fake': new FakeDidProvider(),
// 'did:web': new WebDIDProvider({ defaultKms: 'local' })
},
store: new MemoryDIDStore(),
defaultProvider: 'did:fake',
}),
new DIDResolverPlugin({
resolver: new Resolver({
...new FakeDidResolver(() => agent).getDidFakeResolver(),
}),
}),
new DIDComm({ transports: [new DIDCommHttpTransport()] }),
new MessageHandler({
messageHandlers: [
// @ts-ignore
new DIDCommMessageHandler(),
new PickupMediatorMessageHandler(),
],
}),
new DataStore(dbConnection),
new DataStoreORM(dbConnection),
DIDCommEventSniffer,
],
})
recipient = await agent.didManagerImport({
did: 'did:fake:z6MkgbqNU4uF9NKSz5BqJQ4XKVHuQZYcUZP8pXGsJC8nTHwo',
keys: [
{
type: 'Ed25519',
kid: 'didcomm-senderKey-1',
publicKeyHex: '1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
privateKeyHex:
'b57103882f7c66512dc96777cbafbeb2d48eca1e7a867f5a17a84e9a6740f7dc1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
kms: 'local',
},
],
services: [
{
id: 'msg1',
type: 'DIDCommMessaging',
serviceEndpoint: `http://localhost:${listeningPort}/messaging`,
},
],
provider: 'did:fake',
alias: 'sender',
})
recipient2 = await agent.didManagerImport({
did: 'did:fake:recipient2',
keys: [
{
type: 'Ed25519',
kid: 'didcomm-senderKey-1',
publicKeyHex: '1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
privateKeyHex:
'b57103882f7c66512dc96777cbafbeb2d48eca1e7a867f5a17a84e9a6740f7dc1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
kms: 'local',
},
],
services: [
{
id: 'msg1',
type: 'DIDCommMessaging',
serviceEndpoint: `http://localhost:${listeningPort}/messaging`,
},
],
provider: 'did:fake',
alias: 'recipient2',
})
mediator = await agent.didManagerImport({
did: 'did:fake:z6MkrPhffVLBZpxH7xvKNyD4sRVZeZsNTWJkLdHdgWbfgNu3',
keys: [
{
type: 'Ed25519',
kid: 'didcomm-receiverKey-1',
publicKeyHex: 'b162e405b6485eff8a57932429b192ec4de13c06813e9028a7cdadf0e2703636',
privateKeyHex:
'19ed9b6949cfd0f9a57e30f0927839a985fa699491886ebcdda6a954d869732ab162e405b6485eff8a57932429b192ec4de13c06813e9028a7cdadf0e2703636',
kms: 'local',
},
],
services: [
{
id: 'msg2',
type: 'DIDCommMessaging',
serviceEndpoint: `http://localhost:${listeningPort}/messaging`,
},
],
provider: 'did:fake',
alias: 'receiver',
})
// console.log('sender: ', sender)
// console.log('recipient: ', recipient)
// Save messages in queue
innerMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: {
type: 'test',
to: [recipient.did],
from: mediator.did,
id: 'test',
body: { hello: 'world' },
},
})
messageToQueue = new Message({ raw: innerMessage.message })
messageToQueue.id = 'test1'
messageToQueue.type = QUEUE_MESSAGE_TYPE
messageToQueue.to = `${recipient.did}#${recipient.keys[0].kid}`
messageToQueue.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue })
messageToQueue1 = new Message({ raw: innerMessage.message })
messageToQueue1.id = 'test2'
messageToQueue1.type = QUEUE_MESSAGE_TYPE
messageToQueue1.to = `${recipient.did}#some-other-key`
messageToQueue1.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue1 })
const requestWithAgent = RequestWithAgentRouter({ agent })
await new Promise((resolve) => {
//setup a server to receive HTTP messages and forward them to this agent to be processed as DIDComm messages
const app = express()
// app.use(requestWithAgent)
app.use(
'/messaging',
requestWithAgent,
MessagingRouter({
metaData: { type: 'DIDComm', value: 'integration test' },
}),
)
didCommEndpointServer = app.listen(listeningPort, () => {
resolve(true)
})
})
})
afterAll(async () => {
try {
await new Promise((resolve, reject) => didCommEndpointServer?.close(resolve))
} catch (e: any) {
// nop
}
try {
await dbConnection?.destroy()
} catch (e: any) {
// nop
}
})
it('should respond to StatusRequest with no recipient_key', async () => {
expect.assertions(1)
// Send StatusRequest
const statusRequestMessage: IDIDCommMessage = {
id: v4(),
type: STATUS_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: {},
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: statusRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: statusRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
body: { message_count: 2, live_delivery: false },
id: expect.anything(),
created_time: expect.anything(),
thid: statusRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: STATUS_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should respond to StatusRequest with recipient_key', async () => {
expect.assertions(1)
// Send StatusRequest
const statusRequestMessage: IDIDCommMessage = {
id: v4(),
type: STATUS_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: {
recipient_key: `${recipient.did}#${recipient.keys[0].kid}`,
},
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: statusRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: statusRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
body: {
message_count: 1,
live_delivery: false,
recipient_key: `${recipient.did}#${recipient.keys[0].kid}`,
},
id: expect.anything(),
created_time: expect.anything(),
thid: statusRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: STATUS_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should contain returnMessage', async () => {
// Send StatusRequest
const statusRequestMessage: IDIDCommMessage = {
id: v4(),
type: STATUS_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: {
recipient_key: `${recipient.did}#${recipient.keys[0].kid}`,
},
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: statusRequestMessage,
})
const result = await agent.sendDIDCommMessage({
messageId: statusRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(result.transportId).toBeDefined()
expect(result.returnMessage).toBeDefined()
})
it('should not respond to StatusRequest with no return_route', async () => {
expect.assertions(1)
const statusRequestMessage: IDIDCommMessage = {
id: v4(),
type: STATUS_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
body: {},
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: statusRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: statusRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).not.toHaveBeenCalledWith(
{
data: {
message: {
body: expect.anything(),
id: expect.anything(),
created_time: expect.anything(),
thid: statusRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: STATUS_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should respond to DeliveryRequest with no recipient_key', async () => {
expect.assertions(1)
// Send DeliveryRequest
const deliveryRequestMessage: IDIDCommMessage = {
id: v4(),
type: DELIVERY_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: { limit: 2 },
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: deliveryRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: deliveryRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
body: {},
id: expect.anything(),
created_time: expect.anything(),
thid: deliveryRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: DELIVERY_MESSAGE_TYPE,
attachments: [
{
id: messageToQueue.id,
media_type: DIDCommMessageMediaType.ENCRYPTED,
data: {
json: JSON.parse(innerMessage.message),
},
},
{
id: messageToQueue1.id,
media_type: DIDCommMessageMediaType.ENCRYPTED,
data: {
json: JSON.parse(innerMessage.message),
},
},
],
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should respond to DeliveryRequest with recipient_key', async () => {
expect.assertions(1)
// Send DeliveryRequest
const deliveryRequestMessage: IDIDCommMessage = {
id: v4(),
type: DELIVERY_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: { limit: 2, recipient_key: `${recipient.did}#${recipient.keys[0].kid}` },
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: deliveryRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: deliveryRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
body: { recipient_key: `${recipient.did}#${recipient.keys[0].kid}` },
id: expect.anything(),
created_time: expect.anything(),
thid: deliveryRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: DELIVERY_MESSAGE_TYPE,
attachments: [
{
id: messageToQueue.id,
media_type: DIDCommMessageMediaType.ENCRYPTED,
data: {
json: JSON.parse(innerMessage.message),
},
},
],
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should not respond to DeliveryRequest with no return_route', async () => {
expect.assertions(1)
const deliveryRequestMessage: IDIDCommMessage = {
id: v4(),
type: DELIVERY_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
body: { limit: 2 },
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: deliveryRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: deliveryRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).not.toHaveBeenCalledWith(
{
data: {
message: {
attachments: expect.anything(),
body: expect.anything(),
id: expect.anything(),
created_time: expect.anything(),
thid: deliveryRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: DELIVERY_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should not respond to DeliveryRequest with no limit', async () => {
expect.assertions(1)
const deliveryRequestMessage: IDIDCommMessage = {
id: v4(),
type: DELIVERY_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: {},
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: deliveryRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: deliveryRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).not.toHaveBeenCalledWith(
{
data: {
message: {
attachments: expect.anything(),
body: expect.anything(),
id: expect.anything(),
created_time: expect.anything(),
thid: deliveryRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: DELIVERY_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should not respond to DeliveryRequest with bad limit', async () => {
expect.assertions(1)
const deliveryRequestMessage: IDIDCommMessage = {
id: v4(),
type: DELIVERY_REQUEST_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: { limit: 'not a number' },
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: deliveryRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: deliveryRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).not.toHaveBeenCalledWith(
{
data: {
message: {
attachments: expect.anything(),
body: expect.anything(),
id: expect.anything(),
created_time: expect.anything(),
thid: deliveryRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: DELIVERY_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should clear message on MessagesReceived', async () => {
expect.assertions(2)
// Save message
const messageToQueue2 = new Message({ raw: innerMessage.message })
messageToQueue2.id = 'test3'
messageToQueue2.type = QUEUE_MESSAGE_TYPE
messageToQueue2.to = `${recipient.did}#${recipient.keys[0].kid}`
messageToQueue2.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue2 })
// Send MessagesRequest
const messagesRequestMessage: IDIDCommMessage = {
id: v4(),
type: MESSAGES_RECEIVED_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: { message_id_list: [messageToQueue2.id] },
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: messagesRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: messagesRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: messageToQueue2.id,
type: 'DIDCommV2Message-forwardMessageDequeued',
},
expect.anything(),
)
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
body: { message_count: 2, live_delivery: false },
id: expect.anything(),
created_time: expect.anything(),
thid: messagesRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: STATUS_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should clear multiple messages on MessagesReceived', async () => {
expect.assertions(3)
// Save messages
const messageToQueue2 = new Message({ raw: innerMessage.message })
messageToQueue2.id = v4()
messageToQueue2.type = QUEUE_MESSAGE_TYPE
messageToQueue2.to = `${recipient.did}#${recipient.keys[0].kid}`
messageToQueue2.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue2 })
const messageToQueue3 = new Message({ raw: innerMessage.message })
messageToQueue3.id = v4()
messageToQueue3.type = QUEUE_MESSAGE_TYPE
messageToQueue3.to = `${recipient.did}#${recipient.keys[0].kid}`
messageToQueue3.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue3 })
// Send MessagesRequest
const messagesRequestMessage: IDIDCommMessage = {
id: v4(),
type: MESSAGES_RECEIVED_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
return_route: 'all',
body: { message_id_list: [messageToQueue2.id, messageToQueue3.id] },
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: messagesRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: messagesRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: messageToQueue2.id,
type: 'DIDCommV2Message-forwardMessageDequeued',
},
expect.anything(),
)
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: messageToQueue3.id,
type: 'DIDCommV2Message-forwardMessageDequeued',
},
expect.anything(),
)
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
body: { message_count: 2, live_delivery: false },
id: expect.anything(),
created_time: expect.anything(),
thid: messagesRequestMessage.id,
to: [recipient.did],
from: mediator.did,
type: STATUS_MESSAGE_TYPE,
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
it('should not clear messages on MessagesReceived for another recipient', async () => {
// Save message
const messageToQueue2 = new Message({ raw: innerMessage.message })
messageToQueue2.id = v4()
messageToQueue2.type = QUEUE_MESSAGE_TYPE
messageToQueue2.to = `${recipient.did}#${recipient.keys[0].kid}`
messageToQueue2.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue2 })
// Send MessagesRequest
const messagesRequestMessage: IDIDCommMessage = {
id: v4(),
type: MESSAGES_RECEIVED_MESSAGE_TYPE,
to: [mediator.did],
from: recipient2.did,
return_route: 'all',
body: { message_id_list: [messageToQueue2.id] },
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: messagesRequestMessage,
})
await agent.sendDIDCommMessage({
messageId: messagesRequestMessage.id,
packedMessage,
recipientDidUrl: mediator.did,
})
expect(DIDCommEventSniffer.onEvent).not.toHaveBeenCalledWith(
{
data: messageToQueue2.id,
type: 'DIDCommV2Message-forwardMessageDequeued',
},
expect.anything(),
)
expect(await agent.dataStoreGetMessage({ id: messageToQueue2.id })).toBeDefined()
// Clean up
await agent.dataStoreDeleteMessage({ id: messageToQueue2.id })
})
})
describe('PickupRecipientMessageHandler', () => {
let recipient: IIdentifier
let recipient2: IIdentifier
let mediator: IIdentifier
let agent: TAgent<IResolver & IKeyManager & IDIDManager & IDIDComm & IMessageHandler & IDataStore>
let didCommEndpointServer: Server
let listeningPort = Math.round(Math.random() * 32000 + 2048)
let dbConnection: DataSource
let messageToQueue: Message
let messageToQueue1: Message
let innerMessage: IPackedDIDCommMessage
beforeAll(async () => {
dbConnection = new DataSource({
name: 'test',
type: 'sqlite',
database: ':memory:',
synchronize: false,
migrations: migrations,
migrationsRun: true,
logging: false,
entities: Entities,
})
agent = createAgent({
plugins: [
new KeyManager({
store: new MemoryKeyStore(),
kms: {
// @ts-ignore
local: new KeyManagementSystem(new MemoryPrivateKeyStore()),
},
}),
new DIDManager({
providers: {
'did:fake': new FakeDidProvider(),
// 'did:web': new WebDIDProvider({ defaultKms: 'local' })
},
store: new MemoryDIDStore(),
defaultProvider: 'did:fake',
}),
new DIDResolverPlugin({
resolver: new Resolver({
...new FakeDidResolver(() => agent).getDidFakeResolver(),
}),
}),
new DIDComm({ transports: [new DIDCommHttpTransport()] }),
new MessageHandler({
messageHandlers: [
// @ts-ignore
new DIDCommMessageHandler(),
new PickupRecipientMessageHandler(),
],
}),
new DataStore(dbConnection),
new DataStoreORM(dbConnection),
DIDCommEventSniffer,
],
})
recipient = await agent.didManagerImport({
did: 'did:fake:z6MkgbqNU4uF9NKSz5BqJQ4XKVHuQZYcUZP8pXGsJC8nTHwo',
keys: [
{
type: 'Ed25519',
kid: 'didcomm-senderKey-1',
publicKeyHex: '1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
privateKeyHex:
'b57103882f7c66512dc96777cbafbeb2d48eca1e7a867f5a17a84e9a6740f7dc1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
kms: 'local',
},
],
services: [
{
id: 'msg1',
type: 'DIDCommMessaging',
serviceEndpoint: `http://localhost:${listeningPort}/messaging`,
},
],
provider: 'did:fake',
alias: 'sender',
})
recipient2 = await agent.didManagerImport({
did: 'did:fake:recipient2',
keys: [
{
type: 'Ed25519',
kid: 'didcomm-senderKey-1',
publicKeyHex: '1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
privateKeyHex:
'b57103882f7c66512dc96777cbafbeb2d48eca1e7a867f5a17a84e9a6740f7dc1fe9b397c196ab33549041b29cf93be29b9f2bdd27322f05844112fad97ff92a',
kms: 'local',
},
],
services: [
{
id: 'msg1',
type: 'DIDCommMessaging',
serviceEndpoint: `http://localhost:${listeningPort}/messaging`,
},
],
provider: 'did:fake',
alias: 'recipient2',
})
mediator = await agent.didManagerImport({
did: 'did:fake:z6MkrPhffVLBZpxH7xvKNyD4sRVZeZsNTWJkLdHdgWbfgNu3',
keys: [
{
type: 'Ed25519',
kid: 'didcomm-receiverKey-1',
publicKeyHex: 'b162e405b6485eff8a57932429b192ec4de13c06813e9028a7cdadf0e2703636',
privateKeyHex:
'19ed9b6949cfd0f9a57e30f0927839a985fa699491886ebcdda6a954d869732ab162e405b6485eff8a57932429b192ec4de13c06813e9028a7cdadf0e2703636',
kms: 'local',
},
],
services: [
{
id: 'msg2',
type: 'DIDCommMessaging',
serviceEndpoint: `http://localhost:${listeningPort}/messaging`,
},
],
provider: 'did:fake',
alias: 'receiver',
})
// console.log('sender: ', sender)
// console.log('recipient: ', recipient)
// Save messages in queue
innerMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: {
type: 'test',
to: [recipient.did],
from: mediator.did,
id: 'test',
body: { hello: 'world' },
},
})
messageToQueue = new Message({ raw: innerMessage.message })
messageToQueue.id = 'test1'
messageToQueue.type = QUEUE_MESSAGE_TYPE
messageToQueue.to = `${recipient.did}#${recipient.keys[0].kid}`
messageToQueue.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue })
messageToQueue1 = new Message({ raw: innerMessage.message })
messageToQueue1.id = 'test2'
messageToQueue1.type = QUEUE_MESSAGE_TYPE
messageToQueue1.to = `${recipient.did}#some-other-key`
messageToQueue1.createdAt = new Date().toISOString()
await agent.dataStoreSaveMessage({ message: messageToQueue1 })
const requestWithAgent = RequestWithAgentRouter({ agent })
await new Promise((resolve) => {
//setup a server to receive HTTP messages and forward them to this agent to be processed as DIDComm messages
const app = express()
// app.use(requestWithAgent)
app.use(
'/messaging',
requestWithAgent,
MessagingRouter({
metaData: { type: 'DIDComm', value: 'integration test' },
}),
)
didCommEndpointServer = app.listen(listeningPort, () => {
resolve(true)
})
})
})
afterAll(async () => {
try {
await new Promise((resolve, reject) => didCommEndpointServer?.close(resolve))
} catch (e: any) {
// nop
}
try {
await dbConnection?.destroy()
} catch (e: any) {
// nop
}
})
it('should handle messages from MessageDelivery batch', async () => {
expect.assertions(3)
// Send MessageDelivery
const msgId = v4()
const messageDeliveryMessage: IDIDCommMessage = {
body: {},
id: v4(),
created_time: new Date().toISOString(),
to: [recipient.did],
from: mediator.did,
type: DELIVERY_MESSAGE_TYPE,
attachments: [
{
id: msgId,
data: {
json: JSON.parse(innerMessage.message),
},
},
],
}
const packedMessage = await agent.packDIDCommMessage({
packing: 'authcrypt',
message: messageDeliveryMessage,
})
await agent.sendDIDCommMessage({
messageId: messageDeliveryMessage.id,
packedMessage,
recipientDidUrl: recipient.did,
})
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: messageDeliveryMessage,
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
type: 'test',
to: [recipient.did],
from: mediator.did,
id: 'test',
body: { hello: 'world' },
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith(
{
data: {
message: {
id: expect.anything(),
type: MESSAGES_RECEIVED_MESSAGE_TYPE,
to: [mediator.did],
from: recipient.did,
created_time: expect.anything(),
thid: messageDeliveryMessage.id,
return_route: 'all',
body: { message_id_list: [msgId] },
},
metaData: { packing: 'authcrypt' },
},
type: 'DIDCommV2Message-received',
},
expect.anything(),
)
})
})
})