From 071a149d3e426709663a1c4dee48beec6abfe993 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Tue, 14 May 2024 14:12:26 -1000 Subject: [PATCH] fix(federation): :bug: Fix extensions schema being incorrectly non-optional --- federation/index.ts | 15 +++++++++++++++ federation/schemas/base.ts | 14 +++++++------- federation/schemas/extensions.ts | 6 ++++++ 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 federation/schemas/extensions.ts diff --git a/federation/index.ts b/federation/index.ts index 15709d6..c92887d 100644 --- a/federation/index.ts +++ b/federation/index.ts @@ -15,6 +15,7 @@ import { CustomEmojiExtension, DislikeSchema, EntitySchema, + ExtensionPropertySchema, ExtensionSchema, FollowAcceptSchema, FollowRejectSchema, @@ -83,6 +84,9 @@ class EntityValidator { declare static $ActorPublicKeyData: InferType< typeof ActorPublicKeyDataSchema >; + declare static $ExtensionProperty: InferType< + typeof ExtensionPropertySchema + >; declare static $VanityExtension: InferType; declare static $User: InferType; declare static $Action: InferType; @@ -302,6 +306,17 @@ class EntityValidator { public Entity(data: unknown): Promise> { return this.validate(EntitySchema, data); } + + /** + * Validates an ExtensionProperty. + * @param data - The data to validate + * @returns A promise that resolves to the validated data. + */ + public ExtensionProperty( + data: unknown, + ): Promise> { + return this.validate(ExtensionPropertySchema, data); + } } export { diff --git a/federation/schemas/base.ts b/federation/schemas/base.ts index a28bd54..d299e6a 100644 --- a/federation/schemas/base.ts +++ b/federation/schemas/base.ts @@ -1,5 +1,6 @@ import { z } from "zod"; import { ContentFormatSchema } from "./content_format"; +import { ExtensionPropertySchema } from "./extensions"; import { CustomEmojiExtension } from "./extensions/custom_emojis"; import { VanityExtensionSchema } from "./extensions/vanity"; import { extensionTypeRegex } from "./regex"; @@ -9,9 +10,7 @@ const EntitySchema = z.object({ created_at: z.string(), uri: z.string().url(), type: z.string(), - extensions: z.object({ - "org.lysand:custom_emojis": CustomEmojiExtension.optional(), - }), + extensions: ExtensionPropertySchema.optional(), }); const VisibilitySchema = z.enum(["public", "unlisted", "private", "direct"]); @@ -27,7 +26,7 @@ const PublicationSchema = EntitySchema.extend({ subject: z.string().optional(), is_sensitive: z.boolean().optional(), visibility: VisibilitySchema, - extensions: EntitySchema.shape.extensions.extend({ + extensions: ExtensionPropertySchema.extend({ "org.lysand:reactions": z .object({ reactions: z.string(), @@ -43,7 +42,7 @@ const PublicationSchema = EntitySchema.extend({ }), }) .optional(), - }), + }).optional(), }); const NoteSchema = PublicationSchema.extend({ @@ -85,9 +84,9 @@ const UserSchema = EntitySchema.extend({ dislikes: z.string().url(), inbox: z.string().url(), outbox: z.string().url(), - extensions: EntitySchema.shape.extensions.extend({ + extensions: ExtensionPropertySchema.extend({ "org.lysand:vanity": VanityExtensionSchema.optional(), - }), + }).optional(), }); const ActionSchema = EntitySchema.extend({ @@ -185,4 +184,5 @@ export { ServerMetadataSchema, ContentFormatSchema, CustomEmojiExtension, + ExtensionPropertySchema, }; diff --git a/federation/schemas/extensions.ts b/federation/schemas/extensions.ts new file mode 100644 index 0000000..da06308 --- /dev/null +++ b/federation/schemas/extensions.ts @@ -0,0 +1,6 @@ +import { z } from "zod"; +import { CustomEmojiExtension } from "./extensions/custom_emojis"; + +export const ExtensionPropertySchema = z.object({ + "org.lysand:custom_emojis": CustomEmojiExtension.optional(), +});