@undefineds.co/xpod 0.3.4 → 0.3.6

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.
@@ -0,0 +1,539 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PodMatrixStore = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
6
+ const models_1 = require("@undefineds.co/models");
7
+ const AuthContext_1 = require("../auth/AuthContext");
8
+ const schema = {
9
+ matrixAccount: models_1.matrixAccountResource,
10
+ matrixRoom: models_1.matrixRoomResource,
11
+ matrixEvent: models_1.matrixEventResource,
12
+ chat: models_1.chatResource,
13
+ thread: models_1.threadResource,
14
+ message: models_1.messageResource,
15
+ };
16
+ class PodMatrixStore {
17
+ constructor(options) {
18
+ this.serverName = options.serverName;
19
+ }
20
+ async createRoom(input, context) {
21
+ const db = await this.getDb(context);
22
+ const sender = this.getMatrixUserId(context);
23
+ const now = Date.now();
24
+ const roomId = this.generateRoomId(context);
25
+ const chatId = this.chatResourceIdFromRoomId(roomId);
26
+ const threadId = this.threadResourceIdFromRoomId(roomId);
27
+ await this.ensureMatrixAccount(db, context);
28
+ await db.insert(models_1.chatResource).values({
29
+ id: chatId,
30
+ title: input.name ?? roomId,
31
+ description: input.topic ?? null,
32
+ author: context.userId,
33
+ status: 'active',
34
+ metadata: { protocol: 'matrix', roomId },
35
+ createdAt: new Date(now).toISOString(),
36
+ updatedAt: new Date(now).toISOString(),
37
+ });
38
+ await db.insert(models_1.threadResource).values({
39
+ id: threadId,
40
+ commandKind: 'chat',
41
+ surfaceId: this.surfaceIdFromRoomId(roomId),
42
+ chat: chatId,
43
+ title: input.name ?? roomId,
44
+ status: 'active',
45
+ metadata: { protocol: 'matrix', roomId },
46
+ createdAt: new Date(now).toISOString(),
47
+ updatedAt: new Date(now).toISOString(),
48
+ });
49
+ await db.insert(models_1.matrixRoomResource).values({
50
+ id: this.roomResourceId(roomId),
51
+ matrixRoomId: roomId,
52
+ canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : null,
53
+ name: input.name ?? null,
54
+ topic: input.topic ?? null,
55
+ creator: context.userId,
56
+ visibility: input.visibility === 'public' ? models_1.MatrixRoomVisibility.PUBLIC : models_1.MatrixRoomVisibility.PRIVATE,
57
+ roomVersion: String(input.creation_content?.room_version ?? '11'),
58
+ federate: input.creation_content?.['m.federate'] === true,
59
+ chat: chatId,
60
+ members: [context.userId],
61
+ metadata: {
62
+ preset: input.preset,
63
+ is_direct: input.is_direct,
64
+ invite: input.invite ?? [],
65
+ },
66
+ createdAt: new Date(now).toISOString(),
67
+ updatedAt: new Date(now).toISOString(),
68
+ });
69
+ await this.appendEvent(db, {
70
+ roomId,
71
+ type: 'm.room.create',
72
+ sender,
73
+ originServerTs: now,
74
+ stateKey: '',
75
+ content: {
76
+ creator: sender,
77
+ room_version: String(input.creation_content?.room_version ?? '11'),
78
+ type: input.creation_content?.type,
79
+ 'm.federate': input.creation_content?.['m.federate'] === true,
80
+ },
81
+ }, context);
82
+ await this.appendEvent(db, {
83
+ roomId,
84
+ type: 'm.room.member',
85
+ sender,
86
+ originServerTs: now + 1,
87
+ stateKey: sender,
88
+ content: {
89
+ membership: 'join',
90
+ displayname: this.displayNameFromUserId(sender),
91
+ },
92
+ }, context);
93
+ if (input.name) {
94
+ await this.appendEvent(db, {
95
+ roomId,
96
+ type: 'm.room.name',
97
+ sender,
98
+ originServerTs: now + 2,
99
+ stateKey: '',
100
+ content: { name: input.name },
101
+ }, context);
102
+ }
103
+ if (input.topic) {
104
+ await this.appendEvent(db, {
105
+ roomId,
106
+ type: 'm.room.topic',
107
+ sender,
108
+ originServerTs: now + 3,
109
+ stateKey: '',
110
+ content: { topic: input.topic },
111
+ }, context);
112
+ }
113
+ for (const state of input.initial_state ?? []) {
114
+ await this.appendEvent(db, {
115
+ roomId,
116
+ type: state.type,
117
+ sender,
118
+ originServerTs: Date.now(),
119
+ stateKey: state.state_key ?? '',
120
+ content: state.content ?? {},
121
+ }, context);
122
+ }
123
+ return {
124
+ roomId,
125
+ name: input.name,
126
+ topic: input.topic,
127
+ creator: sender,
128
+ createdAt: now,
129
+ };
130
+ }
131
+ async sendEvent(roomId, eventType, txnId, content, context) {
132
+ const db = await this.getDb(context);
133
+ await this.ensureRoomExists(db, roomId);
134
+ await this.ensureMatrixAccount(db, context);
135
+ const existing = await this.findEventByTxnId(db, roomId, txnId);
136
+ if (existing) {
137
+ return existing;
138
+ }
139
+ const sender = this.getMatrixUserId(context);
140
+ const event = await this.appendEvent(db, {
141
+ roomId,
142
+ type: eventType,
143
+ sender,
144
+ txnId,
145
+ originServerTs: Date.now(),
146
+ content,
147
+ }, context);
148
+ if (eventType === 'm.room.message') {
149
+ await db.insert(models_1.messageResource).values({
150
+ id: this.messageResourceIdFromEvent(roomId, event.eventId, event.originServerTs),
151
+ commandKind: 'chat',
152
+ surfaceId: this.surfaceIdFromRoomId(roomId),
153
+ chat: this.chatResourceIdFromRoomId(roomId),
154
+ thread: this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(roomId), context),
155
+ maker: context.userId,
156
+ role: models_1.MessageRole.USER,
157
+ content: typeof content.body === 'string' ? content.body : JSON.stringify(content),
158
+ status: models_1.MessageStatus.SENT,
159
+ metadata: {
160
+ protocol: 'matrix',
161
+ roomId,
162
+ eventId: event.eventId,
163
+ eventType,
164
+ msgtype: content.msgtype,
165
+ },
166
+ createdAt: new Date(event.originServerTs).toISOString(),
167
+ });
168
+ }
169
+ return event;
170
+ }
171
+ async sync(context, options = {}) {
172
+ const db = await this.getDb(context);
173
+ const rooms = await this.listRooms(db);
174
+ const sinceTs = this.parseSyncToken(options.since);
175
+ const limit = options.limit && options.limit > 0 ? options.limit : 50;
176
+ const join = {};
177
+ for (const room of rooms) {
178
+ const events = await this.listEvents(db, room.roomId, {
179
+ sinceTs,
180
+ limit,
181
+ });
182
+ join[room.roomId] = {
183
+ state: {
184
+ events: events.filter((event) => event.stateKey !== undefined).map((event) => this.toClientEvent(event)),
185
+ },
186
+ timeline: {
187
+ events: events.map((event) => this.toClientEvent(event)),
188
+ limited: false,
189
+ },
190
+ };
191
+ }
192
+ return {
193
+ next_batch: this.encodeSyncToken(Date.now()),
194
+ rooms: { join },
195
+ };
196
+ }
197
+ async listMessages(roomId, context, options = {}) {
198
+ const db = await this.getDb(context);
199
+ await this.ensureRoomExists(db, roomId);
200
+ const limit = options.limit && options.limit > 0 ? options.limit : 50;
201
+ const fromTs = this.parseSyncToken(options.from);
202
+ const forward = options.dir === 'f';
203
+ const events = await this.listEvents(db, roomId, {
204
+ sinceTs: forward && fromTs > 0 ? fromTs : undefined,
205
+ beforeOrAtTs: !forward && fromTs > 0 ? fromTs : undefined,
206
+ limit,
207
+ newestFirst: !forward,
208
+ });
209
+ const chunk = events.slice(0, limit).map((event) => this.toClientEvent(event));
210
+ return {
211
+ chunk,
212
+ start: options.from,
213
+ end: this.encodeSyncToken(chunk.length ? chunk[chunk.length - 1].origin_server_ts : Date.now()),
214
+ };
215
+ }
216
+ async getEvent(roomId, eventId, context) {
217
+ const db = await this.getDb(context);
218
+ const event = await this.findEventById(db, roomId, eventId);
219
+ if (!event) {
220
+ throw new Error(`Matrix event not found: ${eventId}`);
221
+ }
222
+ return this.toClientEvent(event);
223
+ }
224
+ async getState(roomId, eventType, stateKey, context) {
225
+ const db = await this.getDb(context);
226
+ const event = await this.findLatestStateEvent(db, roomId, eventType, stateKey);
227
+ if (!event) {
228
+ throw new Error(`Matrix state not found: ${eventType}/${stateKey}`);
229
+ }
230
+ return event.content;
231
+ }
232
+ async getDb(context) {
233
+ if (context._matrixDb) {
234
+ return context._matrixDb;
235
+ }
236
+ const auth = context.auth;
237
+ if (!auth || !(0, AuthContext_1.isSolidAuth)(auth) || !auth.accessToken || !auth.webId) {
238
+ throw new Error('Matrix API requires Solid access-token authentication');
239
+ }
240
+ const db = (0, drizzle_solid_1.drizzle)({
241
+ fetch: this.createAccessTokenFetch(auth.accessToken, auth.tokenType),
242
+ info: { webId: auth.webId, isLoggedIn: true },
243
+ }, { schema });
244
+ await db.init(models_1.matrixAccountResource, models_1.matrixRoomResource, models_1.matrixEventResource, models_1.chatResource, models_1.threadResource, models_1.messageResource);
245
+ context._matrixDb = db;
246
+ return db;
247
+ }
248
+ createAccessTokenFetch(accessToken, tokenType) {
249
+ const scheme = tokenType ?? 'Bearer';
250
+ return async (input, init) => {
251
+ const headers = new Headers(init?.headers);
252
+ if (!headers.has('Authorization')) {
253
+ headers.set('Authorization', `${scheme} ${accessToken}`);
254
+ }
255
+ return fetch(input, { ...init, headers });
256
+ };
257
+ }
258
+ async ensureMatrixAccount(db, context) {
259
+ const matrixUserId = this.getMatrixUserId(context);
260
+ const accountId = this.accountResourceId(matrixUserId);
261
+ const existing = await db.findById(models_1.matrixAccountResource, accountId);
262
+ if (existing) {
263
+ return;
264
+ }
265
+ await db.insert(models_1.matrixAccountResource).values({
266
+ id: accountId,
267
+ matrixUserId,
268
+ webId: context.userId,
269
+ displayName: this.displayNameFromUserId(matrixUserId),
270
+ metadata: { serverName: this.getServerName(context) },
271
+ createdAt: new Date().toISOString(),
272
+ updatedAt: new Date().toISOString(),
273
+ });
274
+ }
275
+ async ensureRoomExists(db, roomId) {
276
+ const room = await db.findById(models_1.matrixRoomResource, this.roomResourceId(roomId));
277
+ if (!room) {
278
+ throw new Error(`Matrix room not found: ${roomId}`);
279
+ }
280
+ }
281
+ async appendEvent(db, input, context) {
282
+ const eventId = this.generateEventId(context);
283
+ const depth = await this.nextEventDepth(db, input.roomId);
284
+ const record = {
285
+ id: this.eventResourceId(input.roomId, eventId, input.originServerTs),
286
+ matrixEventId: eventId,
287
+ matrixRoomId: input.roomId,
288
+ room: this.roomResourceId(input.roomId),
289
+ type: input.type,
290
+ sender: input.sender,
291
+ senderWebId: context.userId,
292
+ originServerTs: input.originServerTs,
293
+ depth,
294
+ txnId: input.txnId ?? null,
295
+ stateKey: input.stateKey ?? null,
296
+ content: input.content,
297
+ createdAt: new Date(input.originServerTs).toISOString(),
298
+ };
299
+ await db.insert(models_1.matrixEventResource).values(record);
300
+ return this.eventSourceToRecord(record);
301
+ }
302
+ async listRooms(db) {
303
+ const rooms = await db.select().from(models_1.matrixRoomResource);
304
+ return rooms.map((room) => ({
305
+ roomId: room.matrixRoomId ?? this.roomIdFromResourceId(room.id),
306
+ name: room.name ?? undefined,
307
+ topic: room.topic ?? undefined,
308
+ creator: room.creator ?? '',
309
+ createdAt: this.isoToMillis(room.createdAt) ?? 0,
310
+ }));
311
+ }
312
+ async listEvents(db, roomId, options = {}) {
313
+ const conditions = [
314
+ (0, drizzle_solid_1.eq)(models_1.matrixEventResource.matrixRoomId, roomId),
315
+ options.sinceTs !== undefined ? (0, drizzle_solid_1.gt)(models_1.matrixEventResource.originServerTs, options.sinceTs) : undefined,
316
+ options.beforeOrAtTs !== undefined ? (0, drizzle_solid_1.lte)(models_1.matrixEventResource.originServerTs, options.beforeOrAtTs) : undefined,
317
+ ];
318
+ let query = db.select().from(models_1.matrixEventResource).where((0, drizzle_solid_1.and)(...conditions));
319
+ query = options.newestFirst
320
+ ? query.orderBy((0, drizzle_solid_1.desc)(models_1.matrixEventResource.originServerTs))
321
+ : query.orderBy(models_1.matrixEventResource.originServerTs);
322
+ if (options.limit && options.limit > 0) {
323
+ query = query.limit(options.limit);
324
+ }
325
+ const events = await query;
326
+ return events.map((event) => this.eventSourceToRecord(event));
327
+ }
328
+ async findEventByTxnId(db, roomId, txnId) {
329
+ const records = await db.select()
330
+ .from(models_1.matrixEventResource)
331
+ .where((0, drizzle_solid_1.and)((0, drizzle_solid_1.eq)(models_1.matrixEventResource.matrixRoomId, roomId), (0, drizzle_solid_1.eq)(models_1.matrixEventResource.txnId, txnId)));
332
+ const record = records[0];
333
+ return record ? this.eventSourceToRecord(record) : undefined;
334
+ }
335
+ async findEventById(db, roomId, eventId) {
336
+ const records = await db.select()
337
+ .from(models_1.matrixEventResource)
338
+ .where((0, drizzle_solid_1.and)((0, drizzle_solid_1.eq)(models_1.matrixEventResource.matrixRoomId, roomId), (0, drizzle_solid_1.eq)(models_1.matrixEventResource.matrixEventId, eventId)))
339
+ .limit(1);
340
+ const record = records[0];
341
+ return record ? this.eventSourceToRecord(record) : undefined;
342
+ }
343
+ async nextEventDepth(db, roomId) {
344
+ const records = await db.select()
345
+ .from(models_1.matrixEventResource)
346
+ .where((0, drizzle_solid_1.eq)(models_1.matrixEventResource.matrixRoomId, roomId))
347
+ .orderBy((0, drizzle_solid_1.desc)(models_1.matrixEventResource.depth))
348
+ .limit(1);
349
+ return Number(records[0]?.depth ?? 0) + 1;
350
+ }
351
+ async findLatestStateEvent(db, roomId, eventType, stateKey) {
352
+ const records = await db.select()
353
+ .from(models_1.matrixEventResource)
354
+ .where((0, drizzle_solid_1.and)((0, drizzle_solid_1.eq)(models_1.matrixEventResource.matrixRoomId, roomId), (0, drizzle_solid_1.eq)(models_1.matrixEventResource.type, eventType), (0, drizzle_solid_1.eq)(models_1.matrixEventResource.stateKey, stateKey)))
355
+ .orderBy((0, drizzle_solid_1.desc)(models_1.matrixEventResource.originServerTs))
356
+ .limit(1);
357
+ const record = records[0];
358
+ return record ? this.eventSourceToRecord(record) : undefined;
359
+ }
360
+ eventSourceToRecord(source) {
361
+ return {
362
+ eventId: source.matrixEventId ?? this.eventIdFromResourceId(source.id),
363
+ roomId: source.matrixRoomId ?? '',
364
+ type: source.type ?? 'm.room.message',
365
+ sender: source.sender ?? '',
366
+ senderWebId: source.senderWebId ?? undefined,
367
+ originServerTs: Number(source.originServerTs ?? this.isoToMillis(source.createdAt) ?? Date.now()),
368
+ content: this.parseJsonObject(source.content) ?? {},
369
+ stateKey: source.stateKey ?? undefined,
370
+ unsigned: this.parseJsonObject(source.unsigned),
371
+ };
372
+ }
373
+ toClientEvent(event) {
374
+ return {
375
+ event_id: event.eventId,
376
+ room_id: event.roomId,
377
+ type: event.type,
378
+ sender: event.sender,
379
+ origin_server_ts: event.originServerTs,
380
+ content: event.content,
381
+ ...(event.stateKey !== undefined ? { state_key: event.stateKey } : {}),
382
+ ...(event.unsigned ? { unsigned: event.unsigned } : {}),
383
+ };
384
+ }
385
+ parseJsonObject(value) {
386
+ if (!value) {
387
+ return undefined;
388
+ }
389
+ if (typeof value === 'object' && !Array.isArray(value)) {
390
+ return value;
391
+ }
392
+ if (typeof value !== 'string') {
393
+ return undefined;
394
+ }
395
+ try {
396
+ const parsed = JSON.parse(value);
397
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
398
+ ? parsed
399
+ : undefined;
400
+ }
401
+ catch {
402
+ return undefined;
403
+ }
404
+ }
405
+ getMatrixUserId(context) {
406
+ const serverName = this.getServerName(context);
407
+ const localpart = this.localpartFromUserId(context.userId);
408
+ return `@${localpart}:${serverName}`;
409
+ }
410
+ getServerName(context) {
411
+ if (this.serverName) {
412
+ return this.serverName;
413
+ }
414
+ try {
415
+ return new URL(context.userId).host || 'localhost';
416
+ }
417
+ catch {
418
+ return 'localhost';
419
+ }
420
+ }
421
+ localpartFromUserId(userId) {
422
+ try {
423
+ const url = new URL(userId);
424
+ const withoutHash = `${url.pathname}${url.hash}`.replace(/^\/+/, '');
425
+ return this.slug(withoutHash || url.host);
426
+ }
427
+ catch {
428
+ return this.slug(userId);
429
+ }
430
+ }
431
+ displayNameFromUserId(matrixUserId) {
432
+ return matrixUserId.replace(/^@/, '').split(':')[0] || matrixUserId;
433
+ }
434
+ generateRoomId(context) {
435
+ return `!${this.randomId(24)}:${this.getServerName(context)}`;
436
+ }
437
+ generateEventId(context) {
438
+ return `$${this.randomId(24)}:${this.getServerName(context)}`;
439
+ }
440
+ randomId(size) {
441
+ return (0, node_crypto_1.randomBytes)(size).toString('base64url');
442
+ }
443
+ slug(value) {
444
+ return value.toLowerCase().replace(/[^a-z0-9._=-]+/g, '_').replace(/^_+|_+$/g, '') || 'user';
445
+ }
446
+ resourceSlot(value) {
447
+ return encodeURIComponent(value)
448
+ .replace(/[!'()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`)
449
+ .replace(/%/g, '~');
450
+ }
451
+ surfaceIdFromRoomId(roomId) {
452
+ return `matrix-${(0, node_crypto_1.createHash)('sha256').update(roomId).digest('hex').slice(0, 16)}`;
453
+ }
454
+ roomResourceId(roomId) {
455
+ return `rooms/${this.resourceSlot(roomId)}/index.ttl#this`;
456
+ }
457
+ chatResourceIdFromRoomId(roomId) {
458
+ return `${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;
459
+ }
460
+ threadResourceIdFromRoomId(roomId) {
461
+ return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#thread`;
462
+ }
463
+ messageResourceIdFromEvent(roomId, eventId, ts) {
464
+ const { yyyy, MM, dd } = this.dateParts(ts);
465
+ return `chat/${this.surfaceIdFromRoomId(roomId)}/${yyyy}/${MM}/${dd}/messages.ttl#${this.slug(eventId)}`;
466
+ }
467
+ accountResourceId(matrixUserId) {
468
+ return `accounts/${this.resourceSlot(matrixUserId)}.ttl#this`;
469
+ }
470
+ eventResourceId(roomId, eventId, ts) {
471
+ const { yyyy, MM, dd } = this.dateParts(ts);
472
+ return `rooms/${this.resourceSlot(roomId)}/${yyyy}/${MM}/${dd}/events.ttl#${this.resourceSlot(eventId)}`;
473
+ }
474
+ roomIdFromResourceId(id) {
475
+ const match = id.match(/^rooms\/([^/]+)\/index\.ttl#this$/);
476
+ return match ? decodeURIComponent(match[1].replace(/~/g, '%')) : id;
477
+ }
478
+ eventIdFromResourceId(id) {
479
+ const hash = id.lastIndexOf('#');
480
+ if (hash < 0) {
481
+ return id;
482
+ }
483
+ return decodeURIComponent(id.slice(hash + 1).replace(/~/g, '%'));
484
+ }
485
+ resolveDataResourceUriFromId(resourceId, context) {
486
+ const podBaseUrl = this.derivePodBaseUrl((0, AuthContext_1.getWebId)(context.auth) ?? context.userId);
487
+ if (!podBaseUrl) {
488
+ return resourceId;
489
+ }
490
+ return `${podBaseUrl.replace(/\/$/, '')}/.data/${resourceId}`;
491
+ }
492
+ derivePodBaseUrl(webId) {
493
+ if (!webId) {
494
+ return undefined;
495
+ }
496
+ try {
497
+ const url = new URL(webId);
498
+ url.hash = '';
499
+ url.search = '';
500
+ const normalizedPath = url.pathname.replace(/\/+$/, '');
501
+ if (!normalizedPath.endsWith('/profile/card')) {
502
+ return url.origin;
503
+ }
504
+ url.pathname = normalizedPath.slice(0, -'/profile/card'.length) || '/';
505
+ return url.toString().replace(/\/$/, '');
506
+ }
507
+ catch {
508
+ return undefined;
509
+ }
510
+ }
511
+ dateParts(value) {
512
+ const date = new Date(value);
513
+ return {
514
+ yyyy: String(date.getUTCFullYear()),
515
+ MM: String(date.getUTCMonth() + 1).padStart(2, '0'),
516
+ dd: String(date.getUTCDate()).padStart(2, '0'),
517
+ };
518
+ }
519
+ isoToMillis(value) {
520
+ if (!value) {
521
+ return undefined;
522
+ }
523
+ const date = value instanceof Date ? value : new Date(value);
524
+ const time = date.getTime();
525
+ return Number.isFinite(time) ? time : undefined;
526
+ }
527
+ encodeSyncToken(ts) {
528
+ return `s${Math.max(0, Math.floor(ts))}`;
529
+ }
530
+ parseSyncToken(token) {
531
+ if (!token) {
532
+ return 0;
533
+ }
534
+ const parsed = Number(token.replace(/^s/, ''));
535
+ return Number.isFinite(parsed) ? parsed : 0;
536
+ }
537
+ }
538
+ exports.PodMatrixStore = PodMatrixStore;
539
+ //# sourceMappingURL=PodMatrixStore.js.map
@@ -0,0 +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 { and, desc, drizzle, eq, gt, lte } from '@undefineds.co/drizzle-solid';\nimport {\n chatResource,\n matrixAccountResource,\n matrixEventResource,\n matrixRoomResource,\n messageResource,\n MatrixRoomVisibility,\n MessageRole,\n MessageStatus,\n threadResource,\n} from '@undefineds.co/models';\nimport { getWebId, isSolidAuth, type AuthContext } from '../auth/AuthContext';\nimport type {\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n\nconst schema = {\n matrixAccount: matrixAccountResource,\n matrixRoom: matrixRoomResource,\n matrixEvent: matrixEventResource,\n chat: chatResource,\n thread: threadResource,\n message: messageResource,\n};\n\nexport interface PodMatrixStoreOptions {\n serverName?: string;\n}\n\ntype Db = any;\ntype JsonObjectSource = string | Record<string, unknown> | null | undefined;\n\ninterface MatrixRoomSource {\n id: string;\n matrixRoomId?: string | null;\n name?: string | null;\n topic?: string | null;\n creator?: string | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixEventSource {\n id: string;\n matrixEventId?: string | null;\n matrixRoomId?: string | null;\n type?: string | null;\n sender?: string | null;\n senderWebId?: string | null;\n originServerTs?: number | null;\n depth?: number | null;\n content?: JsonObjectSource;\n stateKey?: string | null;\n unsigned?: JsonObjectSource;\n createdAt?: string | Date | null;\n}\n\nexport class PodMatrixStore {\n private readonly serverName?: string;\n\n public constructor(options: PodMatrixStoreOptions) {\n this.serverName = options.serverName;\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\n await this.ensureMatrixAccount(db, context);\n await db.insert(chatResource).values({\n id: chatId,\n title: input.name ?? roomId,\n description: input.topic ?? null,\n author: context.userId,\n status: 'active',\n metadata: { protocol: 'matrix', roomId },\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n await db.insert(threadResource).values({\n id: threadId,\n commandKind: 'chat',\n surfaceId: this.surfaceIdFromRoomId(roomId),\n chat: chatId,\n title: input.name ?? roomId,\n status: 'active',\n metadata: { protocol: 'matrix', roomId },\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n await db.insert(matrixRoomResource).values({\n id: this.roomResourceId(roomId),\n matrixRoomId: roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : null,\n name: input.name ?? null,\n topic: input.topic ?? null,\n creator: context.userId,\n visibility: input.visibility === 'public' ? MatrixRoomVisibility.PUBLIC : MatrixRoomVisibility.PRIVATE,\n roomVersion: String(input.creation_content?.room_version ?? '11'),\n federate: input.creation_content?.['m.federate'] === true,\n chat: chatId,\n members: [context.userId],\n metadata: {\n preset: input.preset,\n is_direct: input.is_direct,\n invite: input.invite ?? [],\n },\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n\n await this.appendEvent(db, {\n roomId,\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 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 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 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 type: state.type,\n sender,\n originServerTs: Date.now(),\n stateKey: state.state_key ?? '',\n content: state.content ?? {},\n }, context);\n }\n\n return {\n roomId,\n name: input.name,\n topic: input.topic,\n creator: sender,\n createdAt: now,\n };\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 await this.ensureMatrixAccount(db, context);\n\n const existing = await this.findEventByTxnId(db, roomId, txnId);\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 if (eventType === 'm.room.message') {\n await db.insert(messageResource).values({\n id: this.messageResourceIdFromEvent(roomId, event.eventId, event.originServerTs),\n commandKind: 'chat',\n surfaceId: this.surfaceIdFromRoomId(roomId),\n chat: this.chatResourceIdFromRoomId(roomId),\n thread: this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(roomId), context),\n maker: context.userId,\n role: MessageRole.USER,\n content: typeof content.body === 'string' ? content.body : JSON.stringify(content),\n status: MessageStatus.SENT,\n metadata: {\n protocol: 'matrix',\n roomId,\n eventId: event.eventId,\n eventType,\n msgtype: content.msgtype,\n },\n createdAt: new Date(event.originServerTs).toISOString(),\n });\n }\n\n return event;\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.listRooms(db);\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, {\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 };\n }\n\n return {\n next_batch: this.encodeSyncToken(Date.now()),\n rooms: { join },\n };\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, {\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);\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);\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 matrixAccountResource,\n matrixRoomResource,\n matrixEventResource,\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 ensureMatrixAccount(db: Db, context: MatrixStoreContext): Promise<void> {\n const matrixUserId = this.getMatrixUserId(context);\n const accountId = this.accountResourceId(matrixUserId);\n const existing = await db.findById(matrixAccountResource, accountId);\n if (existing) {\n return;\n }\n await db.insert(matrixAccountResource).values({\n id: accountId,\n matrixUserId,\n webId: context.userId,\n displayName: this.displayNameFromUserId(matrixUserId),\n metadata: { serverName: this.getServerName(context) },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n\n private async ensureRoomExists(db: Db, roomId: string): Promise<void> {\n const room = await db.findById(matrixRoomResource, this.roomResourceId(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 },\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const eventId = this.generateEventId(context);\n const depth = await this.nextEventDepth(db, input.roomId);\n const record = {\n id: this.eventResourceId(input.roomId, eventId, input.originServerTs),\n matrixEventId: eventId,\n matrixRoomId: input.roomId,\n room: this.roomResourceId(input.roomId),\n type: input.type,\n sender: input.sender,\n senderWebId: context.userId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? null,\n stateKey: input.stateKey ?? null,\n content: input.content,\n createdAt: new Date(input.originServerTs).toISOString(),\n };\n await db.insert(matrixEventResource).values(record);\n return this.eventSourceToRecord(record);\n }\n\n private async listRooms(db: Db): Promise<MatrixRoomRecord[]> {\n const rooms = await db.select().from(matrixRoomResource) as MatrixRoomSource[];\n return rooms.map((room) => ({\n roomId: room.matrixRoomId ?? this.roomIdFromResourceId(room.id),\n name: room.name ?? undefined,\n topic: room.topic ?? undefined,\n creator: room.creator ?? '',\n createdAt: this.isoToMillis(room.createdAt) ?? 0,\n }));\n }\n\n private async listEvents(\n db: Db,\n roomId: string,\n options: {\n sinceTs?: number;\n beforeOrAtTs?: number;\n limit?: number;\n newestFirst?: boolean;\n } = {},\n ): Promise<MatrixEventRecord[]> {\n const conditions = [\n eq(matrixEventResource.matrixRoomId, roomId),\n options.sinceTs !== undefined ? gt(matrixEventResource.originServerTs, options.sinceTs) : undefined,\n options.beforeOrAtTs !== undefined ? lte(matrixEventResource.originServerTs, options.beforeOrAtTs) : undefined,\n ];\n let query = db.select().from(matrixEventResource).where(and(...conditions));\n query = options.newestFirst\n ? query.orderBy(desc(matrixEventResource.originServerTs as any))\n : query.orderBy(matrixEventResource.originServerTs 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): Promise<MatrixEventRecord | undefined> {\n const records = await db.select()\n .from(matrixEventResource)\n .where(and(eq(matrixEventResource.matrixRoomId, roomId), eq(matrixEventResource.txnId, txnId))) as MatrixEventSource[];\n const record = records[0];\n return record ? this.eventSourceToRecord(record) : undefined;\n }\n\n private async findEventById(db: Db, roomId: string, eventId: string): Promise<MatrixEventRecord | undefined> {\n const records = await db.select()\n .from(matrixEventResource)\n .where(and(\n eq(matrixEventResource.matrixRoomId, roomId),\n eq(matrixEventResource.matrixEventId, eventId),\n ))\n .limit(1) as MatrixEventSource[];\n const record = records[0];\n return record ? this.eventSourceToRecord(record) : undefined;\n }\n\n private async nextEventDepth(db: Db, roomId: string): Promise<number> {\n const records = await db.select()\n .from(matrixEventResource)\n .where(eq(matrixEventResource.matrixRoomId, roomId))\n .orderBy(desc(matrixEventResource.depth as any))\n .limit(1) as MatrixEventSource[];\n return Number(records[0]?.depth ?? 0) + 1;\n }\n\n private async findLatestStateEvent(\n db: Db,\n roomId: string,\n eventType: string,\n stateKey: string,\n ): Promise<MatrixEventRecord | undefined> {\n const records = await db.select()\n .from(matrixEventResource)\n .where(and(\n eq(matrixEventResource.matrixRoomId, roomId),\n eq(matrixEventResource.type, eventType),\n eq(matrixEventResource.stateKey, stateKey),\n ))\n .orderBy(desc(matrixEventResource.originServerTs as any))\n .limit(1) as MatrixEventSource[];\n const record = records[0];\n return record ? this.eventSourceToRecord(record) : undefined;\n }\n\n private eventSourceToRecord(source: MatrixEventSource): MatrixEventRecord {\n return {\n eventId: source.matrixEventId ?? this.eventIdFromResourceId(source.id),\n roomId: source.matrixRoomId ?? '',\n type: source.type ?? 'm.room.message',\n sender: source.sender ?? '',\n senderWebId: source.senderWebId ?? undefined,\n originServerTs: Number(source.originServerTs ?? this.isoToMillis(source.createdAt) ?? Date.now()),\n content: this.parseJsonObject(source.content) ?? {},\n stateKey: source.stateKey ?? undefined,\n unsigned: this.parseJsonObject(source.unsigned),\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 getMatrixUserId(context: MatrixStoreContext): string {\n const serverName = this.getServerName(context);\n const localpart = this.localpartFromUserId(context.userId);\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.userId).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 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 resourceSlot(value: string): string {\n return encodeURIComponent(value)\n .replace(/[!'()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`)\n .replace(/%/g, '~');\n }\n\n private surfaceIdFromRoomId(roomId: string): string {\n return `matrix-${createHash('sha256').update(roomId).digest('hex').slice(0, 16)}`;\n }\n\n private roomResourceId(roomId: string): string {\n return `rooms/${this.resourceSlot(roomId)}/index.ttl#this`;\n }\n\n private chatResourceIdFromRoomId(roomId: string): string {\n return `${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 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 accountResourceId(matrixUserId: string): string {\n return `accounts/${this.resourceSlot(matrixUserId)}.ttl#this`;\n }\n\n private eventResourceId(roomId: string, eventId: string, ts: number): string {\n const { yyyy, MM, dd } = this.dateParts(ts);\n return `rooms/${this.resourceSlot(roomId)}/${yyyy}/${MM}/${dd}/events.ttl#${this.resourceSlot(eventId)}`;\n }\n\n private roomIdFromResourceId(id: string): string {\n const match = id.match(/^rooms\\/([^/]+)\\/index\\.ttl#this$/);\n return match ? decodeURIComponent(match[1].replace(/~/g, '%')) : id;\n }\n\n private eventIdFromResourceId(id: string): string {\n const hash = id.lastIndexOf('#');\n if (hash < 0) {\n return id;\n }\n return decodeURIComponent(id.slice(hash + 1).replace(/~/g, '%'));\n }\n\n private resolveDataResourceUriFromId(resourceId: string, context: MatrixStoreContext): string {\n const podBaseUrl = this.derivePodBaseUrl(getWebId(context.auth as AuthContext) ?? context.userId);\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"]}
@@ -0,0 +1,2 @@
1
+ export { PodMatrixStore, type PodMatrixStoreOptions } from './PodMatrixStore';
2
+ export type { MatrixClientEvent, MatrixCreateRoomRequest, MatrixEventRecord, MatrixRoomRecord, MatrixSendEventRequest, MatrixStore, MatrixStoreContext, MatrixSyncResponse, } from './types';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PodMatrixStore = void 0;
4
+ var PodMatrixStore_1 = require("./PodMatrixStore");
5
+ Object.defineProperty(exports, "PodMatrixStore", { enumerable: true, get: function () { return PodMatrixStore_1.PodMatrixStore; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/matrix/index.ts"],"names":[],"mappings":";;;AAAA,mDAA8E;AAArE,gHAAA,cAAc,OAAA","sourcesContent":["export { PodMatrixStore, type PodMatrixStoreOptions } from './PodMatrixStore';\nexport type {\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStore,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n"]}