@undefineds.co/xpod 0.3.49 → 0.3.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/auth/MultiAuthenticator.js +2 -2
- package/dist/api/auth/MultiAuthenticator.js.map +1 -1
- package/dist/api/handlers/MatrixHandler.js +25 -1
- package/dist/api/handlers/MatrixHandler.js.map +1 -1
- package/dist/api/matrix/PodMatrixStore.js +11 -4
- package/dist/api/matrix/PodMatrixStore.js.map +1 -1
- package/dist/api/matrix/types.d.ts +2 -0
- package/dist/api/matrix/types.js.map +1 -1
- package/dist/api/middleware/AuthMiddleware.d.ts +1 -0
- package/dist/api/middleware/AuthMiddleware.js +13 -1
- package/dist/api/middleware/AuthMiddleware.js.map +1 -1
- package/dist/api/protocol-metadata.js +14 -4
- package/dist/api/protocol-metadata.js.map +1 -1
- package/dist/cli/lib/auth-context.js +10 -7
- package/dist/cli/lib/auth-context.js.map +1 -1
- package/dist/cli/lib/auth-helper.d.ts +8 -6
- package/dist/cli/lib/auth-helper.js +8 -6
- package/dist/cli/lib/auth-helper.js.map +1 -1
- package/dist/cli/lib/oidc-auth.d.ts +4 -0
- package/dist/cli/lib/oidc-auth.js +90 -0
- package/dist/cli/lib/oidc-auth.js.map +1 -0
- package/dist/cli/lib/oidc-session-storage.d.ts +3 -0
- package/dist/cli/lib/oidc-session-storage.js +41 -0
- package/dist/cli/lib/oidc-session-storage.js.map +1 -0
- package/dist/runtime/Proxy.d.ts +5 -0
- package/dist/runtime/Proxy.js +60 -6
- package/dist/runtime/Proxy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
- package/package.json +4 -3
|
@@ -14,10 +14,10 @@ class MultiAuthenticator {
|
|
|
14
14
|
return this.authenticators.some((auth) => auth.canAuthenticate(request));
|
|
15
15
|
}
|
|
16
16
|
async authenticate(request) {
|
|
17
|
-
|
|
17
|
+
this.logger.debug(`Starting authentication with ${this.authenticators.length} authenticators`);
|
|
18
18
|
for (const authenticator of this.authenticators) {
|
|
19
19
|
const canAuth = authenticator.canAuthenticate(request);
|
|
20
|
-
|
|
20
|
+
this.logger.debug(`${authenticator.constructor.name}.canAuthenticate: ${canAuth}`);
|
|
21
21
|
if (canAuth) {
|
|
22
22
|
const result = await authenticator.authenticate(request);
|
|
23
23
|
if (result.success) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiAuthenticator.js","sourceRoot":"","sources":["../../../src/api/auth/MultiAuthenticator.ts"],"names":[],"mappings":";;;AACA,iEAAqD;AAOrD;;GAEG;AACH,MAAa,kBAAkB;IAI7B,YAAmB,OAAkC;QAHpC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAI3C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC/C,CAAC;IAEM,eAAe,CAAC,OAAwB;QAC7C,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,OAAwB;QAChD,
|
|
1
|
+
{"version":3,"file":"MultiAuthenticator.js","sourceRoot":"","sources":["../../../src/api/auth/MultiAuthenticator.ts"],"names":[],"mappings":";;;AACA,iEAAqD;AAOrD;;GAEG;AACH,MAAa,kBAAkB;IAI7B,YAAmB,OAAkC;QAHpC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAI3C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC/C,CAAC;IAEM,eAAe,CAAC,OAAwB;QAC7C,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,OAAwB;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,cAAc,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC/F,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,qBAAqB,OAAO,EAAE,CAAC,CAAC;YACnF,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACzD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,4DAA4D;gBAC5D,sCAAsC;gBACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC3D,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;IACvE,CAAC;CACF;AA/BD,gDA+BC","sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { Authenticator, AuthResult } from './Authenticator';\n\nexport interface MultiAuthenticatorOptions {\n authenticators: Authenticator[];\n}\n\n/**\n * Combines multiple authenticators, trying each in order\n */\nexport class MultiAuthenticator implements Authenticator {\n private readonly logger = getLoggerFor(this);\n private readonly authenticators: Authenticator[];\n\n public constructor(options: MultiAuthenticatorOptions) {\n this.authenticators = options.authenticators;\n }\n\n public canAuthenticate(request: IncomingMessage): boolean {\n return this.authenticators.some((auth) => auth.canAuthenticate(request));\n }\n\n public async authenticate(request: IncomingMessage): Promise<AuthResult> {\n this.logger.debug(`Starting authentication with ${this.authenticators.length} authenticators`);\n for (const authenticator of this.authenticators) {\n const canAuth = authenticator.canAuthenticate(request);\n this.logger.debug(`${authenticator.constructor.name}.canAuthenticate: ${canAuth}`);\n if (canAuth) {\n const result = await authenticator.authenticate(request);\n if (result.success) {\n return result;\n }\n // If this authenticator claimed it could handle but failed,\n // don't try others - return the error\n this.logger.debug(`Authenticator failed: ${result.error}`);\n return result;\n }\n }\n\n return { success: false, error: 'No valid authentication provided' };\n }\n}\n"]}
|
|
@@ -218,7 +218,11 @@ function buildContext(request) {
|
|
|
218
218
|
if (!webId) {
|
|
219
219
|
throw new Error('Matrix API requires Solid WebID authentication');
|
|
220
220
|
}
|
|
221
|
-
return {
|
|
221
|
+
return {
|
|
222
|
+
webId,
|
|
223
|
+
podUrl: deriveRequestPodUrl(request, webId),
|
|
224
|
+
auth,
|
|
225
|
+
};
|
|
222
226
|
}
|
|
223
227
|
async function readJson(request) {
|
|
224
228
|
const chunks = [];
|
|
@@ -245,6 +249,26 @@ function requestBaseUrl(request) {
|
|
|
245
249
|
const host = forwardedHost?.split(',')[0]?.trim() || request.headers.host || 'localhost';
|
|
246
250
|
return `${proto}://${host}`;
|
|
247
251
|
}
|
|
252
|
+
function deriveRequestPodUrl(request, webId) {
|
|
253
|
+
try {
|
|
254
|
+
const baseUrl = `${requestBaseUrl(request).replace(/\/$/, '')}/`;
|
|
255
|
+
const webIdUrl = new URL(webId);
|
|
256
|
+
const normalizedPath = webIdUrl.pathname.replace(/\/+$/, '');
|
|
257
|
+
let podPath = '';
|
|
258
|
+
if (normalizedPath.endsWith('/profile/card')) {
|
|
259
|
+
podPath = normalizedPath.slice(0, -'/profile/card'.length);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
const firstSegment = normalizedPath.split('/').filter(Boolean)[0];
|
|
263
|
+
podPath = firstSegment ? `/${firstSegment}` : '';
|
|
264
|
+
}
|
|
265
|
+
const relativePodPath = podPath.replace(/^\/+/, '');
|
|
266
|
+
return new URL(relativePodPath ? `${relativePodPath}/` : './', baseUrl).toString();
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
248
272
|
function headerValue(value) {
|
|
249
273
|
return Array.isArray(value) ? value[0] : value;
|
|
250
274
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatrixHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/MatrixHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport type { ApiServer } from '../ApiServer';\nimport { getWebId } from '../auth/AuthContext';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\nimport type { MatrixCreateRoomRequest, MatrixStore, MatrixStoreContext } from '../matrix/types';\n\nexport interface MatrixHandlerOptions {\n store: MatrixStore;\n}\n\n/**\n * Register the Matrix Client-Server compatibility adapter.\n *\n * Keep these externally visible routes Matrix-shaped:\n * - `/.well-known/matrix/client` is public discovery.\n * - `/_matrix/client/...` is Matrix's protocol namespace.\n *\n * Do not mount this adapter under `/api` or `/matrix`; first-party Xpod\n * clients should use Xpod-owned chat/message APIs, while Matrix clients need\n * the standard route shape to interoperate with existing SDKs.\n */\nexport function registerMatrixRoutes(server: ApiServer, options: MatrixHandlerOptions): void {\n const { store } = options;\n\n server.get('/.well-known/matrix/client', async (request, response) => {\n sendJson(response, 200, {\n 'm.homeserver': {\n base_url: requestBaseUrl(request),\n },\n });\n }, { public: true });\n\n server.get('/_matrix/client/versions', async (_request, response) => {\n sendJson(response, 200, {\n versions: [\n 'r0.6.1',\n 'v1.1',\n 'v1.2',\n 'v1.3',\n 'v1.4',\n 'v1.5',\n 'v1.6',\n 'v1.7',\n 'v1.8',\n 'v1.9',\n 'v1.10',\n 'v1.11',\n ],\n unstable_features: {\n 'co.undefineds.matrix.pod_storage': true,\n },\n });\n }, { public: true });\n\n server.get('/_matrix/client/v3/login', async (_request, response) => {\n sendJson(response, 200, {\n flows: [\n { type: 'm.login.token' },\n ],\n });\n }, { public: true });\n\n server.post('/_matrix/client/v3/login', async (_request, response) => {\n sendMatrixError(response, 501, 'M_UNRECOGNIZED', 'Matrix-native login is not implemented; use Solid/OIDC API authentication.');\n }, { public: true });\n\n server.get('/_matrix/client/v3/account/whoami', async (request, response) => {\n try {\n const account = await store.getAccount(buildContext(request));\n sendJson(response, 200, {\n user_id: account.userId,\n ...(account.deviceId ? { device_id: account.deviceId } : {}),\n is_guest: false,\n });\n } catch (error) {\n sendMatrixError(response, 400, 'M_UNKNOWN', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/createRoom', async (request, response) => {\n try {\n const body = await readJson<MatrixCreateRoomRequest>(request);\n const room = await store.createRoom(body ?? {}, buildContext(request));\n sendJson(response, 200, { room_id: room.roomId });\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n });\n\n server.put('/_matrix/client/v3/rooms/:roomId/send/:eventType/:txnId', async (request, response, params) => {\n try {\n const content = await readJson<Record<string, unknown>>(request);\n const event = await store.sendEvent(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventType),\n decodeURIComponent(params.txnId),\n content ?? {},\n buildContext(request),\n );\n sendJson(response, 200, { event_id: event.eventId });\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/joined_rooms', async (request, response) => {\n try {\n const joinedRooms = await store.listJoinedRooms(buildContext(request));\n sendJson(response, 200, { joined_rooms: joinedRooms });\n } catch (error) {\n sendMatrixError(response, 400, 'M_UNKNOWN', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/join/:roomIdOrAlias', async (request, response, params) => {\n try {\n const result = await store.joinRoom(decodeURIComponent(params.roomIdOrAlias), buildContext(request));\n sendJson(response, 200, { room_id: result.roomId });\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/rooms/:roomId/join', async (request, response, params) => {\n try {\n const result = await store.joinRoom(decodeURIComponent(params.roomId), buildContext(request));\n sendJson(response, 200, { room_id: result.roomId });\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/rooms/:roomId/invite', async (request, response, params) => {\n try {\n const body = await readJson<{ user_id?: unknown }>(request);\n if (!body || typeof body.user_id !== 'string' || body.user_id.length === 0) {\n throw new Error('Invite requires user_id');\n }\n await store.inviteUser(decodeURIComponent(params.roomId), body.user_id, buildContext(request));\n sendJson(response, 200, {});\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/rooms/:roomId/leave', async (request, response, params) => {\n try {\n await store.leaveRoom(decodeURIComponent(params.roomId), buildContext(request));\n sendJson(response, 200, {});\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/sync', async (request, response) => {\n try {\n const url = new URL(request.url ?? '', `http://${request.headers.host ?? 'localhost'}`);\n const sync = await store.sync(buildContext(request), {\n since: url.searchParams.get('since') ?? undefined,\n limit: parseOptionalNumber(url.searchParams.get('limit')),\n });\n sendJson(response, 200, sync);\n } catch (error) {\n sendMatrixError(response, 400, 'M_UNKNOWN', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/messages', async (request, response, params) => {\n try {\n const url = new URL(request.url ?? '', `http://${request.headers.host ?? 'localhost'}`);\n const messages = await store.listMessages(decodeURIComponent(params.roomId), buildContext(request), {\n from: url.searchParams.get('from') ?? undefined,\n dir: url.searchParams.get('dir') === 'f' ? 'f' : 'b',\n limit: parseOptionalNumber(url.searchParams.get('limit')),\n });\n sendJson(response, 200, messages);\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/members', async (request, response, params) => {\n try {\n const members = await store.getMembers(decodeURIComponent(params.roomId), buildContext(request));\n sendJson(response, 200, { chunk: members });\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/event/:eventId', async (request, response, params) => {\n try {\n const event = await store.getEvent(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventId),\n buildContext(request),\n );\n sendJson(response, 200, event);\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/state/:eventType', async (request, response, params) => {\n await sendState(request, response, params, '');\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/state/:eventType/:stateKey', async (request, response, params) => {\n await sendState(request, response, params, decodeURIComponent(params.stateKey ?? ''));\n });\n\n server.put('/_matrix/client/v3/rooms/:roomId/state/:eventType', async (request, response, params) => {\n await putState(request, response, params, '');\n });\n\n server.put('/_matrix/client/v3/rooms/:roomId/state/:eventType/:stateKey', async (request, response, params) => {\n await putState(request, response, params, decodeURIComponent(params.stateKey ?? ''));\n });\n\n async function sendState(\n request: AuthenticatedRequest,\n response: ServerResponse,\n params: Record<string, string>,\n stateKey: string,\n ): Promise<void> {\n try {\n const state = await store.getState(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventType),\n stateKey,\n buildContext(request),\n );\n sendJson(response, 200, state);\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n }\n\n async function putState(\n request: AuthenticatedRequest,\n response: ServerResponse,\n params: Record<string, string>,\n stateKey: string,\n ): Promise<void> {\n try {\n const content = await readJson<Record<string, unknown>>(request);\n const event = await store.setState(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventType),\n stateKey,\n content ?? {},\n buildContext(request),\n );\n sendJson(response, 200, { event_id: event.eventId });\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n }\n}\n\nfunction buildContext(request: AuthenticatedRequest): MatrixStoreContext {\n const auth = request.auth;\n const webId = auth ? getWebId(auth) : undefined;\n if (!webId) {\n throw new Error('Matrix API requires Solid WebID authentication');\n }\n return { webId, auth };\n}\n\nasync function readJson<T>(request: AuthenticatedRequest): Promise<T | undefined> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const raw = Buffer.concat(chunks).toString('utf8').trim();\n if (!raw) {\n return undefined;\n }\n return JSON.parse(raw) as T;\n}\n\nfunction parseOptionalNumber(value: string | null): number | undefined {\n if (!value) {\n return undefined;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction requestBaseUrl(request: AuthenticatedRequest): string {\n const forwardedProto = headerValue(request.headers['x-forwarded-proto']);\n const forwardedHost = headerValue(request.headers['x-forwarded-host']);\n const proto = forwardedProto?.split(',')[0]?.trim() || 'http';\n const host = forwardedHost?.split(',')[0]?.trim() || request.headers.host || 'localhost';\n return `${proto}://${host}`;\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n\nfunction sendMatrixError(response: ServerResponse, status: number, errcode: string, error: string): void {\n sendJson(response, status, { errcode, error });\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MatrixHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/MatrixHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport type { ApiServer } from '../ApiServer';\nimport { getWebId } from '../auth/AuthContext';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\nimport type { MatrixCreateRoomRequest, MatrixStore, MatrixStoreContext } from '../matrix/types';\n\nexport interface MatrixHandlerOptions {\n store: MatrixStore;\n}\n\n/**\n * Register the Matrix Client-Server compatibility adapter.\n *\n * Keep these externally visible routes Matrix-shaped:\n * - `/.well-known/matrix/client` is public discovery.\n * - `/_matrix/client/...` is Matrix's protocol namespace.\n *\n * Do not mount this adapter under `/api` or `/matrix`; first-party Xpod\n * clients should use Xpod-owned chat/message APIs, while Matrix clients need\n * the standard route shape to interoperate with existing SDKs.\n */\nexport function registerMatrixRoutes(server: ApiServer, options: MatrixHandlerOptions): void {\n const { store } = options;\n\n server.get('/.well-known/matrix/client', async (request, response) => {\n sendJson(response, 200, {\n 'm.homeserver': {\n base_url: requestBaseUrl(request),\n },\n });\n }, { public: true });\n\n server.get('/_matrix/client/versions', async (_request, response) => {\n sendJson(response, 200, {\n versions: [\n 'r0.6.1',\n 'v1.1',\n 'v1.2',\n 'v1.3',\n 'v1.4',\n 'v1.5',\n 'v1.6',\n 'v1.7',\n 'v1.8',\n 'v1.9',\n 'v1.10',\n 'v1.11',\n ],\n unstable_features: {\n 'co.undefineds.matrix.pod_storage': true,\n },\n });\n }, { public: true });\n\n server.get('/_matrix/client/v3/login', async (_request, response) => {\n sendJson(response, 200, {\n flows: [\n { type: 'm.login.token' },\n ],\n });\n }, { public: true });\n\n server.post('/_matrix/client/v3/login', async (_request, response) => {\n sendMatrixError(response, 501, 'M_UNRECOGNIZED', 'Matrix-native login is not implemented; use Solid/OIDC API authentication.');\n }, { public: true });\n\n server.get('/_matrix/client/v3/account/whoami', async (request, response) => {\n try {\n const account = await store.getAccount(buildContext(request));\n sendJson(response, 200, {\n user_id: account.userId,\n ...(account.deviceId ? { device_id: account.deviceId } : {}),\n is_guest: false,\n });\n } catch (error) {\n sendMatrixError(response, 400, 'M_UNKNOWN', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/createRoom', async (request, response) => {\n try {\n const body = await readJson<MatrixCreateRoomRequest>(request);\n const room = await store.createRoom(body ?? {}, buildContext(request));\n sendJson(response, 200, { room_id: room.roomId });\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n });\n\n server.put('/_matrix/client/v3/rooms/:roomId/send/:eventType/:txnId', async (request, response, params) => {\n try {\n const content = await readJson<Record<string, unknown>>(request);\n const event = await store.sendEvent(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventType),\n decodeURIComponent(params.txnId),\n content ?? {},\n buildContext(request),\n );\n sendJson(response, 200, { event_id: event.eventId });\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/joined_rooms', async (request, response) => {\n try {\n const joinedRooms = await store.listJoinedRooms(buildContext(request));\n sendJson(response, 200, { joined_rooms: joinedRooms });\n } catch (error) {\n sendMatrixError(response, 400, 'M_UNKNOWN', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/join/:roomIdOrAlias', async (request, response, params) => {\n try {\n const result = await store.joinRoom(decodeURIComponent(params.roomIdOrAlias), buildContext(request));\n sendJson(response, 200, { room_id: result.roomId });\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/rooms/:roomId/join', async (request, response, params) => {\n try {\n const result = await store.joinRoom(decodeURIComponent(params.roomId), buildContext(request));\n sendJson(response, 200, { room_id: result.roomId });\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/rooms/:roomId/invite', async (request, response, params) => {\n try {\n const body = await readJson<{ user_id?: unknown }>(request);\n if (!body || typeof body.user_id !== 'string' || body.user_id.length === 0) {\n throw new Error('Invite requires user_id');\n }\n await store.inviteUser(decodeURIComponent(params.roomId), body.user_id, buildContext(request));\n sendJson(response, 200, {});\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n });\n\n server.post('/_matrix/client/v3/rooms/:roomId/leave', async (request, response, params) => {\n try {\n await store.leaveRoom(decodeURIComponent(params.roomId), buildContext(request));\n sendJson(response, 200, {});\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/sync', async (request, response) => {\n try {\n const url = new URL(request.url ?? '', `http://${request.headers.host ?? 'localhost'}`);\n const sync = await store.sync(buildContext(request), {\n since: url.searchParams.get('since') ?? undefined,\n limit: parseOptionalNumber(url.searchParams.get('limit')),\n });\n sendJson(response, 200, sync);\n } catch (error) {\n sendMatrixError(response, 400, 'M_UNKNOWN', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/messages', async (request, response, params) => {\n try {\n const url = new URL(request.url ?? '', `http://${request.headers.host ?? 'localhost'}`);\n const messages = await store.listMessages(decodeURIComponent(params.roomId), buildContext(request), {\n from: url.searchParams.get('from') ?? undefined,\n dir: url.searchParams.get('dir') === 'f' ? 'f' : 'b',\n limit: parseOptionalNumber(url.searchParams.get('limit')),\n });\n sendJson(response, 200, messages);\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/members', async (request, response, params) => {\n try {\n const members = await store.getMembers(decodeURIComponent(params.roomId), buildContext(request));\n sendJson(response, 200, { chunk: members });\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/event/:eventId', async (request, response, params) => {\n try {\n const event = await store.getEvent(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventId),\n buildContext(request),\n );\n sendJson(response, 200, event);\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/state/:eventType', async (request, response, params) => {\n await sendState(request, response, params, '');\n });\n\n server.get('/_matrix/client/v3/rooms/:roomId/state/:eventType/:stateKey', async (request, response, params) => {\n await sendState(request, response, params, decodeURIComponent(params.stateKey ?? ''));\n });\n\n server.put('/_matrix/client/v3/rooms/:roomId/state/:eventType', async (request, response, params) => {\n await putState(request, response, params, '');\n });\n\n server.put('/_matrix/client/v3/rooms/:roomId/state/:eventType/:stateKey', async (request, response, params) => {\n await putState(request, response, params, decodeURIComponent(params.stateKey ?? ''));\n });\n\n async function sendState(\n request: AuthenticatedRequest,\n response: ServerResponse,\n params: Record<string, string>,\n stateKey: string,\n ): Promise<void> {\n try {\n const state = await store.getState(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventType),\n stateKey,\n buildContext(request),\n );\n sendJson(response, 200, state);\n } catch (error) {\n sendMatrixError(response, 404, 'M_NOT_FOUND', formatError(error));\n }\n }\n\n async function putState(\n request: AuthenticatedRequest,\n response: ServerResponse,\n params: Record<string, string>,\n stateKey: string,\n ): Promise<void> {\n try {\n const content = await readJson<Record<string, unknown>>(request);\n const event = await store.setState(\n decodeURIComponent(params.roomId),\n decodeURIComponent(params.eventType),\n stateKey,\n content ?? {},\n buildContext(request),\n );\n sendJson(response, 200, { event_id: event.eventId });\n } catch (error) {\n sendMatrixError(response, 400, 'M_BAD_JSON', formatError(error));\n }\n }\n}\n\nfunction buildContext(request: AuthenticatedRequest): MatrixStoreContext {\n const auth = request.auth;\n const webId = auth ? getWebId(auth) : undefined;\n if (!webId) {\n throw new Error('Matrix API requires Solid WebID authentication');\n }\n return {\n webId,\n podUrl: deriveRequestPodUrl(request, webId),\n auth,\n };\n}\n\nasync function readJson<T>(request: AuthenticatedRequest): Promise<T | undefined> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const raw = Buffer.concat(chunks).toString('utf8').trim();\n if (!raw) {\n return undefined;\n }\n return JSON.parse(raw) as T;\n}\n\nfunction parseOptionalNumber(value: string | null): number | undefined {\n if (!value) {\n return undefined;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction requestBaseUrl(request: AuthenticatedRequest): string {\n const forwardedProto = headerValue(request.headers['x-forwarded-proto']);\n const forwardedHost = headerValue(request.headers['x-forwarded-host']);\n const proto = forwardedProto?.split(',')[0]?.trim() || 'http';\n const host = forwardedHost?.split(',')[0]?.trim() || request.headers.host || 'localhost';\n return `${proto}://${host}`;\n}\n\nfunction deriveRequestPodUrl(request: AuthenticatedRequest, webId: string): string | undefined {\n try {\n const baseUrl = `${requestBaseUrl(request).replace(/\\/$/, '')}/`;\n const webIdUrl = new URL(webId);\n const normalizedPath = webIdUrl.pathname.replace(/\\/+$/, '');\n let podPath = '';\n\n if (normalizedPath.endsWith('/profile/card')) {\n podPath = normalizedPath.slice(0, -'/profile/card'.length);\n } else {\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0];\n podPath = firstSegment ? `/${firstSegment}` : '';\n }\n\n const relativePodPath = podPath.replace(/^\\/+/, '');\n return new URL(relativePodPath ? `${relativePodPath}/` : './', baseUrl).toString();\n } catch {\n return undefined;\n }\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n\nfunction sendMatrixError(response: ServerResponse, status: number, errcode: string, error: string): void {\n sendJson(response, status, { errcode, error });\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
|
|
@@ -289,8 +289,15 @@ class PodMatrixStore {
|
|
|
289
289
|
}
|
|
290
290
|
const db = (0, drizzle_solid_1.drizzle)({
|
|
291
291
|
fetch: this.createAccessTokenFetch(auth.accessToken, auth.tokenType),
|
|
292
|
-
info: {
|
|
293
|
-
|
|
292
|
+
info: {
|
|
293
|
+
webId: auth.webId,
|
|
294
|
+
isLoggedIn: true,
|
|
295
|
+
podUrl: context.podUrl,
|
|
296
|
+
},
|
|
297
|
+
}, {
|
|
298
|
+
schema,
|
|
299
|
+
podUrl: context.podUrl,
|
|
300
|
+
});
|
|
294
301
|
await db.init(models_1.chatResource, models_1.threadResource, models_1.messageResource);
|
|
295
302
|
context._matrixDb = db;
|
|
296
303
|
return db;
|
|
@@ -436,7 +443,7 @@ class PodMatrixStore {
|
|
|
436
443
|
let query = db.select().from(models_1.messageResource).where((0, drizzle_solid_1.and)(...conditions));
|
|
437
444
|
query = options.newestFirst
|
|
438
445
|
? query.orderBy((0, drizzle_solid_1.desc)(models_1.messageResource.createdAt))
|
|
439
|
-
: query.orderBy(models_1.messageResource.createdAt);
|
|
446
|
+
: query.orderBy((0, drizzle_solid_1.asc)(models_1.messageResource.createdAt));
|
|
440
447
|
if (options.limit && options.limit > 0) {
|
|
441
448
|
query = query.limit(options.limit);
|
|
442
449
|
}
|
|
@@ -661,7 +668,7 @@ class PodMatrixStore {
|
|
|
661
668
|
return `chat/${this.surfaceIdFromRoomId(roomId)}/${yyyy}/${MM}/${dd}/messages.ttl#${this.slug(eventId)}`;
|
|
662
669
|
}
|
|
663
670
|
resolveDataResourceUriFromId(resourceId, context) {
|
|
664
|
-
const podBaseUrl = this.derivePodBaseUrl(context.webId);
|
|
671
|
+
const podBaseUrl = context.podUrl ?? this.derivePodBaseUrl(context.webId);
|
|
665
672
|
if (!podBaseUrl) {
|
|
666
673
|
return resourceId;
|
|
667
674
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PodMatrixStore.js","sourceRoot":"","sources":["../../../src/api/matrix/PodMatrixStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from 'node:crypto';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { and, desc, drizzle, eq, gt, lte } from '@undefineds.co/drizzle-solid';\nimport {\n chatResource,\n messageResource,\n MessageRole,\n MessageStatus,\n threadResource,\n} from '@undefineds.co/models';\nimport {\n normalizeAgentUris,\n normalizeReconcilerOwner,\n reconcilerCoordinationMetadata,\n type ReconcilerOwner,\n type ServerGroupReconcilerService,\n} from '../reconciler';\nimport { getProtocolMetadata, withProtocolMetadata } from '../protocol-metadata';\nimport { isSolidAuth, type AuthContext } from '../auth/AuthContext';\nimport type {\n MatrixAccountInfo,\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n\nconst schema = {\n chat: chatResource,\n thread: threadResource,\n message: messageResource,\n};\n\nexport interface PodMatrixStoreOptions {\n serverName?: string;\n serverGroupReconcilerService?: ServerGroupReconcilerService;\n}\n\ntype Db = any;\ntype JsonObjectSource = string | Record<string, unknown> | null | undefined;\n\ninterface MatrixRoomSource {\n id: string;\n title?: string | null;\n description?: string | null;\n author?: string | null;\n participants?: string[] | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixEventSource {\n id: string;\n maker?: string | null;\n content?: JsonObjectSource;\n mentions?: string[] | null;\n routeTargetAgent?: string | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixRoomContext {\n metadata?: Record<string, unknown>;\n participants: string[];\n}\n\nexport class PodMatrixStore {\n private readonly logger = getLoggerFor(this);\n private readonly serverName?: string;\n private readonly serverGroupReconcilerService?: ServerGroupReconcilerService;\n\n public constructor(options: PodMatrixStoreOptions) {\n this.serverName = options.serverName;\n this.serverGroupReconcilerService = options.serverGroupReconcilerService;\n }\n\n public async getAccount(context: MatrixStoreContext): Promise<MatrixAccountInfo> {\n const matrixUserId = this.getMatrixUserId(context);\n return {\n userId: matrixUserId,\n deviceId: this.deviceIdFromUserId(context.webId),\n displayName: this.displayNameFromUserId(matrixUserId),\n };\n }\n\n public async createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord> {\n const db = await this.getDb(context);\n const sender = this.getMatrixUserId(context);\n const now = Date.now();\n const roomId = this.generateRoomId(context);\n const chatId = this.chatResourceIdFromRoomId(roomId);\n const threadId = this.threadResourceIdFromRoomId(roomId);\n const reconcilerOwner = 'server' as const;\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n\n await db.insert(chatResource).values({\n id: chatId,\n title: input.name ?? roomId,\n description: input.topic ?? null,\n author: context.webId,\n status: 'active',\n participants: [context.webId],\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n ...coordination,\n }, 'matrix', {\n roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : null,\n visibility: input.visibility === 'public' ? 'public' : 'private',\n roomVersion: String(input.creation_content?.room_version ?? '11'),\n federate: input.creation_content?.['m.federate'] === true,\n members: [context.webId],\n preset: input.preset,\n invite: input.invite ?? [],\n }),\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n await db.insert(threadResource).values({\n id: threadId,\n parent: this.chatParentRefFromRoomId(roomId),\n title: input.name ?? roomId,\n status: 'active',\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(roomId),\n ...coordination,\n }, 'matrix', { roomId }),\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.create',\n sender,\n originServerTs: now,\n stateKey: '',\n content: {\n creator: sender,\n room_version: String(input.creation_content?.room_version ?? '11'),\n type: input.creation_content?.type,\n 'm.federate': input.creation_content?.['m.federate'] === true,\n },\n }, context);\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.member',\n sender,\n originServerTs: now + 1,\n stateKey: sender,\n content: {\n membership: 'join',\n displayname: this.displayNameFromUserId(sender),\n },\n }, context);\n if (input.name) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.name',\n sender,\n originServerTs: now + 2,\n stateKey: '',\n content: { name: input.name },\n }, context);\n }\n if (input.topic) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.topic',\n sender,\n originServerTs: now + 3,\n stateKey: '',\n content: { topic: input.topic },\n }, context);\n }\n for (const state of input.initial_state ?? []) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: state.type,\n sender,\n originServerTs: Date.now(),\n stateKey: state.state_key ?? '',\n content: state.content ?? {},\n }, context);\n }\n for (const invitee of input.invite ?? []) {\n await this.appendMembershipEvent(db, roomId, invitee, 'invite', context, { sender, reconcilerOwner });\n }\n\n return {\n roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : undefined,\n name: input.name,\n topic: input.topic,\n creator: sender,\n reconcilerOwner: coordination.reconcilerOwner,\n createdAt: now,\n };\n }\n\n public async joinRoom(roomIdOrAlias: string, context: MatrixStoreContext): Promise<{ roomId: string }> {\n const db = await this.getDb(context);\n const roomId = await this.resolveRoomId(db, roomIdOrAlias);\n await this.ensureRoomExists(db, roomId);\n\n const sender = this.getMatrixUserId(context);\n const existing = await this.findLatestStateEvent(db, roomId, 'm.room.member', sender, context);\n if (existing?.content.membership !== 'join') {\n await this.appendMembershipEvent(db, roomId, sender, 'join', context);\n }\n\n return { roomId };\n }\n\n public async inviteUser(roomId: string, userId: string, context: MatrixStoreContext): Promise<void> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n await this.appendMembershipEvent(db, roomId, userId, 'invite', context);\n }\n\n public async leaveRoom(roomId: string, context: MatrixStoreContext): Promise<void> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n await this.appendMembershipEvent(db, roomId, this.getMatrixUserId(context), 'leave', context);\n }\n\n public async sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n\n const existing = await this.findEventByTxnId(db, roomId, txnId, context);\n if (existing) {\n return existing;\n }\n\n const sender = this.getMatrixUserId(context);\n const event = await this.appendEvent(db, {\n roomId,\n type: eventType,\n sender,\n txnId,\n originServerTs: Date.now(),\n content,\n }, context);\n\n return event;\n }\n\n public async setState(\n roomId: string,\n eventType: string,\n stateKey: string,\n content: Record<string, unknown>,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n return this.appendEvent(db, {\n roomId,\n type: eventType,\n sender: this.getMatrixUserId(context),\n stateKey,\n originServerTs: Date.now(),\n content,\n }, context);\n }\n\n public async sync(context: MatrixStoreContext, options: { since?: string; limit?: number } = {}): Promise<MatrixSyncResponse> {\n const db = await this.getDb(context);\n const rooms = await this.listJoinedRoomRecords(db, context);\n const sinceTs = this.parseSyncToken(options.since);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const join: MatrixSyncResponse['rooms']['join'] = {};\n\n for (const room of rooms) {\n const events = await this.listEvents(db, room.roomId, context, {\n sinceTs,\n limit,\n });\n join[room.roomId] = {\n state: {\n events: events.filter((event) => event.stateKey !== undefined).map((event) => this.toClientEvent(event)),\n },\n timeline: {\n events: events.map((event) => this.toClientEvent(event)),\n limited: false,\n },\n 'co.undefineds.coordination': {\n reconcilerOwner: room.reconcilerOwner,\n },\n };\n }\n\n return {\n next_batch: this.encodeSyncToken(Date.now()),\n rooms: { join },\n };\n }\n\n public async listJoinedRooms(context: MatrixStoreContext): Promise<string[]> {\n const db = await this.getDb(context);\n return (await this.listJoinedRoomRecords(db, context)).map((room) => room.roomId);\n }\n\n public async getMembers(roomId: string, context: MatrixStoreContext): Promise<MatrixClientEvent[]> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n const events = await this.listEvents(db, roomId, context, { newestFirst: true });\n const latestByStateKey = new Map<string, MatrixEventRecord>();\n for (const event of events) {\n if (event.type !== 'm.room.member' || event.stateKey === undefined || latestByStateKey.has(event.stateKey)) {\n continue;\n }\n latestByStateKey.set(event.stateKey, event);\n }\n return Array.from(latestByStateKey.values())\n .sort((left, right) => (left.originServerTs - right.originServerTs) || ((left.depth ?? 0) - (right.depth ?? 0)))\n .map((event) => this.toClientEvent(event));\n }\n\n public async listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options: { limit?: number; dir?: 'b' | 'f'; from?: string } = {},\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const fromTs = this.parseSyncToken(options.from);\n const forward = options.dir === 'f';\n const events = await this.listEvents(db, roomId, context, {\n sinceTs: forward && fromTs > 0 ? fromTs : undefined,\n beforeOrAtTs: !forward && fromTs > 0 ? fromTs : undefined,\n limit,\n newestFirst: !forward,\n });\n const chunk = events.slice(0, limit).map((event) => this.toClientEvent(event));\n return {\n chunk,\n start: options.from,\n end: this.encodeSyncToken(chunk.length ? chunk[chunk.length - 1].origin_server_ts : Date.now()),\n };\n }\n\n public async getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent> {\n const db = await this.getDb(context);\n const event = await this.findEventById(db, roomId, eventId, context);\n if (!event) {\n throw new Error(`Matrix event not found: ${eventId}`);\n }\n return this.toClientEvent(event);\n }\n\n public async getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>> {\n const db = await this.getDb(context);\n const event = await this.findLatestStateEvent(db, roomId, eventType, stateKey, context);\n if (!event) {\n throw new Error(`Matrix state not found: ${eventType}/${stateKey}`);\n }\n return event.content;\n }\n\n private async getDb(context: MatrixStoreContext): Promise<Db> {\n if ((context as any)._matrixDb) {\n return (context as any)._matrixDb;\n }\n\n const auth = context.auth as AuthContext | undefined;\n if (!auth || !isSolidAuth(auth) || !auth.accessToken || !auth.webId) {\n throw new Error('Matrix API requires Solid access-token authentication');\n }\n\n const db: Db = drizzle(\n {\n fetch: this.createAccessTokenFetch(auth.accessToken, auth.tokenType),\n info: { webId: auth.webId, isLoggedIn: true },\n } as any,\n { schema },\n );\n await db.init(\n chatResource,\n threadResource,\n messageResource,\n );\n (context as any)._matrixDb = db;\n return db;\n }\n\n private createAccessTokenFetch(accessToken: string, tokenType?: 'Bearer' | 'DPoP'): typeof fetch {\n const scheme = tokenType ?? 'Bearer';\n return async (input, init) => {\n const headers = new Headers(init?.headers);\n if (!headers.has('Authorization')) {\n headers.set('Authorization', `${scheme} ${accessToken}`);\n }\n return fetch(input, { ...init, headers });\n };\n }\n\n private async ensureRoomExists(db: Db, roomId: string): Promise<void> {\n const room = await db.findById(chatResource, this.chatResourceIdFromRoomId(roomId));\n if (!room) {\n throw new Error(`Matrix room not found: ${roomId}`);\n }\n }\n\n private async appendEvent(\n db: Db,\n input: {\n roomId: string;\n type: string;\n sender: string;\n originServerTs: number;\n content: Record<string, unknown>;\n stateKey?: string;\n txnId?: string;\n reconcilerOwner?: ReconcilerOwner;\n },\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const eventId = this.generateEventId(context);\n const depth = await this.nextEventDepth(db, input.roomId, context);\n const originIso = new Date(input.originServerTs).toISOString();\n const needsRoomMetadata = input.reconcilerOwner === undefined\n || (input.type === 'm.room.message' && this.serverGroupReconcilerService !== undefined);\n const roomContext = needsRoomMetadata ? await this.getRoomContext(db, input.roomId) : undefined;\n const roomMetadata = roomContext?.metadata;\n const reconcilerOwner = input.reconcilerOwner ?? this.reconcilerOwnerFromRoomMetadata(roomMetadata);\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n const messageResourceId = this.messageResourceIdFromEvent(input.roomId, eventId, input.originServerTs);\n const thread = this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(input.roomId), context);\n const contentText = this.messageContentFromMatrixEvent(input.type, input.content);\n const mentions = this.mentionsFromMatrixContent(input.content);\n const routeTargetAgent = this.routeTargetAgentFromMatrixContent(input.content);\n const record = {\n eventId,\n roomId: input.roomId,\n type: input.type,\n sender: input.sender,\n senderWebId: context.webId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? undefined,\n stateKey: input.stateKey ?? undefined,\n content: input.content,\n createdAt: originIso,\n };\n await db.insert(messageResource).values({\n id: messageResourceId,\n parent: this.resolveDataResourceUriFromId(this.messageParentResourceIdFromRoomId(input.roomId), context),\n chat: this.chatResourceIdFromRoomId(input.roomId),\n thread,\n maker: context.webId,\n role: input.type === 'm.room.message' ? MessageRole.USER : MessageRole.SYSTEM,\n content: contentText,\n status: MessageStatus.SENT,\n mentions,\n routeTargetAgent: routeTargetAgent ?? null,\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(input.roomId),\n ...coordination,\n }, 'matrix', {\n eventId,\n roomId: input.roomId,\n eventType: input.type,\n sender: input.sender,\n senderWebId: context.webId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? null,\n stateKey: input.stateKey ?? null,\n content: input.content,\n }),\n createdAt: originIso,\n updatedAt: originIso,\n });\n\n await this.reconcileGroupUserMessage({\n thread,\n triggerMessage: this.resolveDataResourceUriFromId(messageResourceId, context),\n actor: context.webId,\n role: input.type === 'm.room.message' ? MessageRole.USER : MessageRole.SYSTEM,\n content: contentText,\n reconcilerOwner,\n mentions,\n routeTargetAgent,\n participants: roomContext?.participants,\n });\n\n return record;\n }\n\n private async appendMembershipEvent(\n db: Db,\n roomId: string,\n memberUserId: string,\n membership: 'invite' | 'join' | 'leave' | 'ban',\n context: MatrixStoreContext,\n options: { sender?: string; reconcilerOwner?: ReconcilerOwner } = {},\n ): Promise<MatrixEventRecord> {\n const sender = options.sender ?? this.getMatrixUserId(context);\n return this.appendEvent(db, {\n roomId,\n reconcilerOwner: options.reconcilerOwner,\n type: 'm.room.member',\n sender,\n originServerTs: Date.now(),\n stateKey: memberUserId,\n content: {\n membership,\n displayname: this.displayNameFromUserId(memberUserId),\n },\n }, context);\n }\n\n private async listRooms(db: Db): Promise<MatrixRoomRecord[]> {\n const rooms = await db.select().from(chatResource) as MatrixRoomSource[];\n return rooms\n .map((room) => this.chatSourceToRoomRecord(room))\n .filter((room): room is MatrixRoomRecord => room !== undefined);\n }\n\n private async listJoinedRoomRecords(db: Db, context: MatrixStoreContext): Promise<MatrixRoomRecord[]> {\n const rooms = await this.listRooms(db);\n const matrixUserId = this.getMatrixUserId(context);\n const joined: MatrixRoomRecord[] = [];\n for (const room of rooms) {\n const membership = await this.findLatestStateEvent(db, room.roomId, 'm.room.member', matrixUserId, context);\n if (!membership || membership.content.membership === 'join' || membership.content.membership === 'invite') {\n joined.push(room);\n }\n }\n return joined;\n }\n\n private async resolveRoomId(db: Db, roomIdOrAlias: string): Promise<string> {\n if (!roomIdOrAlias.startsWith('#')) {\n return roomIdOrAlias;\n }\n const rooms = await this.listRooms(db);\n const room = rooms.find((candidate) => candidate.canonicalAlias === roomIdOrAlias);\n if (!room) {\n throw new Error(`Matrix room alias not found: ${roomIdOrAlias}`);\n }\n return room.roomId;\n }\n\n private async listEvents(\n db: Db,\n roomId: string,\n context: MatrixStoreContext,\n options: {\n sinceTs?: number;\n beforeOrAtTs?: number;\n limit?: number;\n newestFirst?: boolean;\n } = {},\n ): Promise<MatrixEventRecord[]> {\n const conditions = [\n eq(messageResource.thread, this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(roomId), context)),\n options.sinceTs !== undefined ? gt(messageResource.createdAt, new Date(options.sinceTs).toISOString()) : undefined,\n options.beforeOrAtTs !== undefined ? lte(messageResource.createdAt, new Date(options.beforeOrAtTs).toISOString()) : undefined,\n ];\n let query = db.select().from(messageResource).where(and(...conditions));\n query = options.newestFirst\n ? query.orderBy(desc(messageResource.createdAt as any))\n : query.orderBy(messageResource.createdAt as any);\n if (options.limit && options.limit > 0) {\n query = query.limit(options.limit);\n }\n const events = await query as MatrixEventSource[];\n return events.map((event) => this.eventSourceToRecord(event));\n }\n\n private async findEventByTxnId(db: Db, roomId: string, txnId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.txnId === txnId);\n }\n\n private async findEventById(db: Db, roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.eventId === eventId);\n }\n\n private async nextEventDepth(db: Db, roomId: string, context: MatrixStoreContext): Promise<number> {\n const records = await this.listEvents(db, roomId, context);\n return records.reduce((max, record) => Math.max(max, record.depth ?? 0), 0) + 1;\n }\n\n private async findLatestStateEvent(\n db: Db,\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context, { newestFirst: true });\n return records.find((record) => record.type === eventType && (record.stateKey ?? '') === stateKey);\n }\n\n private eventSourceToRecord(source: MatrixEventSource): MatrixEventRecord {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n const matrix = getProtocolMetadata(metadata, 'matrix') ?? {};\n const content = this.parseJsonObject(matrix.content as JsonObjectSource)\n ?? this.parseJsonObject(metadata.content as JsonObjectSource)\n ?? this.parseJsonObject(source.content)\n ?? {};\n const unsigned = this.parseJsonObject(matrix.unsigned as JsonObjectSource)\n ?? this.parseJsonObject(metadata.unsigned as JsonObjectSource);\n const stateKey = this.stringValue(matrix.stateKey ?? matrix.state_key ?? metadata.stateKey);\n const txnId = this.stringValue(matrix.txnId ?? matrix.txn_id ?? metadata.txnId);\n return {\n eventId: this.stringValue(matrix.eventId ?? matrix.event_id ?? metadata.eventId) ?? source.id,\n roomId: this.stringValue(matrix.roomId ?? matrix.room_id ?? metadata.roomId) ?? '',\n type: this.stringValue(matrix.eventType ?? matrix.event_type ?? metadata.eventType) ?? 'm.room.message',\n sender: this.stringValue(matrix.sender ?? metadata.sender) ?? '',\n senderWebId: this.stringValue(matrix.senderWebId ?? matrix.sender_web_id ?? metadata.senderWebId) ?? source.maker ?? undefined,\n originServerTs: this.numberValue(matrix.originServerTs ?? matrix.origin_server_ts ?? metadata.originServerTs) ?? this.isoToMillis(source.createdAt) ?? Date.now(),\n depth: this.numberValue(matrix.depth ?? metadata.depth),\n txnId: txnId ?? undefined,\n content,\n stateKey: stateKey ?? undefined,\n unsigned,\n };\n }\n\n private chatSourceToRoomRecord(source: MatrixRoomSource): MatrixRoomRecord | undefined {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n if (metadata.protocol !== 'matrix') {\n return undefined;\n }\n const matrix = getProtocolMetadata(metadata, 'matrix') ?? {};\n const roomId = this.stringValue(matrix.roomId ?? matrix.room_id ?? metadata.roomId);\n if (!roomId) {\n return undefined;\n }\n const reconcilerOwner = normalizeReconcilerOwner(metadata.reconcilerOwner, 'server');\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n return {\n roomId,\n canonicalAlias: this.stringValue(matrix.canonicalAlias ?? matrix.canonical_alias ?? metadata.canonicalAlias),\n name: source.title ?? undefined,\n topic: source.description ?? undefined,\n creator: source.author ?? '',\n reconcilerOwner: coordination.reconcilerOwner,\n createdAt: this.isoToMillis(source.createdAt) ?? 0,\n };\n }\n\n private toClientEvent(event: MatrixEventRecord): MatrixClientEvent {\n return {\n event_id: event.eventId,\n room_id: event.roomId,\n type: event.type,\n sender: event.sender,\n origin_server_ts: event.originServerTs,\n content: event.content,\n ...(event.stateKey !== undefined ? { state_key: event.stateKey } : {}),\n ...(event.unsigned ? { unsigned: event.unsigned } : {}),\n };\n }\n\n private parseJsonObject(value: JsonObjectSource): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n if (typeof value !== 'string') {\n return undefined;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n private stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n }\n\n private numberValue(value: unknown): number | undefined {\n if (typeof value !== 'number') {\n return undefined;\n }\n return Number.isFinite(value) ? value : undefined;\n }\n\n private async getRoomContext(db: Db, roomId: string): Promise<MatrixRoomContext> {\n const room = await db.findById(chatResource, this.chatResourceIdFromRoomId(roomId)) as MatrixRoomSource | null;\n return {\n metadata: this.parseJsonObject(room?.metadata),\n participants: normalizeAgentUris(room?.participants),\n };\n }\n\n private reconcilerOwnerFromRoomMetadata(metadata: Record<string, unknown> | undefined): ReconcilerOwner {\n return normalizeReconcilerOwner(metadata?.reconcilerOwner, 'server');\n }\n\n private async reconcileGroupUserMessage(input: {\n thread: string;\n triggerMessage: string;\n actor: string;\n role: string;\n content: string;\n reconcilerOwner: ReconcilerOwner;\n mentions?: string[];\n routeTargetAgent?: string;\n participants?: string[];\n }): Promise<void> {\n if (!this.serverGroupReconcilerService || input.role !== MessageRole.USER) {\n return;\n }\n try {\n await this.serverGroupReconcilerService.reconcileThreadMessage({\n thread: input.thread,\n triggerMessage: input.triggerMessage,\n actor: input.actor,\n role: 'user',\n content: input.content,\n reconcilerOwner: input.reconcilerOwner,\n mentions: input.mentions,\n routeTargetAgent: input.routeTargetAgent,\n participants: input.participants,\n });\n } catch (error) {\n this.logger.warn(`Failed to enqueue Matrix group Reconciler wake: ${error}`);\n }\n }\n\n private messageContentFromMatrixEvent(eventType: string, content: Record<string, unknown>): string {\n if (eventType === 'm.room.message' && typeof content.body === 'string') {\n return content.body;\n }\n return JSON.stringify(content);\n }\n\n private mentionsFromMatrixContent(content: Record<string, unknown>): string[] {\n const matrixMentions = this.parseJsonObject(content['m.mentions'] as JsonObjectSource);\n return normalizeAgentUris([\n ...normalizeAgentUris(content.mentions),\n ...normalizeAgentUris(content['co.undefineds.mentions']),\n ...normalizeAgentUris(matrixMentions?.agents),\n ]);\n }\n\n private routeTargetAgentFromMatrixContent(content: Record<string, unknown>): string | undefined {\n return this.stringValue(content.routeTargetAgent)\n ?? this.stringValue(content['co.undefineds.routeTargetAgent'])\n ?? this.stringValue(content['co.undefineds.route_target_agent']);\n }\n\n private getMatrixUserId(context: MatrixStoreContext): string {\n const serverName = this.getServerName(context);\n const localpart = this.localpartFromUserId(context.webId);\n return `@${localpart}:${serverName}`;\n }\n\n private getServerName(context: MatrixStoreContext): string {\n if (this.serverName) {\n return this.serverName;\n }\n try {\n return new URL(context.webId).host || 'localhost';\n } catch {\n return 'localhost';\n }\n }\n\n private localpartFromUserId(userId: string): string {\n try {\n const url = new URL(userId);\n const withoutHash = `${url.pathname}${url.hash}`.replace(/^\\/+/, '');\n return this.slug(withoutHash || url.host);\n } catch {\n return this.slug(userId);\n }\n }\n\n private displayNameFromUserId(matrixUserId: string): string {\n return matrixUserId.replace(/^@/, '').split(':')[0] || matrixUserId;\n }\n\n private generateRoomId(context: MatrixStoreContext): string {\n return `!${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private generateEventId(context: MatrixStoreContext): string {\n return `$${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private deviceIdFromUserId(userId: string): string {\n return `XPOD${createHash('sha256').update(userId).digest('hex').slice(0, 12).toUpperCase()}`;\n }\n\n private randomId(size: number): string {\n return randomBytes(size).toString('base64url');\n }\n\n private slug(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9._=-]+/g, '_').replace(/^_+|_+$/g, '') || 'user';\n }\n\n private surfaceIdFromRoomId(roomId: string): string {\n return `matrix-${createHash('sha256').update(roomId).digest('hex').slice(0, 16)}`;\n }\n\n private chatResourceIdFromRoomId(roomId: string): string {\n return `${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;\n }\n\n private messageParentResourceIdFromRoomId(roomId: string): string {\n return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;\n }\n\n private threadResourceIdFromRoomId(roomId: string): string {\n return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#thread`;\n }\n\n private chatParentRefFromRoomId(roomId: string): string {\n return `/.data/chat/${this.chatResourceIdFromRoomId(roomId)}`;\n }\n\n private messageResourceIdFromEvent(roomId: string, eventId: string, ts: number): string {\n const { yyyy, MM, dd } = this.dateParts(ts);\n return `chat/${this.surfaceIdFromRoomId(roomId)}/${yyyy}/${MM}/${dd}/messages.ttl#${this.slug(eventId)}`;\n }\n\n private resolveDataResourceUriFromId(resourceId: string, context: MatrixStoreContext): string {\n const podBaseUrl = this.derivePodBaseUrl(context.webId);\n if (!podBaseUrl) {\n return resourceId;\n }\n return `${podBaseUrl.replace(/\\/$/, '')}/.data/${resourceId}`;\n }\n\n private derivePodBaseUrl(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return url.origin;\n }\n url.pathname = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return undefined;\n }\n }\n\n private dateParts(value: number): { yyyy: string; MM: string; dd: string } {\n const date = new Date(value);\n return {\n yyyy: String(date.getUTCFullYear()),\n MM: String(date.getUTCMonth() + 1).padStart(2, '0'),\n dd: String(date.getUTCDate()).padStart(2, '0'),\n };\n }\n\n private isoToMillis(value: string | Date | null | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n const date = value instanceof Date ? value : new Date(value);\n const time = date.getTime();\n return Number.isFinite(time) ? time : undefined;\n }\n\n private encodeSyncToken(ts: number): string {\n return `s${Math.max(0, Math.floor(ts))}`;\n }\n\n private parseSyncToken(token: string | undefined): number {\n if (!token) {\n return 0;\n }\n const parsed = Number(token.replace(/^s/, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PodMatrixStore.js","sourceRoot":"","sources":["../../../src/api/matrix/PodMatrixStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from 'node:crypto';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { and, asc, desc, drizzle, eq, gt, lte } from '@undefineds.co/drizzle-solid';\nimport {\n chatResource,\n messageResource,\n MessageRole,\n MessageStatus,\n threadResource,\n} from '@undefineds.co/models';\nimport {\n normalizeAgentUris,\n normalizeReconcilerOwner,\n reconcilerCoordinationMetadata,\n type ReconcilerOwner,\n type ServerGroupReconcilerService,\n} from '../reconciler';\nimport { getProtocolMetadata, withProtocolMetadata } from '../protocol-metadata';\nimport { isSolidAuth, type AuthContext } from '../auth/AuthContext';\nimport type {\n MatrixAccountInfo,\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n\nconst schema = {\n chat: chatResource,\n thread: threadResource,\n message: messageResource,\n};\n\nexport interface PodMatrixStoreOptions {\n serverName?: string;\n serverGroupReconcilerService?: ServerGroupReconcilerService;\n}\n\ntype Db = any;\ntype JsonObjectSource = string | Record<string, unknown> | null | undefined;\n\ninterface MatrixRoomSource {\n id: string;\n title?: string | null;\n description?: string | null;\n author?: string | null;\n participants?: string[] | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixEventSource {\n id: string;\n maker?: string | null;\n content?: JsonObjectSource;\n mentions?: string[] | null;\n routeTargetAgent?: string | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixRoomContext {\n metadata?: Record<string, unknown>;\n participants: string[];\n}\n\nexport class PodMatrixStore {\n private readonly logger = getLoggerFor(this);\n private readonly serverName?: string;\n private readonly serverGroupReconcilerService?: ServerGroupReconcilerService;\n\n public constructor(options: PodMatrixStoreOptions) {\n this.serverName = options.serverName;\n this.serverGroupReconcilerService = options.serverGroupReconcilerService;\n }\n\n public async getAccount(context: MatrixStoreContext): Promise<MatrixAccountInfo> {\n const matrixUserId = this.getMatrixUserId(context);\n return {\n userId: matrixUserId,\n deviceId: this.deviceIdFromUserId(context.webId),\n displayName: this.displayNameFromUserId(matrixUserId),\n };\n }\n\n public async createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord> {\n const db = await this.getDb(context);\n const sender = this.getMatrixUserId(context);\n const now = Date.now();\n const roomId = this.generateRoomId(context);\n const chatId = this.chatResourceIdFromRoomId(roomId);\n const threadId = this.threadResourceIdFromRoomId(roomId);\n const reconcilerOwner = 'server' as const;\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n\n await db.insert(chatResource).values({\n id: chatId,\n title: input.name ?? roomId,\n description: input.topic ?? null,\n author: context.webId,\n status: 'active',\n participants: [context.webId],\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n ...coordination,\n }, 'matrix', {\n roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : null,\n visibility: input.visibility === 'public' ? 'public' : 'private',\n roomVersion: String(input.creation_content?.room_version ?? '11'),\n federate: input.creation_content?.['m.federate'] === true,\n members: [context.webId],\n preset: input.preset,\n invite: input.invite ?? [],\n }),\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n await db.insert(threadResource).values({\n id: threadId,\n parent: this.chatParentRefFromRoomId(roomId),\n title: input.name ?? roomId,\n status: 'active',\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(roomId),\n ...coordination,\n }, 'matrix', { roomId }),\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.create',\n sender,\n originServerTs: now,\n stateKey: '',\n content: {\n creator: sender,\n room_version: String(input.creation_content?.room_version ?? '11'),\n type: input.creation_content?.type,\n 'm.federate': input.creation_content?.['m.federate'] === true,\n },\n }, context);\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.member',\n sender,\n originServerTs: now + 1,\n stateKey: sender,\n content: {\n membership: 'join',\n displayname: this.displayNameFromUserId(sender),\n },\n }, context);\n if (input.name) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.name',\n sender,\n originServerTs: now + 2,\n stateKey: '',\n content: { name: input.name },\n }, context);\n }\n if (input.topic) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.topic',\n sender,\n originServerTs: now + 3,\n stateKey: '',\n content: { topic: input.topic },\n }, context);\n }\n for (const state of input.initial_state ?? []) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: state.type,\n sender,\n originServerTs: Date.now(),\n stateKey: state.state_key ?? '',\n content: state.content ?? {},\n }, context);\n }\n for (const invitee of input.invite ?? []) {\n await this.appendMembershipEvent(db, roomId, invitee, 'invite', context, { sender, reconcilerOwner });\n }\n\n return {\n roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : undefined,\n name: input.name,\n topic: input.topic,\n creator: sender,\n reconcilerOwner: coordination.reconcilerOwner,\n createdAt: now,\n };\n }\n\n public async joinRoom(roomIdOrAlias: string, context: MatrixStoreContext): Promise<{ roomId: string }> {\n const db = await this.getDb(context);\n const roomId = await this.resolveRoomId(db, roomIdOrAlias);\n await this.ensureRoomExists(db, roomId);\n\n const sender = this.getMatrixUserId(context);\n const existing = await this.findLatestStateEvent(db, roomId, 'm.room.member', sender, context);\n if (existing?.content.membership !== 'join') {\n await this.appendMembershipEvent(db, roomId, sender, 'join', context);\n }\n\n return { roomId };\n }\n\n public async inviteUser(roomId: string, userId: string, context: MatrixStoreContext): Promise<void> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n await this.appendMembershipEvent(db, roomId, userId, 'invite', context);\n }\n\n public async leaveRoom(roomId: string, context: MatrixStoreContext): Promise<void> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n await this.appendMembershipEvent(db, roomId, this.getMatrixUserId(context), 'leave', context);\n }\n\n public async sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n\n const existing = await this.findEventByTxnId(db, roomId, txnId, context);\n if (existing) {\n return existing;\n }\n\n const sender = this.getMatrixUserId(context);\n const event = await this.appendEvent(db, {\n roomId,\n type: eventType,\n sender,\n txnId,\n originServerTs: Date.now(),\n content,\n }, context);\n\n return event;\n }\n\n public async setState(\n roomId: string,\n eventType: string,\n stateKey: string,\n content: Record<string, unknown>,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n return this.appendEvent(db, {\n roomId,\n type: eventType,\n sender: this.getMatrixUserId(context),\n stateKey,\n originServerTs: Date.now(),\n content,\n }, context);\n }\n\n public async sync(context: MatrixStoreContext, options: { since?: string; limit?: number } = {}): Promise<MatrixSyncResponse> {\n const db = await this.getDb(context);\n const rooms = await this.listJoinedRoomRecords(db, context);\n const sinceTs = this.parseSyncToken(options.since);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const join: MatrixSyncResponse['rooms']['join'] = {};\n\n for (const room of rooms) {\n const events = await this.listEvents(db, room.roomId, context, {\n sinceTs,\n limit,\n });\n join[room.roomId] = {\n state: {\n events: events.filter((event) => event.stateKey !== undefined).map((event) => this.toClientEvent(event)),\n },\n timeline: {\n events: events.map((event) => this.toClientEvent(event)),\n limited: false,\n },\n 'co.undefineds.coordination': {\n reconcilerOwner: room.reconcilerOwner,\n },\n };\n }\n\n return {\n next_batch: this.encodeSyncToken(Date.now()),\n rooms: { join },\n };\n }\n\n public async listJoinedRooms(context: MatrixStoreContext): Promise<string[]> {\n const db = await this.getDb(context);\n return (await this.listJoinedRoomRecords(db, context)).map((room) => room.roomId);\n }\n\n public async getMembers(roomId: string, context: MatrixStoreContext): Promise<MatrixClientEvent[]> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n const events = await this.listEvents(db, roomId, context, { newestFirst: true });\n const latestByStateKey = new Map<string, MatrixEventRecord>();\n for (const event of events) {\n if (event.type !== 'm.room.member' || event.stateKey === undefined || latestByStateKey.has(event.stateKey)) {\n continue;\n }\n latestByStateKey.set(event.stateKey, event);\n }\n return Array.from(latestByStateKey.values())\n .sort((left, right) => (left.originServerTs - right.originServerTs) || ((left.depth ?? 0) - (right.depth ?? 0)))\n .map((event) => this.toClientEvent(event));\n }\n\n public async listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options: { limit?: number; dir?: 'b' | 'f'; from?: string } = {},\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const fromTs = this.parseSyncToken(options.from);\n const forward = options.dir === 'f';\n const events = await this.listEvents(db, roomId, context, {\n sinceTs: forward && fromTs > 0 ? fromTs : undefined,\n beforeOrAtTs: !forward && fromTs > 0 ? fromTs : undefined,\n limit,\n newestFirst: !forward,\n });\n const chunk = events.slice(0, limit).map((event) => this.toClientEvent(event));\n return {\n chunk,\n start: options.from,\n end: this.encodeSyncToken(chunk.length ? chunk[chunk.length - 1].origin_server_ts : Date.now()),\n };\n }\n\n public async getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent> {\n const db = await this.getDb(context);\n const event = await this.findEventById(db, roomId, eventId, context);\n if (!event) {\n throw new Error(`Matrix event not found: ${eventId}`);\n }\n return this.toClientEvent(event);\n }\n\n public async getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>> {\n const db = await this.getDb(context);\n const event = await this.findLatestStateEvent(db, roomId, eventType, stateKey, context);\n if (!event) {\n throw new Error(`Matrix state not found: ${eventType}/${stateKey}`);\n }\n return event.content;\n }\n\n private async getDb(context: MatrixStoreContext): Promise<Db> {\n if ((context as any)._matrixDb) {\n return (context as any)._matrixDb;\n }\n\n const auth = context.auth as AuthContext | undefined;\n if (!auth || !isSolidAuth(auth) || !auth.accessToken || !auth.webId) {\n throw new Error('Matrix API requires Solid access-token authentication');\n }\n\n const db: Db = drizzle(\n {\n fetch: this.createAccessTokenFetch(auth.accessToken, auth.tokenType),\n info: {\n webId: auth.webId,\n isLoggedIn: true,\n podUrl: context.podUrl,\n },\n } as any,\n {\n schema,\n podUrl: context.podUrl,\n },\n );\n await db.init(\n chatResource,\n threadResource,\n messageResource,\n );\n (context as any)._matrixDb = db;\n return db;\n }\n\n private createAccessTokenFetch(accessToken: string, tokenType?: 'Bearer' | 'DPoP'): typeof fetch {\n const scheme = tokenType ?? 'Bearer';\n return async (input, init) => {\n const headers = new Headers(init?.headers);\n if (!headers.has('Authorization')) {\n headers.set('Authorization', `${scheme} ${accessToken}`);\n }\n return fetch(input, { ...init, headers });\n };\n }\n\n private async ensureRoomExists(db: Db, roomId: string): Promise<void> {\n const room = await db.findById(chatResource, this.chatResourceIdFromRoomId(roomId));\n if (!room) {\n throw new Error(`Matrix room not found: ${roomId}`);\n }\n }\n\n private async appendEvent(\n db: Db,\n input: {\n roomId: string;\n type: string;\n sender: string;\n originServerTs: number;\n content: Record<string, unknown>;\n stateKey?: string;\n txnId?: string;\n reconcilerOwner?: ReconcilerOwner;\n },\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const eventId = this.generateEventId(context);\n const depth = await this.nextEventDepth(db, input.roomId, context);\n const originIso = new Date(input.originServerTs).toISOString();\n const needsRoomMetadata = input.reconcilerOwner === undefined\n || (input.type === 'm.room.message' && this.serverGroupReconcilerService !== undefined);\n const roomContext = needsRoomMetadata ? await this.getRoomContext(db, input.roomId) : undefined;\n const roomMetadata = roomContext?.metadata;\n const reconcilerOwner = input.reconcilerOwner ?? this.reconcilerOwnerFromRoomMetadata(roomMetadata);\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n const messageResourceId = this.messageResourceIdFromEvent(input.roomId, eventId, input.originServerTs);\n const thread = this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(input.roomId), context);\n const contentText = this.messageContentFromMatrixEvent(input.type, input.content);\n const mentions = this.mentionsFromMatrixContent(input.content);\n const routeTargetAgent = this.routeTargetAgentFromMatrixContent(input.content);\n const record = {\n eventId,\n roomId: input.roomId,\n type: input.type,\n sender: input.sender,\n senderWebId: context.webId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? undefined,\n stateKey: input.stateKey ?? undefined,\n content: input.content,\n createdAt: originIso,\n };\n await db.insert(messageResource).values({\n id: messageResourceId,\n parent: this.resolveDataResourceUriFromId(this.messageParentResourceIdFromRoomId(input.roomId), context),\n chat: this.chatResourceIdFromRoomId(input.roomId),\n thread,\n maker: context.webId,\n role: input.type === 'm.room.message' ? MessageRole.USER : MessageRole.SYSTEM,\n content: contentText,\n status: MessageStatus.SENT,\n mentions,\n routeTargetAgent: routeTargetAgent ?? null,\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(input.roomId),\n ...coordination,\n }, 'matrix', {\n eventId,\n roomId: input.roomId,\n eventType: input.type,\n sender: input.sender,\n senderWebId: context.webId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? null,\n stateKey: input.stateKey ?? null,\n content: input.content,\n }),\n createdAt: originIso,\n updatedAt: originIso,\n });\n\n await this.reconcileGroupUserMessage({\n thread,\n triggerMessage: this.resolveDataResourceUriFromId(messageResourceId, context),\n actor: context.webId,\n role: input.type === 'm.room.message' ? MessageRole.USER : MessageRole.SYSTEM,\n content: contentText,\n reconcilerOwner,\n mentions,\n routeTargetAgent,\n participants: roomContext?.participants,\n });\n\n return record;\n }\n\n private async appendMembershipEvent(\n db: Db,\n roomId: string,\n memberUserId: string,\n membership: 'invite' | 'join' | 'leave' | 'ban',\n context: MatrixStoreContext,\n options: { sender?: string; reconcilerOwner?: ReconcilerOwner } = {},\n ): Promise<MatrixEventRecord> {\n const sender = options.sender ?? this.getMatrixUserId(context);\n return this.appendEvent(db, {\n roomId,\n reconcilerOwner: options.reconcilerOwner,\n type: 'm.room.member',\n sender,\n originServerTs: Date.now(),\n stateKey: memberUserId,\n content: {\n membership,\n displayname: this.displayNameFromUserId(memberUserId),\n },\n }, context);\n }\n\n private async listRooms(db: Db): Promise<MatrixRoomRecord[]> {\n const rooms = await db.select().from(chatResource) as MatrixRoomSource[];\n return rooms\n .map((room) => this.chatSourceToRoomRecord(room))\n .filter((room): room is MatrixRoomRecord => room !== undefined);\n }\n\n private async listJoinedRoomRecords(db: Db, context: MatrixStoreContext): Promise<MatrixRoomRecord[]> {\n const rooms = await this.listRooms(db);\n const matrixUserId = this.getMatrixUserId(context);\n const joined: MatrixRoomRecord[] = [];\n for (const room of rooms) {\n const membership = await this.findLatestStateEvent(db, room.roomId, 'm.room.member', matrixUserId, context);\n if (!membership || membership.content.membership === 'join' || membership.content.membership === 'invite') {\n joined.push(room);\n }\n }\n return joined;\n }\n\n private async resolveRoomId(db: Db, roomIdOrAlias: string): Promise<string> {\n if (!roomIdOrAlias.startsWith('#')) {\n return roomIdOrAlias;\n }\n const rooms = await this.listRooms(db);\n const room = rooms.find((candidate) => candidate.canonicalAlias === roomIdOrAlias);\n if (!room) {\n throw new Error(`Matrix room alias not found: ${roomIdOrAlias}`);\n }\n return room.roomId;\n }\n\n private async listEvents(\n db: Db,\n roomId: string,\n context: MatrixStoreContext,\n options: {\n sinceTs?: number;\n beforeOrAtTs?: number;\n limit?: number;\n newestFirst?: boolean;\n } = {},\n ): Promise<MatrixEventRecord[]> {\n const conditions = [\n eq(messageResource.thread, this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(roomId), context)),\n options.sinceTs !== undefined ? gt(messageResource.createdAt, new Date(options.sinceTs).toISOString()) : undefined,\n options.beforeOrAtTs !== undefined ? lte(messageResource.createdAt, new Date(options.beforeOrAtTs).toISOString()) : undefined,\n ];\n let query = db.select().from(messageResource).where(and(...conditions));\n query = options.newestFirst\n ? query.orderBy(desc(messageResource.createdAt as any))\n : query.orderBy(asc(messageResource.createdAt as any));\n if (options.limit && options.limit > 0) {\n query = query.limit(options.limit);\n }\n const events = await query as MatrixEventSource[];\n return events.map((event) => this.eventSourceToRecord(event));\n }\n\n private async findEventByTxnId(db: Db, roomId: string, txnId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.txnId === txnId);\n }\n\n private async findEventById(db: Db, roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.eventId === eventId);\n }\n\n private async nextEventDepth(db: Db, roomId: string, context: MatrixStoreContext): Promise<number> {\n const records = await this.listEvents(db, roomId, context);\n return records.reduce((max, record) => Math.max(max, record.depth ?? 0), 0) + 1;\n }\n\n private async findLatestStateEvent(\n db: Db,\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context, { newestFirst: true });\n return records.find((record) => record.type === eventType && (record.stateKey ?? '') === stateKey);\n }\n\n private eventSourceToRecord(source: MatrixEventSource): MatrixEventRecord {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n const matrix = getProtocolMetadata(metadata, 'matrix') ?? {};\n const content = this.parseJsonObject(matrix.content as JsonObjectSource)\n ?? this.parseJsonObject(metadata.content as JsonObjectSource)\n ?? this.parseJsonObject(source.content)\n ?? {};\n const unsigned = this.parseJsonObject(matrix.unsigned as JsonObjectSource)\n ?? this.parseJsonObject(metadata.unsigned as JsonObjectSource);\n const stateKey = this.stringValue(matrix.stateKey ?? matrix.state_key ?? metadata.stateKey);\n const txnId = this.stringValue(matrix.txnId ?? matrix.txn_id ?? metadata.txnId);\n return {\n eventId: this.stringValue(matrix.eventId ?? matrix.event_id ?? metadata.eventId) ?? source.id,\n roomId: this.stringValue(matrix.roomId ?? matrix.room_id ?? metadata.roomId) ?? '',\n type: this.stringValue(matrix.eventType ?? matrix.event_type ?? metadata.eventType) ?? 'm.room.message',\n sender: this.stringValue(matrix.sender ?? metadata.sender) ?? '',\n senderWebId: this.stringValue(matrix.senderWebId ?? matrix.sender_web_id ?? metadata.senderWebId) ?? source.maker ?? undefined,\n originServerTs: this.numberValue(matrix.originServerTs ?? matrix.origin_server_ts ?? metadata.originServerTs) ?? this.isoToMillis(source.createdAt) ?? Date.now(),\n depth: this.numberValue(matrix.depth ?? metadata.depth),\n txnId: txnId ?? undefined,\n content,\n stateKey: stateKey ?? undefined,\n unsigned,\n };\n }\n\n private chatSourceToRoomRecord(source: MatrixRoomSource): MatrixRoomRecord | undefined {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n if (metadata.protocol !== 'matrix') {\n return undefined;\n }\n const matrix = getProtocolMetadata(metadata, 'matrix') ?? {};\n const roomId = this.stringValue(matrix.roomId ?? matrix.room_id ?? metadata.roomId);\n if (!roomId) {\n return undefined;\n }\n const reconcilerOwner = normalizeReconcilerOwner(metadata.reconcilerOwner, 'server');\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n return {\n roomId,\n canonicalAlias: this.stringValue(matrix.canonicalAlias ?? matrix.canonical_alias ?? metadata.canonicalAlias),\n name: source.title ?? undefined,\n topic: source.description ?? undefined,\n creator: source.author ?? '',\n reconcilerOwner: coordination.reconcilerOwner,\n createdAt: this.isoToMillis(source.createdAt) ?? 0,\n };\n }\n\n private toClientEvent(event: MatrixEventRecord): MatrixClientEvent {\n return {\n event_id: event.eventId,\n room_id: event.roomId,\n type: event.type,\n sender: event.sender,\n origin_server_ts: event.originServerTs,\n content: event.content,\n ...(event.stateKey !== undefined ? { state_key: event.stateKey } : {}),\n ...(event.unsigned ? { unsigned: event.unsigned } : {}),\n };\n }\n\n private parseJsonObject(value: JsonObjectSource): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n if (typeof value !== 'string') {\n return undefined;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n private stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n }\n\n private numberValue(value: unknown): number | undefined {\n if (typeof value !== 'number') {\n return undefined;\n }\n return Number.isFinite(value) ? value : undefined;\n }\n\n private async getRoomContext(db: Db, roomId: string): Promise<MatrixRoomContext> {\n const room = await db.findById(chatResource, this.chatResourceIdFromRoomId(roomId)) as MatrixRoomSource | null;\n return {\n metadata: this.parseJsonObject(room?.metadata),\n participants: normalizeAgentUris(room?.participants),\n };\n }\n\n private reconcilerOwnerFromRoomMetadata(metadata: Record<string, unknown> | undefined): ReconcilerOwner {\n return normalizeReconcilerOwner(metadata?.reconcilerOwner, 'server');\n }\n\n private async reconcileGroupUserMessage(input: {\n thread: string;\n triggerMessage: string;\n actor: string;\n role: string;\n content: string;\n reconcilerOwner: ReconcilerOwner;\n mentions?: string[];\n routeTargetAgent?: string;\n participants?: string[];\n }): Promise<void> {\n if (!this.serverGroupReconcilerService || input.role !== MessageRole.USER) {\n return;\n }\n try {\n await this.serverGroupReconcilerService.reconcileThreadMessage({\n thread: input.thread,\n triggerMessage: input.triggerMessage,\n actor: input.actor,\n role: 'user',\n content: input.content,\n reconcilerOwner: input.reconcilerOwner,\n mentions: input.mentions,\n routeTargetAgent: input.routeTargetAgent,\n participants: input.participants,\n });\n } catch (error) {\n this.logger.warn(`Failed to enqueue Matrix group Reconciler wake: ${error}`);\n }\n }\n\n private messageContentFromMatrixEvent(eventType: string, content: Record<string, unknown>): string {\n if (eventType === 'm.room.message' && typeof content.body === 'string') {\n return content.body;\n }\n return JSON.stringify(content);\n }\n\n private mentionsFromMatrixContent(content: Record<string, unknown>): string[] {\n const matrixMentions = this.parseJsonObject(content['m.mentions'] as JsonObjectSource);\n return normalizeAgentUris([\n ...normalizeAgentUris(content.mentions),\n ...normalizeAgentUris(content['co.undefineds.mentions']),\n ...normalizeAgentUris(matrixMentions?.agents),\n ]);\n }\n\n private routeTargetAgentFromMatrixContent(content: Record<string, unknown>): string | undefined {\n return this.stringValue(content.routeTargetAgent)\n ?? this.stringValue(content['co.undefineds.routeTargetAgent'])\n ?? this.stringValue(content['co.undefineds.route_target_agent']);\n }\n\n private getMatrixUserId(context: MatrixStoreContext): string {\n const serverName = this.getServerName(context);\n const localpart = this.localpartFromUserId(context.webId);\n return `@${localpart}:${serverName}`;\n }\n\n private getServerName(context: MatrixStoreContext): string {\n if (this.serverName) {\n return this.serverName;\n }\n try {\n return new URL(context.webId).host || 'localhost';\n } catch {\n return 'localhost';\n }\n }\n\n private localpartFromUserId(userId: string): string {\n try {\n const url = new URL(userId);\n const withoutHash = `${url.pathname}${url.hash}`.replace(/^\\/+/, '');\n return this.slug(withoutHash || url.host);\n } catch {\n return this.slug(userId);\n }\n }\n\n private displayNameFromUserId(matrixUserId: string): string {\n return matrixUserId.replace(/^@/, '').split(':')[0] || matrixUserId;\n }\n\n private generateRoomId(context: MatrixStoreContext): string {\n return `!${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private generateEventId(context: MatrixStoreContext): string {\n return `$${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private deviceIdFromUserId(userId: string): string {\n return `XPOD${createHash('sha256').update(userId).digest('hex').slice(0, 12).toUpperCase()}`;\n }\n\n private randomId(size: number): string {\n return randomBytes(size).toString('base64url');\n }\n\n private slug(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9._=-]+/g, '_').replace(/^_+|_+$/g, '') || 'user';\n }\n\n private surfaceIdFromRoomId(roomId: string): string {\n return `matrix-${createHash('sha256').update(roomId).digest('hex').slice(0, 16)}`;\n }\n\n private chatResourceIdFromRoomId(roomId: string): string {\n return `${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;\n }\n\n private messageParentResourceIdFromRoomId(roomId: string): string {\n return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;\n }\n\n private threadResourceIdFromRoomId(roomId: string): string {\n return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#thread`;\n }\n\n private chatParentRefFromRoomId(roomId: string): string {\n return `/.data/chat/${this.chatResourceIdFromRoomId(roomId)}`;\n }\n\n private messageResourceIdFromEvent(roomId: string, eventId: string, ts: number): string {\n const { yyyy, MM, dd } = this.dateParts(ts);\n return `chat/${this.surfaceIdFromRoomId(roomId)}/${yyyy}/${MM}/${dd}/messages.ttl#${this.slug(eventId)}`;\n }\n\n private resolveDataResourceUriFromId(resourceId: string, context: MatrixStoreContext): string {\n const podBaseUrl = context.podUrl ?? this.derivePodBaseUrl(context.webId);\n if (!podBaseUrl) {\n return resourceId;\n }\n return `${podBaseUrl.replace(/\\/$/, '')}/.data/${resourceId}`;\n }\n\n private derivePodBaseUrl(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return url.origin;\n }\n url.pathname = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return undefined;\n }\n }\n\n private dateParts(value: number): { yyyy: string; MM: string; dd: string } {\n const date = new Date(value);\n return {\n yyyy: String(date.getUTCFullYear()),\n MM: String(date.getUTCMonth() + 1).padStart(2, '0'),\n dd: String(date.getUTCDate()).padStart(2, '0'),\n };\n }\n\n private isoToMillis(value: string | Date | null | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n const date = value instanceof Date ? value : new Date(value);\n const time = date.getTime();\n return Number.isFinite(time) ? time : undefined;\n }\n\n private encodeSyncToken(ts: number): string {\n return `s${Math.max(0, Math.floor(ts))}`;\n }\n\n private parseSyncToken(token: string | undefined): number {\n if (!token) {\n return 0;\n }\n const parsed = Number(token.replace(/^s/, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n}\n"]}
|
|
@@ -3,6 +3,8 @@ import type { ReconcilerOwner } from '../reconciler';
|
|
|
3
3
|
export interface MatrixStoreContext {
|
|
4
4
|
/** Authenticated Solid WebID used as the Pod actor/resource owner. */
|
|
5
5
|
webId: string;
|
|
6
|
+
/** Storage Pod selected by the current SP/gateway, not necessarily the WebID issuer origin. */
|
|
7
|
+
podUrl?: string;
|
|
6
8
|
auth?: AuthContext;
|
|
7
9
|
}
|
|
8
10
|
export interface MatrixRoomRecord {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/matrix/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AuthContext } from '../auth/AuthContext';\nimport type { ReconcilerOwner } from '../reconciler';\n\nexport interface MatrixStoreContext {\n /** Authenticated Solid WebID used as the Pod actor/resource owner. */\n webId: string;\n auth?: AuthContext;\n}\n\nexport interface MatrixRoomRecord {\n roomId: string;\n canonicalAlias?: string;\n name?: string;\n topic?: string;\n creator: string;\n reconcilerOwner: ReconcilerOwner;\n createdAt: number;\n}\n\nexport interface MatrixEventRecord {\n eventId: string;\n roomId: string;\n type: string;\n sender: string;\n senderWebId?: string;\n originServerTs: number;\n depth?: number;\n txnId?: string;\n content: Record<string, unknown>;\n stateKey?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixCreateRoomRequest {\n visibility?: 'private' | 'public';\n room_alias_name?: string;\n name?: string;\n topic?: string;\n invite?: string[];\n creation_content?: Record<string, unknown>;\n initial_state?: Array<{\n type: string;\n state_key?: string;\n content?: Record<string, unknown>;\n }>;\n preset?: string;\n}\n\nexport interface MatrixSendEventRequest {\n body?: string;\n msgtype?: string;\n [key: string]: unknown;\n}\n\nexport interface MatrixSyncResponse {\n next_batch: string;\n rooms: {\n join: Record<string, {\n state: { events: MatrixClientEvent[] };\n timeline: {\n events: MatrixClientEvent[];\n limited: boolean;\n prev_batch?: string;\n };\n 'co.undefineds.coordination'?: {\n reconcilerOwner: ReconcilerOwner;\n };\n }>;\n };\n}\n\nexport interface MatrixClientEvent {\n event_id: string;\n room_id: string;\n type: string;\n sender: string;\n origin_server_ts: number;\n content: Record<string, unknown>;\n state_key?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixAccountInfo {\n userId: string;\n deviceId?: string;\n displayName?: string;\n avatarUrl?: string;\n}\n\nexport interface MatrixStore {\n getAccount(context: MatrixStoreContext): Promise<MatrixAccountInfo>;\n createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord>;\n joinRoom(roomIdOrAlias: string, context: MatrixStoreContext): Promise<{ roomId: string }>;\n inviteUser(roomId: string, userId: string, context: MatrixStoreContext): Promise<void>;\n leaveRoom(roomId: string, context: MatrixStoreContext): Promise<void>;\n sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord>;\n setState(\n roomId: string,\n eventType: string,\n stateKey: string,\n content: Record<string, unknown>,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord>;\n sync(context: MatrixStoreContext, options?: { since?: string; limit?: number }): Promise<MatrixSyncResponse>;\n listJoinedRooms(context: MatrixStoreContext): Promise<string[]>;\n getMembers(roomId: string, context: MatrixStoreContext): Promise<MatrixClientEvent[]>;\n listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options?: { limit?: number; dir?: 'b' | 'f'; from?: string },\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }>;\n getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent>;\n getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/matrix/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AuthContext } from '../auth/AuthContext';\nimport type { ReconcilerOwner } from '../reconciler';\n\nexport interface MatrixStoreContext {\n /** Authenticated Solid WebID used as the Pod actor/resource owner. */\n webId: string;\n /** Storage Pod selected by the current SP/gateway, not necessarily the WebID issuer origin. */\n podUrl?: string;\n auth?: AuthContext;\n}\n\nexport interface MatrixRoomRecord {\n roomId: string;\n canonicalAlias?: string;\n name?: string;\n topic?: string;\n creator: string;\n reconcilerOwner: ReconcilerOwner;\n createdAt: number;\n}\n\nexport interface MatrixEventRecord {\n eventId: string;\n roomId: string;\n type: string;\n sender: string;\n senderWebId?: string;\n originServerTs: number;\n depth?: number;\n txnId?: string;\n content: Record<string, unknown>;\n stateKey?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixCreateRoomRequest {\n visibility?: 'private' | 'public';\n room_alias_name?: string;\n name?: string;\n topic?: string;\n invite?: string[];\n creation_content?: Record<string, unknown>;\n initial_state?: Array<{\n type: string;\n state_key?: string;\n content?: Record<string, unknown>;\n }>;\n preset?: string;\n}\n\nexport interface MatrixSendEventRequest {\n body?: string;\n msgtype?: string;\n [key: string]: unknown;\n}\n\nexport interface MatrixSyncResponse {\n next_batch: string;\n rooms: {\n join: Record<string, {\n state: { events: MatrixClientEvent[] };\n timeline: {\n events: MatrixClientEvent[];\n limited: boolean;\n prev_batch?: string;\n };\n 'co.undefineds.coordination'?: {\n reconcilerOwner: ReconcilerOwner;\n };\n }>;\n };\n}\n\nexport interface MatrixClientEvent {\n event_id: string;\n room_id: string;\n type: string;\n sender: string;\n origin_server_ts: number;\n content: Record<string, unknown>;\n state_key?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixAccountInfo {\n userId: string;\n deviceId?: string;\n displayName?: string;\n avatarUrl?: string;\n}\n\nexport interface MatrixStore {\n getAccount(context: MatrixStoreContext): Promise<MatrixAccountInfo>;\n createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord>;\n joinRoom(roomIdOrAlias: string, context: MatrixStoreContext): Promise<{ roomId: string }>;\n inviteUser(roomId: string, userId: string, context: MatrixStoreContext): Promise<void>;\n leaveRoom(roomId: string, context: MatrixStoreContext): Promise<void>;\n sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord>;\n setState(\n roomId: string,\n eventType: string,\n stateKey: string,\n content: Record<string, unknown>,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord>;\n sync(context: MatrixStoreContext, options?: { since?: string; limit?: number }): Promise<MatrixSyncResponse>;\n listJoinedRooms(context: MatrixStoreContext): Promise<string[]>;\n getMembers(roomId: string, context: MatrixStoreContext): Promise<MatrixClientEvent[]>;\n listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options?: { limit?: number; dir?: 'b' | 'f'; from?: string },\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }>;\n getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent>;\n getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>>;\n}\n"]}
|
|
@@ -31,7 +31,9 @@ class AuthMiddleware {
|
|
|
31
31
|
}
|
|
32
32
|
// Attempt authentication
|
|
33
33
|
const result = await this.authenticator.authenticate(request);
|
|
34
|
-
|
|
34
|
+
this.logger.debug(`Auth ${request.method} ${request.url} success=${result.success}` +
|
|
35
|
+
(result.error ? ` error=${result.error}` : '') +
|
|
36
|
+
(result.context ? ` context=${JSON.stringify(this.safeContextForLog(result.context))}` : ''));
|
|
35
37
|
if (!result.success) {
|
|
36
38
|
this.sendUnauthorized(response, result.error ?? 'Authentication failed');
|
|
37
39
|
return false;
|
|
@@ -46,6 +48,16 @@ class AuthMiddleware {
|
|
|
46
48
|
response.setHeader('WWW-Authenticate', 'Bearer, DPoP');
|
|
47
49
|
response.end(JSON.stringify({ error: 'Unauthorized', message }));
|
|
48
50
|
}
|
|
51
|
+
safeContextForLog(context) {
|
|
52
|
+
return {
|
|
53
|
+
type: context.type,
|
|
54
|
+
webId: context.webId,
|
|
55
|
+
accountId: context.accountId,
|
|
56
|
+
clientId: context.clientId,
|
|
57
|
+
tokenType: context.tokenType,
|
|
58
|
+
viaApiKey: context.viaApiKey,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
49
61
|
}
|
|
50
62
|
exports.AuthMiddleware = AuthMiddleware;
|
|
51
63
|
//# sourceMappingURL=AuthMiddleware.js.map
|