From a56036aaae312b8fb66466cc0ce483b4ce256725 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Fri, 17 Feb 2023 11:22:45 +0100 Subject: [PATCH 01/23] chore: wip outbound message send via session Signed-off-by: Moriarty --- packages/core/src/agent/Agent.ts | 10 +- packages/core/src/agent/Dispatcher.ts | 2 + packages/core/src/agent/MessageReceiver.ts | 38 +++- packages/core/src/agent/MessageSender.ts | 107 +++++++++--- .../agent/models/OutboundMessageContext.ts | 7 +- packages/core/src/modules/proofs/ProofsApi.ts | 4 +- .../proofs/protocol/BaseProofProtocol.ts | 20 +-- .../v1-connectionless-proofs.e2e.test.ts | 82 ++++++++- packages/core/tests/helpers.ts | 164 +++++++++++++++++- 9 files changed, 387 insertions(+), 47 deletions(-) diff --git a/packages/core/src/agent/Agent.ts b/packages/core/src/agent/Agent.ts index 3785d00f4a..04b2e5600c 100644 --- a/packages/core/src/agent/Agent.ts +++ b/packages/core/src/agent/Agent.ts @@ -1,9 +1,9 @@ -import type { AgentDependencies } from './AgentDependencies' -import type { AgentModulesInput } from './AgentModules' -import type { AgentMessageReceivedEvent } from './Events' import type { InboundTransport } from '../transport/InboundTransport' import type { OutboundTransport } from '../transport/OutboundTransport' import type { InitConfig } from '../types' +import type { AgentDependencies } from './AgentDependencies' +import type { AgentModulesInput } from './AgentModules' +import type { AgentMessageReceivedEvent } from './Events' import type { Subscription } from 'rxjs' import { Subject } from 'rxjs' @@ -141,6 +141,10 @@ export class Agent extends BaseAge this.messageSender.registerOutboundTransport(outboundTransport) } + public resetOutboundTransport() { + this.messageSender.resetOutboundTransport() + } + public get outboundTransports() { return this.messageSender.outboundTransports } diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index ee04bc0e3c..7750850d36 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -78,6 +78,8 @@ class Dispatcher { } if (outboundMessage) { + outboundMessage.sessionIdFromInbound = messageContext.sessionId + this.logger.debug(`OutboundMessage ${outboundMessage}`, outboundMessage) if (outboundMessage.isOutboundServiceMessage()) { await this.messageSender.sendMessageToService(outboundMessage) } else { diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 55d1368fc0..32585fcdab 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -1,12 +1,14 @@ -import type { AgentMessage } from './AgentMessage' -import type { DecryptedMessageContext } from './EnvelopeService' -import type { TransportSession } from './TransportService' -import type { AgentContext } from './context' import type { ConnectionRecord } from '../modules/connections' import type { InboundTransport } from '../transport' import type { EncryptedMessage, PlaintextMessage } from '../types' +import type { AgentMessage } from './AgentMessage' +import type { DecryptedMessageContext, EnvelopeKeys } from './EnvelopeService' +import type { TransportSession } from './TransportService' +import type { AgentContext } from './context' import { InjectionSymbols } from '../constants' +import { Key } from '../crypto' +import { ReturnRouteTypes } from '../decorators/transport/TransportDecorator' import { AriesFrameworkError } from '../error' import { Logger } from '../logger' import { ConnectionService } from '../modules/connections' @@ -85,7 +87,7 @@ export class MessageReceiver { if (this.isEncryptedMessage(inboundMessage)) { await this.receiveEncryptedMessage(agentContext, inboundMessage as EncryptedMessage, session) } else if (this.isPlaintextMessage(inboundMessage)) { - await this.receivePlaintextMessage(agentContext, inboundMessage, connection) + await this.receivePlaintextMessage(agentContext, inboundMessage, connection, session) } else { throw new AriesFrameworkError('Unable to parse incoming message: unrecognized format') } @@ -98,10 +100,31 @@ export class MessageReceiver { private async receivePlaintextMessage( agentContext: AgentContext, plaintextMessage: PlaintextMessage, - connection?: ConnectionRecord + connection?: ConnectionRecord, + session?: TransportSession ) { const message = await this.transformAndValidate(agentContext, plaintextMessage) - const messageContext = new InboundMessageContext(message, { connection, agentContext }) + const messageContext = new InboundMessageContext(message, { connection, agentContext, sessionId: session?.id }) + const { senderKey, recipientKey } = messageContext + + if (message.hasAnyReturnRoute() && session) { + this.logger.debug(`Storing session for inbound message '${message.id}'`) + let keys + if (messageContext.recipientKey && messageContext.senderKey) { + keys = { + recipientKeys: [messageContext.senderKey], + routingKeys: [], + senderKey: messageContext.recipientKey, + } + } + session.keys = keys + message.setReturnRouting(ReturnRouteTypes.all, message.transport?.returnRouteThread) + session.inboundMessage = message + session.connectionId = connection?.id + session.connectionId = connection?.id + messageContext.sessionId = session.id + this.transportService.saveSession(session) + } await this.dispatcher.dispatch(messageContext) } @@ -136,6 +159,7 @@ export class MessageReceiver { // That can happen when inbound message has `return_route` set to `all` or `thread`. // If `return_route` defines just `thread`, we decide later whether to use session according to outbound message `threadId`. if (senderKey && recipientKey && message.hasAnyReturnRoute() && session) { + // if (senderKey && recipientKey && message.hasAnyReturnRoute() && session) { this.logger.debug(`Storing session for inbound message '${message.id}'`) const keys = { recipientKeys: [senderKey], diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 04aad34d38..27bfe4145a 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -1,15 +1,19 @@ -import type { AgentMessage } from './AgentMessage' -import type { EnvelopeKeys } from './EnvelopeService' -import type { AgentMessageSentEvent } from './Events' -import type { TransportSession } from './TransportService' -import type { AgentContext } from './context' +import type { SubjectMessage } from '../../../../tests/transport/SubjectInboundTransport' import type { ConnectionRecord } from '../modules/connections' import type { ResolvedDidCommService } from '../modules/didcomm' import type { DidDocument } from '../modules/dids' import type { OutOfBandRecord } from '../modules/oob/repository' import type { OutboundTransport } from '../transport/OutboundTransport' import type { OutboundPackage, EncryptedMessage } from '../types' +import type { AgentMessage } from './AgentMessage' +import type { EnvelopeKeys } from './EnvelopeService' +import type { AgentMessageSentEvent } from './Events' +import type { TransportSession } from './TransportService' +import type { AgentContext } from './context' + +import { Subject } from 'rxjs' +import { SubjectTransportSession } from '../../../../tests/transport/SubjectInboundTransport' import { DID_COMM_TRANSPORT_QUEUE, InjectionSymbols } from '../constants' import { ReturnRouteTypes } from '../decorators/transport/TransportDecorator' import { AriesFrameworkError, MessageSendingError } from '../error' @@ -43,7 +47,7 @@ export class MessageSender { private didResolverService: DidResolverService private didCommDocumentService: DidCommDocumentService private eventEmitter: EventEmitter - public readonly outboundTransports: OutboundTransport[] = [] + public outboundTransports: OutboundTransport[] = [] public constructor( envelopeService: EnvelopeService, @@ -68,6 +72,10 @@ export class MessageSender { this.outboundTransports.push(outboundTransport) } + public resetOutboundTransport() { + this.outboundTransports = [] + } + public async packMessage( agentContext: AgentContext, { @@ -185,7 +193,7 @@ export class MessageSender { transportPriority?: TransportPriorityOptions } ) { - const { agentContext, connection, outOfBand, sessionId, message } = outboundMessageContext + const { agentContext, connection, outOfBand, sessionId, message, sessionIdFromInbound } = outboundMessageContext const errors: Error[] = [] if (!connection) { @@ -203,8 +211,10 @@ export class MessageSender { let session: TransportSession | undefined - if (sessionId) { - session = this.transportService.findSessionById(sessionId) + if (sessionId || sessionIdFromInbound) { + session = sessionId + ? this.transportService.findSessionById(sessionId) + : this.transportService.findSessionById(sessionIdFromInbound) } if (!session) { // Try to send to already open session @@ -364,14 +374,14 @@ export class MessageSender { } private async sendToService(outboundMessageContext: OutboundMessageContext) { - const { agentContext, message, serviceParams, connection } = outboundMessageContext + const { agentContext, message, serviceParams, connection, sessionIdFromInbound, sessionId } = outboundMessageContext if (!serviceParams) { throw new AriesFrameworkError('No service parameters found in outbound message context') } const { service, senderKey, returnRoute } = serviceParams - if (this.outboundTransports.length === 0) { + if (this.outboundTransports.length === 0 && !sessionIdFromInbound && !sessionId) { throw new AriesFrameworkError('Agent has no outbound transport!') } @@ -408,18 +418,73 @@ export class MessageSender { const outboundPackage = await this.packMessage(agentContext, { message, keys, endpoint: service.serviceEndpoint }) outboundPackage.endpoint = service.serviceEndpoint outboundPackage.connectionId = connection?.id - for (const transport of this.outboundTransports) { - const protocolScheme = getProtocolScheme(service.serviceEndpoint) - if (!protocolScheme) { - this.logger.warn('Service does not have valid protocolScheme.') - } else if (transport.supportedSchemes.includes(protocolScheme)) { - await transport.sendMessage(outboundPackage) - return + + if (this.outboundTransports.length !== 0) { + for (const transport of this.outboundTransports) { + const protocolScheme = getProtocolScheme(service.serviceEndpoint) + if (!protocolScheme) { + this.logger.warn('Service does not have valid protocolScheme.') + } else if (transport.supportedSchemes.includes(protocolScheme)) { + await transport.sendMessage(outboundPackage) + return + } + } + } else { + // throw new MessageSendingError(`sessionId and sessionIdFromInbound: ${sessionId} ${sessionIdFromInbound}`, { + // sessionId, + // sessionIdFromInbound, + // }) + if (sessionId || sessionIdFromInbound) { + // throw new MessageSendingError( + // `sessionId and sessionIdFromInbound in condition: ${sessionId} ${sessionIdFromInbound}`, + // { + // sessionId, + // sessionIdFromInbound, + // } + // ) + let session: TransportSession | undefined + + if (sessionId || sessionIdFromInbound) { + if (sessionIdFromInbound) { + session = this.transportService.findSessionById(sessionIdFromInbound) + } else if (sessionId) { + session = this.transportService.findSessionById(sessionId) + } + } + if (!session) { + // Try to send to already open session + throw new MessageSendingError(`no session for: ${sessionId} ${sessionIdFromInbound}`, { + sessionId, + sessionIdFromInbound, + }) + } + + if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { + this.logger.debug( + `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` + ) + try { + await this.sendMessageToSession(agentContext, session, message) + // this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) + return + } catch (error) { + // errors.push(error) + this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) + throw new MessageSendingError( + `Unable to send message to service: ${service.serviceEndpoint} ${JSON.stringify( + message.threadId + )} ${JSON.stringify(session)}`, + { + outboundMessageContext, + } + ) + } + } } } - throw new MessageSendingError(`Unable to send message to service: ${service.serviceEndpoint}`, { - outboundMessageContext, - }) + // throw new MessageSendingError(`Unable to send message to service: ${service.serviceEndpoint}`, { + // outboundMessageContext, + // }) } private async retrieveServicesByConnection( diff --git a/packages/core/src/agent/models/OutboundMessageContext.ts b/packages/core/src/agent/models/OutboundMessageContext.ts index 465b339eb2..fc86a81ae8 100644 --- a/packages/core/src/agent/models/OutboundMessageContext.ts +++ b/packages/core/src/agent/models/OutboundMessageContext.ts @@ -6,6 +6,7 @@ import type { OutOfBandRecord } from '../../modules/oob' import type { BaseRecord } from '../../storage/BaseRecord' import type { AgentMessage } from '../AgentMessage' import type { AgentContext } from '../context' +import type { InboundMessageContext } from './InboundMessageContext' import { AriesFrameworkError } from '../../error' @@ -17,6 +18,7 @@ export interface ServiceMessageParams { export interface OutboundMessageContextParams { agentContext: AgentContext + inboundMessageContext?: InboundMessageContext associatedRecord?: BaseRecord connection?: ConnectionRecord serviceParams?: ServiceMessageParams @@ -26,6 +28,7 @@ export interface OutboundMessageContextParams { export class OutboundMessageContext { public message: T + public sessionIdFromInbound?: string | undefined public connection?: ConnectionRecord public serviceParams?: ServiceMessageParams public outOfBand?: OutOfBandRecord @@ -33,8 +36,9 @@ export class OutboundMessageContext { public sessionId?: string public readonly agentContext: AgentContext - public constructor(message: T, context: OutboundMessageContextParams) { + public constructor(message: T, context: OutboundMessageContextParams, inboundContext?: InboundMessageContext) { this.message = message + this.sessionIdFromInbound = inboundContext?.sessionId ? inboundContext.sessionId : undefined this.connection = context.connection this.sessionId = context.sessionId this.outOfBand = context.outOfBand @@ -67,6 +71,7 @@ export class OutboundMessageContext { return { message: this.message, outOfBand: this.outOfBand, + sessionIdFromInbound: this.sessionIdFromInbound, associatedRecord: this.associatedRecord, sessionId: this.sessionId, serviceParams: this.serviceParams, diff --git a/packages/core/src/modules/proofs/ProofsApi.ts b/packages/core/src/modules/proofs/ProofsApi.ts index 52b45d5733..08322220e5 100644 --- a/packages/core/src/modules/proofs/ProofsApi.ts +++ b/packages/core/src/modules/proofs/ProofsApi.ts @@ -1,3 +1,5 @@ +import type { AgentMessage } from '../../agent/AgentMessage' +import type { Query } from '../../storage/StorageService' import type { AcceptProofOptions, AcceptProofProposalOptions, @@ -21,8 +23,6 @@ import type { import type { ProofProtocol } from './protocol/ProofProtocol' import type { ProofFormatsFromProtocols } from './protocol/ProofProtocolOptions' import type { ProofExchangeRecord } from './repository/ProofExchangeRecord' -import type { AgentMessage } from '../../agent/AgentMessage' -import type { Query } from '../../storage/StorageService' import { injectable } from 'tsyringe' diff --git a/packages/core/src/modules/proofs/protocol/BaseProofProtocol.ts b/packages/core/src/modules/proofs/protocol/BaseProofProtocol.ts index 9e4e9e8b1c..bd480acf87 100644 --- a/packages/core/src/modules/proofs/protocol/BaseProofProtocol.ts +++ b/packages/core/src/modules/proofs/protocol/BaseProofProtocol.ts @@ -1,3 +1,13 @@ +import type { AgentMessage } from '../../../agent/AgentMessage' +import type { FeatureRegistry } from '../../../agent/FeatureRegistry' +import type { AgentContext } from '../../../agent/context/AgentContext' +import type { InboundMessageContext } from '../../../agent/models/InboundMessageContext' +import type { DependencyManager } from '../../../plugins' +import type { Query } from '../../../storage/StorageService' +import type { ProblemReportMessage } from '../../problem-reports' +import type { ProofStateChangedEvent } from '../ProofEvents' +import type { ExtractProofFormats, ProofFormatService } from '../formats' +import type { ProofExchangeRecord } from '../repository' import type { ProofProtocol } from './ProofProtocol' import type { CreateProofProposalOptions, @@ -16,16 +26,6 @@ import type { SelectCredentialsForRequestOptions, SelectCredentialsForRequestReturn, } from './ProofProtocolOptions' -import type { AgentMessage } from '../../../agent/AgentMessage' -import type { FeatureRegistry } from '../../../agent/FeatureRegistry' -import type { AgentContext } from '../../../agent/context/AgentContext' -import type { InboundMessageContext } from '../../../agent/models/InboundMessageContext' -import type { DependencyManager } from '../../../plugins' -import type { Query } from '../../../storage/StorageService' -import type { ProblemReportMessage } from '../../problem-reports' -import type { ProofStateChangedEvent } from '../ProofEvents' -import type { ExtractProofFormats, ProofFormatService } from '../formats' -import type { ProofExchangeRecord } from '../repository' import { EventEmitter } from '../../../agent/EventEmitter' import { DidCommMessageRepository } from '../../../storage' diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index fcfaaaebf1..5ca75dbffb 100644 --- a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -1,9 +1,13 @@ import type { SubjectMessage } from '../../../../../../../../tests/transport/SubjectInboundTransport' +import type { TransportSession } from '../../../../../agent/TransportService' import type { ProofStateChangedEvent } from '../../../ProofEvents' import { Subject, ReplaySubject } from 'rxjs' -import { SubjectInboundTransport } from '../../../../../../../../tests/transport/SubjectInboundTransport' +import { + SubjectTransportSession, + SubjectInboundTransport, +} from '../../../../../../../../tests/transport/SubjectInboundTransport' import { SubjectOutboundTransport } from '../../../../../../../../tests/transport/SubjectOutboundTransport' import { setupProofsTest, @@ -12,10 +16,12 @@ import { prepareForIssuance, makeConnection, issueCredential, + setupProofsTestNoOutbound, } from '../../../../../../tests/helpers' import testLogger from '../../../../../../tests/logger' import { Agent } from '../../../../../agent/Agent' import { Attachment, AttachmentData } from '../../../../../decorators/attachment/Attachment' +import { ReturnRouteTypes } from '../../../../../decorators/transport/TransportDecorator' import { LinkedAttachment } from '../../../../../utils/LinkedAttachment' import { uuid } from '../../../../../utils/uuid' import { HandshakeProtocol } from '../../../../connections' @@ -198,6 +204,80 @@ describe('Present Proof', () => { await faberProofExchangeRecordPromise }) + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and using other transport', async () => { + testLogger.test('Faber sends presentation request to Alice') + + const { aliceAgent, faberAgent, aliceReplay, credDefId, faberReplay } = await setupProofsTestNoOutbound( + 'Faber connection-less Proofs - Auto Accept', + 'Alice connection-less Proofs - Auto Accept', + AutoAcceptProof.Always + ) + + agents = [aliceAgent, faberAgent] + + const attributes = { + name: new ProofAttributeInfo({ + name: 'name', + restrictions: [ + new AttributeFilter({ + credentialDefinitionId: credDefId, + }), + ], + }), + } + + const predicates = { + age: new ProofPredicateInfo({ + name: 'age', + predicateType: PredicateType.GreaterThanOrEqualTo, + predicateValue: 50, + restrictions: [ + new AttributeFilter({ + credentialDefinitionId: credDefId, + }), + ], + }), + } + + const aliceProofExchangeRecordPromise = waitForProofExchangeRecordSubject(aliceReplay, { + state: ProofState.Done, + }) + + const faberProofExchangeRecordPromise = waitForProofExchangeRecordSubject(faberReplay, { + state: ProofState.Done, + }) + + // eslint-disable-next-line prefer-const + let { message, proofRecord: faberProofExchangeRecord } = await faberAgent.proofs.createRequest({ + protocolVersion: 'v1', + proofFormats: { + indy: { + name: 'test-proof-request', + version: '1.0', + requestedAttributes: attributes, + requestedPredicates: predicates, + }, + }, + autoAcceptProof: AutoAcceptProof.Always, + }) + + const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ + recordId: faberProofExchangeRecord.id, + message, + domain: 'subject', + }) + + message.setReturnRouting(ReturnRouteTypes.all, message.thread?.threadId) + const aliceMessages = new Subject() + const session = new SubjectTransportSession(message.threadId, aliceMessages) + + await aliceAgent.receiveMessage(requestMessage.toJSON(), session) + + await aliceProofExchangeRecordPromise + + await faberProofExchangeRecordPromise + }) + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and both agents having a mediator', async () => { testLogger.test('Faber sends presentation request to Alice') diff --git a/packages/core/tests/helpers.ts b/packages/core/tests/helpers.ts index e8fd1f8a29..050777cee1 100644 --- a/packages/core/tests/helpers.ts +++ b/packages/core/tests/helpers.ts @@ -17,7 +17,8 @@ import type { import type { AgentModulesInput, EmptyModuleMap } from '../src/agent/AgentModules' import type { TrustPingReceivedEvent, TrustPingResponseReceivedEvent } from '../src/modules/connections/TrustPingEvents' import type { IndyOfferCredentialFormat } from '../src/modules/credentials/formats/indy/IndyCredentialFormat' -import type { ProofAttributeInfo, ProofPredicateInfoOptions } from '../src/modules/proofs/formats/indy/models' +import type { ProofAttributeInfo } from '../src/modules/proofs/formats/indy/models' +import type { ProofPredicateInfoOptions } from '../src/modules/proofs/formats/indy/models/ProofPredicateInfo' import type { AutoAcceptProof } from '../src/modules/proofs/models/ProofAutoAcceptType' import type { Awaited, WalletConfig } from '../src/types' import type { CredDef, Schema } from 'indy-sdk' @@ -65,7 +66,7 @@ import { OutOfBandRole } from '../src/modules/oob/domain/OutOfBandRole' import { OutOfBandState } from '../src/modules/oob/domain/OutOfBandState' import { OutOfBandInvitation } from '../src/modules/oob/messages' import { OutOfBandRecord } from '../src/modules/oob/repository' -import { PredicateType } from '../src/modules/proofs/formats/indy/models' +import { PredicateType, ProofPredicateInfo, AttributeFilter } from '../src/modules/proofs/formats/indy/models' import { ProofState } from '../src/modules/proofs/models/ProofState' import { V1PresentationPreview } from '../src/modules/proofs/protocol/v1/models/V1PresentationPreview' import { customDocumentLoader } from '../src/modules/vc/__tests__/documentLoader' @@ -478,6 +479,48 @@ export async function makeConnection(agentA: Agent, agentB: Agent) { return [agentAConnection, agentBConnection] } +// export async function makConnectionlessLegacyConnection(agentA: Agent, agentB: Agent, recordId: string) { +// const attributes = { +// name: new ProofAttributeInfo({ +// name: 'name', +// restrictions: [ +// new AttributeFilter({ +// credentialDefinitionId: credDefId, +// }), +// ], +// }), +// } + +// const predicates = { +// age: new ProofPredicateInfo({ +// name: 'age', +// predicateType: PredicateType.GreaterThanOrEqualTo, +// predicateValue: 50, +// restrictions: [ +// new AttributeFilter({ +// credentialDefinitionId: credDefId, +// }), +// ], +// }), +// } +// const { message: agentMessage } = await agentA.oob.createLegacyConnectionlessInvitation({ +// recordId: recordId, +// message, +// domain: `rxjs`, // or 'subject' +// }) +// const agentAOutOfBand = await agentA.oob.createInvitation({ +// handshakeProtocols: [HandshakeProtocol.Connections], +// }) + +// let { connectionRecord: agentBConnection } = await agentB.oob.receiveInvitation(agentAOutOfBand.outOfBandInvitation) + +// agentBConnection = await agentB.connections.returnWhenIsConnected(agentBConnection!.id) +// let [agentAConnection] = await agentA.connections.findAllByOutOfBandId(agentAOutOfBand.id) +// agentAConnection = await agentA.connections.returnWhenIsConnected(agentAConnection!.id) + +// return [agentAConnection, agentBConnection] +// } + export async function registerSchema(agent: Agent, schemaTemplate: SchemaTemplate): Promise { const schema = await agent.ledger.registerSchema(schemaTemplate) testLogger.test(`created schema with id ${schema.id}`, schema) @@ -883,3 +926,120 @@ export async function setupProofsTest(faberName: string, aliceName: string, auto aliceReplay, } } + +export async function setupProofsTestNoOutbound( + faberName: string, + aliceName: string, + autoAcceptProofs?: AutoAcceptProof +) { + const credentialPreview = V1CredentialPreview.fromRecord({ + name: 'John', + age: '99', + }) + + const unique = uuid().substring(0, 4) + + const faberAgentOptions = getAgentOptions(`${faberName} - ${unique}`, { + autoAcceptProofs, + endpoints: ['rxjs:faber'], + }) + + const aliceAgentOptions = getAgentOptions(`${aliceName} - ${unique}`, { + autoAcceptProofs, + endpoints: ['rxjs:alice'], + }) + + const faberMessages = new Subject() + const aliceMessages = new Subject() + + const subjectMap = { + 'rxjs:faber': faberMessages, + 'rxjs:alice': aliceMessages, + } + const faberAgent = new Agent(faberAgentOptions) + faberAgent.registerInboundTransport(new SubjectInboundTransport(faberMessages)) + faberAgent.registerOutboundTransport(new SubjectOutboundTransport(subjectMap)) + await faberAgent.initialize() + + const aliceAgent = new Agent(aliceAgentOptions) + aliceAgent.registerInboundTransport(new SubjectInboundTransport(aliceMessages)) + aliceAgent.registerOutboundTransport(new SubjectOutboundTransport(subjectMap)) + await aliceAgent.initialize() + + const { definition } = await prepareForIssuance(faberAgent, ['name', 'age', 'image_0', 'image_1']) + + const [agentAConnection, agentBConnection] = await makeConnection(faberAgent, aliceAgent) + expect(agentAConnection.isReady).toBe(true) + expect(agentBConnection.isReady).toBe(true) + + const faberConnection = agentAConnection + const aliceConnection = agentBConnection + + const presentationPreview = new V1PresentationPreview({ + attributes: [ + { + name: 'name', + credentialDefinitionId: definition.id, + referent: '0', + value: 'John', + }, + { + name: 'image_0', + credentialDefinitionId: definition.id, + }, + ], + predicates: [ + { + name: 'age', + credentialDefinitionId: definition.id, + predicate: PredicateType.GreaterThanOrEqualTo, + threshold: 50, + }, + ], + }) + + await issueCredential({ + issuerAgent: faberAgent, + issuerConnectionId: faberConnection.id, + holderAgent: aliceAgent, + credentialTemplate: { + credentialDefinitionId: definition.id, + attributes: credentialPreview.attributes, + linkedAttachments: [ + new LinkedAttachment({ + name: 'image_0', + attachment: new Attachment({ + filename: 'picture-of-a-cat.png', + data: new AttachmentData({ base64: 'cGljdHVyZSBvZiBhIGNhdA==' }), + }), + }), + new LinkedAttachment({ + name: 'image_1', + attachment: new Attachment({ + filename: 'picture-of-a-dog.png', + data: new AttachmentData({ base64: 'UGljdHVyZSBvZiBhIGRvZw==' }), + }), + }), + ], + }, + }) + const faberReplay = new ReplaySubject() + const aliceReplay = new ReplaySubject() + + faberAgent.events.observable(ProofEventTypes.ProofStateChanged).subscribe(faberReplay) + aliceAgent.events.observable(ProofEventTypes.ProofStateChanged).subscribe(aliceReplay) + + aliceAgent.resetOutboundTransport() + faberAgent.resetOutboundTransport() + + return { + faberAgent, + aliceAgent, + credDefId: definition.id, + faberConnection, + aliceConnection, + presentationPreview, + faberReplay, + aliceReplay, + } +} From b3c7a549315b05e2963894ccc332c02c7e605ff3 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Fri, 17 Feb 2023 14:47:14 +0100 Subject: [PATCH 02/23] chore: make some progress add some logging Signed-off-by: Moriarty --- packages/core/src/agent/MessageReceiver.ts | 1 - packages/core/src/agent/MessageSender.ts | 33 ++++++++++++++++--- packages/core/src/agent/TransportService.ts | 4 +-- .../v1-connectionless-proofs.e2e.test.ts | 5 +-- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 32585fcdab..94feb51556 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -121,7 +121,6 @@ export class MessageReceiver { message.setReturnRouting(ReturnRouteTypes.all, message.transport?.returnRouteThread) session.inboundMessage = message session.connectionId = connection?.id - session.connectionId = connection?.id messageContext.sessionId = session.id this.transportService.saveSession(session) } diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 27bfe4145a..4696371e70 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -98,10 +98,19 @@ export class MessageSender { } private async sendMessageToSession(agentContext: AgentContext, session: TransportSession, message: AgentMessage) { + console.log('====================================') + console.log('sendMessageToSession') + console.log('====================================') this.logger.debug(`Existing ${session.type} transport session has been found.`) if (!session.keys) { + console.log('====================================') + console.log(`no session keys ${JSON.stringify(session)}`) + console.log('====================================') throw new AriesFrameworkError(`There are no keys for the given ${session.type} transport session.`) } + console.log('====================================') + console.log('calling send ') + console.log('====================================') const encryptedMessage = await this.envelopeService.packMessage(agentContext, message, session.keys) await session.send(encryptedMessage) } @@ -212,9 +221,10 @@ export class MessageSender { let session: TransportSession | undefined if (sessionId || sessionIdFromInbound) { - session = sessionId - ? this.transportService.findSessionById(sessionId) - : this.transportService.findSessionById(sessionIdFromInbound) + session = this.transportService.findSessionById(sessionId) + // session = sessionId + // ? this.transportService.findSessionById(sessionId) + // : this.transportService.findSessionById(sessionIdFromInbound) } if (!session) { // Try to send to already open session @@ -354,6 +364,9 @@ export class MessageSender { public async sendMessageToService(outboundMessageContext: OutboundMessageContext) { try { + console.log('====================================') + console.log('send message to service try') + console.log('====================================') await this.sendToService(outboundMessageContext) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) } catch (error) { @@ -464,8 +477,20 @@ export class MessageSender { `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` ) try { + session.keys = keys + console.log('====================================') + console.log('session before sendMessageToSession ') + console.log(`${JSON.stringify(session)}`) + console.log('====================================') + // session.inboundMessage?.transport?.returnRoute = await this.sendMessageToSession(agentContext, session, message) - // this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) + console.log('====================================') + console.log('after sendMessageToSession') + console.log('====================================') + this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) + console.log('====================================') + console.log('after emitMessageSentEvent') + console.log('====================================') return } catch (error) { // errors.push(error) diff --git a/packages/core/src/agent/TransportService.ts b/packages/core/src/agent/TransportService.ts index 9455a045bb..7531f45c16 100644 --- a/packages/core/src/agent/TransportService.ts +++ b/packages/core/src/agent/TransportService.ts @@ -1,7 +1,7 @@ -import type { AgentMessage } from './AgentMessage' -import type { EnvelopeKeys } from './EnvelopeService' import type { DidDocument } from '../modules/dids' import type { EncryptedMessage } from '../types' +import type { AgentMessage } from './AgentMessage' +import type { EnvelopeKeys } from './EnvelopeService' import { DID_COMM_TRANSPORT_QUEUE } from '../constants' import { injectable } from '../plugins' diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 5ca75dbffb..8cf68a6758 100644 --- a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -264,11 +264,12 @@ describe('Present Proof', () => { const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ recordId: faberProofExchangeRecord.id, message, - domain: 'subject', + domain: 'rxjs:faber', }) - message.setReturnRouting(ReturnRouteTypes.all, message.thread?.threadId) + message.setReturnRouting(ReturnRouteTypes.all, message.threadId) const aliceMessages = new Subject() + const session = new SubjectTransportSession(message.threadId, aliceMessages) await aliceAgent.receiveMessage(requestMessage.toJSON(), session) From 356a0b533c5480e7469d8d9f66a1b30894ffd105 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Fri, 17 Feb 2023 15:21:19 +0100 Subject: [PATCH 03/23] chore: wip - possibly working Is state 'done' in observable pipe enough or is simply wrong? Signed-off-by: Moriarty --- packages/core/src/agent/MessageSender.ts | 7 ++++--- packages/core/tests/helpers.ts | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 4696371e70..52216dd763 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -486,6 +486,7 @@ export class MessageSender { await this.sendMessageToSession(agentContext, session, message) console.log('====================================') console.log('after sendMessageToSession') + console.log(`${JSON.stringify(outboundMessageContext)}`) console.log('====================================') this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) console.log('====================================') @@ -507,9 +508,9 @@ export class MessageSender { } } } - // throw new MessageSendingError(`Unable to send message to service: ${service.serviceEndpoint}`, { - // outboundMessageContext, - // }) + throw new MessageSendingError(`Unable to send message to service: ${service.serviceEndpoint}`, { + outboundMessageContext, + }) } private async retrieveServicesByConnection( diff --git a/packages/core/tests/helpers.ts b/packages/core/tests/helpers.ts index 050777cee1..50f008041a 100644 --- a/packages/core/tests/helpers.ts +++ b/packages/core/tests/helpers.ts @@ -230,7 +230,7 @@ export function waitForProofExchangeRecordSubject( filter((e) => previousState === undefined || e.payload.previousState === previousState), filter((e) => threadId === undefined || e.payload.proofRecord.threadId === threadId), filter((e) => parentThreadId === undefined || e.payload.proofRecord.parentThreadId === parentThreadId), - filter((e) => state === undefined || e.payload.proofRecord.state === state), + filter((e) => state === undefined || e.payload.proofRecord.state === state || state === 'done'), timeout(timeoutMs), catchError(() => { throw new Error( From ff98207f448f6298c391395d1842af8d7d44fff2 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Tue, 21 Feb 2023 14:43:27 +0100 Subject: [PATCH 04/23] chore: wip broken Signed-off-by: Moriarty --- packages/core/src/agent/Dispatcher.ts | 20 ++++- packages/core/src/agent/MessageReceiver.ts | 78 ++++++++++++++----- packages/core/src/agent/MessageSender.ts | 46 +++++++++-- .../v1-connectionless-proofs.e2e.test.ts | 17 +++- packages/core/tests/helpers.ts | 10 ++- 5 files changed, 138 insertions(+), 33 deletions(-) diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index 7750850d36..f483f4a367 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -78,11 +78,29 @@ class Dispatcher { } if (outboundMessage) { - outboundMessage.sessionIdFromInbound = messageContext.sessionId + // Store the sessionId of the inbound message, if there is one, so messages can later be send without + // outbound transport. + // if (message.service?.serviceEndpoint) { + + // } + console.log('====================================') + console.log('sessionIdFromInbound') + console.log(outboundMessage.sessionIdFromInbound) + console.log('====================================') + console.log('====================================') + console.log(outboundMessage.toJSON()) + console.log('====================================') this.logger.debug(`OutboundMessage ${outboundMessage}`, outboundMessage) + outboundMessage.sessionIdFromInbound = message.thread?.threadId if (outboundMessage.isOutboundServiceMessage()) { + console.log('====================================') + console.log('DISPATCHER ISOUTBOUNDMESSAGE') + console.log('====================================') await this.messageSender.sendMessageToService(outboundMessage) } else { + console.log('====================================') + console.log('DISPATCHER IS SESSION MESSAGE') + console.log('====================================') outboundMessage.sessionId = messageContext.sessionId await this.messageSender.sendMessage(outboundMessage) } diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 94feb51556..0cfdd9fb8b 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -7,7 +7,7 @@ import type { TransportSession } from './TransportService' import type { AgentContext } from './context' import { InjectionSymbols } from '../constants' -import { Key } from '../crypto' +import { Key, KeyType } from '../crypto' import { ReturnRouteTypes } from '../decorators/transport/TransportDecorator' import { AriesFrameworkError } from '../error' import { Logger } from '../logger' @@ -87,6 +87,9 @@ export class MessageReceiver { if (this.isEncryptedMessage(inboundMessage)) { await this.receiveEncryptedMessage(agentContext, inboundMessage as EncryptedMessage, session) } else if (this.isPlaintextMessage(inboundMessage)) { + console.log('====================================') + console.log('PLAINTEXT MESSAGE RECEIVED') + console.log('====================================') await this.receivePlaintextMessage(agentContext, inboundMessage, connection, session) } else { throw new AriesFrameworkError('Unable to parse incoming message: unrecognized format') @@ -105,25 +108,28 @@ export class MessageReceiver { ) { const message = await this.transformAndValidate(agentContext, plaintextMessage) const messageContext = new InboundMessageContext(message, { connection, agentContext, sessionId: session?.id }) - const { senderKey, recipientKey } = messageContext + // const { senderKey, recipientKey } = messageContext - if (message.hasAnyReturnRoute() && session) { - this.logger.debug(`Storing session for inbound message '${message.id}'`) - let keys - if (messageContext.recipientKey && messageContext.senderKey) { - keys = { - recipientKeys: [messageContext.senderKey], - routingKeys: [], - senderKey: messageContext.recipientKey, - } - } - session.keys = keys - message.setReturnRouting(ReturnRouteTypes.all, message.transport?.returnRouteThread) - session.inboundMessage = message - session.connectionId = connection?.id - messageContext.sessionId = session.id - this.transportService.saveSession(session) - } + // if (message.hasAnyReturnRoute() && session) { + // this.logger.debug(`Storing session for inbound message '${message.id}'`) + // let keys + // // const newKeys = agentContext.dependencyManager. + // if (messageContext.recipientKey && messageContext.senderKey) { + // // const newKeys = await agentContext.wallet.generateWalletKey() + // keys = { + // recipientKeys: [messageContext.senderKey], + // routingKeys: [], + // senderKey: messageContext.recipientKey, + // } + // // } + // session.keys = keys + // message.setReturnRouting(ReturnRouteTypes.all, message.transport?.returnRouteThread) + // session.inboundMessage = message + // session.connectionId = connection?.id + // messageContext.sessionId = session.id + // this.transportService.saveSession(session) + // } + // } await this.dispatcher.dispatch(messageContext) } @@ -133,6 +139,10 @@ export class MessageReceiver { session?: TransportSession ) { const decryptedMessage = await this.decryptMessage(agentContext, encryptedMessage) + console.log('====================================') + console.log('DECRYPTED MESSAGE IN receiveEncryptedMessage') + console.log(decryptedMessage) + console.log('====================================') const { plaintextMessage, senderKey, recipientKey } = decryptedMessage this.logger.info( @@ -143,6 +153,10 @@ export class MessageReceiver { const connection = await this.findConnectionByMessageKeys(agentContext, decryptedMessage) const message = await this.transformAndValidate(agentContext, plaintextMessage, connection) + console.log('====================================') + console.log('MESSAGE IN receiveEncryptedMessage') + console.log(message) + console.log('====================================') const messageContext = new InboundMessageContext(message, { // Only make the connection available in message context if the connection is ready @@ -153,6 +167,10 @@ export class MessageReceiver { recipientKey, agentContext, }) + console.log('====================================') + console.log('MESSAGE CONTEXT IN receiveEncryptedMessage') + console.log(messageContext) + console.log('====================================') // We want to save a session if there is a chance of returning outbound message via inbound transport. // That can happen when inbound message has `return_route` set to `all` or `thread`. @@ -172,6 +190,28 @@ export class MessageReceiver { // with mediators when you don't have a public endpoint yet. session.connectionId = connection?.id messageContext.sessionId = session.id + console.log('====================================') + console.log('SESSION IN ENCRYPTED') + console.log(JSON.stringify(session)) + console.log('====================================') + this.transportService.saveSession(session) + } else if (senderKey && recipientKey && message.service?.serviceEndpoint && session) { + console.log('====================================') + console.log('SESSION IN service endpoint') + console.log(JSON.stringify(session)) + console.log('====================================') + const keys = { + recipientKeys: [senderKey], + routingKeys: [], + senderKey: recipientKey, + } + session.keys = keys + session.inboundMessage = message + // We allow unready connections to be attached to the session as we want to be able to + // use return routing to make connections. This is especially useful for creating connections + // with mediators when you don't have a public endpoint yet. + session.connectionId = connection?.id + messageContext.sessionId = session.id this.transportService.saveSession(session) } else if (session) { // No need to wait for session to stay open if we're not actually going to respond to the message. diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 52216dd763..80f64b85d1 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -15,6 +15,7 @@ import { Subject } from 'rxjs' import { SubjectTransportSession } from '../../../../tests/transport/SubjectInboundTransport' import { DID_COMM_TRANSPORT_QUEUE, InjectionSymbols } from '../constants' +import { AckDecorator, AckValues } from '../decorators/ack/AckDecorator' import { ReturnRouteTypes } from '../decorators/transport/TransportDecorator' import { AriesFrameworkError, MessageSendingError } from '../error' import { Logger } from '../logger' @@ -112,6 +113,10 @@ export class MessageSender { console.log('calling send ') console.log('====================================') const encryptedMessage = await this.envelopeService.packMessage(agentContext, message, session.keys) + console.log('====================================') + console.log('sessionIdFromInbound encryptedMessage') + console.log(encryptedMessage) + console.log('====================================') await session.send(encryptedMessage) } @@ -220,11 +225,10 @@ export class MessageSender { let session: TransportSession | undefined - if (sessionId || sessionIdFromInbound) { - session = this.transportService.findSessionById(sessionId) - // session = sessionId - // ? this.transportService.findSessionById(sessionId) - // : this.transportService.findSessionById(sessionIdFromInbound) + if (sessionIdFromInbound) { + session = this.transportService.findSessionById(sessionIdFromInbound) + } else if (sessionId) { + this.transportService.findSessionById(sessionId) } if (!session) { // Try to send to already open session @@ -232,6 +236,9 @@ export class MessageSender { } if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { + console.log('====================================') + console.log('SENDMESSAGE HAS RETURN ROUTING') + console.log('====================================') this.logger.debug(`Found session with return routing for message '${message.id}' (connection '${connection.id}'`) try { await this.sendMessageToSession(agentContext, session, message) @@ -411,8 +418,13 @@ export class MessageSender { // Set return routing for message if requested if (returnRoute) { - message.setReturnRouting(ReturnRouteTypes.all) + message.setReturnRouting(ReturnRouteTypes.all, message.threadId) } + // message.pleaseAck = { on: [AckValues.Receipt] } + console.log('====================================') + console.log('SENDTOSERVICE MESSAGE') + console.log(message.toJSON()) + console.log('====================================') try { MessageValidator.validateSync(message) @@ -427,12 +439,21 @@ export class MessageSender { throw error } + // message.setReturnRouting(ReturnRouteTypes.all, message.threadId) const outboundPackage = await this.packMessage(agentContext, { message, keys, endpoint: service.serviceEndpoint }) outboundPackage.endpoint = service.serviceEndpoint outboundPackage.connectionId = connection?.id + console.log('====================================') + console.log('SENDTOSERVICE OUTBOUNDPACKAGE') + console.log(JSON.stringify(outboundPackage)) + console.log('====================================') + // Outbound transport is present if (this.outboundTransports.length !== 0) { + console.log('====================================') + console.log('IN TRANSPORT SEND TO SERVICE') + console.log('====================================') for (const transport of this.outboundTransports) { const protocolScheme = getProtocolScheme(service.serviceEndpoint) if (!protocolScheme) { @@ -442,11 +463,15 @@ export class MessageSender { return } } + // No outbound transport: Try retrieving session-based connection instead } else { // throw new MessageSendingError(`sessionId and sessionIdFromInbound: ${sessionId} ${sessionIdFromInbound}`, { // sessionId, // sessionIdFromInbound, // }) + console.log('====================================') + console.log('NOT IN TRANSPORT SEND TO SERVICE') + console.log('====================================') if (sessionId || sessionIdFromInbound) { // throw new MessageSendingError( // `sessionId and sessionIdFromInbound in condition: ${sessionId} ${sessionIdFromInbound}`, @@ -459,7 +484,9 @@ export class MessageSender { if (sessionId || sessionIdFromInbound) { if (sessionIdFromInbound) { - session = this.transportService.findSessionById(sessionIdFromInbound) + // session = this.transportService.findSessionById(sessionIdFromInbound) + const aliceMessages = new Subject() + session = new SubjectTransportSession(sessionIdFromInbound, aliceMessages) } else if (sessionId) { session = this.transportService.findSessionById(sessionId) } @@ -472,7 +499,11 @@ export class MessageSender { }) } + // if (outboundMessageContext.serviceParams?.service.serviceEndpoint) { if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { + console.log('====================================') + console.log('HAS RETURN ROUTING') + console.log('====================================') this.logger.debug( `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` ) @@ -483,6 +514,7 @@ export class MessageSender { console.log(`${JSON.stringify(session)}`) console.log('====================================') // session.inboundMessage?.transport?.returnRoute = + // await this.sendMessageToService(outboundMessageContext) await this.sendMessageToSession(agentContext, session, message) console.log('====================================') console.log('after sendMessageToSession') diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 8cf68a6758..50a520ba2d 100644 --- a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -20,6 +20,7 @@ import { } from '../../../../../../tests/helpers' import testLogger from '../../../../../../tests/logger' import { Agent } from '../../../../../agent/Agent' +import { AckValues } from '../../../../../decorators/ack/AckDecorator' import { Attachment, AttachmentData } from '../../../../../decorators/attachment/Attachment' import { ReturnRouteTypes } from '../../../../../decorators/transport/TransportDecorator' import { LinkedAttachment } from '../../../../../utils/LinkedAttachment' @@ -261,19 +262,27 @@ describe('Present Proof', () => { autoAcceptProof: AutoAcceptProof.Always, }) + // message.pleaseAck = { on: [AckValues.Receipt, AckValues.Outcome] } + message.setService({ + recipientKeys: [faberAgent.config.walletConfig?.key ?? ''], + serviceEndpoint: message.service?.serviceEndpoint ?? 'rxjs:faber', + }) const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ recordId: faberProofExchangeRecord.id, message, domain: 'rxjs:faber', }) - message.setReturnRouting(ReturnRouteTypes.all, message.threadId) + // faberAgent.resetOutboundTransport() + message.setReturnRouting(ReturnRouteTypes.all) + // console.log('====================================') + // console.log(message) + // console.log('====================================') const aliceMessages = new Subject() - const session = new SubjectTransportSession(message.threadId, aliceMessages) - - await aliceAgent.receiveMessage(requestMessage.toJSON(), session) + const session = new SubjectTransportSession(requestMessage.thread?.threadId ?? message.threadId, aliceMessages) + await aliceAgent.receiveMessage(requestMessage.toJSON()) await aliceProofExchangeRecordPromise await faberProofExchangeRecordPromise diff --git a/packages/core/tests/helpers.ts b/packages/core/tests/helpers.ts index 50f008041a..257bfa6685 100644 --- a/packages/core/tests/helpers.ts +++ b/packages/core/tests/helpers.ts @@ -230,7 +230,13 @@ export function waitForProofExchangeRecordSubject( filter((e) => previousState === undefined || e.payload.previousState === previousState), filter((e) => threadId === undefined || e.payload.proofRecord.threadId === threadId), filter((e) => parentThreadId === undefined || e.payload.proofRecord.parentThreadId === parentThreadId), - filter((e) => state === undefined || e.payload.proofRecord.state === state || state === 'done'), + filter((e) => state === undefined || e.payload.proofRecord.state === state), + // filter( + // (e) => + // state === undefined || + // e.payload.proofRecord.state === state || + // (state === 'done' && previousState === undefined && threadId === undefined && parentThreadId === undefined) + // ), timeout(timeoutMs), catchError(() => { throw new Error( @@ -479,7 +485,7 @@ export async function makeConnection(agentA: Agent, agentB: Agent) { return [agentAConnection, agentBConnection] } -// export async function makConnectionlessLegacyConnection(agentA: Agent, agentB: Agent, recordId: string) { +// export async function makeConnectionlessLegacyConnection(agentA: Agent, agentB: Agent, recordId: string) { // const attributes = { // name: new ProofAttributeInfo({ // name: 'name', From b8a9b473eebd2048185814fdbfd8175d84f4dc49 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Tue, 21 Feb 2023 16:08:49 +0100 Subject: [PATCH 05/23] chore: almost there Signed-off-by: Moriarty --- packages/core/src/agent/Dispatcher.ts | 2 +- packages/core/src/agent/MessageReceiver.ts | 11 +++++-- packages/core/src/agent/MessageSender.ts | 33 +++++++++++++------ .../v1-connectionless-proofs.e2e.test.ts | 4 +-- packages/core/tests/helpers.ts | 4 +-- 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index f483f4a367..dd2c38bfd3 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -91,7 +91,7 @@ class Dispatcher { console.log(outboundMessage.toJSON()) console.log('====================================') this.logger.debug(`OutboundMessage ${outboundMessage}`, outboundMessage) - outboundMessage.sessionIdFromInbound = message.thread?.threadId + outboundMessage.sessionIdFromInbound = messageContext.sessionId if (outboundMessage.isOutboundServiceMessage()) { console.log('====================================') console.log('DISPATCHER ISOUTBOUNDMESSAGE') diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 0cfdd9fb8b..64b3256cd5 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -192,13 +192,13 @@ export class MessageReceiver { messageContext.sessionId = session.id console.log('====================================') console.log('SESSION IN ENCRYPTED') - console.log(JSON.stringify(session)) + // console.log(JSON.stringify(session)) console.log('====================================') this.transportService.saveSession(session) } else if (senderKey && recipientKey && message.service?.serviceEndpoint && session) { console.log('====================================') console.log('SESSION IN service endpoint') - console.log(JSON.stringify(session)) + // console.log(JSON.stringify(session)) console.log('====================================') const keys = { recipientKeys: [senderKey], @@ -212,6 +212,13 @@ export class MessageReceiver { // with mediators when you don't have a public endpoint yet. session.connectionId = connection?.id messageContext.sessionId = session.id + // messageContext.sessionId = message.threadId + console.log('====================================') + console.log('SESSIONID IN service endpoint') + console.log(session.id) + console.log('inboundmessage IN service endpoint') + console.log(session.inboundMessage) + console.log('====================================') this.transportService.saveSession(session) } else if (session) { // No need to wait for session to stay open if we're not actually going to respond to the message. diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 80f64b85d1..e3a0b79c55 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -471,6 +471,8 @@ export class MessageSender { // }) console.log('====================================') console.log('NOT IN TRANSPORT SEND TO SERVICE') + console.log(sessionId) + console.log(sessionIdFromInbound) console.log('====================================') if (sessionId || sessionIdFromInbound) { // throw new MessageSendingError( @@ -485,19 +487,25 @@ export class MessageSender { if (sessionId || sessionIdFromInbound) { if (sessionIdFromInbound) { // session = this.transportService.findSessionById(sessionIdFromInbound) - const aliceMessages = new Subject() - session = new SubjectTransportSession(sessionIdFromInbound, aliceMessages) + // const aliceMessages = new Subject() + // session = new SubjectTransportSession(sessionIdFromInbound, aliceMessages) + session = this.transportService.findSessionById(`${sessionIdFromInbound}`) + // session = this.transportService.findSessionById(sessionIdFromInbound) + console.log('====================================') + console.log('SESSIONID from retrieve session from inbound prop') + console.log(session?.id) + console.log('====================================') } else if (sessionId) { session = this.transportService.findSessionById(sessionId) } } - if (!session) { - // Try to send to already open session - throw new MessageSendingError(`no session for: ${sessionId} ${sessionIdFromInbound}`, { - sessionId, - sessionIdFromInbound, - }) - } + // if (!session) { + // // Try to send to already open session + // throw new MessageSendingError(`no session for: ${sessionId} ${sessionIdFromInbound}`, { + // sessionId, + // sessionIdFromInbound, + // }) + // } // if (outboundMessageContext.serviceParams?.service.serviceEndpoint) { if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { @@ -508,7 +516,7 @@ export class MessageSender { `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` ) try { - session.keys = keys + // session.keys = keys console.log('====================================') console.log('session before sendMessageToSession ') console.log(`${JSON.stringify(session)}`) @@ -537,6 +545,11 @@ export class MessageSender { } ) } + } else if (outboundMessageContext.serviceParams?.service.serviceEndpoint && session) { + console.log('====================================') + console.log('HAS SERVICE ENDPOINT ROUTING') + console.log('====================================') + await this.sendMessageToSession(agentContext, session, message) } } } diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 50a520ba2d..8d71c888ac 100644 --- a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -273,8 +273,8 @@ describe('Present Proof', () => { domain: 'rxjs:faber', }) - // faberAgent.resetOutboundTransport() - message.setReturnRouting(ReturnRouteTypes.all) + faberAgent.resetOutboundTransport() + message.setReturnRouting(ReturnRouteTypes.all, message.threadId) // console.log('====================================') // console.log(message) // console.log('====================================') diff --git a/packages/core/tests/helpers.ts b/packages/core/tests/helpers.ts index 257bfa6685..5b2730e829 100644 --- a/packages/core/tests/helpers.ts +++ b/packages/core/tests/helpers.ts @@ -1035,8 +1035,8 @@ export async function setupProofsTestNoOutbound( faberAgent.events.observable(ProofEventTypes.ProofStateChanged).subscribe(faberReplay) aliceAgent.events.observable(ProofEventTypes.ProofStateChanged).subscribe(aliceReplay) - aliceAgent.resetOutboundTransport() - faberAgent.resetOutboundTransport() + // aliceAgent.resetOutboundTransport() + // faberAgent.resetOutboundTransport() return { faberAgent, From 27cc421ae8a4362bfbbbd4d14cf448effedc80e9 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Tue, 21 Feb 2023 16:46:40 +0100 Subject: [PATCH 06/23] chore: still need to tidy up but it worx Signed-off-by: Moriarty --- packages/core/src/agent/Dispatcher.ts | 18 ++++++++++++++++++ packages/core/src/agent/MessageReceiver.ts | 4 +++- packages/core/src/agent/MessageSender.ts | 11 ++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index dd2c38bfd3..784179c06a 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -52,10 +52,22 @@ class Dispatcher { let outboundMessage: OutboundMessageContext | void try { + console.log('====================================') + console.log('HANDLING OUTBOUND MESSAGE') + console.log('====================================') outboundMessage = await messageHandler.handle(messageContext) } catch (error) { const problemReportMessage = error.problemReport + console.log('====================================') + console.log(`Error handling message with type ${message.type}`, { + message: message.toJSON(), + error, + senderKey: senderKey?.fingerprint, + recipientKey: recipientKey?.fingerprint, + connectionId: connection?.id, + }) + console.log('====================================') if (problemReportMessage instanceof ProblemReportMessage && messageContext.connection) { problemReportMessage.setThread({ threadId: message.threadId, @@ -77,6 +89,9 @@ class Dispatcher { } } + console.log('====================================') + console.log('MADE IT HERE IN HANDLER') + console.log('====================================') if (outboundMessage) { // Store the sessionId of the inbound message, if there is one, so messages can later be send without // outbound transport. @@ -105,6 +120,9 @@ class Dispatcher { await this.messageSender.sendMessage(outboundMessage) } } + console.log('====================================') + console.log('MADE IT TO EVENTEMITTER') + console.log('====================================') // Emit event that allows to hook into received messages this.eventEmitter.emit(agentContext, { type: AgentEventTypes.AgentMessageProcessed, diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 64b3256cd5..127badc2d8 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -224,7 +224,9 @@ export class MessageReceiver { // No need to wait for session to stay open if we're not actually going to respond to the message. await session.close() } - + console.log('====================================') + console.log('DISPATCH MESSAGE CONTEXT UPON RECEIVED') + console.log('====================================') await this.dispatcher.dispatch(messageContext) } diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index e3a0b79c55..c0d330a9e5 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -378,7 +378,7 @@ export class MessageSender { this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) } catch (error) { this.logger.error( - `Message is undeliverable to service with id ${outboundMessageContext.serviceParams?.service.id}: ${error.message}`, + `Message is undeliverable to service with id ${outboundMessageContext.serviceParams?.service.id}: ${error}`, { message: outboundMessageContext.message, error, @@ -386,6 +386,9 @@ export class MessageSender { ) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.Undeliverable) + console.log('====================================') + console.log(`${JSON.stringify(error)}`) + console.log('====================================') throw new MessageSendingError( `Message is undeliverable to service with id ${outboundMessageContext.serviceParams?.service.id}: ${error.message}`, { outboundMessageContext } @@ -522,8 +525,8 @@ export class MessageSender { console.log(`${JSON.stringify(session)}`) console.log('====================================') // session.inboundMessage?.transport?.returnRoute = - // await this.sendMessageToService(outboundMessageContext) - await this.sendMessageToSession(agentContext, session, message) + await this.sendMessageToService(outboundMessageContext) + // await this.sendMessageToSession(agentContext, session, message) console.log('====================================') console.log('after sendMessageToSession') console.log(`${JSON.stringify(outboundMessageContext)}`) @@ -550,6 +553,8 @@ export class MessageSender { console.log('HAS SERVICE ENDPOINT ROUTING') console.log('====================================') await this.sendMessageToSession(agentContext, session, message) + this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) + return } } } From 8e2148fa3da863d69f3158ef901af33e6b66a281 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Wed, 22 Feb 2023 10:57:55 +0100 Subject: [PATCH 07/23] feat: use session based connection for sending without outbound connection This is required for BLE transport where there is no outbound registered. TODO: * extend tests to at least also cover V2 proof request handling Signed-off-by: Moriarty --- packages/core/src/agent/Dispatcher.ts | 36 ---- packages/core/src/agent/MessageReceiver.ts | 57 ------ packages/core/src/agent/MessageSender.ts | 163 +++++------------- .../v1-connectionless-proofs.e2e.test.ts | 19 +- packages/core/tests/helpers.ts | 159 ----------------- 5 files changed, 47 insertions(+), 387 deletions(-) diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index 784179c06a..d10a976090 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -52,22 +52,9 @@ class Dispatcher { let outboundMessage: OutboundMessageContext | void try { - console.log('====================================') - console.log('HANDLING OUTBOUND MESSAGE') - console.log('====================================') outboundMessage = await messageHandler.handle(messageContext) } catch (error) { const problemReportMessage = error.problemReport - - console.log('====================================') - console.log(`Error handling message with type ${message.type}`, { - message: message.toJSON(), - error, - senderKey: senderKey?.fingerprint, - recipientKey: recipientKey?.fingerprint, - connectionId: connection?.id, - }) - console.log('====================================') if (problemReportMessage instanceof ProblemReportMessage && messageContext.connection) { problemReportMessage.setThread({ threadId: message.threadId, @@ -89,40 +76,17 @@ class Dispatcher { } } - console.log('====================================') - console.log('MADE IT HERE IN HANDLER') - console.log('====================================') if (outboundMessage) { // Store the sessionId of the inbound message, if there is one, so messages can later be send without // outbound transport. - // if (message.service?.serviceEndpoint) { - - // } - console.log('====================================') - console.log('sessionIdFromInbound') - console.log(outboundMessage.sessionIdFromInbound) - console.log('====================================') - console.log('====================================') - console.log(outboundMessage.toJSON()) - console.log('====================================') - this.logger.debug(`OutboundMessage ${outboundMessage}`, outboundMessage) outboundMessage.sessionIdFromInbound = messageContext.sessionId if (outboundMessage.isOutboundServiceMessage()) { - console.log('====================================') - console.log('DISPATCHER ISOUTBOUNDMESSAGE') - console.log('====================================') await this.messageSender.sendMessageToService(outboundMessage) } else { - console.log('====================================') - console.log('DISPATCHER IS SESSION MESSAGE') - console.log('====================================') outboundMessage.sessionId = messageContext.sessionId await this.messageSender.sendMessage(outboundMessage) } } - console.log('====================================') - console.log('MADE IT TO EVENTEMITTER') - console.log('====================================') // Emit event that allows to hook into received messages this.eventEmitter.emit(agentContext, { type: AgentEventTypes.AgentMessageProcessed, diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 127badc2d8..a9816516cc 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -7,8 +7,6 @@ import type { TransportSession } from './TransportService' import type { AgentContext } from './context' import { InjectionSymbols } from '../constants' -import { Key, KeyType } from '../crypto' -import { ReturnRouteTypes } from '../decorators/transport/TransportDecorator' import { AriesFrameworkError } from '../error' import { Logger } from '../logger' import { ConnectionService } from '../modules/connections' @@ -87,9 +85,6 @@ export class MessageReceiver { if (this.isEncryptedMessage(inboundMessage)) { await this.receiveEncryptedMessage(agentContext, inboundMessage as EncryptedMessage, session) } else if (this.isPlaintextMessage(inboundMessage)) { - console.log('====================================') - console.log('PLAINTEXT MESSAGE RECEIVED') - console.log('====================================') await this.receivePlaintextMessage(agentContext, inboundMessage, connection, session) } else { throw new AriesFrameworkError('Unable to parse incoming message: unrecognized format') @@ -108,28 +103,7 @@ export class MessageReceiver { ) { const message = await this.transformAndValidate(agentContext, plaintextMessage) const messageContext = new InboundMessageContext(message, { connection, agentContext, sessionId: session?.id }) - // const { senderKey, recipientKey } = messageContext - // if (message.hasAnyReturnRoute() && session) { - // this.logger.debug(`Storing session for inbound message '${message.id}'`) - // let keys - // // const newKeys = agentContext.dependencyManager. - // if (messageContext.recipientKey && messageContext.senderKey) { - // // const newKeys = await agentContext.wallet.generateWalletKey() - // keys = { - // recipientKeys: [messageContext.senderKey], - // routingKeys: [], - // senderKey: messageContext.recipientKey, - // } - // // } - // session.keys = keys - // message.setReturnRouting(ReturnRouteTypes.all, message.transport?.returnRouteThread) - // session.inboundMessage = message - // session.connectionId = connection?.id - // messageContext.sessionId = session.id - // this.transportService.saveSession(session) - // } - // } await this.dispatcher.dispatch(messageContext) } @@ -139,10 +113,6 @@ export class MessageReceiver { session?: TransportSession ) { const decryptedMessage = await this.decryptMessage(agentContext, encryptedMessage) - console.log('====================================') - console.log('DECRYPTED MESSAGE IN receiveEncryptedMessage') - console.log(decryptedMessage) - console.log('====================================') const { plaintextMessage, senderKey, recipientKey } = decryptedMessage this.logger.info( @@ -153,10 +123,6 @@ export class MessageReceiver { const connection = await this.findConnectionByMessageKeys(agentContext, decryptedMessage) const message = await this.transformAndValidate(agentContext, plaintextMessage, connection) - console.log('====================================') - console.log('MESSAGE IN receiveEncryptedMessage') - console.log(message) - console.log('====================================') const messageContext = new InboundMessageContext(message, { // Only make the connection available in message context if the connection is ready @@ -167,16 +133,11 @@ export class MessageReceiver { recipientKey, agentContext, }) - console.log('====================================') - console.log('MESSAGE CONTEXT IN receiveEncryptedMessage') - console.log(messageContext) - console.log('====================================') // We want to save a session if there is a chance of returning outbound message via inbound transport. // That can happen when inbound message has `return_route` set to `all` or `thread`. // If `return_route` defines just `thread`, we decide later whether to use session according to outbound message `threadId`. if (senderKey && recipientKey && message.hasAnyReturnRoute() && session) { - // if (senderKey && recipientKey && message.hasAnyReturnRoute() && session) { this.logger.debug(`Storing session for inbound message '${message.id}'`) const keys = { recipientKeys: [senderKey], @@ -190,16 +151,8 @@ export class MessageReceiver { // with mediators when you don't have a public endpoint yet. session.connectionId = connection?.id messageContext.sessionId = session.id - console.log('====================================') - console.log('SESSION IN ENCRYPTED') - // console.log(JSON.stringify(session)) - console.log('====================================') this.transportService.saveSession(session) } else if (senderKey && recipientKey && message.service?.serviceEndpoint && session) { - console.log('====================================') - console.log('SESSION IN service endpoint') - // console.log(JSON.stringify(session)) - console.log('====================================') const keys = { recipientKeys: [senderKey], routingKeys: [], @@ -212,21 +165,11 @@ export class MessageReceiver { // with mediators when you don't have a public endpoint yet. session.connectionId = connection?.id messageContext.sessionId = session.id - // messageContext.sessionId = message.threadId - console.log('====================================') - console.log('SESSIONID IN service endpoint') - console.log(session.id) - console.log('inboundmessage IN service endpoint') - console.log(session.inboundMessage) - console.log('====================================') this.transportService.saveSession(session) } else if (session) { // No need to wait for session to stay open if we're not actually going to respond to the message. await session.close() } - console.log('====================================') - console.log('DISPATCH MESSAGE CONTEXT UPON RECEIVED') - console.log('====================================') await this.dispatcher.dispatch(messageContext) } diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index c0d330a9e5..37dee7efb8 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -73,7 +73,12 @@ export class MessageSender { this.outboundTransports.push(outboundTransport) } - public resetOutboundTransport() { + public async resetOutboundTransport() { + // NOTE: we could also make this void instead of an async fct. + // Maybe void is a bit dirty? + this.outboundTransports.forEach(async (obt) => { + await obt.stop() + }) this.outboundTransports = [] } @@ -99,24 +104,11 @@ export class MessageSender { } private async sendMessageToSession(agentContext: AgentContext, session: TransportSession, message: AgentMessage) { - console.log('====================================') - console.log('sendMessageToSession') - console.log('====================================') this.logger.debug(`Existing ${session.type} transport session has been found.`) if (!session.keys) { - console.log('====================================') - console.log(`no session keys ${JSON.stringify(session)}`) - console.log('====================================') throw new AriesFrameworkError(`There are no keys for the given ${session.type} transport session.`) } - console.log('====================================') - console.log('calling send ') - console.log('====================================') const encryptedMessage = await this.envelopeService.packMessage(agentContext, message, session.keys) - console.log('====================================') - console.log('sessionIdFromInbound encryptedMessage') - console.log(encryptedMessage) - console.log('====================================') await session.send(encryptedMessage) } @@ -236,9 +228,6 @@ export class MessageSender { } if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { - console.log('====================================') - console.log('SENDMESSAGE HAS RETURN ROUTING') - console.log('====================================') this.logger.debug(`Found session with return routing for message '${message.id}' (connection '${connection.id}'`) try { await this.sendMessageToSession(agentContext, session, message) @@ -371,9 +360,6 @@ export class MessageSender { public async sendMessageToService(outboundMessageContext: OutboundMessageContext) { try { - console.log('====================================') - console.log('send message to service try') - console.log('====================================') await this.sendToService(outboundMessageContext) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) } catch (error) { @@ -386,9 +372,6 @@ export class MessageSender { ) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.Undeliverable) - console.log('====================================') - console.log(`${JSON.stringify(error)}`) - console.log('====================================') throw new MessageSendingError( `Message is undeliverable to service with id ${outboundMessageContext.serviceParams?.service.id}: ${error.message}`, { outboundMessageContext } @@ -423,11 +406,6 @@ export class MessageSender { if (returnRoute) { message.setReturnRouting(ReturnRouteTypes.all, message.threadId) } - // message.pleaseAck = { on: [AckValues.Receipt] } - console.log('====================================') - console.log('SENDTOSERVICE MESSAGE') - console.log(message.toJSON()) - console.log('====================================') try { MessageValidator.validateSync(message) @@ -447,16 +425,9 @@ export class MessageSender { const outboundPackage = await this.packMessage(agentContext, { message, keys, endpoint: service.serviceEndpoint }) outboundPackage.endpoint = service.serviceEndpoint outboundPackage.connectionId = connection?.id - console.log('====================================') - console.log('SENDTOSERVICE OUTBOUNDPACKAGE') - console.log(JSON.stringify(outboundPackage)) - console.log('====================================') // Outbound transport is present if (this.outboundTransports.length !== 0) { - console.log('====================================') - console.log('IN TRANSPORT SEND TO SERVICE') - console.log('====================================') for (const transport of this.outboundTransports) { const protocolScheme = getProtocolScheme(service.serviceEndpoint) if (!protocolScheme) { @@ -467,94 +438,48 @@ export class MessageSender { } } // No outbound transport: Try retrieving session-based connection instead - } else { - // throw new MessageSendingError(`sessionId and sessionIdFromInbound: ${sessionId} ${sessionIdFromInbound}`, { - // sessionId, - // sessionIdFromInbound, - // }) - console.log('====================================') - console.log('NOT IN TRANSPORT SEND TO SERVICE') - console.log(sessionId) - console.log(sessionIdFromInbound) - console.log('====================================') - if (sessionId || sessionIdFromInbound) { - // throw new MessageSendingError( - // `sessionId and sessionIdFromInbound in condition: ${sessionId} ${sessionIdFromInbound}`, - // { - // sessionId, - // sessionIdFromInbound, - // } - // ) - let session: TransportSession | undefined - - if (sessionId || sessionIdFromInbound) { - if (sessionIdFromInbound) { - // session = this.transportService.findSessionById(sessionIdFromInbound) - // const aliceMessages = new Subject() - // session = new SubjectTransportSession(sessionIdFromInbound, aliceMessages) - session = this.transportService.findSessionById(`${sessionIdFromInbound}`) - // session = this.transportService.findSessionById(sessionIdFromInbound) - console.log('====================================') - console.log('SESSIONID from retrieve session from inbound prop') - console.log(session?.id) - console.log('====================================') - } else if (sessionId) { - session = this.transportService.findSessionById(sessionId) - } - } - // if (!session) { - // // Try to send to already open session - // throw new MessageSendingError(`no session for: ${sessionId} ${sessionIdFromInbound}`, { - // sessionId, - // sessionIdFromInbound, - // }) - // } - - // if (outboundMessageContext.serviceParams?.service.serviceEndpoint) { - if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { - console.log('====================================') - console.log('HAS RETURN ROUTING') - console.log('====================================') - this.logger.debug( - `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` + } else if (sessionId || sessionIdFromInbound) { + const session = sessionIdFromInbound + ? this.transportService.findSessionById(sessionIdFromInbound) + : sessionId + ? this.transportService.findSessionById(sessionId) + : undefined + + if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { + this.logger.debug( + `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` + ) + try { + await this.sendMessageToService(outboundMessageContext) + this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) + return + } catch (error) { + // errors.push(error) + this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) + throw new MessageSendingError( + `Unable to send message to service: ${service.serviceEndpoint} ${JSON.stringify( + message.threadId + )} ${JSON.stringify(session)}`, + { + outboundMessageContext, + } ) - try { - // session.keys = keys - console.log('====================================') - console.log('session before sendMessageToSession ') - console.log(`${JSON.stringify(session)}`) - console.log('====================================') - // session.inboundMessage?.transport?.returnRoute = - await this.sendMessageToService(outboundMessageContext) - // await this.sendMessageToSession(agentContext, session, message) - console.log('====================================') - console.log('after sendMessageToSession') - console.log(`${JSON.stringify(outboundMessageContext)}`) - console.log('====================================') - this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) - console.log('====================================') - console.log('after emitMessageSentEvent') - console.log('====================================') - return - } catch (error) { - // errors.push(error) - this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) - throw new MessageSendingError( - `Unable to send message to service: ${service.serviceEndpoint} ${JSON.stringify( - message.threadId - )} ${JSON.stringify(session)}`, - { - outboundMessageContext, - } - ) - } - } else if (outboundMessageContext.serviceParams?.service.serviceEndpoint && session) { - console.log('====================================') - console.log('HAS SERVICE ENDPOINT ROUTING') - console.log('====================================') + } + } else if (outboundMessageContext.serviceParams?.service.serviceEndpoint && session) { + try { await this.sendMessageToSession(agentContext, session, message) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) return + } catch (error) { + this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) + throw new MessageSendingError( + `Unable to send message to service: ${ + outboundMessageContext.serviceParams?.service.serviceEndpoint + } ${JSON.stringify(message.threadId)} ${JSON.stringify(session)}`, + { + outboundMessageContext, + } + ) } } } diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 8d71c888ac..f9a818e9a8 100644 --- a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -1,13 +1,9 @@ import type { SubjectMessage } from '../../../../../../../../tests/transport/SubjectInboundTransport' -import type { TransportSession } from '../../../../../agent/TransportService' import type { ProofStateChangedEvent } from '../../../ProofEvents' import { Subject, ReplaySubject } from 'rxjs' -import { - SubjectTransportSession, - SubjectInboundTransport, -} from '../../../../../../../../tests/transport/SubjectInboundTransport' +import { SubjectInboundTransport } from '../../../../../../../../tests/transport/SubjectInboundTransport' import { SubjectOutboundTransport } from '../../../../../../../../tests/transport/SubjectOutboundTransport' import { setupProofsTest, @@ -16,11 +12,9 @@ import { prepareForIssuance, makeConnection, issueCredential, - setupProofsTestNoOutbound, } from '../../../../../../tests/helpers' import testLogger from '../../../../../../tests/logger' import { Agent } from '../../../../../agent/Agent' -import { AckValues } from '../../../../../decorators/ack/AckDecorator' import { Attachment, AttachmentData } from '../../../../../decorators/attachment/Attachment' import { ReturnRouteTypes } from '../../../../../decorators/transport/TransportDecorator' import { LinkedAttachment } from '../../../../../utils/LinkedAttachment' @@ -208,7 +202,7 @@ describe('Present Proof', () => { test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and using other transport', async () => { testLogger.test('Faber sends presentation request to Alice') - const { aliceAgent, faberAgent, aliceReplay, credDefId, faberReplay } = await setupProofsTestNoOutbound( + const { aliceAgent, faberAgent, aliceReplay, credDefId, faberReplay } = await setupProofsTest( 'Faber connection-less Proofs - Auto Accept', 'Alice connection-less Proofs - Auto Accept', AutoAcceptProof.Always @@ -262,7 +256,6 @@ describe('Present Proof', () => { autoAcceptProof: AutoAcceptProof.Always, }) - // message.pleaseAck = { on: [AckValues.Receipt, AckValues.Outcome] } message.setService({ recipientKeys: [faberAgent.config.walletConfig?.key ?? ''], serviceEndpoint: message.service?.serviceEndpoint ?? 'rxjs:faber', @@ -273,14 +266,8 @@ describe('Present Proof', () => { domain: 'rxjs:faber', }) - faberAgent.resetOutboundTransport() + await faberAgent.resetOutboundTransport() message.setReturnRouting(ReturnRouteTypes.all, message.threadId) - // console.log('====================================') - // console.log(message) - // console.log('====================================') - const aliceMessages = new Subject() - - const session = new SubjectTransportSession(requestMessage.thread?.threadId ?? message.threadId, aliceMessages) await aliceAgent.receiveMessage(requestMessage.toJSON()) await aliceProofExchangeRecordPromise diff --git a/packages/core/tests/helpers.ts b/packages/core/tests/helpers.ts index 5b2730e829..d9d455f09c 100644 --- a/packages/core/tests/helpers.ts +++ b/packages/core/tests/helpers.ts @@ -485,48 +485,6 @@ export async function makeConnection(agentA: Agent, agentB: Agent) { return [agentAConnection, agentBConnection] } -// export async function makeConnectionlessLegacyConnection(agentA: Agent, agentB: Agent, recordId: string) { -// const attributes = { -// name: new ProofAttributeInfo({ -// name: 'name', -// restrictions: [ -// new AttributeFilter({ -// credentialDefinitionId: credDefId, -// }), -// ], -// }), -// } - -// const predicates = { -// age: new ProofPredicateInfo({ -// name: 'age', -// predicateType: PredicateType.GreaterThanOrEqualTo, -// predicateValue: 50, -// restrictions: [ -// new AttributeFilter({ -// credentialDefinitionId: credDefId, -// }), -// ], -// }), -// } -// const { message: agentMessage } = await agentA.oob.createLegacyConnectionlessInvitation({ -// recordId: recordId, -// message, -// domain: `rxjs`, // or 'subject' -// }) -// const agentAOutOfBand = await agentA.oob.createInvitation({ -// handshakeProtocols: [HandshakeProtocol.Connections], -// }) - -// let { connectionRecord: agentBConnection } = await agentB.oob.receiveInvitation(agentAOutOfBand.outOfBandInvitation) - -// agentBConnection = await agentB.connections.returnWhenIsConnected(agentBConnection!.id) -// let [agentAConnection] = await agentA.connections.findAllByOutOfBandId(agentAOutOfBand.id) -// agentAConnection = await agentA.connections.returnWhenIsConnected(agentAConnection!.id) - -// return [agentAConnection, agentBConnection] -// } - export async function registerSchema(agent: Agent, schemaTemplate: SchemaTemplate): Promise { const schema = await agent.ledger.registerSchema(schemaTemplate) testLogger.test(`created schema with id ${schema.id}`, schema) @@ -932,120 +890,3 @@ export async function setupProofsTest(faberName: string, aliceName: string, auto aliceReplay, } } - -export async function setupProofsTestNoOutbound( - faberName: string, - aliceName: string, - autoAcceptProofs?: AutoAcceptProof -) { - const credentialPreview = V1CredentialPreview.fromRecord({ - name: 'John', - age: '99', - }) - - const unique = uuid().substring(0, 4) - - const faberAgentOptions = getAgentOptions(`${faberName} - ${unique}`, { - autoAcceptProofs, - endpoints: ['rxjs:faber'], - }) - - const aliceAgentOptions = getAgentOptions(`${aliceName} - ${unique}`, { - autoAcceptProofs, - endpoints: ['rxjs:alice'], - }) - - const faberMessages = new Subject() - const aliceMessages = new Subject() - - const subjectMap = { - 'rxjs:faber': faberMessages, - 'rxjs:alice': aliceMessages, - } - const faberAgent = new Agent(faberAgentOptions) - faberAgent.registerInboundTransport(new SubjectInboundTransport(faberMessages)) - faberAgent.registerOutboundTransport(new SubjectOutboundTransport(subjectMap)) - await faberAgent.initialize() - - const aliceAgent = new Agent(aliceAgentOptions) - aliceAgent.registerInboundTransport(new SubjectInboundTransport(aliceMessages)) - aliceAgent.registerOutboundTransport(new SubjectOutboundTransport(subjectMap)) - await aliceAgent.initialize() - - const { definition } = await prepareForIssuance(faberAgent, ['name', 'age', 'image_0', 'image_1']) - - const [agentAConnection, agentBConnection] = await makeConnection(faberAgent, aliceAgent) - expect(agentAConnection.isReady).toBe(true) - expect(agentBConnection.isReady).toBe(true) - - const faberConnection = agentAConnection - const aliceConnection = agentBConnection - - const presentationPreview = new V1PresentationPreview({ - attributes: [ - { - name: 'name', - credentialDefinitionId: definition.id, - referent: '0', - value: 'John', - }, - { - name: 'image_0', - credentialDefinitionId: definition.id, - }, - ], - predicates: [ - { - name: 'age', - credentialDefinitionId: definition.id, - predicate: PredicateType.GreaterThanOrEqualTo, - threshold: 50, - }, - ], - }) - - await issueCredential({ - issuerAgent: faberAgent, - issuerConnectionId: faberConnection.id, - holderAgent: aliceAgent, - credentialTemplate: { - credentialDefinitionId: definition.id, - attributes: credentialPreview.attributes, - linkedAttachments: [ - new LinkedAttachment({ - name: 'image_0', - attachment: new Attachment({ - filename: 'picture-of-a-cat.png', - data: new AttachmentData({ base64: 'cGljdHVyZSBvZiBhIGNhdA==' }), - }), - }), - new LinkedAttachment({ - name: 'image_1', - attachment: new Attachment({ - filename: 'picture-of-a-dog.png', - data: new AttachmentData({ base64: 'UGljdHVyZSBvZiBhIGRvZw==' }), - }), - }), - ], - }, - }) - const faberReplay = new ReplaySubject() - const aliceReplay = new ReplaySubject() - - faberAgent.events.observable(ProofEventTypes.ProofStateChanged).subscribe(faberReplay) - aliceAgent.events.observable(ProofEventTypes.ProofStateChanged).subscribe(aliceReplay) - - // aliceAgent.resetOutboundTransport() - // faberAgent.resetOutboundTransport() - - return { - faberAgent, - aliceAgent, - credDefId: definition.id, - faberConnection, - aliceConnection, - presentationPreview, - faberReplay, - aliceReplay, - } -} From ec30c753ae76ae9f605ab9924476ee6fc9d3c55d Mon Sep 17 00:00:00 2001 From: Jim Ezesinachi Date: Wed, 22 Feb 2023 13:06:00 +0100 Subject: [PATCH 08/23] feat: added protocol v2 tests and renamed test files Signed-off-by: Jim Ezesinachi --- packages/core/src/agent/Agent.ts | 4 +- ...v1-indy-connectionless-proofs.e2e.test.ts} | 3 + ...t.ts => v1-indy-proof-negotiation.test.ts} | 0 ...=> v1-indy-proof-presentation.e2e.test.ts} | 0 ....ts => v1-indy-proof-proposal.e2e.test.ts} | 0 ...=> v1-indy-proofs-auto-accept.e2e.test.ts} | 0 .../v2-indy-connectionless-proofs.e2e.test.ts | 81 +++++++++++++++++++ ...=> v2-indy-proofs-auto-accept.e2e.test.ts} | 0 8 files changed, 86 insertions(+), 2 deletions(-) rename packages/core/src/modules/proofs/protocol/v1/__tests__/{v1-connectionless-proofs.e2e.test.ts => v1-indy-connectionless-proofs.e2e.test.ts} (99%) rename packages/core/src/modules/proofs/protocol/v1/__tests__/{indy-proof-negotiation.test.ts => v1-indy-proof-negotiation.test.ts} (100%) rename packages/core/src/modules/proofs/protocol/v1/__tests__/{indy-proof-presentation.test.e2e.ts => v1-indy-proof-presentation.e2e.test.ts} (100%) rename packages/core/src/modules/proofs/protocol/v1/__tests__/{indy-proof-proposal.test.e2e.ts => v1-indy-proof-proposal.e2e.test.ts} (100%) rename packages/core/src/modules/proofs/protocol/v1/__tests__/{v1-proofs-auto-accept.e2e.test.ts => v1-indy-proofs-auto-accept.e2e.test.ts} (100%) rename packages/core/src/modules/proofs/protocol/v2/__tests__/{v2-indy-proofs-auto-accept.2e.test.ts => v2-indy-proofs-auto-accept.e2e.test.ts} (100%) diff --git a/packages/core/src/agent/Agent.ts b/packages/core/src/agent/Agent.ts index 04b2e5600c..6b3d3f2802 100644 --- a/packages/core/src/agent/Agent.ts +++ b/packages/core/src/agent/Agent.ts @@ -141,8 +141,8 @@ export class Agent extends BaseAge this.messageSender.registerOutboundTransport(outboundTransport) } - public resetOutboundTransport() { - this.messageSender.resetOutboundTransport() + public async resetOutboundTransport() { + await this.messageSender.resetOutboundTransport() } public get outboundTransports() { diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-connectionless-proofs.e2e.test.ts similarity index 99% rename from packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts rename to packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-connectionless-proofs.e2e.test.ts index f9a818e9a8..87bff0a303 100644 --- a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-connectionless-proofs.e2e.test.ts @@ -91,12 +91,14 @@ describe('Present Proof', () => { message, domain: 'https://a-domain.com', }) + await aliceAgent.receiveMessage(requestMessage.toJSON()) testLogger.test('Alice waits for presentation request from Faber') let aliceProofExchangeRecord = await aliceProofExchangeRecordPromise testLogger.test('Alice accepts presentation request from Faber') + const requestedCredentials = await aliceAgent.proofs.selectCredentialsForRequest({ proofRecordId: aliceProofExchangeRecord.id, }) @@ -348,6 +350,7 @@ describe('Present Proof', () => { expect(faberConnection.isReady).toBe(true) expect(aliceConnection.isReady).toBe(true) + // issue credential with two linked attachments await issueCredential({ issuerAgent: faberAgent, issuerConnectionId: faberConnection.id, diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/indy-proof-negotiation.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proof-negotiation.test.ts similarity index 100% rename from packages/core/src/modules/proofs/protocol/v1/__tests__/indy-proof-negotiation.test.ts rename to packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proof-negotiation.test.ts diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/indy-proof-presentation.test.e2e.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proof-presentation.e2e.test.ts similarity index 100% rename from packages/core/src/modules/proofs/protocol/v1/__tests__/indy-proof-presentation.test.e2e.ts rename to packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proof-presentation.e2e.test.ts diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/indy-proof-proposal.test.e2e.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proof-proposal.e2e.test.ts similarity index 100% rename from packages/core/src/modules/proofs/protocol/v1/__tests__/indy-proof-proposal.test.e2e.ts rename to packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proof-proposal.e2e.test.ts diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-proofs-auto-accept.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proofs-auto-accept.e2e.test.ts similarity index 100% rename from packages/core/src/modules/proofs/protocol/v1/__tests__/v1-proofs-auto-accept.e2e.test.ts rename to packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-proofs-auto-accept.e2e.test.ts diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts index f924869f3f..b19fd76c03 100644 --- a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts @@ -16,6 +16,7 @@ import { import testLogger from '../../../../../../tests/logger' import { Agent } from '../../../../../agent/Agent' import { Attachment, AttachmentData } from '../../../../../decorators/attachment/Attachment' +import { ReturnRouteTypes } from '../../../../../decorators/transport/TransportDecorator' import { LinkedAttachment } from '../../../../../utils/LinkedAttachment' import { uuid } from '../../../../../utils/uuid' import { HandshakeProtocol } from '../../../../connections' @@ -192,6 +193,7 @@ describe('Present Proof', () => { message, domain: 'https://a-domain.com', }) + await aliceAgent.receiveMessage(requestMessage.toJSON()) await aliceProofExchangeRecordPromise @@ -199,6 +201,82 @@ describe('Present Proof', () => { await faberProofExchangeRecordPromise }) + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and using other transport', async () => { + testLogger.test('Faber sends presentation request to Alice') + + const { aliceAgent, faberAgent, aliceReplay, credDefId, faberReplay } = await setupProofsTest( + 'Faber connection-less Proofs - Auto Accept', + 'Alice connection-less Proofs - Auto Accept', + AutoAcceptProof.Always + ) + + agents = [aliceAgent, faberAgent] + + const attributes = { + name: new ProofAttributeInfo({ + name: 'name', + restrictions: [ + new AttributeFilter({ + credentialDefinitionId: credDefId, + }), + ], + }), + } + + const predicates = { + age: new ProofPredicateInfo({ + name: 'age', + predicateType: PredicateType.GreaterThanOrEqualTo, + predicateValue: 50, + restrictions: [ + new AttributeFilter({ + credentialDefinitionId: credDefId, + }), + ], + }), + } + + const aliceProofExchangeRecordPromise = waitForProofExchangeRecordSubject(aliceReplay, { + state: ProofState.Done, + }) + + const faberProofExchangeRecordPromise = waitForProofExchangeRecordSubject(faberReplay, { + state: ProofState.Done, + }) + + // eslint-disable-next-line prefer-const + let { message, proofRecord: faberProofExchangeRecord } = await faberAgent.proofs.createRequest({ + protocolVersion: 'v2', + proofFormats: { + indy: { + name: 'test-proof-request', + version: '1.0', + requestedAttributes: attributes, + requestedPredicates: predicates, + }, + }, + autoAcceptProof: AutoAcceptProof.Always, + }) + + message.setService({ + recipientKeys: [faberAgent.config.walletConfig?.key ?? ''], + serviceEndpoint: message.service?.serviceEndpoint ?? 'rxjs:faber', + }) + const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ + recordId: faberProofExchangeRecord.id, + message, + domain: 'rxjs:faber', + }) + + await faberAgent.resetOutboundTransport() + message.setReturnRouting(ReturnRouteTypes.all, message.threadId) + + await aliceAgent.receiveMessage(requestMessage.toJSON()) + await aliceProofExchangeRecordPromise + + await faberProofExchangeRecordPromise + }) + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and both agents having a mediator', async () => { testLogger.test('Faber sends presentation request to Alice') @@ -374,5 +452,8 @@ describe('Present Proof', () => { await aliceProofExchangeRecordPromise await faberProofExchangeRecordPromise + + await aliceAgent.mediationRecipient.stopMessagePickup() + await faberAgent.mediationRecipient.stopMessagePickup() }) }) diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-proofs-auto-accept.2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-proofs-auto-accept.e2e.test.ts similarity index 100% rename from packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-proofs-auto-accept.2e.test.ts rename to packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-proofs-auto-accept.e2e.test.ts From 634a86f9eb181665df54cdda5a3b63976fdbe3dd Mon Sep 17 00:00:00 2001 From: Moriarty Date: Wed, 22 Feb 2023 13:37:32 +0100 Subject: [PATCH 09/23] chore: minor cosmetics of test naming Signed-off-by: Moriarty --- packages/core/src/agent/MessageSender.ts | 19 ++++++------------- .../v1-indy-connectionless-proofs.e2e.test.ts | 2 +- .../v2-indy-connectionless-proofs.e2e.test.ts | 2 +- packages/core/tests/helpers.ts | 8 +------- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 37dee7efb8..336d29b1b2 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -1,21 +1,16 @@ -import type { SubjectMessage } from '../../../../tests/transport/SubjectInboundTransport' +import type { AgentMessage } from './AgentMessage' +import type { EnvelopeKeys } from './EnvelopeService' +import type { AgentMessageSentEvent } from './Events' +import type { TransportSession } from './TransportService' +import type { AgentContext } from './context' import type { ConnectionRecord } from '../modules/connections' import type { ResolvedDidCommService } from '../modules/didcomm' import type { DidDocument } from '../modules/dids' import type { OutOfBandRecord } from '../modules/oob/repository' import type { OutboundTransport } from '../transport/OutboundTransport' import type { OutboundPackage, EncryptedMessage } from '../types' -import type { AgentMessage } from './AgentMessage' -import type { EnvelopeKeys } from './EnvelopeService' -import type { AgentMessageSentEvent } from './Events' -import type { TransportSession } from './TransportService' -import type { AgentContext } from './context' - -import { Subject } from 'rxjs' -import { SubjectTransportSession } from '../../../../tests/transport/SubjectInboundTransport' import { DID_COMM_TRANSPORT_QUEUE, InjectionSymbols } from '../constants' -import { AckDecorator, AckValues } from '../decorators/ack/AckDecorator' import { ReturnRouteTypes } from '../decorators/transport/TransportDecorator' import { AriesFrameworkError, MessageSendingError } from '../error' import { Logger } from '../logger' @@ -420,7 +415,6 @@ export class MessageSender { throw error } - // message.setReturnRouting(ReturnRouteTypes.all, message.threadId) const outboundPackage = await this.packMessage(agentContext, { message, keys, endpoint: service.serviceEndpoint }) outboundPackage.endpoint = service.serviceEndpoint @@ -454,7 +448,6 @@ export class MessageSender { this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) return } catch (error) { - // errors.push(error) this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) throw new MessageSendingError( `Unable to send message to service: ${service.serviceEndpoint} ${JSON.stringify( @@ -475,7 +468,7 @@ export class MessageSender { throw new MessageSendingError( `Unable to send message to service: ${ outboundMessageContext.serviceParams?.service.serviceEndpoint - } ${JSON.stringify(message.threadId)} ${JSON.stringify(session)}`, + } with threadId ${JSON.stringify(message.threadId)} `, { outboundMessageContext, } diff --git a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-connectionless-proofs.e2e.test.ts index 87bff0a303..dd318c7453 100644 --- a/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v1/__tests__/v1-indy-connectionless-proofs.e2e.test.ts @@ -201,7 +201,7 @@ describe('Present Proof', () => { await faberProofExchangeRecordPromise }) - test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and using other transport', async () => { + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without outbound transport', async () => { testLogger.test('Faber sends presentation request to Alice') const { aliceAgent, faberAgent, aliceReplay, credDefId, faberReplay } = await setupProofsTest( diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts index b19fd76c03..537e49cc70 100644 --- a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts @@ -201,7 +201,7 @@ describe('Present Proof', () => { await faberProofExchangeRecordPromise }) - test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and using other transport', async () => { + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without outbound transport', async () => { testLogger.test('Faber sends presentation request to Alice') const { aliceAgent, faberAgent, aliceReplay, credDefId, faberReplay } = await setupProofsTest( diff --git a/packages/core/tests/helpers.ts b/packages/core/tests/helpers.ts index d9d455f09c..56255b162e 100644 --- a/packages/core/tests/helpers.ts +++ b/packages/core/tests/helpers.ts @@ -66,7 +66,7 @@ import { OutOfBandRole } from '../src/modules/oob/domain/OutOfBandRole' import { OutOfBandState } from '../src/modules/oob/domain/OutOfBandState' import { OutOfBandInvitation } from '../src/modules/oob/messages' import { OutOfBandRecord } from '../src/modules/oob/repository' -import { PredicateType, ProofPredicateInfo, AttributeFilter } from '../src/modules/proofs/formats/indy/models' +import { PredicateType } from '../src/modules/proofs/formats/indy/models' import { ProofState } from '../src/modules/proofs/models/ProofState' import { V1PresentationPreview } from '../src/modules/proofs/protocol/v1/models/V1PresentationPreview' import { customDocumentLoader } from '../src/modules/vc/__tests__/documentLoader' @@ -231,12 +231,6 @@ export function waitForProofExchangeRecordSubject( filter((e) => threadId === undefined || e.payload.proofRecord.threadId === threadId), filter((e) => parentThreadId === undefined || e.payload.proofRecord.parentThreadId === parentThreadId), filter((e) => state === undefined || e.payload.proofRecord.state === state), - // filter( - // (e) => - // state === undefined || - // e.payload.proofRecord.state === state || - // (state === 'done' && previousState === undefined && threadId === undefined && parentThreadId === undefined) - // ), timeout(timeoutMs), catchError(() => { throw new Error( From 6f98f983f7b3262a6ad037411b7f7b0aa3b6e47a Mon Sep 17 00:00:00 2001 From: Moriarty Date: Thu, 23 Feb 2023 10:32:10 +0100 Subject: [PATCH 10/23] chore: code review feedback Signed-off-by: Moriarty --- packages/core/src/agent/MessageReceiver.ts | 22 ++++------------- packages/core/src/agent/MessageSender.ts | 24 +++++++++---------- .../agent/models/OutboundMessageContext.ts | 6 ++--- .../v2-indy-connectionless-proofs.e2e.test.ts | 2 +- 4 files changed, 19 insertions(+), 35 deletions(-) diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index a9816516cc..7527863672 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -1,10 +1,10 @@ -import type { ConnectionRecord } from '../modules/connections' -import type { InboundTransport } from '../transport' -import type { EncryptedMessage, PlaintextMessage } from '../types' import type { AgentMessage } from './AgentMessage' import type { DecryptedMessageContext, EnvelopeKeys } from './EnvelopeService' import type { TransportSession } from './TransportService' import type { AgentContext } from './context' +import type { ConnectionRecord } from '../modules/connections' +import type { InboundTransport } from '../transport' +import type { EncryptedMessage, PlaintextMessage } from '../types' import { InjectionSymbols } from '../constants' import { AriesFrameworkError } from '../error' @@ -137,7 +137,7 @@ export class MessageReceiver { // We want to save a session if there is a chance of returning outbound message via inbound transport. // That can happen when inbound message has `return_route` set to `all` or `thread`. // If `return_route` defines just `thread`, we decide later whether to use session according to outbound message `threadId`. - if (senderKey && recipientKey && message.hasAnyReturnRoute() && session) { + if (senderKey && recipientKey && session && (message.hasAnyReturnRoute() || message.service?.serviceEndpoint)) { this.logger.debug(`Storing session for inbound message '${message.id}'`) const keys = { recipientKeys: [senderKey], @@ -152,20 +152,6 @@ export class MessageReceiver { session.connectionId = connection?.id messageContext.sessionId = session.id this.transportService.saveSession(session) - } else if (senderKey && recipientKey && message.service?.serviceEndpoint && session) { - const keys = { - recipientKeys: [senderKey], - routingKeys: [], - senderKey: recipientKey, - } - session.keys = keys - session.inboundMessage = message - // We allow unready connections to be attached to the session as we want to be able to - // use return routing to make connections. This is especially useful for creating connections - // with mediators when you don't have a public endpoint yet. - session.connectionId = connection?.id - messageContext.sessionId = session.id - this.transportService.saveSession(session) } else if (session) { // No need to wait for session to stay open if we're not actually going to respond to the message. await session.close() diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 336d29b1b2..d6c561f76f 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -71,9 +71,9 @@ export class MessageSender { public async resetOutboundTransport() { // NOTE: we could also make this void instead of an async fct. // Maybe void is a bit dirty? - this.outboundTransports.forEach(async (obt) => { - await obt.stop() - }) + for (const transport of this.outboundTransports) { + await transport.stop() + } this.outboundTransports = [] } @@ -215,7 +215,7 @@ export class MessageSender { if (sessionIdFromInbound) { session = this.transportService.findSessionById(sessionIdFromInbound) } else if (sessionId) { - this.transportService.findSessionById(sessionId) + session = this.transportService.findSessionById(sessionId) } if (!session) { // Try to send to already open session @@ -359,7 +359,7 @@ export class MessageSender { this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) } catch (error) { this.logger.error( - `Message is undeliverable to service with id ${outboundMessageContext.serviceParams?.service.id}: ${error}`, + `Message is undeliverable to service with id ${outboundMessageContext.serviceParams?.service.id}: ${error.message}`, { message: outboundMessageContext.message, error, @@ -425,7 +425,7 @@ export class MessageSender { for (const transport of this.outboundTransports) { const protocolScheme = getProtocolScheme(service.serviceEndpoint) if (!protocolScheme) { - this.logger.warn('Service does not have valid protocolScheme.') + this.logger.warn('Service does not have a protocol scheme.') } else if (transport.supportedSchemes.includes(protocolScheme)) { await transport.sendMessage(outboundPackage) return @@ -450,9 +450,9 @@ export class MessageSender { } catch (error) { this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) throw new MessageSendingError( - `Unable to send message to service: ${service.serviceEndpoint} ${JSON.stringify( - message.threadId - )} ${JSON.stringify(session)}`, + `Unable to send message to service: ${service.serviceEndpoint} ${message.threadId} ${JSON.stringify( + session + )}`, { outboundMessageContext, } @@ -464,11 +464,9 @@ export class MessageSender { this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) return } catch (error) { - this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) + this.logger.error(`Sending an outbound message via session failed with error: `, error) throw new MessageSendingError( - `Unable to send message to service: ${ - outboundMessageContext.serviceParams?.service.serviceEndpoint - } with threadId ${JSON.stringify(message.threadId)} `, + `Unable to send message to service: ${outboundMessageContext.serviceParams?.service.serviceEndpoint} with threadId ${message.threadId} `, { outboundMessageContext, } diff --git a/packages/core/src/agent/models/OutboundMessageContext.ts b/packages/core/src/agent/models/OutboundMessageContext.ts index fc86a81ae8..ca3e0c2119 100644 --- a/packages/core/src/agent/models/OutboundMessageContext.ts +++ b/packages/core/src/agent/models/OutboundMessageContext.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import type { InboundMessageContext } from './InboundMessageContext' import type { Key } from '../../crypto' import type { ConnectionRecord } from '../../modules/connections' import type { ResolvedDidCommService } from '../../modules/didcomm' @@ -6,7 +7,6 @@ import type { OutOfBandRecord } from '../../modules/oob' import type { BaseRecord } from '../../storage/BaseRecord' import type { AgentMessage } from '../AgentMessage' import type { AgentContext } from '../context' -import type { InboundMessageContext } from './InboundMessageContext' import { AriesFrameworkError } from '../../error' @@ -28,7 +28,7 @@ export interface OutboundMessageContextParams { export class OutboundMessageContext { public message: T - public sessionIdFromInbound?: string | undefined + public sessionIdFromInbound?: string public connection?: ConnectionRecord public serviceParams?: ServiceMessageParams public outOfBand?: OutOfBandRecord @@ -38,7 +38,7 @@ export class OutboundMessageContext { public constructor(message: T, context: OutboundMessageContextParams, inboundContext?: InboundMessageContext) { this.message = message - this.sessionIdFromInbound = inboundContext?.sessionId ? inboundContext.sessionId : undefined + this.sessionIdFromInbound = inboundContext?.sessionId this.connection = context.connection this.sessionId = context.sessionId this.outOfBand = context.outOfBand diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts index 537e49cc70..10dfcf40e8 100644 --- a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts @@ -201,7 +201,7 @@ describe('Present Proof', () => { await faberProofExchangeRecordPromise }) - test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without outbound transport', async () => { + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without an outbound transport', async () => { testLogger.test('Faber sends presentation request to Alice') const { aliceAgent, faberAgent, aliceReplay, credDefId, faberReplay } = await setupProofsTest( From a599cfbde099d531d7ccd34379bcb2481694291b Mon Sep 17 00:00:00 2001 From: Moriarty Date: Fri, 24 Feb 2023 13:33:44 +0100 Subject: [PATCH 11/23] chore: code review feedback Signed-off-by: Moriarty --- .../v1-connectionless-proofs.e2e.test.ts | 6 ++- .../v1/handlers/V1PresentationHandler.ts | 1 + packages/core/src/agent/Agent.ts | 4 +- packages/core/src/agent/Dispatcher.ts | 2 +- packages/core/src/agent/MessageReceiver.ts | 23 ++++++--- packages/core/src/agent/MessageSender.ts | 48 +++++++------------ .../agent/models/OutboundMessageContext.ts | 5 +- .../v2-indy-connectionless-proofs.e2e.test.ts | 6 ++- .../v2/handlers/V2PresentationHandler.ts | 1 + 9 files changed, 48 insertions(+), 48 deletions(-) diff --git a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 0cbe0a154a..1d4e56eadf 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -327,8 +327,10 @@ describe('V1 Proofs - Connectionless - Indy', () => { domain: 'https://a-domain.com', }) - await faberAgent.resetOutboundTransport() - message.setReturnRouting(ReturnRouteTypes.all, message.threadId) + for (const transport of faberAgent.outboundTransports) { + await faberAgent.unregisterOutboundTransportTransport(transport) + } + // message.setReturnRouting(ReturnRouteTypes.all, message.threadId) await aliceAgent.receiveMessage(requestMessage.toJSON()) diff --git a/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts b/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts index 20732e3ecf..3fd66c2755 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts @@ -68,6 +68,7 @@ export class V1PresentationHandler implements MessageHandler { serviceParams: { service: recipientService.resolvedDidCommService, senderKey: ourService.resolvedDidCommService.recipientKeys[0], + returnRoute: message.transport?.returnRoute || message.transport?.returnRouteThread ? true : false, }, }) } diff --git a/packages/core/src/agent/Agent.ts b/packages/core/src/agent/Agent.ts index 588a1c035d..7e59b20e5a 100644 --- a/packages/core/src/agent/Agent.ts +++ b/packages/core/src/agent/Agent.ts @@ -144,8 +144,8 @@ export class Agent extends BaseAge this.messageSender.registerOutboundTransport(outboundTransport) } - public async resetOutboundTransport() { - await this.messageSender.resetOutboundTransport() + public async unregisterOutboundTransportTransport(outboundTransport: OutboundTransport) { + await this.messageSender.unregisterOutboundTransport(outboundTransport) } public get outboundTransports() { diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index 6c83598aab..c850e81a7c 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -92,7 +92,7 @@ class Dispatcher { if (outboundMessage) { // Store the sessionId of the inbound message, if there is one, so messages can later be send without // outbound transport. - outboundMessage.sessionIdFromInbound = messageContext.sessionId + if (!outboundMessage.sessionId) outboundMessage.sessionId = messageContext.sessionId if (outboundMessage.isOutboundServiceMessage()) { await this.messageSender.sendMessageToService(outboundMessage) } else { diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 8174bcd7e9..d72f240fb5 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -1,5 +1,5 @@ import type { AgentMessage } from './AgentMessage' -import type { DecryptedMessageContext, EnvelopeKeys } from './EnvelopeService' +import type { DecryptedMessageContext } from './EnvelopeService' import type { TransportSession } from './TransportService' import type { AgentContext } from './context' import type { ConnectionRecord } from '../modules/connections' @@ -34,7 +34,7 @@ export class MessageReceiver { private connectionService: ConnectionService private messageHandlerRegistry: MessageHandlerRegistry private agentContextProvider: AgentContextProvider - public readonly inboundTransports: InboundTransport[] = [] + private _inboundTransports: InboundTransport[] = [] public constructor( envelopeService: EnvelopeService, @@ -54,10 +54,20 @@ export class MessageReceiver { this.messageHandlerRegistry = messageHandlerRegistry this.agentContextProvider = agentContextProvider this.logger = logger + this._inboundTransports = [] + } + + public get inboundTransports() { + return this._inboundTransports } public registerInboundTransport(inboundTransport: InboundTransport) { - this.inboundTransports.push(inboundTransport) + this._inboundTransports.push(inboundTransport) + } + + public async unregisterInboundTransport(inboundTransport: InboundTransport) { + this._inboundTransports = this._inboundTransports.filter((transport) => transport !== inboundTransport) + await inboundTransport.stop() } /** @@ -85,7 +95,7 @@ export class MessageReceiver { if (this.isEncryptedMessage(inboundMessage)) { await this.receiveEncryptedMessage(agentContext, inboundMessage as EncryptedMessage, session) } else if (this.isPlaintextMessage(inboundMessage)) { - await this.receivePlaintextMessage(agentContext, inboundMessage, connection, session) + await this.receivePlaintextMessage(agentContext, inboundMessage, connection) } else { throw new AriesFrameworkError('Unable to parse incoming message: unrecognized format') } @@ -98,11 +108,10 @@ export class MessageReceiver { private async receivePlaintextMessage( agentContext: AgentContext, plaintextMessage: PlaintextMessage, - connection?: ConnectionRecord, - session?: TransportSession + connection?: ConnectionRecord ) { const message = await this.transformAndValidate(agentContext, plaintextMessage) - const messageContext = new InboundMessageContext(message, { connection, agentContext, sessionId: session?.id }) + const messageContext = new InboundMessageContext(message, { connection, agentContext }) await this.dispatcher.dispatch(messageContext) } diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index e0c5acc3dc..3cee67eb4c 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -43,7 +43,7 @@ export class MessageSender { private didResolverService: DidResolverService private didCommDocumentService: DidCommDocumentService private eventEmitter: EventEmitter - public outboundTransports: OutboundTransport[] = [] + private _outboundTransports: OutboundTransport[] = [] public constructor( envelopeService: EnvelopeService, @@ -61,20 +61,20 @@ export class MessageSender { this.didResolverService = didResolverService this.didCommDocumentService = didCommDocumentService this.eventEmitter = eventEmitter - this.outboundTransports = [] + this._outboundTransports = [] + } + + public get outboundTransports() { + return this._outboundTransports } public registerOutboundTransport(outboundTransport: OutboundTransport) { - this.outboundTransports.push(outboundTransport) + this._outboundTransports.push(outboundTransport) } - public async resetOutboundTransport() { - // NOTE: we could also make this void instead of an async fct. - // Maybe void is a bit dirty? - for (const transport of this.outboundTransports) { - await transport.stop() - } - this.outboundTransports = [] + public async unregisterOutboundTransport(outboundTransport: OutboundTransport) { + this._outboundTransports = this.outboundTransports.filter((transport) => transport !== outboundTransport) + await outboundTransport.stop() } public async packMessage( @@ -194,7 +194,7 @@ export class MessageSender { transportPriority?: TransportPriorityOptions } ) { - const { agentContext, connection, outOfBand, sessionId, message, sessionIdFromInbound } = outboundMessageContext + const { agentContext, connection, outOfBand, sessionId, message } = outboundMessageContext const errors: Error[] = [] if (!connection) { @@ -210,17 +210,9 @@ export class MessageSender { connectionId: connection.id, }) - let session: TransportSession | undefined - - if (sessionIdFromInbound) { - session = this.transportService.findSessionById(sessionIdFromInbound) - } else if (sessionId) { - session = this.transportService.findSessionById(sessionId) - } - if (!session) { - // Try to send to already open session - session = this.transportService.findSessionByConnectionId(connection.id) - } + const session: TransportSession | undefined = sessionId + ? this.transportService.findSessionById(sessionId) + : this.transportService.findSessionByConnectionId(connection.id) if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { this.logger.debug(`Found session with return routing for message '${message.id}' (connection '${connection.id}'`) @@ -375,14 +367,14 @@ export class MessageSender { } private async sendToService(outboundMessageContext: OutboundMessageContext) { - const { agentContext, message, serviceParams, connection, sessionIdFromInbound, sessionId } = outboundMessageContext + const { agentContext, message, serviceParams, connection, sessionId } = outboundMessageContext if (!serviceParams) { throw new AriesFrameworkError('No service parameters found in outbound message context') } const { service, senderKey, returnRoute } = serviceParams - if (this.outboundTransports.length === 0 && !sessionIdFromInbound && !sessionId) { + if (this.outboundTransports.length === 0 && !sessionId) { throw new AriesFrameworkError('Agent has no outbound transport!') } @@ -432,12 +424,8 @@ export class MessageSender { } } // No outbound transport: Try retrieving session-based connection instead - } else if (sessionId || sessionIdFromInbound) { - const session = sessionIdFromInbound - ? this.transportService.findSessionById(sessionIdFromInbound) - : sessionId - ? this.transportService.findSessionById(sessionId) - : undefined + } else { + const session = sessionId ? this.transportService.findSessionById(sessionId) : undefined if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { this.logger.debug( diff --git a/packages/core/src/agent/models/OutboundMessageContext.ts b/packages/core/src/agent/models/OutboundMessageContext.ts index ca3e0c2119..f0836e223e 100644 --- a/packages/core/src/agent/models/OutboundMessageContext.ts +++ b/packages/core/src/agent/models/OutboundMessageContext.ts @@ -28,7 +28,6 @@ export interface OutboundMessageContextParams { export class OutboundMessageContext { public message: T - public sessionIdFromInbound?: string public connection?: ConnectionRecord public serviceParams?: ServiceMessageParams public outOfBand?: OutOfBandRecord @@ -36,9 +35,8 @@ export class OutboundMessageContext { public sessionId?: string public readonly agentContext: AgentContext - public constructor(message: T, context: OutboundMessageContextParams, inboundContext?: InboundMessageContext) { + public constructor(message: T, context: OutboundMessageContextParams) { this.message = message - this.sessionIdFromInbound = inboundContext?.sessionId this.connection = context.connection this.sessionId = context.sessionId this.outOfBand = context.outOfBand @@ -71,7 +69,6 @@ export class OutboundMessageContext { return { message: this.message, outOfBand: this.outOfBand, - sessionIdFromInbound: this.sessionIdFromInbound, associatedRecord: this.associatedRecord, sessionId: this.sessionId, serviceParams: this.serviceParams, diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts index ed6e35758f..b75c013567 100644 --- a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts @@ -328,8 +328,10 @@ describe('V2 Connectionless Proofs - Indy', () => { domain: 'rxjs:faber', }) - await faberAgent.resetOutboundTransport() - message.setReturnRouting(ReturnRouteTypes.all, message.threadId) + for (const transport of faberAgent.outboundTransports) { + await faberAgent.unregisterOutboundTransportTransport(transport) + } + // message.setReturnRouting(ReturnRouteTypes.all, message.threadId) await aliceAgent.receiveMessage(requestMessage.toJSON()) await waitForProofExchangeRecordSubject(aliceReplay, { diff --git a/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts b/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts index e3c68c1d84..9eca0ea9c0 100644 --- a/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts +++ b/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts @@ -58,6 +58,7 @@ export class V2PresentationHandler implements MessageHandler { serviceParams: { service: recipientService.resolvedDidCommService, senderKey: ourService.resolvedDidCommService.recipientKeys[0], + returnRoute: message.transport?.returnRoute || message.transport?.returnRouteThread ? true : false, }, }) } From 42104f16423eec2f0df56238348e7db5e23cdbd7 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Tue, 28 Feb 2023 16:09:34 +0100 Subject: [PATCH 12/23] chore: code review feedback working with debug log Signed-off-by: Moriarty --- .../v1-connectionless-proofs.e2e.test.ts | 11 +- .../v1/handlers/V1PresentationHandler.ts | 2 +- .../handlers/V1RequestPresentationHandler.ts | 1 + packages/core/src/agent/Dispatcher.ts | 14 +- packages/core/src/agent/MessageReceiver.ts | 21 +- packages/core/src/agent/MessageSender.ts | 127 ++-- .../v2-indy-connectionless-proofs.e2e.test.ts | 201 ++--- .../v2/handlers/V2PresentationHandler.ts | 2 +- .../handlers/V2RequestPresentationHandler.ts | 1 + .../src/storage/IndySdkStorageService.ts | 10 + yarn.lock | 718 +++++++++--------- 11 files changed, 596 insertions(+), 512 deletions(-) diff --git a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 1d4e56eadf..42af180257 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -17,6 +17,7 @@ import { ProofEventTypes, ReturnRouteTypes, } from '../../../../../../core/src' +import { sleep } from '../../../../../../core/src/utils/sleep' import { uuid } from '../../../../../../core/src/utils/uuid' import { testLogger, @@ -157,7 +158,7 @@ describe('V1 Proofs - Connectionless - Indy', () => { }) }) - test('Faber starts with connection-less proof requests to Alice with auto-accept enabled', async () => { + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled xxx', async () => { const { holderAgent: aliceAgent, issuerAgent: faberAgent, @@ -234,15 +235,21 @@ describe('V1 Proofs - Connectionless - Indy', () => { domain: 'https://a-domain.com', }) + // requestMessage.setReturnRouting(ReturnRouteTypes.all, message.threadId) await aliceAgent.receiveMessage(requestMessage.toJSON()) await waitForProofExchangeRecordSubject(aliceReplay, { state: ProofState.Done, + threadId: message.threadId, }) await waitForProofExchangeRecordSubject(faberReplay, { state: ProofState.Done, + threadId: message.threadId, }) + // FIXME: This should not have to wait here. + // But removing the wait throws and error because the wallet context is already closed when receiving the ack + await sleep(3000) }) test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without an outbound transport', async () => { @@ -330,7 +337,7 @@ describe('V1 Proofs - Connectionless - Indy', () => { for (const transport of faberAgent.outboundTransports) { await faberAgent.unregisterOutboundTransportTransport(transport) } - // message.setReturnRouting(ReturnRouteTypes.all, message.threadId) + // requestMessage.setReturnRouting(ReturnRouteTypes.all, requestMessage.threadId) await aliceAgent.receiveMessage(requestMessage.toJSON()) diff --git a/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts b/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts index 3fd66c2755..41bcd9b4ae 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/handlers/V1PresentationHandler.ts @@ -68,7 +68,7 @@ export class V1PresentationHandler implements MessageHandler { serviceParams: { service: recipientService.resolvedDidCommService, senderKey: ourService.resolvedDidCommService.recipientKeys[0], - returnRoute: message.transport?.returnRoute || message.transport?.returnRouteThread ? true : false, + returnRoute: true, }, }) } diff --git a/packages/anoncreds/src/protocols/proofs/v1/handlers/V1RequestPresentationHandler.ts b/packages/anoncreds/src/protocols/proofs/v1/handlers/V1RequestPresentationHandler.ts index f0309ddee3..a697f0da90 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/handlers/V1RequestPresentationHandler.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/handlers/V1RequestPresentationHandler.ts @@ -77,6 +77,7 @@ export class V1RequestPresentationHandler implements MessageHandler { serviceParams: { service: recipientService.resolvedDidCommService, senderKey: message.service.resolvedDidCommService.recipientKeys[0], + returnRoute: true, }, }) } diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index c850e81a7c..57e63f0dfd 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -52,6 +52,12 @@ class Dispatcher { let outboundMessage: OutboundMessageContext | void + console.log('====================================') + console.log('MESSAGE HANDLER') + console.log(messageHandler) + console.log('MESSAGE CONTEXT') + console.log(messageContext) + console.log('====================================') try { outboundMessage = await messageHandler.handle(messageContext) } catch (error) { @@ -92,9 +98,15 @@ class Dispatcher { if (outboundMessage) { // Store the sessionId of the inbound message, if there is one, so messages can later be send without // outbound transport. + // if (!outboundMessage.sessionId && messageContext.message.hasAnyReturnRoute()) if (!outboundMessage.sessionId) outboundMessage.sessionId = messageContext.sessionId + console.log('====================================') + console.log('OUTBOUND MESSAGE AFTER REASSIGN') + console.log(outboundMessage) + console.log('====================================') + // outboundMessage.sessionId = messageContext.sessionId if (outboundMessage.isOutboundServiceMessage()) { - await this.messageSender.sendMessageToService(outboundMessage) + await this.messageSender.sendMessageToService(outboundMessage, agentContext) } else { outboundMessage.sessionId = messageContext.sessionId await this.messageSender.sendMessage(outboundMessage) diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index d72f240fb5..8eb180bbdf 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -93,6 +93,15 @@ export class MessageReceiver { try { if (this.isEncryptedMessage(inboundMessage)) { + console.log('====================================') + console.log('SESSION IN RECEIVE ENCRYPTED') + console.log(session) + console.log('====================================') + console.log('====================================') + console.log(agentContext) + console.log(inboundMessage) + console.log('====================================') + // if (agentContext.wallet.isInitialized) await this.receiveEncryptedMessage(agentContext, inboundMessage as EncryptedMessage, session) } else if (this.isPlaintextMessage(inboundMessage)) { await this.receivePlaintextMessage(agentContext, inboundMessage, connection) @@ -143,10 +152,14 @@ export class MessageReceiver { agentContext, }) + console.log('====================================') + console.log('INBOUND MESSAGE CONTEXT RECEIVER') + console.log(messageContext.toJSON()) + console.log('====================================') // We want to save a session if there is a chance of returning outbound message via inbound transport. // That can happen when inbound message has `return_route` set to `all` or `thread`. // If `return_route` defines just `thread`, we decide later whether to use session according to outbound message `threadId`. - if (senderKey && recipientKey && session && (message.hasAnyReturnRoute() || message.service?.serviceEndpoint)) { + if (senderKey && recipientKey && session && message.hasReturnRouting()) { this.logger.debug(`Storing session for inbound message '${message.id}'`) const keys = { recipientKeys: [senderKey], @@ -160,6 +173,12 @@ export class MessageReceiver { // with mediators when you don't have a public endpoint yet. session.connectionId = connection?.id messageContext.sessionId = session.id + console.log('====================================') + console.log('SESSION IN RECEIVER') + console.log(session.id) + console.log('SESSION') + console.log(session) + console.log('====================================') this.transportService.saveSession(session) } else if (session) { // No need to wait for session to stay open if we're not actually going to respond to the message. diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 3cee67eb4c..28c4894657 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -140,9 +140,9 @@ export class MessageSender { options?.transportPriority ) - if (this.outboundTransports.length === 0 && !queueService) { - throw new AriesFrameworkError('Agent has no outbound transport!') - } + // if (this.outboundTransports.length === 0 && !queueService) { + // throw new AriesFrameworkError('Agent has no outbound transport!') + // } // Loop trough all available services and try to send the message for await (const service of services) { @@ -194,7 +194,7 @@ export class MessageSender { transportPriority?: TransportPriorityOptions } ) { - const { agentContext, connection, outOfBand, sessionId, message } = outboundMessageContext + const { agentContext, connection, outOfBand, message } = outboundMessageContext const errors: Error[] = [] if (!connection) { @@ -210,13 +210,18 @@ export class MessageSender { connectionId: connection.id, }) - const session: TransportSession | undefined = sessionId - ? this.transportService.findSessionById(sessionId) - : this.transportService.findSessionByConnectionId(connection.id) + const session = this.findSessionForOutboundContext(outboundMessageContext) - if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { + console.log('====================================') + console.log('SEND MESSAGE SESSION') + // console.log(JSON.stringify(session)) + console.log('====================================') + if (session) { this.logger.debug(`Found session with return routing for message '${message.id}' (connection '${connection.id}'`) try { + console.log('====================================') + console.log('SENDING MESSAGE TO SESSION FROM SEND SEND_MESSAGE') + console.log('====================================') await this.sendMessageToSession(agentContext, session, message) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) return @@ -280,6 +285,7 @@ export class MessageSender { // an incoming message. const [firstOurAuthenticationKey] = ourAuthenticationKeys // If the returnRoute is already set we won't override it. This allows to set the returnRoute manually if this is desired. + // const shouldAddReturnRoute = true const shouldAddReturnRoute = message.transport?.returnRoute === undefined && !this.transportService.hasInboundEndpoint(ourDidDocument) @@ -345,7 +351,21 @@ export class MessageSender { ) } - public async sendMessageToService(outboundMessageContext: OutboundMessageContext) { + public async sendMessageToService(outboundMessageContext: OutboundMessageContext, agentContext: AgentContext) { + const session = this.findSessionForOutboundContext(outboundMessageContext) + if (session) { + try { + console.log('====================================') + console.log('SENDING MESSAGE TO SERVICE VIA SESSION') + console.log('====================================') + await this.sendMessageToSession(agentContext, session, outboundMessageContext.message) + this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) + } catch (_) { + this.logger.error('Failed to send message to session.') + this.logger.info('Attempting to send to Service instead.') + } + } + // If there is no session try sending to service instead try { await this.sendToService(outboundMessageContext) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) @@ -390,7 +410,7 @@ export class MessageSender { } // Set return routing for message if requested - if (returnRoute) { + if (returnRoute || sessionId) { message.setReturnRouting(ReturnRouteTypes.all, message.threadId) } @@ -423,48 +443,53 @@ export class MessageSender { return } } - // No outbound transport: Try retrieving session-based connection instead - } else { - const session = sessionId ? this.transportService.findSessionById(sessionId) : undefined - - if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { - this.logger.debug( - `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` - ) - try { - await this.sendMessageToService(outboundMessageContext) - this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) - return - } catch (error) { - this.logger.debug(`Sending an outbound message via session failed with error: ${error.message}.`, error) - throw new MessageSendingError( - `Unable to send message to service: ${service.serviceEndpoint} ${message.threadId} ${JSON.stringify( - session - )}`, - { - outboundMessageContext, - } - ) - } - } else if (outboundMessageContext.serviceParams?.service.serviceEndpoint && session) { - try { - await this.sendMessageToSession(agentContext, session, message) - this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) - return - } catch (error) { - this.logger.error(`Sending an outbound message via session failed with error: `, error) - throw new MessageSendingError( - `Unable to send message to service: ${outboundMessageContext.serviceParams?.service.serviceEndpoint} with threadId ${message.threadId} `, - { - outboundMessageContext, - } - ) - } - } } - throw new MessageSendingError(`Unable to send message to service: ${service.serviceEndpoint}`, { - outboundMessageContext, - }) + // else { + // // No outbound transport: Try retrieving session-based connection instead + // // } + // // else { + // const session = this.findSessionForOutboundContext(outboundMessageContext) + + // if (session) { + // // if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { + // this.logger.debug( + // `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` + // ) + // try { + // await this.sendMessageToSession(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) + // throw new MessageSendingError( + // `Unable to send message to service: ${service.serviceEndpoint} ${message.threadId} ${JSON.stringify( + // session + // )}`, + // { + // outboundMessageContext, + // } + // ) + // } + // } + // } + } + // } else if (outboundMessageContext.serviceParams?.service.serviceEndpoint && session) { + // try { + private findSessionForOutboundContext(outboundContext: OutboundMessageContext) { + const session = outboundContext.sessionId + ? this.transportService.findSessionById(outboundContext.sessionId) + : outboundContext.connection?.id + ? this.transportService.findSessionByConnectionId(outboundContext.connection.id) + : undefined + console.log('====================================') + console.log('FOUND SESSION') + console.log(session !== undefined) + console.log(session) + console.log('====================================') + // if (session && (session.inboundMessage?.hasAnyReturnRoute() || outboundContext.message.hasAnyReturnRoute())) + // return session + // if (session && outboundContext.message.hasAnyReturnRoute()) return session + if (session && session.inboundMessage?.hasAnyReturnRoute()) return session } private async retrieveServicesByConnection( diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts index b75c013567..27ea498692 100644 --- a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts @@ -22,6 +22,7 @@ import { Agent } from '../../../../../agent/Agent' import { Attachment, AttachmentData } from '../../../../../decorators/attachment/Attachment' import { ReturnRouteTypes } from '../../../../../decorators/transport/TransportDecorator' import { LinkedAttachment } from '../../../../../utils/LinkedAttachment' +import { sleep } from '../../../../../utils/sleep' import { uuid } from '../../../../../utils/uuid' import { HandshakeProtocol } from '../../../../connections' import { CredentialEventTypes } from '../../../../credentials' @@ -242,105 +243,9 @@ describe('V2 Connectionless Proofs - Indy', () => { await waitForProofExchangeRecordSubject(faberReplay, { state: ProofState.Done, }) - }) - - test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without an outbound transport', async () => { - testLogger.test('Faber sends presentation request to Alice') - - const { - issuerAgent: faberAgent, - issuerReplay: faberReplay, - holderAgent: aliceAgent, - holderReplay: aliceReplay, - credentialDefinitionId, - issuerHolderConnectionId: faberConnectionId, - } = await setupAnonCredsTests({ - issuerName: 'Faber connection-less Proofs v2 - Auto Accept', - holderName: 'Alice connection-less Proofs v2 - Auto Accept', - autoAcceptProofs: AutoAcceptProof.Always, - attributeNames: ['name', 'age'], - }) - - await issueLegacyAnonCredsCredential({ - issuerAgent: faberAgent, - issuerReplay: faberReplay, - holderAgent: aliceAgent, - holderReplay: aliceReplay, - issuerHolderConnectionId: faberConnectionId, - offer: { - credentialDefinitionId, - attributes: [ - { - name: 'name', - value: 'Alice', - }, - { - name: 'age', - value: '99', - }, - ], - }, - }) - - agents = [aliceAgent, faberAgent] - - // eslint-disable-next-line prefer-const - let { message, proofRecord: faberProofExchangeRecord } = await faberAgent.proofs.createRequest({ - protocolVersion: 'v2', - proofFormats: { - indy: { - name: 'test-proof-request', - version: '1.0', - requested_attributes: { - name: { - name: 'name', - restrictions: [ - { - cred_def_id: credentialDefinitionId, - }, - ], - }, - }, - requested_predicates: { - age: { - name: 'age', - p_type: '>=', - p_value: 50, - restrictions: [ - { - cred_def_id: credentialDefinitionId, - }, - ], - }, - }, - }, - }, - autoAcceptProof: AutoAcceptProof.ContentApproved, - }) - - message.setService({ - recipientKeys: [faberAgent.config.walletConfig?.key ?? ''], - serviceEndpoint: message.service?.serviceEndpoint ?? 'rxjs:faber', - }) - const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ - recordId: faberProofExchangeRecord.id, - message, - domain: 'rxjs:faber', - }) - - for (const transport of faberAgent.outboundTransports) { - await faberAgent.unregisterOutboundTransportTransport(transport) - } - // message.setReturnRouting(ReturnRouteTypes.all, message.threadId) - - await aliceAgent.receiveMessage(requestMessage.toJSON()) - await waitForProofExchangeRecordSubject(aliceReplay, { - state: ProofState.Done, - }) - - await waitForProofExchangeRecordSubject(faberReplay, { - state: ProofState.Done, - }) + // FIXME: This should not have to wait here. + // But removing the wait throws and error because the wallet context is already closed when receiving the ack + await sleep(3000) }) test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and both agents having a mediator', async () => { @@ -521,6 +426,104 @@ describe('V2 Connectionless Proofs - Indy', () => { state: ProofState.Done, }) + await waitForProofExchangeRecordSubject(faberReplay, { + state: ProofState.Done, + }) + }) + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without an outbound transport', async () => { + testLogger.test('Faber sends presentation request to Alice') + + const { + issuerAgent: faberAgent, + issuerReplay: faberReplay, + holderAgent: aliceAgent, + holderReplay: aliceReplay, + credentialDefinitionId, + issuerHolderConnectionId: faberConnectionId, + } = await setupAnonCredsTests({ + issuerName: 'Faber connection-less Proofs v2 - Auto Accept', + holderName: 'Alice connection-less Proofs v2 - Auto Accept', + autoAcceptProofs: AutoAcceptProof.Always, + attributeNames: ['name', 'age'], + }) + + await issueLegacyAnonCredsCredential({ + issuerAgent: faberAgent, + issuerReplay: faberReplay, + holderAgent: aliceAgent, + holderReplay: aliceReplay, + issuerHolderConnectionId: faberConnectionId, + offer: { + credentialDefinitionId, + attributes: [ + { + name: 'name', + value: 'Alice', + }, + { + name: 'age', + value: '99', + }, + ], + }, + }) + + agents = [aliceAgent, faberAgent] + + // eslint-disable-next-line prefer-const + let { message, proofRecord: faberProofExchangeRecord } = await faberAgent.proofs.createRequest({ + protocolVersion: 'v2', + proofFormats: { + indy: { + name: 'test-proof-request', + version: '1.0', + requested_attributes: { + name: { + name: 'name', + restrictions: [ + { + cred_def_id: credentialDefinitionId, + }, + ], + }, + }, + requested_predicates: { + age: { + name: 'age', + p_type: '>=', + p_value: 50, + restrictions: [ + { + cred_def_id: credentialDefinitionId, + }, + ], + }, + }, + }, + }, + autoAcceptProof: AutoAcceptProof.ContentApproved, + }) + + message.setService({ + recipientKeys: [faberAgent.config.walletConfig?.key ?? ''], + serviceEndpoint: message.service?.serviceEndpoint ?? 'rxjs:faber', + }) + const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ + recordId: faberProofExchangeRecord.id, + message, + domain: 'rxjs:faber', + }) + + for (const transport of faberAgent.outboundTransports) { + await faberAgent.unregisterOutboundTransportTransport(transport) + } + requestMessage.setReturnRouting(ReturnRouteTypes.all, message.threadId) + + await aliceAgent.receiveMessage(requestMessage.toJSON()) + await waitForProofExchangeRecordSubject(aliceReplay, { + state: ProofState.Done, + }) + await waitForProofExchangeRecordSubject(faberReplay, { state: ProofState.Done, }) diff --git a/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts b/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts index 9eca0ea9c0..73216d17c1 100644 --- a/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts +++ b/packages/core/src/modules/proofs/protocol/v2/handlers/V2PresentationHandler.ts @@ -58,7 +58,7 @@ export class V2PresentationHandler implements MessageHandler { serviceParams: { service: recipientService.resolvedDidCommService, senderKey: ourService.resolvedDidCommService.recipientKeys[0], - returnRoute: message.transport?.returnRoute || message.transport?.returnRouteThread ? true : false, + returnRoute: true, }, }) } diff --git a/packages/core/src/modules/proofs/protocol/v2/handlers/V2RequestPresentationHandler.ts b/packages/core/src/modules/proofs/protocol/v2/handlers/V2RequestPresentationHandler.ts index e43a60df7e..0eaad0f2d0 100644 --- a/packages/core/src/modules/proofs/protocol/v2/handlers/V2RequestPresentationHandler.ts +++ b/packages/core/src/modules/proofs/protocol/v2/handlers/V2RequestPresentationHandler.ts @@ -71,6 +71,7 @@ export class V2RequestPresentationHandler implements MessageHandler { serviceParams: { service: recipientService.resolvedDidCommService, senderKey: message.service.resolvedDidCommService.recipientKeys[0], + returnRoute: true, }, }) } diff --git a/packages/indy-sdk/src/storage/IndySdkStorageService.ts b/packages/indy-sdk/src/storage/IndySdkStorageService.ts index bfcb740d79..bb84f9059d 100644 --- a/packages/indy-sdk/src/storage/IndySdkStorageService.ts +++ b/packages/indy-sdk/src/storage/IndySdkStorageService.ts @@ -166,10 +166,20 @@ export class IndySdkStorageService implements StorageServi const tags = this.transformFromRecordTagValues(record.getTags()) as Record try { + console.log('====================================') + console.log('IS WALLET INITIALISED') + console.log(agentContext.wallet.handle.toString()) + console.log('====================================') await this.indySdk.updateWalletRecordValue(agentContext.wallet.handle, record.type, record.id, value) + console.log('====================================') + console.log('before updateWalletRecordTags') + console.log('====================================') await this.indySdk.updateWalletRecordTags(agentContext.wallet.handle, record.type, record.id, tags) } catch (error) { // Record does not exist + console.log('====================================') + console.log(JSON.stringify(error)) + console.log('====================================') if (isIndyError(error, 'WalletItemNotFound')) { throw new RecordNotFoundError(`record with id ${record.id} not found.`, { recordType: record.type, diff --git a/yarn.lock b/yarn.lock index 1c48eeb5a7..30dbfc43ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": +"@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -30,38 +30,39 @@ "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" - integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== dependencies: - "@ampproject/remapping" "^2.1.0" + "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" + "@babel/generator" "^7.21.0" "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.20.7", "@babel/generator@^7.5.0", "@babel/generator@^7.7.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" - integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.5.0", "@babel/generator@^7.7.2": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.21.0" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": @@ -90,27 +91,27 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" + integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" + integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" + regexpu-core "^5.3.1" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -136,13 +137,13 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -151,12 +152,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" + integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-module-imports@^7.18.6": version "7.18.6" @@ -165,10 +166,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== +"@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -176,8 +177,8 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -234,19 +235,19 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== -"@babel/helpers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" - integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" @@ -257,10 +258,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== "@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.1.0": version "7.18.6" @@ -306,9 +307,9 @@ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.1.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" @@ -448,21 +449,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.0.0": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" - integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.0.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.20.7" @@ -493,19 +494,19 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" - integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz#6aeca0adcb81dc627c8986e770bfaa4d9812aff5" + integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-flow" "^7.18.6" "@babel/plugin-transform-for-of@^7.0.0": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-function-name@^7.0.0": version "7.18.9" @@ -531,11 +532,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== dependencies: - "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-module-transforms" "^7.21.2" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" @@ -576,11 +577,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" - integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz#ec98d4a9baafc5a1eb398da4cf94afbb40254a54" + integrity sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-jsx-source@^7.0.0": version "7.19.6" @@ -590,15 +591,15 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-react-jsx@^7.0.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" - integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" + integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/plugin-transform-regenerator@^7.0.0": version "7.20.5" @@ -609,12 +610,12 @@ regenerator-transform "^0.15.1" "@babel/plugin-transform-runtime@^7.0.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz#2a884f29556d0a68cd3d152dcc9e6c71dfb6eee8" + integrity sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -649,12 +650,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.18.6", "@babel/plugin-transform-typescript@^7.5.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" - integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== +"@babel/plugin-transform-typescript@^7.21.0", "@babel/plugin-transform-typescript@^7.5.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz#f0956a153679e3b377ae5b7f0143427151e4c848" + integrity sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" @@ -676,18 +677,18 @@ "@babel/plugin-transform-flow-strip-types" "^7.18.6" "@babel/preset-typescript@^7.1.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz#bcbbca513e8213691fe5d4b23d9251e01f00ebff" + integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-transform-typescript" "^7.21.0" "@babel/register@^7.0.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" - integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.21.0.tgz#c97bf56c2472e063774f31d344c592ebdcefa132" + integrity sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -695,14 +696,19 @@ pirates "^4.0.5" source-map-support "^0.5.16" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + "@babel/runtime@^7.8.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" - integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": +"@babel/template@^7.0.0", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -711,26 +717,26 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" - integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" + "@babel/generator" "^7.21.1" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" @@ -859,11 +865,11 @@ integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== "@hyperledger/anoncreds-nodejs@^0.1.0-dev.6": - version "0.1.0-dev.6" - resolved "https://registry.yarnpkg.com/@hyperledger/anoncreds-nodejs/-/anoncreds-nodejs-0.1.0-dev.6.tgz#db90e9de4a05e1446132048c07f54503afee4272" - integrity sha512-0BKTEVf1ovkGZGEsMK1jj545jIX48nYQwjKakMmKnSFrb62mtS7VkZ+5kQWp8fGzcTjr3h6Lo/G7TaMIDgQ6Ww== + version "0.1.0-dev.8" + resolved "https://registry.yarnpkg.com/@hyperledger/anoncreds-nodejs/-/anoncreds-nodejs-0.1.0-dev.8.tgz#e9574ce0f7fdc557decc11f4ea4a252333f4a63b" + integrity sha512-KLjTFcGNjby3Pa1CkMXQUZqFJjOAv2peRJ7TzXVcqqXxVHbLIY+B3H8kHNYpRaAPAaKBfHybmzEuWrfFRB4q4w== dependencies: - "@hyperledger/anoncreds-shared" "0.1.0-dev.6" + "@hyperledger/anoncreds-shared" "0.1.0-dev.8" "@mapbox/node-pre-gyp" "^1.0.10" ffi-napi "4.0.3" node-cache "5.1.2" @@ -871,10 +877,10 @@ ref-napi "3.0.3" ref-struct-di "1.1.1" -"@hyperledger/anoncreds-shared@0.1.0-dev.6", "@hyperledger/anoncreds-shared@^0.1.0-dev.6": - version "0.1.0-dev.6" - resolved "https://registry.yarnpkg.com/@hyperledger/anoncreds-shared/-/anoncreds-shared-0.1.0-dev.6.tgz#2e6afb4641cc25daef4074a32990ec078d2fd94e" - integrity sha512-4YZ2kzhOOrGRL//n/Qe/A+yyGsbnHqojQW6vGEZQpZ9bf4ir+QaZLRHijgXFmffMA+SRONfdlnxhLJ6/b6ZaMg== +"@hyperledger/anoncreds-shared@0.1.0-dev.8", "@hyperledger/anoncreds-shared@^0.1.0-dev.6": + version "0.1.0-dev.8" + resolved "https://registry.yarnpkg.com/@hyperledger/anoncreds-shared/-/anoncreds-shared-0.1.0-dev.8.tgz#991ee8079435f6865f6b1c39b87ff6dfaf67ad3e" + integrity sha512-yJBgFPcRX2JSYkOctdubL9YYji9rYo+A6qDBrk3ClSNYdH5TFfl02da6ZbNp+iyOyhmbKV3GO1MTD8/fGEyxkw== "@hyperledger/aries-askar-nodejs@^0.1.0-dev.3": version "0.1.0-dev.3" @@ -897,21 +903,21 @@ fast-text-encoding "^1.0.3" "@hyperledger/indy-vdr-nodejs@^0.1.0-dev.6": - version "0.1.0-dev.6" - resolved "https://registry.yarnpkg.com/@hyperledger/indy-vdr-nodejs/-/indy-vdr-nodejs-0.1.0-dev.6.tgz#28946107feb6c641839de843cc7ddca9eef01f8d" - integrity sha512-jtFRkfjiveKIfeyTx9qDAUXLtpFaiZlUGN2ts2zX8QvY6XGZEKc6LvhMPzLW5kLW34u6ldEqjG4mjyAawUKRsA== + version "0.1.0-dev.9" + resolved "https://registry.yarnpkg.com/@hyperledger/indy-vdr-nodejs/-/indy-vdr-nodejs-0.1.0-dev.9.tgz#11552e7bcfb3eb9ebeceb9021be5aa775ab5a881" + integrity sha512-5tw1b7LbCInFn6KDL8TYIicHpndDwMOxMZkAjmOIUopK7CzHV7DM56UgCF3SUajxkPln1vreBqEuGAMiiTl70Q== dependencies: - "@hyperledger/indy-vdr-shared" "0.1.0-dev.6" + "@hyperledger/indy-vdr-shared" "0.1.0-dev.9" "@mapbox/node-pre-gyp" "^1.0.10" ffi-napi "^4.0.3" ref-array-di "^1.2.2" ref-napi "^3.0.3" ref-struct-di "^1.1.1" -"@hyperledger/indy-vdr-shared@0.1.0-dev.6", "@hyperledger/indy-vdr-shared@^0.1.0-dev.6": - version "0.1.0-dev.6" - resolved "https://registry.yarnpkg.com/@hyperledger/indy-vdr-shared/-/indy-vdr-shared-0.1.0-dev.6.tgz#345b6ff60d29d74615ee882e225af674315a0bda" - integrity sha512-MIUdm3zIwKfFZmZSwbAPiZHEZE0HhsIPjeEWiu//Z1m9GDDSNhEyxsHuVN17pE0pcxwbuCQrIaK3v4Tc6x0jJw== +"@hyperledger/indy-vdr-shared@0.1.0-dev.9", "@hyperledger/indy-vdr-shared@^0.1.0-dev.6": + version "0.1.0-dev.9" + resolved "https://registry.yarnpkg.com/@hyperledger/indy-vdr-shared/-/indy-vdr-shared-0.1.0-dev.9.tgz#b257c1ca75690812598e4606386c618e652d3f8c" + integrity sha512-n7W0YYVRad2AFD13RtZJ+xduUyz2Th6erfVW+7w21K04whyhsoPj9VTda2PtFGzPPNbZzrzRyEwdYNzsvy2GXQ== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1156,7 +1162,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -2278,7 +2284,7 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@sideway/formula@^3.0.0": +"@sideway/formula@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== @@ -2318,9 +2324,9 @@ uint8arrays "^3.1.1" "@sphereon/ssi-types@^0.8.1-next.123": - version "0.8.1-unstable.179" - resolved "https://registry.yarnpkg.com/@sphereon/ssi-types/-/ssi-types-0.8.1-unstable.179.tgz#9583ea0e1011d03876a9108eb863dce83502ada3" - integrity sha512-Se8n7sh3UEO+LGfUcO946TaQaGJf7ozY5tRo9V3Ssax0Rg5MMSOdlf+YE0tgZ7X84WZOrFTdzUVxpN2tpoYRlQ== + version "0.8.1-unstable.242" + resolved "https://registry.yarnpkg.com/@sphereon/ssi-types/-/ssi-types-0.8.1-unstable.242.tgz#cf958a3f6ae0cae5e2b5175616edd158170a65ac" + integrity sha512-/Dy7WuT78gWOChhe4YTbDhr9xly1rxajPnGyPaYmeKOleY8c3az2zU2pRcAiL5nqFN0DkVnT0ncYeeENr9NzOw== dependencies: jwt-decode "^3.1.2" @@ -2415,12 +2421,12 @@ integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -2494,22 +2500,22 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -"@types/express-serve-static-core@^4.17.31": - version "4.17.32" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz#93dda387f5516af616d8d3f05f2c4c79d81e1b82" - integrity sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA== +"@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@^4.17.13", "@types/express@^4.17.15": - version "4.17.15" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.15.tgz#9290e983ec8b054b65a5abccb610411953d417ff" - integrity sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ== + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.31" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" @@ -2542,11 +2548,12 @@ buffer "^6.0.0" "@types/inquirer@^8.1.3": - version "8.2.5" - resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.5.tgz#c508423bcc11126db278170ab07347783ac2300c" - integrity sha512-QXlzybid60YtAwfgG3cpykptRYUx2KomzNutMlWsQC64J/WG/gQSl+P4w7A21sGN0VIxRVava4rgnT7FQmFCdg== + version "8.2.6" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.6.tgz#abd41a5fb689c7f1acb12933d787d4262a02a0ab" + integrity sha512-3uT88kxg8lNzY8ay2ZjP44DKcRaTGztqeIvN2zHvhzIBH/uAPaL75aBtdNRKbA7xXoMbBt5kX0M00VKAnfOYlA== dependencies: "@types/through" "*" + rxjs "^7.2.0" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" @@ -2614,9 +2621,9 @@ form-data "^3.0.0" "@types/node@*", "@types/node@^16.11.7": - version "16.18.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.11.tgz#cbb15c12ca7c16c85a72b6bdc4d4b01151bb3cae" - integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA== + version "16.18.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.13.tgz#c572f8837094c6e3b73918a68674c784f6877fc0" + integrity sha512-l0/3XZ153UTlNOnZK8xSNoJlQda9/WnYgiTdcKKPJSZjdjI9MU+A9oMXOesAWLSnqAaaJhj3qfQsU07Dr8OUwg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2654,25 +2661,25 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-native@^0.64.10": - version "0.64.29" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.64.29.tgz#521544f12f01192e38cdaa376817eceb0c4104db" - integrity sha512-nCa4rcAlilTWL7wEUwTnxo6HjxQvFjVeDPK9taglDvId06pw/eOUu2NozfpwY91o8K7UdZn8VUoDRaGt2i8LBA== + version "0.64.31" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.64.31.tgz#589fa25676818f47d43e2fe16deca8c926c67b4d" + integrity sha512-U54mD5zsVade6nJidMEr8Zo7JGJytH+mH3Be3EeYrfgNMW1bHYr6U1HODFUC0wpprMdlQYvFXOSrBaWR2eefOA== dependencies: "@types/react" "^17" "@types/react@^17": - version "17.0.52" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b" - integrity sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A== + version "17.0.53" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.53.tgz#10d4d5999b8af3d6bc6a9369d7eb953da82442ab" + integrity sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/ref-napi@*", "@types/ref-napi@^3.0.4": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/ref-napi/-/ref-napi-3.0.6.tgz#56f95b10e7698dced16e05b2bd10b6a46cf90f20" - integrity sha512-yLbSiZkLQB9Bv6m46+c4Gdv5Xmw34ehdUagQCfc88FvqHLamaGpYInHbFQ3+sawFonAQ0GDysQIEdZmSOmMh3A== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/ref-napi/-/ref-napi-3.0.7.tgz#20adc93a7a2f9f992dfb17409fd748e6f4bf403d" + integrity sha512-CzPwr36VkezSpaJGdQX/UrczMSDsDgsWQQFEfQkS799Ft7n/s183a53lsql7RwVq+Ik4yLEgI84pRnLC0XXRlA== dependencies: "@types/node" "*" @@ -2694,9 +2701,9 @@ integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== "@types/serve-static@*": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== dependencies: "@types/mime" "*" "@types/node" "*" @@ -2719,9 +2726,9 @@ integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/validator@^13.1.3", "@types/validator@^13.7.10": - version "13.7.10" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.10.tgz#f9763dc0933f8324920afa9c0790308eedf55ca7" - integrity sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ== + version "13.7.12" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.12.tgz#a285379b432cc8d103b69d223cbb159a253cf2f7" + integrity sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA== "@types/varint@^6.0.0": version "6.0.1" @@ -2757,14 +2764,15 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz#deee67e399f2cb6b4608c935777110e509d8018c" - integrity sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ== + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz#24b8b4a952f3c615fe070e3c461dd852b5056734" + integrity sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw== dependencies: - "@typescript-eslint/scope-manager" "5.48.1" - "@typescript-eslint/type-utils" "5.48.1" - "@typescript-eslint/utils" "5.48.1" + "@typescript-eslint/scope-manager" "5.53.0" + "@typescript-eslint/type-utils" "5.53.0" + "@typescript-eslint/utils" "5.53.0" debug "^4.3.4" + grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" regexpp "^3.2.0" @@ -2772,71 +2780,71 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.48.1.tgz#d0125792dab7e232035434ab8ef0658154db2f10" - integrity sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA== + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.53.0.tgz#a1f2b9ae73b83181098747e96683f1b249ecab52" + integrity sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ== dependencies: - "@typescript-eslint/scope-manager" "5.48.1" - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/typescript-estree" "5.48.1" + "@typescript-eslint/scope-manager" "5.53.0" + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/typescript-estree" "5.53.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz#39c71e4de639f5fe08b988005beaaf6d79f9d64d" - integrity sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ== +"@typescript-eslint/scope-manager@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz#42b54f280e33c82939275a42649701024f3fafef" + integrity sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w== dependencies: - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/visitor-keys" "5.48.1" + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/visitor-keys" "5.53.0" -"@typescript-eslint/type-utils@5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz#5d94ac0c269a81a91ad77c03407cea2caf481412" - integrity sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ== +"@typescript-eslint/type-utils@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz#41665449935ba9b4e6a1ba6e2a3f4b2c31d6cf97" + integrity sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw== dependencies: - "@typescript-eslint/typescript-estree" "5.48.1" - "@typescript-eslint/utils" "5.48.1" + "@typescript-eslint/typescript-estree" "5.53.0" + "@typescript-eslint/utils" "5.53.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.1.tgz#efd1913a9aaf67caf8a6e6779fd53e14e8587e14" - integrity sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg== +"@typescript-eslint/types@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.53.0.tgz#f79eca62b97e518ee124086a21a24f3be267026f" + integrity sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A== -"@typescript-eslint/typescript-estree@5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz#9efa8ee2aa471c6ab62e649f6e64d8d121bc2056" - integrity sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA== +"@typescript-eslint/typescript-estree@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690" + integrity sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w== dependencies: - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/visitor-keys" "5.48.1" + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/visitor-keys" "5.53.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.1.tgz#20f2f4e88e9e2a0961cbebcb47a1f0f7da7ba7f9" - integrity sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA== +"@typescript-eslint/utils@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.53.0.tgz#e55eaad9d6fffa120575ffaa530c7e802f13bce8" + integrity sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.48.1" - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/typescript-estree" "5.48.1" + "@typescript-eslint/scope-manager" "5.53.0" + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/typescript-estree" "5.53.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.48.1": - version "5.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz#79fd4fb9996023ef86849bf6f904f33eb6c8fccb" - integrity sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA== +"@typescript-eslint/visitor-keys@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f" + integrity sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w== dependencies: - "@typescript-eslint/types" "5.48.1" + "@typescript-eslint/types" "5.53.0" eslint-visitor-keys "^3.3.0" "@unimodules/core@*": @@ -2921,9 +2929,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== add-stream@^1.0.0: version "1.0.0" @@ -3195,7 +3203,7 @@ array.prototype.flat@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.0: +array.prototype.flatmap@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== @@ -3620,15 +3628,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.21.3, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bs-logger@0.x: version "0.2.6" @@ -3779,10 +3787,10 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400: - version "1.0.30001445" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001445.tgz#cf2d4eb93f2bcdf0310de9dd6d18be271bc0b447" - integrity sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg== +caniuse-lite@^1.0.30001449: + version "1.0.30001458" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" + integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== canonicalize@^1.0.1: version "1.0.8" @@ -3852,9 +3860,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" - integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -4190,9 +4198,9 @@ content-disposition@0.5.4: safe-buffer "5.2.1" content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== conventional-changelog-angular@^5.0.12: version "5.0.13" @@ -4306,11 +4314,11 @@ copy-descriptor@^0.1.0: integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js-compat@^3.25.1: - version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.1.tgz#b5695eb25c602d72b1d30cbfba3cb7e5e4cf0a67" - integrity sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA== + version "3.29.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" + integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== dependencies: - browserslist "^4.21.4" + browserslist "^4.21.5" core-util-is@1.0.2: version "1.0.2" @@ -4524,9 +4532,9 @@ deepmerge@^3.2.0: integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== defaults@^1.0.3: version "1.0.4" @@ -4536,9 +4544,9 @@ defaults@^1.0.3: clone "^1.0.2" define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -4723,10 +4731,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.284: + version "1.4.311" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz#953bc9a4767f5ce8ec125f9a1ad8e00e8f67e479" + integrity sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw== emittery@^0.8.1: version "0.8.1" @@ -4966,13 +4974,13 @@ eslint-module-utils@^2.7.4: debug "^3.2.7" eslint-plugin-import@^2.23.4: - version "2.27.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.4.tgz#319c2f6f6580e1678d674a258ee5e981c10cc25b" - integrity sha512-Z1jVt1EGKia1X9CnBCkpAOhWy8FgQ7OmJ/IblEkT82yrFU/xJaxwujaTzLWqigewwynRQ9mmHfX9MtAfhxm0sA== + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: array-includes "^3.1.6" array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.0" + array.prototype.flatmap "^1.3.1" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.7" @@ -5091,9 +5099,9 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + version "1.4.2" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.2.tgz#c6d3fee05dd665808e2ad870631f221f5617b1d1" + integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng== dependencies: estraverse "^5.1.0" @@ -5212,9 +5220,9 @@ expo-modules-autolinking@^0.0.3: fs-extra "^9.1.0" expo-random@*: - version "13.0.0" - resolved "https://registry.yarnpkg.com/expo-random/-/expo-random-13.0.0.tgz#fc9c1496ac9f7555563d86de0db25966739c028f" - integrity sha512-aGb0vtUmFFuW0TF1rdOgsz89zEVD/RXUPUnnZy5+i3jJeQ2PerJ4uo72/EuWqHpCBNto8/qT+aCzFinmQDeTAA== + version "13.1.1" + resolved "https://registry.yarnpkg.com/expo-random/-/expo-random-13.1.1.tgz#15e781911d5db4fbcee75e26ac109bc2523fe00c" + integrity sha512-+KkhGp7xW45GvMRzlcSOzvDwzTgyXo6C84GaG4GI43rOdECBQ2lGUJ12st39OtfZm1lORNskpi66DjnuJ73g9w== dependencies: base64-js "^1.3.0" @@ -5519,9 +5527,9 @@ flatted@^3.1.0: integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flow-parser@0.*: - version "0.197.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.197.0.tgz#9a581ef7c0b1c3377b195cec0bbad794b88be67b" - integrity sha512-yhwkJPxH1JBg0aJunk/jVRy5p3UhVZBGkzL1hq/GK+GaBh6bKr2YKkv6gDuiufaw+i3pKWQgOLtD++1cvrgXLA== + version "0.200.1" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.200.1.tgz#99a94b35b7d1815716e3db56bb797440ed340716" + integrity sha512-N6gxgo0iQx0G2m3aJjg3RLxNLUG3EBYgBN/xDDPGQXSjvqNkTdEd2t1myE36Xi7GndZQWngDP7jf0GvxdL6pRg== flow-parser@^0.121.0: version "0.121.0" @@ -5710,10 +5718,10 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -5864,9 +5872,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" @@ -5901,6 +5909,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + handlebars@^4.7.6, handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -6248,11 +6261,11 @@ inquirer@^7.3.3: through "^2.3.6" internal-slot@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" - integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -7172,14 +7185,14 @@ jetifier@^1.6.2: integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== joi@^17.2.1: - version "17.7.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3" - integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== + version "17.8.3" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.8.3.tgz#d772fe27a87a5cda21aace5cf11eee8671ca7e6f" + integrity sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" + "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: @@ -7320,7 +7333,7 @@ json5@2.x, json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -json5@^1.0.1: +json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -7491,9 +7504,9 @@ libnpmpublish@^4.0.0: ssri "^8.0.1" libphonenumber-js@^1.10.14, libphonenumber-js@^1.9.7: - version "1.10.18" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.18.tgz#657c419071c8a02c638c0e80d9ee1232f152f280" - integrity sha512-NS4ZEgNhwbcPz1gfSXCGFnQm0xEiyTSPRthIuWytDzOiEG9xnZ2FbLyfJC4tI2BMAAXpoWbNxHYH75pa3Dq9og== + version "1.10.21" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.21.tgz#860312cbec1389e36e28389161025c7817a3ae32" + integrity sha512-/udZhx49av2r2gZR/+xXSrwcR8smX/sDNrVpOFrvW+CA26TfYTVZfwb3MIDvmwAYMLs7pXuJjZX0VxxGpqPhsA== lines-and-columns@^1.1.6: version "1.2.4" @@ -8139,9 +8152,9 @@ minimist-options@4.1.0: kind-of "^6.0.3" minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -8206,11 +8219,9 @@ minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: yallist "^4.0.0" minipass@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" - integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== - dependencies: - yallist "^4.0.0" + version "4.2.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.4.tgz#7d0d97434b6a19f59c5c3221698b48bbf3b2cd06" + integrity sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ== minizlib@^1.3.3: version "1.3.3" @@ -8453,9 +8464,9 @@ node-fetch@3.0.0-beta.9: fetch-blob "^2.1.1" node-fetch@^2.0, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.8" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" - integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg== + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== dependencies: whatwg-url "^5.0.0" @@ -8534,10 +8545,10 @@ node-pre-gyp@0.17.0: semver "^5.7.1" tar "^4.4.13" -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== node-stream-zip@^1.9.1: version "1.15.0" @@ -9260,9 +9271,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.3.1: - version "2.8.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" - integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== + version "2.8.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== pretty-format@^26.0.0, pretty-format@^26.5.2, pretty-format@^26.6.2: version "26.6.2" @@ -9379,9 +9390,9 @@ pump@^3.0.0: once "^1.3.1" punycode@^2.1.0, punycode@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.2.0.tgz#2092cc57cd2582c38e4e7e8bb869dc8d3148bc74" - integrity sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== pvtsutils@^1.3.2: version "1.3.2" @@ -9473,9 +9484,9 @@ rc@^1.2.8: strip-json-comments "~2.0.1" react-devtools-core@^4.6.0: - version "4.27.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.27.1.tgz#167aa174383c65786cbb7e965a5b39c702f0a2d3" - integrity sha512-qXhcxxDWiFmFAOq48jts9YQYe1+wVoUXzJTlY4jbaATzyio6dd6CUGu3dXBhREeVgpZ+y4kg6vFJzIOZh6vY2w== + version "4.27.2" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.27.2.tgz#d20fc57e258c656eedabafc2c851d38b33583148" + integrity sha512-8SzmIkpO87alD7Xr6gWIEa1jHkMjawOZ+6egjazlnjB4UUcbnzGDf/vBJ4BzGuWWEM+pzrxuzsPpcMqlQkYK2g== dependencies: shell-quote "^1.6.1" ws "^7" @@ -9668,18 +9679,18 @@ read@1, read@~1.0.1: mute-stream "~0.0.4" readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@^2.0.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -9805,23 +9816,18 @@ regexpp@^3.1.0, regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" + integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -9982,9 +9988,9 @@ rimraf@^3.0.0, rimraf@^3.0.2: glob "^7.1.3" rimraf@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.0.7.tgz#f438c7d6a2d5e5cca1d81e3904a48ac7b053a542" - integrity sha512-CUEDDrZvc0swDgVdXGiv3FcYYQMpJxjvSGt85Amj6yU+MCVWurrLCeLiJDdJPHCzNJnwuebBEdcO//eP11Xa7w== + version "4.1.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.1.2.tgz#20dfbc98083bdfaa28b01183162885ef213dbf7c" + integrity sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ== rimraf@~2.2.6: version "2.2.8" @@ -10215,9 +10221,9 @@ shell-quote@1.6.1: jsonify "~0.0.0" shell-quote@^1.6.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" - integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== shelljs@^0.8.4: version "0.8.5" @@ -10965,12 +10971,12 @@ ts-typed-json@^0.3.2: integrity sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA== tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -10989,9 +10995,9 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tslog@^3.2.0: version "3.3.4" @@ -11120,9 +11126,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@~4.9.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typical@^4.0.0: version "4.0.0" @@ -11264,7 +11270,7 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -update-browserslist-db@^1.0.9: +update-browserslist-db@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== @@ -11376,9 +11382,9 @@ validate-npm-package-name@^3.0.0: builtins "^1.0.3" validator@^13.5.2, validator@^13.7.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + version "13.9.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" + integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== varint@^6.0.0: version "6.0.0" @@ -11441,9 +11447,9 @@ web-did-resolver@^2.0.8: did-resolver "^4.0.0" webcrypto-core@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.5.tgz#c02104c953ca7107557f9c165d194c6316587ca4" - integrity sha512-gaExY2/3EHQlRNNNVSrbG2Cg94Rutl7fAaKILS1w8ZDhGxdFOaw6EbCfHIxPy9vt/xwp5o0VQAx9aySPF6hU1A== + version "1.7.6" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.6.tgz#e32c4a12a13de4251f8f9ef336a6cba7cdec9b55" + integrity sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA== dependencies: "@peculiar/asn1-schema" "^2.1.6" "@peculiar/json-schema" "^1.1.12" From d42fc896956353592eddd2ff86651de5669710b4 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Tue, 28 Feb 2023 16:17:18 +0100 Subject: [PATCH 13/23] chore: code review feedback Signed-off-by: Moriarty --- .../v1-connectionless-proofs.e2e.test.ts | 4 +- packages/core/src/agent/Dispatcher.ts | 12 ----- packages/core/src/agent/MessageReceiver.ts | 19 ------- packages/core/src/agent/MessageSender.ts | 49 +------------------ .../v2-indy-connectionless-proofs.e2e.test.ts | 1 - .../src/storage/IndySdkStorageService.ts | 10 ---- 6 files changed, 2 insertions(+), 93 deletions(-) diff --git a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 42af180257..cd828118d1 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -158,7 +158,7 @@ describe('V1 Proofs - Connectionless - Indy', () => { }) }) - test('Faber starts with connection-less proof requests to Alice with auto-accept enabled xxx', async () => { + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled', async () => { const { holderAgent: aliceAgent, issuerAgent: faberAgent, @@ -235,7 +235,6 @@ describe('V1 Proofs - Connectionless - Indy', () => { domain: 'https://a-domain.com', }) - // requestMessage.setReturnRouting(ReturnRouteTypes.all, message.threadId) await aliceAgent.receiveMessage(requestMessage.toJSON()) await waitForProofExchangeRecordSubject(aliceReplay, { @@ -337,7 +336,6 @@ describe('V1 Proofs - Connectionless - Indy', () => { for (const transport of faberAgent.outboundTransports) { await faberAgent.unregisterOutboundTransportTransport(transport) } - // requestMessage.setReturnRouting(ReturnRouteTypes.all, requestMessage.threadId) await aliceAgent.receiveMessage(requestMessage.toJSON()) diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index 57e63f0dfd..c60fcc0c09 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -52,12 +52,6 @@ class Dispatcher { let outboundMessage: OutboundMessageContext | void - console.log('====================================') - console.log('MESSAGE HANDLER') - console.log(messageHandler) - console.log('MESSAGE CONTEXT') - console.log(messageContext) - console.log('====================================') try { outboundMessage = await messageHandler.handle(messageContext) } catch (error) { @@ -98,13 +92,7 @@ class Dispatcher { if (outboundMessage) { // Store the sessionId of the inbound message, if there is one, so messages can later be send without // outbound transport. - // if (!outboundMessage.sessionId && messageContext.message.hasAnyReturnRoute()) if (!outboundMessage.sessionId) outboundMessage.sessionId = messageContext.sessionId - console.log('====================================') - console.log('OUTBOUND MESSAGE AFTER REASSIGN') - console.log(outboundMessage) - console.log('====================================') - // outboundMessage.sessionId = messageContext.sessionId if (outboundMessage.isOutboundServiceMessage()) { await this.messageSender.sendMessageToService(outboundMessage, agentContext) } else { diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index 8eb180bbdf..b4a50ac553 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -93,15 +93,6 @@ export class MessageReceiver { try { if (this.isEncryptedMessage(inboundMessage)) { - console.log('====================================') - console.log('SESSION IN RECEIVE ENCRYPTED') - console.log(session) - console.log('====================================') - console.log('====================================') - console.log(agentContext) - console.log(inboundMessage) - console.log('====================================') - // if (agentContext.wallet.isInitialized) await this.receiveEncryptedMessage(agentContext, inboundMessage as EncryptedMessage, session) } else if (this.isPlaintextMessage(inboundMessage)) { await this.receivePlaintextMessage(agentContext, inboundMessage, connection) @@ -152,10 +143,6 @@ export class MessageReceiver { agentContext, }) - console.log('====================================') - console.log('INBOUND MESSAGE CONTEXT RECEIVER') - console.log(messageContext.toJSON()) - console.log('====================================') // We want to save a session if there is a chance of returning outbound message via inbound transport. // That can happen when inbound message has `return_route` set to `all` or `thread`. // If `return_route` defines just `thread`, we decide later whether to use session according to outbound message `threadId`. @@ -173,12 +160,6 @@ export class MessageReceiver { // with mediators when you don't have a public endpoint yet. session.connectionId = connection?.id messageContext.sessionId = session.id - console.log('====================================') - console.log('SESSION IN RECEIVER') - console.log(session.id) - console.log('SESSION') - console.log(session) - console.log('====================================') this.transportService.saveSession(session) } else if (session) { // No need to wait for session to stay open if we're not actually going to respond to the message. diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 28c4894657..999c420061 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -212,16 +212,9 @@ export class MessageSender { const session = this.findSessionForOutboundContext(outboundMessageContext) - console.log('====================================') - console.log('SEND MESSAGE SESSION') - // console.log(JSON.stringify(session)) - console.log('====================================') if (session) { this.logger.debug(`Found session with return routing for message '${message.id}' (connection '${connection.id}'`) try { - console.log('====================================') - console.log('SENDING MESSAGE TO SESSION FROM SEND SEND_MESSAGE') - console.log('====================================') await this.sendMessageToSession(agentContext, session, message) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToSession) return @@ -355,9 +348,6 @@ export class MessageSender { const session = this.findSessionForOutboundContext(outboundMessageContext) if (session) { try { - console.log('====================================') - console.log('SENDING MESSAGE TO SERVICE VIA SESSION') - console.log('====================================') await this.sendMessageToSession(agentContext, session, outboundMessageContext.message) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) } catch (_) { @@ -444,51 +434,14 @@ export class MessageSender { } } } - // else { - // // No outbound transport: Try retrieving session-based connection instead - // // } - // // else { - // const session = this.findSessionForOutboundContext(outboundMessageContext) - - // if (session) { - // // if (session?.inboundMessage?.hasReturnRouting(message.threadId)) { - // this.logger.debug( - // `Found session with return routing for message '${message.id}' (connection '${connection?.id}'` - // ) - // try { - // await this.sendMessageToSession(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) - // throw new MessageSendingError( - // `Unable to send message to service: ${service.serviceEndpoint} ${message.threadId} ${JSON.stringify( - // session - // )}`, - // { - // outboundMessageContext, - // } - // ) - // } - // } - // } } - // } else if (outboundMessageContext.serviceParams?.service.serviceEndpoint && session) { - // try { + private findSessionForOutboundContext(outboundContext: OutboundMessageContext) { const session = outboundContext.sessionId ? this.transportService.findSessionById(outboundContext.sessionId) : outboundContext.connection?.id ? this.transportService.findSessionByConnectionId(outboundContext.connection.id) : undefined - console.log('====================================') - console.log('FOUND SESSION') - console.log(session !== undefined) - console.log(session) - console.log('====================================') - // if (session && (session.inboundMessage?.hasAnyReturnRoute() || outboundContext.message.hasAnyReturnRoute())) - // return session - // if (session && outboundContext.message.hasAnyReturnRoute()) return session if (session && session.inboundMessage?.hasAnyReturnRoute()) return session } diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts index 27ea498692..48e684c8ab 100644 --- a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts @@ -517,7 +517,6 @@ describe('V2 Connectionless Proofs - Indy', () => { for (const transport of faberAgent.outboundTransports) { await faberAgent.unregisterOutboundTransportTransport(transport) } - requestMessage.setReturnRouting(ReturnRouteTypes.all, message.threadId) await aliceAgent.receiveMessage(requestMessage.toJSON()) await waitForProofExchangeRecordSubject(aliceReplay, { diff --git a/packages/indy-sdk/src/storage/IndySdkStorageService.ts b/packages/indy-sdk/src/storage/IndySdkStorageService.ts index bb84f9059d..bfcb740d79 100644 --- a/packages/indy-sdk/src/storage/IndySdkStorageService.ts +++ b/packages/indy-sdk/src/storage/IndySdkStorageService.ts @@ -166,20 +166,10 @@ export class IndySdkStorageService implements StorageServi const tags = this.transformFromRecordTagValues(record.getTags()) as Record try { - console.log('====================================') - console.log('IS WALLET INITIALISED') - console.log(agentContext.wallet.handle.toString()) - console.log('====================================') await this.indySdk.updateWalletRecordValue(agentContext.wallet.handle, record.type, record.id, value) - console.log('====================================') - console.log('before updateWalletRecordTags') - console.log('====================================') await this.indySdk.updateWalletRecordTags(agentContext.wallet.handle, record.type, record.id, tags) } catch (error) { // Record does not exist - console.log('====================================') - console.log(JSON.stringify(error)) - console.log('====================================') if (isIndyError(error, 'WalletItemNotFound')) { throw new RecordNotFoundError(`record with id ${record.id} not found.`, { recordType: record.type, From 88e81725d6b56dbb2078126adf2b83e806b95fab Mon Sep 17 00:00:00 2001 From: Moriarty Date: Tue, 28 Feb 2023 16:33:52 +0100 Subject: [PATCH 14/23] chore: lint Signed-off-by: Moriarty --- packages/action-menu/tests/action-menu.e2e.test.ts | 4 ++-- .../src/modules/oob/__tests__/connect-to-self.e2e.test.ts | 3 +-- packages/core/tests/oob.test.ts | 5 ++--- packages/openid4vc-client/tests/openid4vc-client.e2e.test.ts | 4 ++-- packages/question-answer/tests/question-answer.e2e.test.ts | 4 ++-- tests/e2e-askar-indy-sdk-wallet-subject.test.ts | 4 ++-- tests/e2e-subject.test.ts | 5 ++--- tests/e2e-ws-pickup-v2.test.ts | 3 +-- 8 files changed, 14 insertions(+), 18 deletions(-) diff --git a/packages/action-menu/tests/action-menu.e2e.test.ts b/packages/action-menu/tests/action-menu.e2e.test.ts index 8ba99acdbc..a32b13df49 100644 --- a/packages/action-menu/tests/action-menu.e2e.test.ts +++ b/packages/action-menu/tests/action-menu.e2e.test.ts @@ -5,6 +5,8 @@ import { Agent } from '@aries-framework/core' import { getAgentOptions, makeConnection, testLogger, setupSubjectTransports, indySdk } from '../../core/tests' import { IndySdkModule } from '../../indy-sdk/src' +import { waitForActionMenuRecord } from './helpers' + import { ActionMenu, ActionMenuModule, @@ -13,8 +15,6 @@ import { ActionMenuState, } from '@aries-framework/action-menu' -import { waitForActionMenuRecord } from './helpers' - const modules = { actionMenu: new ActionMenuModule(), indySdk: new IndySdkModule({ diff --git a/packages/core/src/modules/oob/__tests__/connect-to-self.e2e.test.ts b/packages/core/src/modules/oob/__tests__/connect-to-self.e2e.test.ts index 5807e13d70..59ea798c98 100644 --- a/packages/core/src/modules/oob/__tests__/connect-to-self.e2e.test.ts +++ b/packages/core/src/modules/oob/__tests__/connect-to-self.e2e.test.ts @@ -8,11 +8,10 @@ import { SubjectOutboundTransport } from '../../../../../../tests/transport/Subj import { getIndySdkModules } from '../../../../../indy-sdk/tests/setupIndySdkModule' import { getAgentOptions } from '../../../../tests/helpers' import { HandshakeProtocol, DidExchangeState } from '../../connections' +import { OutOfBandState } from '../domain/OutOfBandState' import { Agent } from '@aries-framework/core' -import { OutOfBandState } from '../domain/OutOfBandState' - const faberAgentOptions = getAgentOptions( 'Faber Agent OOB Connect to Self', { diff --git a/packages/core/tests/oob.test.ts b/packages/core/tests/oob.test.ts index 836ca766bd..3a9c09abe8 100644 --- a/packages/core/tests/oob.test.ts +++ b/packages/core/tests/oob.test.ts @@ -10,9 +10,6 @@ import { SubjectInboundTransport } from '../../../tests/transport/SubjectInbound import { SubjectOutboundTransport } from '../../../tests/transport/SubjectOutboundTransport' import { getLegacyAnonCredsModules, prepareForAnonCredsIssuance } from '../../anoncreds/tests/legacyAnonCredsSetup' import { Agent } from '../src/agent/Agent' - -import { AgentEventTypes, AriesFrameworkError, AutoAcceptCredential, CredentialState } from '@aries-framework/core' - import { Key } from '../src/crypto' import { DidExchangeState, HandshakeProtocol } from '../src/modules/connections' import { OutOfBandDidCommService } from '../src/modules/oob/domain/OutOfBandDidCommService' @@ -26,6 +23,8 @@ import { JsonEncoder } from '../src/utils' import { TestMessage } from './TestMessage' import { getAgentOptions, waitForCredentialRecord } from './helpers' +import { AgentEventTypes, AriesFrameworkError, AutoAcceptCredential, CredentialState } from '@aries-framework/core' + const faberAgentOptions = getAgentOptions( 'Faber Agent OOB', { diff --git a/packages/openid4vc-client/tests/openid4vc-client.e2e.test.ts b/packages/openid4vc-client/tests/openid4vc-client.e2e.test.ts index 2afc542a49..2c20b6acce 100644 --- a/packages/openid4vc-client/tests/openid4vc-client.e2e.test.ts +++ b/packages/openid4vc-client/tests/openid4vc-client.e2e.test.ts @@ -8,10 +8,10 @@ import { customDocumentLoader } from '../../core/src/modules/vc/__tests__/docume import { getAgentOptions, indySdk } from '../../core/tests' import { IndySdkModule } from '../../indy-sdk/src' -import { OpenId4VcClientModule } from '@aries-framework/openid4vc-client' - import { acquireAccessTokenResponse, credentialRequestResponse, getMetadataResponse } from './fixtures' +import { OpenId4VcClientModule } from '@aries-framework/openid4vc-client' + const modules = { openId4VcClient: new OpenId4VcClientModule(), w3cVc: new W3cVcModule({ diff --git a/packages/question-answer/tests/question-answer.e2e.test.ts b/packages/question-answer/tests/question-answer.e2e.test.ts index b15d71efe6..af3373de88 100644 --- a/packages/question-answer/tests/question-answer.e2e.test.ts +++ b/packages/question-answer/tests/question-answer.e2e.test.ts @@ -5,10 +5,10 @@ import { Agent } from '@aries-framework/core' import { indySdk, setupSubjectTransports, testLogger, getAgentOptions, makeConnection } from '../../core/tests' import { IndySdkModule } from '../../indy-sdk/src' -import { QuestionAnswerModule, QuestionAnswerRole, QuestionAnswerState } from '@aries-framework/question-answer' - import { waitForQuestionAnswerRecord } from './helpers' +import { QuestionAnswerModule, QuestionAnswerRole, QuestionAnswerState } from '@aries-framework/question-answer' + const modules = { questionAnswer: new QuestionAnswerModule(), indySdk: new IndySdkModule({ diff --git a/tests/e2e-askar-indy-sdk-wallet-subject.test.ts b/tests/e2e-askar-indy-sdk-wallet-subject.test.ts index d59263dfe2..e2be7f81ea 100644 --- a/tests/e2e-askar-indy-sdk-wallet-subject.test.ts +++ b/tests/e2e-askar-indy-sdk-wallet-subject.test.ts @@ -9,12 +9,12 @@ import { } from '../packages/anoncreds/tests/legacyAnonCredsSetup' import { getAgentOptions } from '../packages/core/tests/helpers' -import { Agent, AutoAcceptCredential, MediatorPickupStrategy } from '@aries-framework/core' - import { e2eTest } from './e2e-test' import { SubjectInboundTransport } from './transport/SubjectInboundTransport' import { SubjectOutboundTransport } from './transport/SubjectOutboundTransport' +import { Agent, AutoAcceptCredential, MediatorPickupStrategy } from '@aries-framework/core' + const recipientAgentOptions = getAgentOptions( 'E2E Askar Subject Recipient', { diff --git a/tests/e2e-subject.test.ts b/tests/e2e-subject.test.ts index 6ec26ef417..148b13f9c4 100644 --- a/tests/e2e-subject.test.ts +++ b/tests/e2e-subject.test.ts @@ -7,12 +7,11 @@ import { getLegacyAnonCredsModules } from '../packages/anoncreds/tests/legacyAno import { getAgentOptions } from '../packages/core/tests/helpers' import { e2eTest } from './e2e-test' - -import { Agent, AutoAcceptCredential, MediatorPickupStrategy } from '@aries-framework/core' - import { SubjectInboundTransport } from './transport/SubjectInboundTransport' import { SubjectOutboundTransport } from './transport/SubjectOutboundTransport' +import { Agent, AutoAcceptCredential, MediatorPickupStrategy } from '@aries-framework/core' + const recipientAgentOptions = getAgentOptions( 'E2E Subject Recipient', { diff --git a/tests/e2e-ws-pickup-v2.test.ts b/tests/e2e-ws-pickup-v2.test.ts index 16ace3cd90..50fe8e0598 100644 --- a/tests/e2e-ws-pickup-v2.test.ts +++ b/tests/e2e-ws-pickup-v2.test.ts @@ -3,10 +3,9 @@ import type { AnonCredsTestsAgent } from '../packages/anoncreds/tests/legacyAnon import { getLegacyAnonCredsModules } from '../packages/anoncreds/tests/legacyAnonCredsSetup' import { getAgentOptions } from '../packages/core/tests/helpers' -import { Agent, WsOutboundTransport, AutoAcceptCredential, MediatorPickupStrategy } from '@aries-framework/core' - import { e2eTest } from './e2e-test' +import { Agent, WsOutboundTransport, AutoAcceptCredential, MediatorPickupStrategy } from '@aries-framework/core' import { WsInboundTransport } from '@aries-framework/node' const recipientOptions = getAgentOptions( From aa5a5d7aab2d65a7773a3f9f01b5a673b8de93d2 Mon Sep 17 00:00:00 2001 From: Moriarty Date: Tue, 28 Feb 2023 16:55:28 +0100 Subject: [PATCH 15/23] chore: fix typing and logic for agentcontext optional Signed-off-by: Moriarty --- packages/core/src/agent/MessageSender.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 999c420061..39f8423570 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -344,9 +344,9 @@ export class MessageSender { ) } - public async sendMessageToService(outboundMessageContext: OutboundMessageContext, agentContext: AgentContext) { + public async sendMessageToService(outboundMessageContext: OutboundMessageContext, agentContext?: AgentContext) { const session = this.findSessionForOutboundContext(outboundMessageContext) - if (session) { + if (session && agentContext) { try { await this.sendMessageToSession(agentContext, session, outboundMessageContext.message) this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) From 28bdc73292ffbdb400e93d6932c8cb585631037f Mon Sep 17 00:00:00 2001 From: Moriarty Date: Wed, 1 Mar 2023 15:26:23 +0100 Subject: [PATCH 16/23] chore: remove non-applicable tests Signed-off-by: Moriarty --- .../v1-connectionless-proofs.e2e.test.ts | 1 - .../src/agent/__tests__/MessageSender.test.ts | 43 ------------------- 2 files changed, 44 deletions(-) diff --git a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index cd828118d1..e85d2d7821 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -15,7 +15,6 @@ import { Attachment, AttachmentData, ProofEventTypes, - ReturnRouteTypes, } from '../../../../../../core/src' import { sleep } from '../../../../../../core/src/utils/sleep' import { uuid } from '../../../../../../core/src/utils/uuid' diff --git a/packages/core/src/agent/__tests__/MessageSender.test.ts b/packages/core/src/agent/__tests__/MessageSender.test.ts index 35d566c3b0..4849384454 100644 --- a/packages/core/src/agent/__tests__/MessageSender.test.ts +++ b/packages/core/src/agent/__tests__/MessageSender.test.ts @@ -462,24 +462,6 @@ describe('MessageSender', () => { expect(sendToServiceSpy).toHaveBeenCalledTimes(2) expect(sendMessageSpy).toHaveBeenCalledTimes(2) }) - - test('throw error when message endpoint is not supported by outbound transport schemes', async () => { - messageSender.registerOutboundTransport(new DummyWsOutboundTransport()) - await expect(messageSender.sendMessage(outboundMessageContext)).rejects.toThrow( - /Message is undeliverable to connection/ - ) - - expect(eventListenerMock).toHaveBeenCalledWith({ - type: AgentEventTypes.AgentMessageSent, - metadata: { - contextCorrelationId: 'mock', - }, - payload: { - message: outboundMessageContext, - status: OutboundMessageSendStatus.Undeliverable, - }, - }) - }) }) describe('sendMessageToService', () => { @@ -605,31 +587,6 @@ describe('MessageSender', () => { }) expect(sendMessageSpy).toHaveBeenCalledTimes(1) }) - - test('throw error when message endpoint is not supported by outbound transport schemes', async () => { - messageSender.registerOutboundTransport(new DummyWsOutboundTransport()) - outboundMessageContext = new OutboundMessageContext(new TestMessage(), { - agentContext, - serviceParams: { - senderKey, - service, - }, - }) - - await expect(messageSender.sendMessageToService(outboundMessageContext)).rejects.toThrow( - /Unable to send message to service/ - ) - expect(eventListenerMock).toHaveBeenCalledWith({ - type: AgentEventTypes.AgentMessageSent, - metadata: { - contextCorrelationId: 'mock', - }, - payload: { - message: outboundMessageContext, - status: OutboundMessageSendStatus.Undeliverable, - }, - }) - }) }) describe('packMessage', () => { From 32c9a2998542924ccac9496eb8fdbc1c094c3d14 Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Wed, 8 Mar 2023 10:39:56 +0100 Subject: [PATCH 17/23] chore: small tweaks Signed-off-by: Timo Glastra --- .../v1-indy-proof-negotiation.test.ts | 293 ------------------ packages/core/src/agent/MessageReceiver.ts | 4 +- 2 files changed, 2 insertions(+), 295 deletions(-) delete mode 100644 packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-indy-proof-negotiation.test.ts diff --git a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-indy-proof-negotiation.test.ts b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-indy-proof-negotiation.test.ts deleted file mode 100644 index 917f5c805d..0000000000 --- a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-indy-proof-negotiation.test.ts +++ /dev/null @@ -1,293 +0,0 @@ -import type { AcceptProofProposalOptions } from '../../../../../../core/src' -import type { AnonCredsTestsAgent } from '../../../../../tests/legacyAnonCredsSetup' -import type { V1RequestPresentationMessage } from '../messages' - -import { ProofState } from '../../../../../../core/src' -import { testLogger, waitForProofExchangeRecord } from '../../../../../../core/tests' -import { setupAnonCredsTests } from '../../../../../tests/legacyAnonCredsSetup' - -describe('Present Proof', () => { - let faberAgent: AnonCredsTestsAgent - let aliceAgent: AnonCredsTestsAgent - let aliceConnectionId: string - let credentialDefinitionId: string - - beforeAll(async () => { - testLogger.test('Initializing the agents') - ;({ - issuerAgent: faberAgent, - holderAgent: aliceAgent, - credentialDefinitionId, - holderIssuerConnectionId: aliceConnectionId, - } = await setupAnonCredsTests({ - issuerName: 'Faber - V1 Indy Proof Negotiation', - holderName: 'Alice - V1 Indy Proof Negotiation', - attributeNames: ['name', 'age'], - })) - }) - - afterAll(async () => { - testLogger.test('Shutting down both agents') - await faberAgent.shutdown() - await faberAgent.wallet.delete() - await aliceAgent.shutdown() - await aliceAgent.wallet.delete() - }) - - test(`Proof negotiation between Alice and Faber`, async () => { - testLogger.test('Alice sends proof proposal to Faber') - - let faberProofExchangeRecordPromise = waitForProofExchangeRecord(faberAgent, { - state: ProofState.ProposalReceived, - }) - - let aliceProofExchangeRecord = await aliceAgent.proofs.proposeProof({ - connectionId: aliceConnectionId, - protocolVersion: 'v1', - proofFormats: { - indy: { - name: 'proof-request', - version: '1.0', - attributes: [], - predicates: [ - { - credentialDefinitionId, - name: 'age', - predicate: '>=', - threshold: 18, - }, - ], - }, - }, - comment: 'V1 propose proof test 1', - }) - - testLogger.test('Faber waits for presentation from Alice') - let faberProofExchangeRecord = await faberProofExchangeRecordPromise - - let proposal = await faberAgent.proofs.findProposalMessage(faberProofExchangeRecord.id) - expect(proposal).toMatchObject({ - type: 'https://didcomm.org/present-proof/1.0/propose-presentation', - id: expect.any(String), - comment: 'V1 propose proof test 1', - presentationProposal: { - type: 'https://didcomm.org/present-proof/1.0/presentation-preview', - attributes: [], - predicates: [ - { - name: 'age', - credentialDefinitionId, - predicate: '>=', - threshold: 18, - }, - ], - }, - }) - expect(faberProofExchangeRecord).toMatchObject({ - id: expect.anything(), - threadId: faberProofExchangeRecord.threadId, - state: ProofState.ProposalReceived, - protocolVersion: 'v1', - }) - - let aliceProofExchangeRecordPromise = waitForProofExchangeRecord(aliceAgent, { - threadId: faberProofExchangeRecord.threadId, - state: ProofState.RequestReceived, - }) - - testLogger.test('Faber sends new proof request to Alice') - faberProofExchangeRecord = await faberAgent.proofs.negotiateProposal({ - proofRecordId: faberProofExchangeRecord.id, - proofFormats: { - indy: { - name: 'proof-request', - version: '1.0', - requested_attributes: { - something: { - name: 'name', - restrictions: [ - { - cred_def_id: credentialDefinitionId, - }, - ], - }, - }, - requested_predicates: { - somethingElse: { - name: 'age', - p_type: '>=', - p_value: 50, - restrictions: [ - { - cred_def_id: credentialDefinitionId, - }, - ], - }, - }, - }, - }, - }) - - testLogger.test('Alice waits for proof request from Faber') - aliceProofExchangeRecord = await aliceProofExchangeRecordPromise - - let request = await faberAgent.proofs.findRequestMessage(faberProofExchangeRecord.id) - expect(request).toMatchObject({ - type: 'https://didcomm.org/present-proof/1.0/request-presentation', - id: expect.any(String), - requestAttachments: [ - { - id: 'libindy-request-presentation-0', - mimeType: 'application/json', - data: { - base64: expect.any(String), - }, - }, - ], - thread: { - threadId: faberProofExchangeRecord.threadId, - }, - }) - expect(aliceProofExchangeRecord).toMatchObject({ - id: expect.anything(), - threadId: faberProofExchangeRecord.threadId, - state: ProofState.RequestReceived, - protocolVersion: 'v1', - }) - - testLogger.test('Alice sends proof proposal to Faber') - - faberProofExchangeRecordPromise = waitForProofExchangeRecord(faberAgent, { - state: ProofState.ProposalReceived, - }) - - aliceProofExchangeRecord = await aliceAgent.proofs.negotiateRequest({ - proofRecordId: aliceProofExchangeRecord.id, - proofFormats: { - indy: { - name: 'proof-request', - version: '1.0', - attributes: [], - predicates: [ - { - credentialDefinitionId, - name: 'age', - predicate: '>=', - threshold: 18, - }, - ], - }, - }, - comment: 'V1 propose proof test 2', - }) - - testLogger.test('Faber waits for presentation from Alice') - faberProofExchangeRecord = await faberProofExchangeRecordPromise - - proposal = await faberAgent.proofs.findProposalMessage(faberProofExchangeRecord.id) - expect(proposal).toMatchObject({ - type: 'https://didcomm.org/present-proof/1.0/propose-presentation', - id: expect.any(String), - comment: 'V1 propose proof test 2', - presentationProposal: { - type: 'https://didcomm.org/present-proof/1.0/presentation-preview', - attributes: [], - predicates: [ - { - name: 'age', - credentialDefinitionId, - predicate: '>=', - threshold: 18, - }, - ], - }, - }) - expect(faberProofExchangeRecord).toMatchObject({ - id: expect.anything(), - threadId: faberProofExchangeRecord.threadId, - state: ProofState.ProposalReceived, - protocolVersion: 'v1', - }) - - // Accept Proposal - const acceptProposalOptions: AcceptProofProposalOptions = { - proofRecordId: faberProofExchangeRecord.id, - } - - aliceProofExchangeRecordPromise = waitForProofExchangeRecord(aliceAgent, { - threadId: faberProofExchangeRecord.threadId, - state: ProofState.RequestReceived, - }) - - testLogger.test('Faber accepts presentation proposal from Alice') - faberProofExchangeRecord = await faberAgent.proofs.acceptProposal(acceptProposalOptions) - - testLogger.test('Alice waits for proof request from Faber') - aliceProofExchangeRecord = await aliceProofExchangeRecordPromise - - request = await faberAgent.proofs.findRequestMessage(faberProofExchangeRecord.id) - expect(request).toMatchObject({ - type: 'https://didcomm.org/present-proof/1.0/request-presentation', - id: expect.any(String), - requestAttachments: [ - { - id: 'libindy-request-presentation-0', - mimeType: 'application/json', - data: { - base64: expect.any(String), - }, - }, - ], - thread: { - threadId: faberProofExchangeRecord.threadId, - }, - }) - expect(aliceProofExchangeRecord).toMatchObject({ - id: expect.anything(), - threadId: faberProofExchangeRecord.threadId, - state: ProofState.RequestReceived, - protocolVersion: 'v1', - }) - - const proposalMessage = await aliceAgent.proofs.findProposalMessage(aliceProofExchangeRecord.id) - expect(proposalMessage).toMatchObject({ - type: 'https://didcomm.org/present-proof/1.0/propose-presentation', - id: expect.any(String), - comment: 'V1 propose proof test 2', - presentationProposal: { - type: 'https://didcomm.org/present-proof/1.0/presentation-preview', - attributes: [], - predicates: [ - { - name: 'age', - credentialDefinitionId, - predicate: '>=', - threshold: 18, - }, - ], - }, - }) - - const proofRequestMessage = (await aliceAgent.proofs.findRequestMessage( - aliceProofExchangeRecord.id - )) as V1RequestPresentationMessage - - const predicateKey = Object.keys(proofRequestMessage.indyProofRequest?.requested_predicates ?? {})[0] - expect(proofRequestMessage.indyProofRequest).toMatchObject({ - name: 'Proof Request', - version: '1.0', - requested_attributes: {}, - requested_predicates: { - [predicateKey]: { - p_type: '>=', - p_value: 18, - restrictions: [ - { - cred_def_id: credentialDefinitionId, - }, - ], - }, - }, - }) - }) -}) diff --git a/packages/core/src/agent/MessageReceiver.ts b/packages/core/src/agent/MessageReceiver.ts index b4a50ac553..2bfabd9342 100644 --- a/packages/core/src/agent/MessageReceiver.ts +++ b/packages/core/src/agent/MessageReceiver.ts @@ -112,7 +112,6 @@ export class MessageReceiver { ) { const message = await this.transformAndValidate(agentContext, plaintextMessage) const messageContext = new InboundMessageContext(message, { connection, agentContext }) - await this.dispatcher.dispatch(messageContext) } @@ -146,7 +145,7 @@ export class MessageReceiver { // We want to save a session if there is a chance of returning outbound message via inbound transport. // That can happen when inbound message has `return_route` set to `all` or `thread`. // If `return_route` defines just `thread`, we decide later whether to use session according to outbound message `threadId`. - if (senderKey && recipientKey && session && message.hasReturnRouting()) { + if (senderKey && recipientKey && message.hasAnyReturnRoute() && session) { this.logger.debug(`Storing session for inbound message '${message.id}'`) const keys = { recipientKeys: [senderKey], @@ -165,6 +164,7 @@ export class MessageReceiver { // No need to wait for session to stay open if we're not actually going to respond to the message. await session.close() } + await this.dispatcher.dispatch(messageContext) } From 1f8cc8bfdb8bc1013720d6c742259b6d8d8bd906 Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Wed, 8 Mar 2023 10:41:38 +0100 Subject: [PATCH 18/23] chore: additional tweaks Signed-off-by: Timo Glastra --- packages/core/src/agent/Agent.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/src/agent/Agent.ts b/packages/core/src/agent/Agent.ts index 7e59b20e5a..57649e1740 100644 --- a/packages/core/src/agent/Agent.ts +++ b/packages/core/src/agent/Agent.ts @@ -136,6 +136,10 @@ export class Agent extends BaseAge this.messageReceiver.registerInboundTransport(inboundTransport) } + public async unregisterInboundTransport(inboundTransport: InboundTransport) { + await this.messageReceiver.unregisterInboundTransport(inboundTransport) + } + public get inboundTransports() { return this.messageReceiver.inboundTransports } @@ -144,7 +148,7 @@ export class Agent extends BaseAge this.messageSender.registerOutboundTransport(outboundTransport) } - public async unregisterOutboundTransportTransport(outboundTransport: OutboundTransport) { + public async unregisterOutboundTransport(outboundTransport: OutboundTransport) { await this.messageSender.unregisterOutboundTransport(outboundTransport) } From d918b3f74aa64064d133c9fb5ff651643133c5e4 Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Wed, 8 Mar 2023 10:51:55 +0100 Subject: [PATCH 19/23] refactor: session logic Signed-off-by: Timo Glastra --- packages/core/src/agent/Dispatcher.ts | 13 ++++--- packages/core/src/agent/MessageSender.ts | 39 ++++++++++++------- .../agent/models/OutboundMessageContext.ts | 2 + 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/packages/core/src/agent/Dispatcher.ts b/packages/core/src/agent/Dispatcher.ts index 787ad41d19..5301745040 100644 --- a/packages/core/src/agent/Dispatcher.ts +++ b/packages/core/src/agent/Dispatcher.ts @@ -48,6 +48,7 @@ class Dispatcher { outboundMessage = await messageHandler.handle(messageContext) } catch (error) { const problemReportMessage = error.problemReport + if (problemReportMessage instanceof ProblemReportMessage && messageContext.connection) { const { protocolUri: problemReportProtocolUri } = parseMessageType(problemReportMessage.type) const { protocolUri: inboundProtocolUri } = parseMessageType(messageContext.message.type) @@ -67,6 +68,7 @@ class Dispatcher { outboundMessage = new OutboundMessageContext(problemReportMessage, { agentContext, connection: messageContext.connection, + inboundMessageContext: messageContext, }) } else { this.logger.error(`Error handling message with type ${message.type}`, { @@ -82,13 +84,14 @@ class Dispatcher { } if (outboundMessage) { - // Store the sessionId of the inbound message, if there is one, so messages can later be send without - // outbound transport. - if (!outboundMessage.sessionId) outboundMessage.sessionId = messageContext.sessionId + // set the inbound message context, if not already defined + if (!outboundMessage.inboundMessageContext) { + outboundMessage.inboundMessageContext = messageContext + } + if (outboundMessage.isOutboundServiceMessage()) { - await this.messageSender.sendMessageToService(outboundMessage, agentContext) + await this.messageSender.sendMessageToService(outboundMessage) } else { - outboundMessage.sessionId = messageContext.sessionId await this.messageSender.sendMessage(outboundMessage) } } diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 0a657d126b..3fa395747c 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -344,17 +344,20 @@ export class MessageSender { ) } - public async sendMessageToService(outboundMessageContext: OutboundMessageContext, agentContext?: AgentContext) { + public async sendMessageToService(outboundMessageContext: OutboundMessageContext) { const session = this.findSessionForOutboundContext(outboundMessageContext) - if (session && agentContext) { + + if (session) { + this.logger.debug(`Found session with return routing for message '${outboundMessageContext.message.id}'`) try { - await this.sendMessageToSession(agentContext, session, outboundMessageContext.message) - this.emitMessageSentEvent(outboundMessageContext, OutboundMessageSendStatus.SentToTransport) - } catch (_) { - this.logger.error('Failed to send message to session.') - this.logger.info('Attempting to send to Service instead.') + 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) } } + // If there is no session try sending to service instead try { await this.sendToService(outboundMessageContext) @@ -437,12 +440,22 @@ export class MessageSender { } private findSessionForOutboundContext(outboundContext: OutboundMessageContext) { - const session = outboundContext.sessionId - ? this.transportService.findSessionById(outboundContext.sessionId) - : outboundContext.connection?.id - ? this.transportService.findSessionByConnectionId(outboundContext.connection.id) - : undefined - if (session && session.inboundMessage?.hasAnyReturnRoute()) return session + let session: TransportSession | undefined = undefined + + // Use session id from outbound context if present, or use the session from the inbound message context + const sessionId = outboundContext.sessionId ?? outboundContext.inboundMessageContext?.sessionId + + // Try to find session by id + if (sessionId) { + session = this.transportService.findSessionById(sessionId) + } + + // Try to find session by connection id + if (!session && outboundContext.connection?.id) { + session = this.transportService.findSessionByConnectionId(outboundContext.connection.id) + } + + return session && session.inboundMessage?.hasAnyReturnRoute() ? session : null } private async retrieveServicesByConnection( diff --git a/packages/core/src/agent/models/OutboundMessageContext.ts b/packages/core/src/agent/models/OutboundMessageContext.ts index f0836e223e..de0eca1705 100644 --- a/packages/core/src/agent/models/OutboundMessageContext.ts +++ b/packages/core/src/agent/models/OutboundMessageContext.ts @@ -33,6 +33,7 @@ export class OutboundMessageContext { public outOfBand?: OutOfBandRecord public associatedRecord?: BaseRecord public sessionId?: string + public inboundMessageContext?: InboundMessageContext public readonly agentContext: AgentContext public constructor(message: T, context: OutboundMessageContextParams) { @@ -42,6 +43,7 @@ export class OutboundMessageContext { this.outOfBand = context.outOfBand this.serviceParams = context.serviceParams this.associatedRecord = context.associatedRecord + this.inboundMessageContext = context.inboundMessageContext this.agentContext = context.agentContext } From c37d970bb72cfdcf2db3a2432095cf87bfbb55d6 Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Wed, 8 Mar 2023 10:55:14 +0100 Subject: [PATCH 20/23] refactor: more tweaks Signed-off-by: Timo Glastra --- packages/core/src/agent/MessageSender.ts | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 3fa395747c..514be3083d 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -140,9 +140,9 @@ export class MessageSender { options?.transportPriority ) - // if (this.outboundTransports.length === 0 && !queueService) { - // throw new AriesFrameworkError('Agent has no outbound transport!') - // } + if (this.outboundTransports.length === 0 && !queueService) { + throw new AriesFrameworkError('Agent has no outbound transport!') + } // Loop trough all available services and try to send the message for await (const service of services) { @@ -278,7 +278,6 @@ export class MessageSender { // an incoming message. const [firstOurAuthenticationKey] = ourAuthenticationKeys // If the returnRoute is already set we won't override it. This allows to set the returnRoute manually if this is desired. - // const shouldAddReturnRoute = true const shouldAddReturnRoute = message.transport?.returnRoute === undefined && !this.transportService.hasInboundEndpoint(ourDidDocument) @@ -380,14 +379,14 @@ export class MessageSender { } private async sendToService(outboundMessageContext: OutboundMessageContext) { - const { agentContext, message, serviceParams, connection, sessionId } = outboundMessageContext + const { agentContext, message, serviceParams, connection } = outboundMessageContext if (!serviceParams) { throw new AriesFrameworkError('No service parameters found in outbound message context') } const { service, senderKey, returnRoute } = serviceParams - if (this.outboundTransports.length === 0 && !sessionId) { + if (this.outboundTransports.length === 0) { throw new AriesFrameworkError('Agent has no outbound transport!') } @@ -403,7 +402,7 @@ export class MessageSender { } // Set return routing for message if requested - if (returnRoute || sessionId) { + if (returnRoute) { message.setReturnRouting(ReturnRouteTypes.all, message.threadId) } @@ -425,18 +424,19 @@ export class MessageSender { outboundPackage.endpoint = service.serviceEndpoint outboundPackage.connectionId = connection?.id - // Outbound transport is present - if (this.outboundTransports.length !== 0) { - for (const transport of this.outboundTransports) { - const protocolScheme = getProtocolScheme(service.serviceEndpoint) - if (!protocolScheme) { - this.logger.warn('Service does not have a protocol scheme.') - } else if (transport.supportedSchemes.includes(protocolScheme)) { - await transport.sendMessage(outboundPackage) - return - } + for (const transport of this.outboundTransports) { + const protocolScheme = getProtocolScheme(service.serviceEndpoint) + if (!protocolScheme) { + this.logger.warn('Service does not have a protocol scheme.') + } else if (transport.supportedSchemes.includes(protocolScheme)) { + await transport.sendMessage(outboundPackage) + return } } + + throw new MessageSendingError(`Unable to send message to service: ${service.serviceEndpoint}`, { + outboundMessageContext, + }) } private findSessionForOutboundContext(outboundContext: OutboundMessageContext) { From 8932ec2b276bd498766f9ca2a63cc9b2a4541b78 Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Wed, 8 Mar 2023 10:56:41 +0100 Subject: [PATCH 21/23] keep aligned with previous implementations Signed-off-by: Timo Glastra --- packages/core/src/agent/MessageSender.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 514be3083d..f6eeb9b758 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -403,7 +403,7 @@ export class MessageSender { // Set return routing for message if requested if (returnRoute) { - message.setReturnRouting(ReturnRouteTypes.all, message.threadId) + message.setReturnRouting(ReturnRouteTypes.all) } try { @@ -423,7 +423,6 @@ export class MessageSender { const outboundPackage = await this.packMessage(agentContext, { message, keys, endpoint: service.serviceEndpoint }) outboundPackage.endpoint = service.serviceEndpoint outboundPackage.connectionId = connection?.id - for (const transport of this.outboundTransports) { const protocolScheme = getProtocolScheme(service.serviceEndpoint) if (!protocolScheme) { @@ -433,7 +432,6 @@ export class MessageSender { return } } - throw new MessageSendingError(`Unable to send message to service: ${service.serviceEndpoint}`, { outboundMessageContext, }) From 03e79f6cd85d1300459670421a7e9618d4e8fb7a Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Wed, 8 Mar 2023 10:58:08 +0100 Subject: [PATCH 22/23] restore tests Signed-off-by: Timo Glastra --- .../src/agent/__tests__/MessageSender.test.ts | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/packages/core/src/agent/__tests__/MessageSender.test.ts b/packages/core/src/agent/__tests__/MessageSender.test.ts index 4849384454..35d566c3b0 100644 --- a/packages/core/src/agent/__tests__/MessageSender.test.ts +++ b/packages/core/src/agent/__tests__/MessageSender.test.ts @@ -462,6 +462,24 @@ describe('MessageSender', () => { expect(sendToServiceSpy).toHaveBeenCalledTimes(2) expect(sendMessageSpy).toHaveBeenCalledTimes(2) }) + + test('throw error when message endpoint is not supported by outbound transport schemes', async () => { + messageSender.registerOutboundTransport(new DummyWsOutboundTransport()) + await expect(messageSender.sendMessage(outboundMessageContext)).rejects.toThrow( + /Message is undeliverable to connection/ + ) + + expect(eventListenerMock).toHaveBeenCalledWith({ + type: AgentEventTypes.AgentMessageSent, + metadata: { + contextCorrelationId: 'mock', + }, + payload: { + message: outboundMessageContext, + status: OutboundMessageSendStatus.Undeliverable, + }, + }) + }) }) describe('sendMessageToService', () => { @@ -587,6 +605,31 @@ describe('MessageSender', () => { }) expect(sendMessageSpy).toHaveBeenCalledTimes(1) }) + + test('throw error when message endpoint is not supported by outbound transport schemes', async () => { + messageSender.registerOutboundTransport(new DummyWsOutboundTransport()) + outboundMessageContext = new OutboundMessageContext(new TestMessage(), { + agentContext, + serviceParams: { + senderKey, + service, + }, + }) + + await expect(messageSender.sendMessageToService(outboundMessageContext)).rejects.toThrow( + /Unable to send message to service/ + ) + expect(eventListenerMock).toHaveBeenCalledWith({ + type: AgentEventTypes.AgentMessageSent, + metadata: { + contextCorrelationId: 'mock', + }, + payload: { + message: outboundMessageContext, + status: OutboundMessageSendStatus.Undeliverable, + }, + }) + }) }) describe('packMessage', () => { From 5f6dbb2e2c89b05ab596663201804d5a86ccb0dc Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Wed, 8 Mar 2023 11:04:54 +0100 Subject: [PATCH 23/23] fix tests Signed-off-by: Timo Glastra --- .../v1-connectionless-proofs.e2e.test.ts | 31 +++++++------------ .../v2-indy-connectionless-proofs.e2e.test.ts | 18 +++++------ 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts index 3dfda5d42c..ea2049d00d 100644 --- a/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts +++ b/packages/anoncreds/src/protocols/proofs/v1/__tests__/v1-connectionless-proofs.e2e.test.ts @@ -16,7 +16,6 @@ import { AttachmentData, ProofEventTypes, } from '../../../../../../core/src' -import { sleep } from '../../../../../../core/src/utils/sleep' import { uuid } from '../../../../../../core/src/utils/uuid' import { testLogger, @@ -245,9 +244,6 @@ describe('V1 Proofs - Connectionless - Indy', () => { state: ProofState.Done, threadId: message.threadId, }) - // FIXME: This should not have to wait here. - // But removing the wait throws and error because the wallet context is already closed when receiving the ack - await sleep(3000) }) test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without an outbound transport', async () => { @@ -321,11 +317,6 @@ describe('V1 Proofs - Connectionless - Indy', () => { autoAcceptProof: AutoAcceptProof.ContentApproved, }) - message.setService({ - recipientKeys: [faberAgent.config.walletConfig?.key ?? ''], - serviceEndpoint: message.service?.serviceEndpoint ?? 'rxjs:faber', - }) - const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ recordId: faberProofExchangeRecord.id, message, @@ -333,17 +324,19 @@ describe('V1 Proofs - Connectionless - Indy', () => { }) for (const transport of faberAgent.outboundTransports) { - await faberAgent.unregisterOutboundTransportTransport(transport) + await faberAgent.unregisterOutboundTransport(transport) } await aliceAgent.receiveMessage(requestMessage.toJSON()) await waitForProofExchangeRecordSubject(aliceReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) await waitForProofExchangeRecordSubject(faberReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) }) @@ -467,14 +460,6 @@ describe('V1 Proofs - Connectionless - Indy', () => { }, }) - const aliceProofExchangeRecordPromise = waitForProofExchangeRecordSubject(aliceReplay, { - state: ProofState.Done, - }) - - const faberProofExchangeRecordPromise = waitForProofExchangeRecordSubject(faberReplay, { - state: ProofState.Done, - }) - // eslint-disable-next-line prefer-const let { message, proofRecord: faberProofExchangeRecord } = await faberAgent.proofs.createRequest({ protocolVersion: 'v1', @@ -530,9 +515,15 @@ describe('V1 Proofs - Connectionless - Indy', () => { await aliceAgent.receiveMessage(requestMessage.toJSON()) - await aliceProofExchangeRecordPromise + await waitForProofExchangeRecordSubject(aliceReplay, { + state: ProofState.Done, + threadId: requestMessage.threadId, + }) - await faberProofExchangeRecordPromise + await waitForProofExchangeRecordSubject(faberReplay, { + state: ProofState.Done, + threadId: requestMessage.threadId, + }) await aliceAgent.mediationRecipient.stopMessagePickup() await faberAgent.mediationRecipient.stopMessagePickup() diff --git a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts index 1c45b5e5c6..7b6e8cad49 100644 --- a/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts +++ b/packages/core/src/modules/proofs/protocol/v2/__tests__/v2-indy-connectionless-proofs.e2e.test.ts @@ -20,9 +20,7 @@ import { } from '../../../../../../tests' import { Agent } from '../../../../../agent/Agent' import { Attachment, AttachmentData } from '../../../../../decorators/attachment/Attachment' -import { ReturnRouteTypes } from '../../../../../decorators/transport/TransportDecorator' import { LinkedAttachment } from '../../../../../utils/LinkedAttachment' -import { sleep } from '../../../../../utils/sleep' import { uuid } from '../../../../../utils/uuid' import { HandshakeProtocol } from '../../../../connections' import { CredentialEventTypes } from '../../../../credentials' @@ -238,14 +236,13 @@ describe('V2 Connectionless Proofs - Indy', () => { await waitForProofExchangeRecordSubject(aliceReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) await waitForProofExchangeRecordSubject(faberReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) - // FIXME: This should not have to wait here. - // But removing the wait throws and error because the wallet context is already closed when receiving the ack - await sleep(3000) }) test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and both agents having a mediator', async () => { @@ -423,12 +420,15 @@ describe('V2 Connectionless Proofs - Indy', () => { await waitForProofExchangeRecordSubject(aliceReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) await waitForProofExchangeRecordSubject(faberReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) }) + test('Faber starts with connection-less proof requests to Alice with auto-accept enabled and without an outbound transport', async () => { testLogger.test('Faber sends presentation request to Alice') @@ -503,10 +503,6 @@ describe('V2 Connectionless Proofs - Indy', () => { autoAcceptProof: AutoAcceptProof.ContentApproved, }) - message.setService({ - recipientKeys: [faberAgent.config.walletConfig?.key ?? ''], - serviceEndpoint: message.service?.serviceEndpoint ?? 'rxjs:faber', - }) const { message: requestMessage } = await faberAgent.oob.createLegacyConnectionlessInvitation({ recordId: faberProofExchangeRecord.id, message, @@ -514,16 +510,18 @@ describe('V2 Connectionless Proofs - Indy', () => { }) for (const transport of faberAgent.outboundTransports) { - await faberAgent.unregisterOutboundTransportTransport(transport) + await faberAgent.unregisterOutboundTransport(transport) } await aliceAgent.receiveMessage(requestMessage.toJSON()) await waitForProofExchangeRecordSubject(aliceReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) await waitForProofExchangeRecordSubject(faberReplay, { state: ProofState.Done, + threadId: requestMessage.threadId, }) }) })