Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to send or recieve PerformMessage with params #1785

Open
BlackLight54 opened this issue Mar 1, 2024 · 1 comment
Open

Unable to send or recieve PerformMessage with params #1785

BlackLight54 opened this issue Mar 1, 2024 · 1 comment

Comments

@BlackLight54
Copy link

BlackLight54 commented Mar 1, 2024

When sending or recieving a message which is compliant with Aries RFC 0509: Action Menu Protocol which contains a valid params dictionary:

Recieved Message

INFO: Received message with type 'https://didcomm.org/action-menu/1.0/perform', recipient key /**/and sender key /**/{
  "@type": "https://didcomm.org/action-menu/1.0/perform",
  "@id": "/**//",
  "name": "echo",
  "params": {
    "message-text": "asd"
  },
  "~thread": {
    "thid": "85e0a4a3-c4c8-4832-81da-79fd7820fc21"
  }
}

There is an unexpected validation error, stating that an `each `constraint is not satisfied, specifically `each value in params must be a string` .
Error

ERROR: Error validating message undefined {
  "errors": {
    "name": "ClassValidationError",
    "message": "PerformMessage: Failed to validate class.
    An instance of PerformMessage has failed the validation:
     - property params has failed the following constraints: each value in params must be a string",
    "stack": "ClassValidationError: PerformMessage: Failed to validate class.
    An instance of PerformMessage has failed the validation:
    - property params has failed the following constraints: each value in params must be a string 

    at Function.validateSync (.../node_modules/@credo-ts/core/src/utils/MessageValidator.ts:19:13)
    at Function.fromJSON (.../node_modules/@credo-ts/core/src/utils/JsonTransformer.ts:35:22)
    at MessageReceiver.transformMessage (.../node_modules/@credo-ts/core/src/agent/MessageReceiver.ts:255:44)
    at MessageReceiver.transformAndValidate (.../node_modules/@credo-ts/core/src/agent/MessageReceiver.ts:212:28)
    at MessageReceiver.receiveEncryptedMessage (.../node_modules/@credo-ts/core/src/agent/MessageReceiver.ts:133:32)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at MessageReceiver.receiveMessage (.../node_modules/@credo-ts/core/src/agent/MessageReceiver.ts:96:9)
    at <anonymous> (...node_modules/@credo-ts/node/src/transport/HttpInboundTransport.ts:55:9)",
    "validationErrors": [
      {
        "target": {
          "@type": "https://didcomm.org/action-menu/1.0/perform",
          "@id": "/**/",
          "name": "echo",
          "params": {
            "message-text": "asd"
          },
          "~thread": {
            "thid": "85e0a4a3-c4c8-4832-81da-79fd7820fc21"
          }
        },
        "value": {
          "message-text": "asd"
        },
        "property": "params",
        "children": [],
        "constraints": {
          "isString": "each value in params must be a string"
        }
      }
    ]
  },
  "message": "{\"@type\":\"https://didcomm.org/action-menu/1.0/perform\",\"@id\":\"/**/\",\"name\":\"echo\",\"params\":{\"message-text\":\"asd\"},\"~thread\":{\"thid\":\"85e0a4a3-c4c8-4832-81da-79fd7820fc21\"}}"
}

The same doesn't happen with an empty params field.

This probably originates from the validation in packages/action-menu/src/messages/PerformMessage.ts

export class PerformMessage extends AgentMessage {
  /* ... */
  @IsString({ each: true })
  @IsOptional()
  public params?: Record<string, string>
}

I suspect that because Record<string,string> is not a class, only a simple object, the validator doesn't work as expected, or that the each validator option only works with arrays not records.
I think a solution would fall along the lines of this issue.

PS: This issue may become irrelevant if class-validator is replaced by zod #1777

@BlackLight54 BlackLight54 changed the title Action Menu PerformMessage validation unexpected error Unable to send or recieve PerformMessage with params Mar 1, 2024
@GJanos
Copy link

GJanos commented May 20, 2024

I was able to recreate this issue, when I tried to perform an action of a requested action menu with params included.

