From d3e0b7f1619a4dd47468cf0c2031e4d165dee14a Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 17 Nov 2025 12:50:50 -0300 Subject: [PATCH 1/4] chore: remove duplicate getMissingEvents method --- packages/federation-sdk/src/sdk.ts | 4 ++-- .../src/services/profiles.service.ts | 21 ------------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/packages/federation-sdk/src/sdk.ts b/packages/federation-sdk/src/sdk.ts index 085f0940..0b3093f8 100644 --- a/packages/federation-sdk/src/sdk.ts +++ b/packages/federation-sdk/src/sdk.ts @@ -271,9 +271,9 @@ export class FederationSDK { } getMissingEvents( - ...args: Parameters + ...args: Parameters ) { - return this.profilesService.getMissingEvents(...args); + return this.eventService.getMissingEvents(...args); } eventAuth(...args: Parameters) { diff --git a/packages/federation-sdk/src/services/profiles.service.ts b/packages/federation-sdk/src/services/profiles.service.ts index 6b505340..ac9fa965 100644 --- a/packages/federation-sdk/src/services/profiles.service.ts +++ b/packages/federation-sdk/src/services/profiles.service.ts @@ -1,6 +1,4 @@ -import { createLogger } from '@rocket.chat/federation-core'; import { ConfigService } from './config.service'; -import { EventService } from './event.service'; import { EventID, @@ -15,11 +13,8 @@ import { StateService } from './state.service'; @singleton() export class ProfilesService { - private readonly logger = createLogger('ProfilesService'); - constructor( private readonly configService: ConfigService, - private readonly eventService: EventService, private readonly stateService: StateService, ) {} async queryProfile(userId: string): Promise<{ @@ -114,22 +109,6 @@ export class ProfilesService { }; } - async getMissingEvents( - roomId: RoomID, - earliestEvents: EventID[], - latestEvents: EventID[], - limit = 10, - minDepth = 0, - ): Promise<{ events: Pdu[] }> { - return this.eventService.getMissingEvents( - roomId, - earliestEvents, - latestEvents, - limit, - minDepth, - ); - } - async eventAuth( _roomId: RoomID, _eventId: EventID, From a2df29a1d39fe39e820a08e55ef5fe46be945655 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 17 Nov 2025 12:51:18 -0300 Subject: [PATCH 2/4] chore: remove not used procedure --- packages/core/src/index.ts | 1 - .../core/src/procedures/getMissingEvents.ts | 39 ------------------- 2 files changed, 40 deletions(-) delete mode 100644 packages/core/src/procedures/getMissingEvents.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 57aeb37d..38e65fb1 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -72,7 +72,6 @@ export * from './models/event.model'; // Procedures export { makeJoinEventBuilder } from './procedures/makeJoin'; -export { makeGetMissingEventsProcedure } from './procedures/getMissingEvents'; export { getPublicKeyFromRemoteServer } from './procedures/getPublicKeyFromServer'; export { createLogger, logger } from './utils/logger'; diff --git a/packages/core/src/procedures/getMissingEvents.ts b/packages/core/src/procedures/getMissingEvents.ts deleted file mode 100644 index 7a78f89a..00000000 --- a/packages/core/src/procedures/getMissingEvents.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { EventBase } from '../events/eventBase'; - -export const makeGetMissingEventsProcedure = ( - getDeepEarliestAndLatestEvents: ( - roomId: string, - earliest_events: string[], - latest_events: string[], - ) => Promise, - getMissingEventsByDeep: ( - roomId: string, - minDepth: number, - maxDepth: number, - limit: number, - ) => Promise, -) => { - return async ( - roomId: string, - earliest_events: string[], - latest_events: string[], - limit: number, - ) => { - const [minDepth, maxDepth] = await getDeepEarliestAndLatestEvents( - roomId, - earliest_events, - latest_events, - ); - - const events = await getMissingEventsByDeep( - roomId, - minDepth, - maxDepth, - limit, - ); - - return { - events, - }; - }; -}; From e47661184b2372f194c9c5980e0cd454e1159bfe Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 17 Nov 2025 12:53:29 -0300 Subject: [PATCH 3/4] fix: get_missing_events endpoint payload --- .../federation/profiles.controller.ts | 7 ++--- .../src/dtos/federation/profiles.dto.ts | 26 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/homeserver/src/controllers/federation/profiles.controller.ts b/packages/homeserver/src/controllers/federation/profiles.controller.ts index 2e94c3a2..6e497e19 100644 --- a/packages/homeserver/src/controllers/federation/profiles.controller.ts +++ b/packages/homeserver/src/controllers/federation/profiles.controller.ts @@ -13,7 +13,6 @@ import { GetMissingEventsParamsDto, GetMissingEventsResponseDto, MakeJoinParamsDto, - MakeJoinQueryDto, MakeJoinResponseDto, QueryKeysBodyDto, QueryKeysResponseDto, @@ -119,6 +118,8 @@ export const profilesPlugin = (app: Elysia) => { }, }, ) + + // https://spec.matrix.org/v1.16/server-server-api/#post_matrixfederationv1get_missing_eventsroomid .post( '/_matrix/federation/v1/get_missing_events/:roomId', async ({ params, body }) => @@ -126,8 +127,8 @@ export const profilesPlugin = (app: Elysia) => { params.roomId as RoomID, body.earliest_events as EventID[], body.latest_events as EventID[], - body.limit, - body.min_depth, + body.limit || 10, + body.min_depth || 0, ), { params: GetMissingEventsParamsDto, diff --git a/packages/homeserver/src/dtos/federation/profiles.dto.ts b/packages/homeserver/src/dtos/federation/profiles.dto.ts index 935aeafd..006a6192 100644 --- a/packages/homeserver/src/dtos/federation/profiles.dto.ts +++ b/packages/homeserver/src/dtos/federation/profiles.dto.ts @@ -128,17 +128,21 @@ export const GetMissingEventsParamsDto = t.Object({ export const GetMissingEventsBodyDto = t.Object({ earliest_events: t.Array(t.String(), { description: 'Earliest events' }), latest_events: t.Array(t.String(), { description: 'Latest events' }), - limit: t.Number({ - minimum: 1, - maximum: 100, - default: 10, - description: 'Maximum number of events to return', - }), - min_depth: t.Number({ - minimum: 1, - default: 1, - description: 'Minimum depth of the events to return', - }), + limit: t.Optional( + t.Number({ + minimum: 1, + maximum: 20, + default: 10, + description: 'Maximum number of events to return', + }), + ), + min_depth: t.Optional( + t.Number({ + minimum: 0, + default: 0, + description: 'Minimum depth of the events to return', + }), + ), }); export const GetMissingEventsResponseDto = t.Object({ From d0b77f9f24bef7aec3efca4bd06d0d602a857a10 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 17 Nov 2025 12:54:29 -0300 Subject: [PATCH 4/4] auto-format --- .../federation/profiles.controller.ts | 261 +++++++++--------- 1 file changed, 132 insertions(+), 129 deletions(-) diff --git a/packages/homeserver/src/controllers/federation/profiles.controller.ts b/packages/homeserver/src/controllers/federation/profiles.controller.ts index 6e497e19..d84c1fa4 100644 --- a/packages/homeserver/src/controllers/federation/profiles.controller.ts +++ b/packages/homeserver/src/controllers/federation/profiles.controller.ts @@ -21,145 +21,148 @@ import { } from '../../dtos'; export const profilesPlugin = (app: Elysia) => { - return app - .group('/_matrix', (app) => - app - .use(isAuthenticatedMiddleware()) - .get( - '/federation/v1/query/profile', - ({ query: { user_id } }) => - federationSDK.queryProfile(user_id as UserID), - { - query: QueryProfileQueryDto, - response: { - 200: QueryProfileResponseDto, + return ( + app + .group('/_matrix', (app) => + app + .use(isAuthenticatedMiddleware()) + .get( + '/federation/v1/query/profile', + ({ query: { user_id } }) => + federationSDK.queryProfile(user_id as UserID), + { + query: QueryProfileQueryDto, + response: { + 200: QueryProfileResponseDto, + }, + detail: { + tags: ['Federation'], + summary: 'Query profile', + description: "Query a user's profile", + }, }, - detail: { - tags: ['Federation'], - summary: 'Query profile', - description: "Query a user's profile", + ) + .post( + '/federation/v1/user/keys/query', + async ({ set }) => { + set.status = 501; + return { + errcode: 'M_UNRECOGNIZED', + error: 'E2EE is not implemented yet', + }; }, - }, - ) - .post( - '/federation/v1/user/keys/query', - async ({ set }) => { - set.status = 501; - return { - errcode: 'M_UNRECOGNIZED', - error: 'E2EE is not implemented yet', - }; - }, - { - body: QueryKeysBodyDto, - response: { - 200: QueryKeysResponseDto, - 501: t.Object({ - errcode: t.String(), - error: t.String(), - }), + { + body: QueryKeysBodyDto, + response: { + 200: QueryKeysResponseDto, + 501: t.Object({ + errcode: t.String(), + error: t.String(), + }), + }, + detail: { + tags: ['Federation'], + summary: 'Query keys', + description: + "Query a user's device keys (E2EE not implemented)", + }, }, - detail: { - tags: ['Federation'], - summary: 'Query keys', - description: "Query a user's device keys (E2EE not implemented)", + ) + .get( + '/federation/v1/user/devices/:userId', + async ({ set }) => { + set.status = 501; + return { + errcode: 'M_UNRECOGNIZED', + error: 'E2EE is not implemented yet', + }; }, - }, - ) - .get( - '/federation/v1/user/devices/:userId', - async ({ set }) => { - set.status = 501; - return { - errcode: 'M_UNRECOGNIZED', - error: 'E2EE is not implemented yet', - }; - }, - { - params: GetDevicesParamsDto, - response: { - 200: GetDevicesResponseDto, - 501: t.Object({ - errcode: t.String(), - error: t.String(), - }), + { + params: GetDevicesParamsDto, + response: { + 200: GetDevicesResponseDto, + 501: t.Object({ + errcode: t.String(), + error: t.String(), + }), + }, + detail: { + tags: ['Federation'], + summary: 'Get devices', + description: "Get a user's devices (E2EE not implemented)", + }, }, - detail: { - tags: ['Federation'], - summary: 'Get devices', - description: "Get a user's devices (E2EE not implemented)", - }, - }, - ), - ) - .use(canAccessResourceMiddleware('room')) - .get( - '/_matrix/federation/v1/make_join/:roomId/:userId', - async ({ params, query: _query }) => { - const { roomId, userId } = params; + ), + ) + .use(canAccessResourceMiddleware('room')) + .get( + '/_matrix/federation/v1/make_join/:roomId/:userId', + async ({ params, query: _query }) => { + const { roomId, userId } = params; - // const { ver } = query; + // const { ver } = query; - return federationSDK.makeJoin(roomId as RoomID, userId as UserID, [ - '10', - ]); - }, - { - params: MakeJoinParamsDto, - query: t.Any(), - response: { - 200: MakeJoinResponseDto, - 400: ErrorResponseDto, + return federationSDK.makeJoin(roomId as RoomID, userId as UserID, [ + '10', + ]); }, - detail: { - tags: ['Federation'], - summary: 'Make join', - description: 'Make a join event', + { + params: MakeJoinParamsDto, + query: t.Any(), + response: { + 200: MakeJoinResponseDto, + 400: ErrorResponseDto, + }, + detail: { + tags: ['Federation'], + summary: 'Make join', + description: 'Make a join event', + }, }, - }, - ) + ) - // https://spec.matrix.org/v1.16/server-server-api/#post_matrixfederationv1get_missing_eventsroomid - .post( - '/_matrix/federation/v1/get_missing_events/:roomId', - async ({ params, body }) => - federationSDK.getMissingEvents( - params.roomId as RoomID, - body.earliest_events as EventID[], - body.latest_events as EventID[], - body.limit || 10, - body.min_depth || 0, - ), - { - params: GetMissingEventsParamsDto, - body: GetMissingEventsBodyDto, - response: { - 200: GetMissingEventsResponseDto, - }, - detail: { - tags: ['Federation'], - summary: 'Get missing events', - description: 'Get missing events for a room', - }, - }, - ) - .get( - '/_matrix/federation/v1/event_auth/:roomId/:eventId', - ({ params }) => - federationSDK.eventAuth( - params.roomId as RoomID, - params.eventId as EventID, - ), - { - params: EventAuthParamsDto, - response: { - 200: EventAuthResponseDto, + // https://spec.matrix.org/v1.16/server-server-api/#post_matrixfederationv1get_missing_eventsroomid + .post( + '/_matrix/federation/v1/get_missing_events/:roomId', + async ({ params, body }) => + federationSDK.getMissingEvents( + params.roomId as RoomID, + body.earliest_events as EventID[], + body.latest_events as EventID[], + body.limit || 10, + body.min_depth || 0, + ), + { + params: GetMissingEventsParamsDto, + body: GetMissingEventsBodyDto, + response: { + 200: GetMissingEventsResponseDto, + }, + detail: { + tags: ['Federation'], + summary: 'Get missing events', + description: 'Get missing events for a room', + }, }, - detail: { - tags: ['Federation'], - summary: 'Event auth', - description: 'Get event auth for a room', + ) + .get( + '/_matrix/federation/v1/event_auth/:roomId/:eventId', + ({ params }) => + federationSDK.eventAuth( + params.roomId as RoomID, + params.eventId as EventID, + ), + { + params: EventAuthParamsDto, + response: { + 200: EventAuthResponseDto, + }, + detail: { + tags: ['Federation'], + summary: 'Event auth', + description: 'Get event auth for a room', + }, }, - }, - ); + ) + ); };