diff --git a/bun.lock b/bun.lock index 0a6f88c81..f9008d0f6 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "homeserver", @@ -54,9 +55,9 @@ }, "packages/federation-sdk": { "name": "@rocket.chat/federation-sdk", - "version": "0.3.0", + "version": "0.3.9", "dependencies": { - "@rocket.chat/emitter": "^0.31.25", + "@rocket.chat/emitter": "^0.32.0", "@rocket.chat/federation-core": "workspace:*", "@rocket.chat/federation-crypto": "workspace:*", "@rocket.chat/federation-room": "workspace:*", @@ -64,7 +65,7 @@ "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", "tweetnacl": "^1.0.3", - "zod": "^3.24.1", + "zod": "~4.3.6", }, "peerDependencies": { "typescript": "~5.9.2", @@ -77,7 +78,7 @@ "@bogeychan/elysia-etag": "^0.0.6", "@bogeychan/elysia-logger": "^0.1.4", "@elysiajs/swagger": "^1.3.0", - "@rocket.chat/emitter": "^0.31.25", + "@rocket.chat/emitter": "^0.32.0", "@rocket.chat/federation-core": "workspace:*", "@rocket.chat/federation-room": "workspace:*", "@rocket.chat/federation-sdk": "workspace:*", @@ -95,7 +96,7 @@ "dependencies": { "@datastructures-js/priority-queue": "^6.3.5", "@rocket.chat/federation-crypto": "workspace:*", - "zod": "^3.24.1", + "zod": "~4.3.6", }, "devDependencies": { "bun-types": "latest", @@ -147,7 +148,7 @@ "@noble/ed25519": ["@noble/ed25519@3.0.0", "", {}, "sha512-QyteqMNm0GLqfa5SoYbSC3+Pvykwpn95Zgth4MFVSMKBB75ELl9tX1LAVsN4c3HXOrakHsF2gL4zWDAYCcsnzg=="], - "@rocket.chat/emitter": ["@rocket.chat/emitter@0.31.25", "", {}, "sha512-hw5BpDlNwpYSb+K5X3DNMNUVEVXxmXugUPetGZGCWvntSVFsOjYuVEypoKW6vBBXSfqCBb0kN1npYcKEb4NFBw=="], + "@rocket.chat/emitter": ["@rocket.chat/emitter@0.32.0", "", {}, "sha512-QCXNGDm5xjJPePMeP9GknMAZne5xhNmLLD/ZVVqNgOyeWdfQKddwBUqtMiWDaFCRq1bC22kNf3WQLqt89CO6fg=="], "@rocket.chat/federation-core": ["@rocket.chat/federation-core@workspace:packages/core"], @@ -291,7 +292,7 @@ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - "bun-types": ["bun-types@1.3.1", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw=="], + "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="], "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -575,18 +576,12 @@ "zhead": ["zhead@2.2.4", "", {}, "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag=="], - "zod": ["zod@3.25.71", "", {}, "sha512-BsBc/NPk7h8WsUWYWYL+BajcJPY8YhjelaWu2NMLuzgraKAz4Lb4/6K11g9jpuDetjMiqhZ6YaexFLOC0Ogi3Q=="], + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@bogeychan/elysia-logger/pino": ["pino@9.7.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg=="], "@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="], - "@rocket.chat/federation-crypto/bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="], - - "@rocket.chat/federation-room/bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="], - - "@rocket.chat/homeserver/bun-types": ["bun-types@1.2.22", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-hwaAu8tct/Zn6Zft4U9BsZcXkYomzpHJX28ofvx7k0Zz2HNz54n1n+tDgxoWFGB4PcFvJXJQloPhaV2eP3Q6EA=="], - "@scalar/themes/@scalar/types": ["@scalar/types@0.1.7", "", { "dependencies": { "@scalar/openapi-types": "0.2.0", "@unhead/schema": "^1.11.11", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "zod": "^3.23.8" } }, "sha512-irIDYzTQG2KLvFbuTI8k2Pz/R4JR+zUUSykVTbEMatkzMmVFnn1VzNSMlODbadycwZunbnL2tA27AXed9URVjw=="], "@sinonjs/samsam/type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="], @@ -621,6 +616,8 @@ "@scalar/themes/@scalar/types/@scalar/openapi-types": ["@scalar/openapi-types@0.2.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-waiKk12cRCqyUCWTOX0K1WEVX46+hVUK+zRPzAahDJ7G0TApvbNkuy5wx7aoUyEk++HHde0XuQnshXnt8jsddA=="], + "@scalar/themes/@scalar/types/zod": ["zod@3.25.71", "", {}, "sha512-BsBc/NPk7h8WsUWYWYL+BajcJPY8YhjelaWu2NMLuzgraKAz4Lb4/6K11g9jpuDetjMiqhZ6YaexFLOC0Ogi3Q=="], + "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.0.0", "", { "dependencies": { "get-east-asian-width": "^1.0.0" } }, "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA=="], diff --git a/package.json b/package.json index 5e5ec4a37..29d22e6f9 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "pre-commit": "bun test" } }, - "packageManager": "bun@1.1.10", + "packageManager": "bun@1.3.9", "lint-staged": { "**.{js|ts|cjs|mjs|d.cts|d.mts|jsx|tsx|json|jsonc}": [ "biome check --files-ignore-unknown=true --diagnostic-level=error", diff --git a/packages/federation-sdk/package.json b/packages/federation-sdk/package.json index 50fc5eaa3..d22563a68 100644 --- a/packages/federation-sdk/package.json +++ b/packages/federation-sdk/package.json @@ -16,7 +16,7 @@ "test": "bun test" }, "dependencies": { - "@rocket.chat/emitter": "^0.31.25", + "@rocket.chat/emitter": "^0.32.0", "@rocket.chat/federation-core": "workspace:*", "@rocket.chat/federation-crypto": "workspace:*", "@rocket.chat/federation-room": "workspace:*", @@ -24,7 +24,7 @@ "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", "tweetnacl": "^1.0.3", - "zod": "^3.24.1" + "zod": "~4.3.6" }, "license": "AGPL-3.0", "author": "Rocket.Chat Technologies Corp. ", diff --git a/packages/federation-sdk/src/services/config.service.ts b/packages/federation-sdk/src/services/config.service.ts index 398813287..eba8f0923 100644 --- a/packages/federation-sdk/src/services/config.service.ts +++ b/packages/federation-sdk/src/services/config.service.ts @@ -5,8 +5,7 @@ import { toUnpaddedBase64, } from '@rocket.chat/federation-core'; import { singleton } from 'tsyringe'; - -import { z } from 'zod'; +import * as z from 'zod'; export interface AppConfig { serverName: string; @@ -112,7 +111,7 @@ export class ConfigService { err: error, }); throw new Error( - `Invalid configuration: ${error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`, + `Invalid configuration: ${error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`, ); } throw error; diff --git a/packages/federation-sdk/src/specs/federation-api.ts b/packages/federation-sdk/src/specs/federation-api.ts index 24a482a83..2266229ab 100644 --- a/packages/federation-sdk/src/specs/federation-api.ts +++ b/packages/federation-sdk/src/specs/federation-api.ts @@ -8,7 +8,7 @@ import { EventPduTypeRoomMember, PduStateEventSchema, } from '@rocket.chat/federation-room'; -import { z } from 'zod'; +import * as z from 'zod'; // Common types export const EventIdSchema = z.string().regex(/^\$[A-Za-z0-9_-]+$/); @@ -160,6 +160,7 @@ export const TransactionSchema = z.object({ export const SendTransactionResponseSchema = z.object({ pdus: z.record( + z.string(), z.object({ error: z.string().optional(), }), diff --git a/packages/federation-sdk/src/utils/event-schemas.ts b/packages/federation-sdk/src/utils/event-schemas.ts index e07cb119d..cb5dbf68e 100644 --- a/packages/federation-sdk/src/utils/event-schemas.ts +++ b/packages/federation-sdk/src/utils/event-schemas.ts @@ -3,11 +3,11 @@ import { roomIdSchema, userIdSchema, } from '@rocket.chat/federation-room'; -import { z } from 'zod'; +import * as z from 'zod'; const baseEventSchema = z.object({ type: z.string(), - content: z.record(z.any()).or(z.object({})), + content: z.record(z.string(), z.any()).or(z.object({})), sender: userIdSchema, room_id: roomIdSchema, origin_server_ts: z.number().int().positive(), @@ -21,8 +21,8 @@ const baseEventSchema = z.object({ .array(z.string().or(z.tuple([z.string(), z.string()]))) .optional(), redacts: eventIdSchema.optional(), - hashes: z.record(z.string()).optional(), - signatures: z.record(z.record(z.string())).optional(), + hashes: z.record(z.string(), z.string()).optional(), + signatures: z.record(z.string(), z.record(z.string(), z.string())).optional(), unsigned: z.any().optional(), }); @@ -34,7 +34,7 @@ const createEventSchema = baseEventSchema.extend({ room_version: z.string(), creator: userIdSchema, }) - .and(z.record(z.any())), + .and(z.record(z.string(), z.any())), prev_events: z.array(z.any()).max(0).optional(), auth_events: z.array(z.any()).max(0).optional(), }); @@ -48,7 +48,7 @@ const memberEventSchema = baseEventSchema.extend({ displayname: z.string().optional().nullable(), avatar_url: z.string().optional().nullable(), }) - .and(z.record(z.any())), + .and(z.record(z.string(), z.any())), }); const messageEventSchema = baseEventSchema.extend({ @@ -58,7 +58,7 @@ const messageEventSchema = baseEventSchema.extend({ msgtype: z.string(), body: z.string(), }) - .and(z.record(z.any())), + .and(z.record(z.string(), z.any())), }); const reactionEventSchema = baseEventSchema.extend({ @@ -71,7 +71,7 @@ const reactionEventSchema = baseEventSchema.extend({ key: z.string(), }), }) - .and(z.record(z.any())), + .and(z.record(z.string(), z.any())), }); const powerLevelsEventSchema = baseEventSchema.extend({ @@ -83,13 +83,13 @@ const powerLevelsEventSchema = baseEventSchema.extend({ kick: z.number().int().default(50), redact: z.number().int().default(50), invite: z.number().int().default(50), - events: z.record(z.number().int()).optional(), + events: z.record(z.string(), z.number().int()).optional(), events_default: z.number().int().default(0), state_default: z.number().int().default(50), - users: z.record(z.number().int()).optional(), + users: z.record(z.string(), z.number().int()).optional(), users_default: z.number().int().default(0), }) - .and(z.record(z.any())), + .and(z.record(z.string(), z.any())), }); const joinRulesEventSchema = baseEventSchema.extend({ @@ -99,7 +99,7 @@ const joinRulesEventSchema = baseEventSchema.extend({ .object({ join_rule: z.enum(['public', 'knock', 'invite', 'private']), }) - .and(z.record(z.any())), + .and(z.record(z.string(), z.any())), }); const redactionEventSchema = baseEventSchema.extend({ @@ -109,7 +109,7 @@ const redactionEventSchema = baseEventSchema.extend({ .object({ reason: z.string().optional(), }) - .and(z.record(z.any())), + .and(z.record(z.string(), z.any())), }); const roomV10Schemas = { diff --git a/packages/homeserver/package.json b/packages/homeserver/package.json index f28a7bb26..257a6856d 100644 --- a/packages/homeserver/package.json +++ b/packages/homeserver/package.json @@ -22,7 +22,7 @@ "@rocket.chat/federation-core": "workspace:*", "@rocket.chat/federation-sdk": "workspace:*", "@rocket.chat/federation-room": "workspace:*", - "@rocket.chat/emitter": "^0.31.25", + "@rocket.chat/emitter": "^0.32.0", "elysia": "^1.1.26", "mongodb": "^6.16.0", "tsyringe": "^4.10.0" diff --git a/packages/room/package.json b/packages/room/package.json index 97186369a..951c3fd5c 100644 --- a/packages/room/package.json +++ b/packages/room/package.json @@ -18,7 +18,7 @@ "dependencies": { "@datastructures-js/priority-queue": "^6.3.5", "@rocket.chat/federation-crypto": "workspace:*", - "zod": "^3.24.1" + "zod": "~4.3.6" }, "devDependencies": { "bun-types": "latest" diff --git a/packages/room/src/types/_common.ts b/packages/room/src/types/_common.ts index c565145f8..a4c4a929f 100644 --- a/packages/room/src/types/_common.ts +++ b/packages/room/src/types/_common.ts @@ -1,4 +1,5 @@ -import z from 'zod'; +import * as z from 'zod'; + import type { Pdu, PduType } from './v3-11'; export type StateKey = string; diff --git a/packages/room/src/types/v3-11.ts b/packages/room/src/types/v3-11.ts index cfee2d9ac..6bff4fffc 100644 --- a/packages/room/src/types/v3-11.ts +++ b/packages/room/src/types/v3-11.ts @@ -1,4 +1,4 @@ -import { z } from 'zod'; +import * as z from 'zod'; import { PduForType, eventIdSchema,