diff --git a/src/domain/models/Message.ts b/src/domain/models/Message.ts index 25475dbc8..7a68f5cde 100644 --- a/src/domain/models/Message.ts +++ b/src/domain/models/Message.ts @@ -142,7 +142,8 @@ export class Message implements Pluto.Storable { } static isJsonAttachment(data: any): data is AttachmentJsonData { - return data.data !== undefined || data.json !== undefined; + // data.data handled for backwards compatibility with stored messages + return data.json !== undefined || data.data !== undefined; } } @@ -173,12 +174,9 @@ export namespace Message { } if (isJson(attachment.data)) { - let decoded: any; - if ("data" in attachment.data) { - decoded = attachment.data.data; - } else if ("json" in attachment.data) { - decoded = attachment.data.json; - } + // data.data handled for backwards compatibility + const decoded = attachment.data.json ?? (attachment.data as any).data; + return typeof decoded === "object" ? decoded : JSON.parse(decoded); @@ -193,8 +191,8 @@ export namespace Message { }; const isJson = (data: AttachmentData): data is AttachmentJsonData => { - // ?? why do we mutate json -> data in didcomm Wrapper - return "data" in data || "json" in data; + // data.data handled for backwards compatibility + return "json" in data || "data" in data; }; } } diff --git a/src/domain/models/MessageAttachment.ts b/src/domain/models/MessageAttachment.ts index 776d00f0e..c6d417a0a 100644 --- a/src/domain/models/MessageAttachment.ts +++ b/src/domain/models/MessageAttachment.ts @@ -27,8 +27,6 @@ export interface AttachmentLinkData { export type AttachmentJsonData = { json: any; -} | { - data: any; }; export type AttachmentData = diff --git a/src/edge-agent/protocols/pickup/PickupRunner.ts b/src/edge-agent/protocols/pickup/PickupRunner.ts index defae0b8f..4e76c1276 100644 --- a/src/edge-agent/protocols/pickup/PickupRunner.ts +++ b/src/edge-agent/protocols/pickup/PickupRunner.ts @@ -5,9 +5,9 @@ import { ProtocolType } from "../ProtocolTypes"; import { PickupAttachment } from "../types"; type PickupResponse = - | { type: "status"; message: Message } - | { type: "delivery"; message: Message } - | { type: 'report', message: Message }; + | { type: "status"; message: Message; } + | { type: "delivery"; message: Message; } + | { type: 'report', message: Message; }; export class PickupRunner { private message: PickupResponse; @@ -41,9 +41,7 @@ export class PickupRunner { } else if (Message.isJsonAttachment(attachment.data)) { return { attachmentId: attachment.id, - data: "data" in attachment.data ? - JSON.stringify(attachment.data.data) : - JSON.stringify(attachment.data.json), + data: JSON.stringify(attachment.data.json), }; } @@ -56,7 +54,7 @@ export class PickupRunner { return attachment !== null; } - async run(): Promise> { + async run(): Promise> { if (this.message.type === "delivery") { return Promise.all( this.message.message.attachments @@ -73,7 +71,7 @@ export class PickupRunner { attachmentId: this.message.message.id, message: this.message.message } - ] + ]; } return []; diff --git a/src/mercury/didcomm/Wrapper.ts b/src/mercury/didcomm/Wrapper.ts index 8cb1c57a3..e7bbeea60 100644 --- a/src/mercury/didcomm/Wrapper.ts +++ b/src/mercury/didcomm/Wrapper.ts @@ -174,29 +174,11 @@ export class DIDCommWrapper implements DIDCommProtocol { private parseAttachmentDataToDomain( data: AttachmentData ): Domain.AttachmentData { - if ("base64" in data) { - const parsed: Domain.AttachmentBase64 = { - base64: data.base64, - }; - - return parsed; - } - - if ("json" in data) { - const parsed: Domain.AttachmentJsonData = { - data: data.json, - }; - - return parsed; - } - - if ("links" in data) { - const parsed: Domain.AttachmentLinkData = { - hash: data.hash, - links: data.links, - }; - - return parsed; + if ("base64" in data + || "json" in data + || "links" in data + ) { + return data; } throw new MercuryError.UnknownAttachmentDataError(); @@ -251,14 +233,6 @@ export class DIDCommWrapper implements DIDCommProtocol { return parsed; } - if ("data" in data) { - const parsed: JsonAttachmentData = { - json: JSON.parse(data.data), - }; - - return parsed; - } - if ("links" in data) { const parsed: LinksAttachmentData = { hash: data.hash, diff --git a/src/mercury/forward/ForwardMessage.ts b/src/mercury/forward/ForwardMessage.ts index 68cb7c618..e9ac688e0 100644 --- a/src/mercury/forward/ForwardMessage.ts +++ b/src/mercury/forward/ForwardMessage.ts @@ -19,7 +19,7 @@ export class ForwardMessage { makeMessage(): Message { const body = JSON.stringify(this.body); const attachment = new AttachmentDescriptor( - { data: this.encryptedMessage }, + { json: this.encryptedMessage }, "application/json" ); return new Message(body, this.id, ForwardMessage.type, this.from, this.to, [ diff --git a/tests/domain/message.test.ts b/tests/domain/message.test.ts index b3db4be6e..a44f58e6d 100644 --- a/tests/domain/message.test.ts +++ b/tests/domain/message.test.ts @@ -1,5 +1,6 @@ import { describe, it, expect, test, beforeEach, afterEach } from 'vitest'; import { Message } from "../../src/domain"; +import { UnsupportedAttachmentType } from '../../src/domain/models/errors/Agent'; describe("Message", () => { describe("fromJson", () => { @@ -10,5 +11,51 @@ describe("Message", () => { expect(result).to.be.an.instanceOf(Message); expect(result.extraHeaders).to.be.an("object"); }); + + test("attachments - doesnt match - not added", () => { + const dataJson = { + body: { prop: 1 }, + piuri: "https://didcomm.org/issue-credential/3.0/offer-credential", + attachments: [{ + data: { + notmatch: { test: 123 } + }, + }], + }; + const sut = () => Message.fromJson(dataJson); + + expect(sut).toThrow(UnsupportedAttachmentType); + }); + + test("attachments - matches .json payload", () => { + const dataJson = { + body: { prop: 1 }, + piuri: "https://didcomm.org/issue-credential/3.0/offer-credential", + attachments: [{ + data: { + json: { test: 123 } + }, + }], + }; + const result = Message.fromJson(dataJson); + + expect(result.attachments).toHaveLength(1); + }); + + // for backwards compatibility with Pluto stored messages + test("attachments - matches .data payload", () => { + const dataJson = { + body: { prop: 1 }, + piuri: "https://didcomm.org/issue-credential/3.0/offer-credential", + attachments: [{ + data: { + data: { test: 123 } + }, + }], + }; + const result = Message.fromJson(dataJson); + + expect(result.attachments).toHaveLength(1); + }); }); });