From 69185ed59fab545fdff18ed96f1c6ee74d0bb1a8 Mon Sep 17 00:00:00 2001 From: Ry Racherbaumer Date: Mon, 28 Oct 2024 15:50:10 -0500 Subject: [PATCH 1/5] Allow for undefined content types and content --- sdks/node-sdk/src/DecodedMessage.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/sdks/node-sdk/src/DecodedMessage.ts b/sdks/node-sdk/src/DecodedMessage.ts index ea5307477..c5cdb7905 100644 --- a/sdks/node-sdk/src/DecodedMessage.ts +++ b/sdks/node-sdk/src/DecodedMessage.ts @@ -10,10 +10,10 @@ import { nsToDate } from "@/helpers/date"; export type MessageKind = "application" | "membership_change"; export type MessageDeliveryStatus = "unpublished" | "published" | "failed"; -export class DecodedMessage { +export class DecodedMessage { #client: Client; - content: any; - contentType: ContentTypeId; + content: T; + contentType: ContentTypeId | undefined; conversationId: string; deliveryStatus: MessageDeliveryStatus; fallback?: string; @@ -56,12 +56,15 @@ export class DecodedMessage { // no default } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.contentType = new ContentTypeId(message.content.type!); + this.contentType = message.content.type + ? new ContentTypeId(message.content.type) + : undefined; this.parameters = message.content.parameters; this.fallback = message.content.fallback; this.compression = message.content.compression; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - this.content = this.#client.decodeContent(message, this.contentType); + this.content = this.contentType + ? this.#client.decodeContent(message, this.contentType) + : undefined; } } From 0c7922215a52fa6192cd78adfab66b1e40b98674 Mon Sep 17 00:00:00 2001 From: Ry Racherbaumer Date: Mon, 28 Oct 2024 15:50:31 -0500 Subject: [PATCH 2/5] Filter messages without content --- sdks/node-sdk/src/Conversation.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sdks/node-sdk/src/Conversation.ts b/sdks/node-sdk/src/Conversation.ts index 8f92fff52..a7466d1de 100644 --- a/sdks/node-sdk/src/Conversation.ts +++ b/sdks/node-sdk/src/Conversation.ts @@ -189,8 +189,12 @@ export class Conversation { } messages(options?: NapiListMessagesOptions): DecodedMessage[] { - return this.#group - .findMessages(options) - .map((message) => new DecodedMessage(this.#client, message)); + return ( + this.#group + .findMessages(options) + .map((message) => new DecodedMessage(this.#client, message)) + // filter out messages without content + .filter((message) => message.content !== undefined) + ); } } From 7c941b82332d9f0c6cabef8e4260a2f19c5e78b9 Mon Sep 17 00:00:00 2001 From: Ry Racherbaumer Date: Mon, 28 Oct 2024 15:52:24 -0500 Subject: [PATCH 3/5] Allow message typing in getMessageById --- sdks/node-sdk/src/Conversations.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdks/node-sdk/src/Conversations.ts b/sdks/node-sdk/src/Conversations.ts index 9df05cf4e..16d33561d 100644 --- a/sdks/node-sdk/src/Conversations.ts +++ b/sdks/node-sdk/src/Conversations.ts @@ -27,11 +27,11 @@ export class Conversations { } } - getMessageById(id: string) { + getMessageById(id: string) { try { // findMessageById will throw if message is not found const message = this.#conversations.findMessageById(id); - return new DecodedMessage(this.#client, message); + return new DecodedMessage(this.#client, message); } catch { return null; } From f3d57da4d05e4ff81f509703e61a2e693e67dd66 Mon Sep 17 00:00:00 2001 From: Ry Racherbaumer Date: Mon, 28 Oct 2024 15:55:03 -0500 Subject: [PATCH 4/5] Use official group updated content type --- sdks/node-sdk/package.json | 1 + sdks/node-sdk/rollup.config.js | 3 +- sdks/node-sdk/src/Client.ts | 8 ++-- sdks/node-sdk/src/codecs/GroupUpdatedCodec.ts | 41 ------------------- sdks/node-sdk/src/index.ts | 4 -- yarn.lock | 1 + 6 files changed, 8 insertions(+), 50 deletions(-) delete mode 100644 sdks/node-sdk/src/codecs/GroupUpdatedCodec.ts diff --git a/sdks/node-sdk/package.json b/sdks/node-sdk/package.json index b1a4bf387..0e7283787 100644 --- a/sdks/node-sdk/package.json +++ b/sdks/node-sdk/package.json @@ -48,6 +48,7 @@ "typecheck": "tsc" }, "dependencies": { + "@xmtp/content-type-group-updated": "^1.0.0", "@xmtp/content-type-primitives": "^1.0.2", "@xmtp/content-type-text": "^1.0.0", "@xmtp/node-bindings": "^0.0.14", diff --git a/sdks/node-sdk/rollup.config.js b/sdks/node-sdk/rollup.config.js index 39aff655a..660feb54d 100644 --- a/sdks/node-sdk/rollup.config.js +++ b/sdks/node-sdk/rollup.config.js @@ -8,8 +8,9 @@ import tsConfigPaths from "rollup-plugin-tsconfig-paths"; const external = [ "node:path", "node:process", - "@xmtp/content-type-text", + "@xmtp/content-type-group-updated", "@xmtp/content-type-primitives", + "@xmtp/content-type-text", "@xmtp/node-bindings", "@xmtp/proto", "@xmtp/xmtp-js", diff --git a/sdks/node-sdk/src/Client.ts b/sdks/node-sdk/src/Client.ts index 3a3065e98..5a645c287 100644 --- a/sdks/node-sdk/src/Client.ts +++ b/sdks/node-sdk/src/Client.ts @@ -1,5 +1,9 @@ import { join } from "node:path"; import process from "node:process"; +import { + ContentTypeGroupUpdated, + GroupUpdatedCodec, +} from "@xmtp/content-type-group-updated"; import type { ContentCodec, ContentTypeId, @@ -15,10 +19,6 @@ import { type NapiClient, type NapiMessage, } from "@xmtp/node-bindings"; -import { - ContentTypeGroupUpdated, - GroupUpdatedCodec, -} from "@/codecs/GroupUpdatedCodec"; import { Conversations } from "@/Conversations"; export const ApiUrls = { diff --git a/sdks/node-sdk/src/codecs/GroupUpdatedCodec.ts b/sdks/node-sdk/src/codecs/GroupUpdatedCodec.ts deleted file mode 100644 index 73b3585d3..000000000 --- a/sdks/node-sdk/src/codecs/GroupUpdatedCodec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - ContentTypeId, - type ContentCodec, - type EncodedContent, -} from "@xmtp/content-type-primitives"; -import { mlsTranscriptMessages } from "@xmtp/proto"; - -export const ContentTypeGroupUpdated = new ContentTypeId({ - authorityId: "xmtp.org", - typeId: "group_updated", - versionMajor: 1, - versionMinor: 0, -}); - -export class GroupUpdatedCodec - implements ContentCodec -{ - get contentType(): ContentTypeId { - return ContentTypeGroupUpdated; - } - - encode(content: mlsTranscriptMessages.GroupUpdated): EncodedContent { - return { - type: this.contentType, - parameters: {}, - content: mlsTranscriptMessages.GroupUpdated.encode(content).finish(), - }; - } - - decode(content: EncodedContent): mlsTranscriptMessages.GroupUpdated { - return mlsTranscriptMessages.GroupUpdated.decode(content.content); - } - - fallback(): undefined { - return undefined; - } - - shouldPush() { - return false; - } -} diff --git a/sdks/node-sdk/src/index.ts b/sdks/node-sdk/src/index.ts index 1093c0bf1..ae43e6918 100644 --- a/sdks/node-sdk/src/index.ts +++ b/sdks/node-sdk/src/index.ts @@ -9,9 +9,5 @@ export { Client, ApiUrls } from "./Client"; export { Conversation } from "./Conversation"; export { Conversations } from "./Conversations"; export { DecodedMessage } from "./DecodedMessage"; -export { - ContentTypeGroupUpdated, - GroupUpdatedCodec, -} from "./codecs/GroupUpdatedCodec"; export type { StreamCallback } from "./AsyncStream"; export type * from "@xmtp/node-bindings"; diff --git a/yarn.lock b/yarn.lock index 975d12bed..8eb78cdd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4847,6 +4847,7 @@ __metadata: "@rollup/plugin-typescript": "npm:^12.1.1" "@types/node": "npm:^20.16.12" "@vitest/coverage-v8": "npm:^2.1.3" + "@xmtp/content-type-group-updated": "npm:^1.0.0" "@xmtp/content-type-primitives": "npm:^1.0.2" "@xmtp/content-type-text": "npm:^1.0.0" "@xmtp/node-bindings": "npm:^0.0.14" From 87457d64f853fa2d7c700cdedd70c6131d64d95a Mon Sep 17 00:00:00 2001 From: Ry Racherbaumer Date: Mon, 28 Oct 2024 16:03:26 -0500 Subject: [PATCH 5/5] Create chatty-snails-roll.md --- .changeset/chatty-snails-roll.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/chatty-snails-roll.md diff --git a/.changeset/chatty-snails-roll.md b/.changeset/chatty-snails-roll.md new file mode 100644 index 000000000..f302b3888 --- /dev/null +++ b/.changeset/chatty-snails-roll.md @@ -0,0 +1,8 @@ +--- +"@xmtp/node-sdk": patch +--- + +- Allowed for `undefined` content type and content in messages +- Filtered out messages without content when calling `Conversation.messages` +- Added generic typing for message content to `DecodedMessage` class and `Conversations.findMessageById` +- Replaced temporary group updated codec with official content type