The data that I tried to submit: {name: "echo", params: { message-text: "test message :)" }}
And the error message that was automatically logged from credo's side: I beleive it is related to this issue.

MessageSendingError: Message is undeliverable to connection 60fb89be-2f84-415e-9a23-dbce0fb9d4c5 (SupportOffice)
    at MessageSender.sendMessage (/usr/src/app/node_modules/@credo-ts/core/build/agent/MessageSender.js:302:15)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async ActionMenuApi.performAction (/usr/src/app/node_modules/@credo-ts/action-menu/build/ActionMenuApi.js:98:9)
    at async ActionMenuRequesterService.performAction (/usr/src/app/dist/apps/credo-api/main.js:222:16)
    at async ActionMenuController.sendActionMenuPerformMessage (/usr/src/app/dist/apps/credo-api/main.js:108:16)
    at async /usr/src/app/node_modules/@nestjs/core/router/router-execution-context.js:46:28
    at async /usr/src/app/node_modules/@nestjs/core/router/router-proxy.js:9:17 {
  outboundMessageContext: OutboundMessageContext {
    message: PerformMessage {
      allowDidSovPrefix: false,
      allowQueueTransport: true,
      type: 'https://didcomm.org/action-menu/1.0/perform',
      id: '498f241a-2849-4043-93fe-e84f43806029',
      name: 'echo',
      params: [Object],
      thread: [ThreadDecorator]
    },
    connection: ConnectionRecord {
      _tags: [Object],
      type: 'ConnectionRecord',
      metadata: [Metadata],
      connectionTypes: [],
      previousDids: [],
      previousTheirDids: [],
      id: '60fb89be-2f84-415e-9a23-dbce0fb9d4c5',
      createdAt: 2024-05-20T11:56:51.098Z,
      did: 'did:peer:1zQmQ8w87wHNULLnQuXorGZmi6GE93JPjbatf2XrfH5tp7yr',
      invitationDid: 'did:peer:2.Vz6MkvBRdeUiJpKd5PDbiiJRxL1r3p4aMJQfrdALPiFuQ95B1.Ez6LSboiaz3wKeSgCN9TAoBqsmaLNcfeTNsVg4g8udiFuUJxg.SeyJzIjoiaHR0cDovL3N1cHBvcnQtb2ZmaWNlOjQwMDEiLCJ0IjoiZGlkLWNvbW11bmljYXRpb24iLCJwcmlvcml0eSI6MCwicmVjaXBpZW50S2V5cyI6WyIja2V5LTEiXSwiciI6W119',
      theirLabel: 'SupportOffice',
      state: 'completed',
      role: 'requester',
      autoAcceptConnection: true,
      threadId: '4997f79d-26f3-436c-995a-1c64d3fea454',
      protocol: 'https://didcomm.org/didexchange/1.x',
      outOfBandId: 'e0148cc7-649e-4182-b510-79e3179f0754',
      updatedAt: 2024-05-20T11:56:51.249Z,
      theirDid: 'did:peer:1zQmX51xQkgS8ge1rQMzmgq2e8gQfijFpcKxeK9Njj6LKQkS'
    },
    sessionId: undefined,
    outOfBand: undefined,
    serviceParams: undefined,
    associatedRecord: ActionMenuRecord {
      _tags: [Object],
      type: 'ActionMenuRecord',
      metadata: [Metadata],
      id: '83bb3288-2a7d-4bcf-b43c-70450eed3217',
      createdAt: 2024-05-20T11:56:56.776Z,
      connectionId: '60fb89be-2f84-415e-9a23-dbce0fb9d4c5',
      threadId: 'd5cf05da-a1cc-4a63-ad6d-385bbe39750f',
      state: 'done',
      role: 'requester',
      updatedAt: 2024-05-20T17:17:01.362Z,
menu: [ActionMenu],
      performedAction: [Object]
    },
    inboundMessageContext: undefined,
    agentContext: AgentContext {
      dependencyManager: [DependencyManager],
      contextCorrelationId: 'default'
    }
  },
  [cause]: undefined
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants