@may-db/core 0.1.0 → 0.1.2

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.
Files changed (100) hide show
  1. package/README.md +210 -0
  2. package/dist/IndexRuntime.d.ts +60 -0
  3. package/dist/IndexRuntime.d.ts.map +1 -0
  4. package/dist/IndexRuntime.js +340 -0
  5. package/dist/IndexRuntime.js.map +1 -0
  6. package/dist/MayDb.d.ts +45 -9
  7. package/dist/MayDb.d.ts.map +1 -1
  8. package/dist/MayDb.js +251 -85
  9. package/dist/MayDb.js.map +1 -1
  10. package/dist/Room.d.ts +40 -57
  11. package/dist/Room.d.ts.map +1 -1
  12. package/dist/Room.js +212 -232
  13. package/dist/Room.js.map +1 -1
  14. package/dist/RuntimeIndexHandle.d.ts +29 -0
  15. package/dist/RuntimeIndexHandle.d.ts.map +1 -0
  16. package/dist/RuntimeIndexHandle.js +48 -0
  17. package/dist/RuntimeIndexHandle.js.map +1 -0
  18. package/dist/authStorage.d.ts +7 -7
  19. package/dist/authStorage.d.ts.map +1 -1
  20. package/dist/authStorage.js +8 -8
  21. package/dist/authStorage.js.map +1 -1
  22. package/dist/errors.d.ts +12 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +15 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +4 -4
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +3 -3
  29. package/dist/index.js.map +1 -1
  30. package/dist/indexing/collaborativeSync.d.ts +25 -0
  31. package/dist/indexing/collaborativeSync.d.ts.map +1 -0
  32. package/dist/indexing/collaborativeSync.js +56 -0
  33. package/dist/indexing/collaborativeSync.js.map +1 -0
  34. package/dist/indexing/descriptor.d.ts +6 -0
  35. package/dist/indexing/descriptor.d.ts.map +1 -0
  36. package/dist/indexing/descriptor.js +2 -0
  37. package/dist/indexing/descriptor.js.map +1 -0
  38. package/dist/indexing/errors.d.ts +9 -0
  39. package/dist/indexing/errors.d.ts.map +1 -0
  40. package/dist/indexing/errors.js +11 -0
  41. package/dist/indexing/errors.js.map +1 -0
  42. package/dist/indexing/handle.d.ts +29 -0
  43. package/dist/indexing/handle.d.ts.map +1 -0
  44. package/dist/indexing/handle.js +48 -0
  45. package/dist/indexing/handle.js.map +1 -0
  46. package/dist/indexing/indexRoomStore.d.ts +18 -0
  47. package/dist/indexing/indexRoomStore.d.ts.map +1 -0
  48. package/dist/indexing/indexRoomStore.js +71 -0
  49. package/dist/indexing/indexRoomStore.js.map +1 -0
  50. package/dist/indexing/roomRegistry.d.ts +26 -0
  51. package/dist/indexing/roomRegistry.d.ts.map +1 -0
  52. package/dist/indexing/roomRegistry.js +125 -0
  53. package/dist/indexing/roomRegistry.js.map +1 -0
  54. package/dist/indexing/rows.d.ts +8 -0
  55. package/dist/indexing/rows.d.ts.map +1 -0
  56. package/dist/indexing/rows.js +86 -0
  57. package/dist/indexing/rows.js.map +1 -0
  58. package/dist/indexing/runtime.d.ts +61 -0
  59. package/dist/indexing/runtime.d.ts.map +1 -0
  60. package/dist/indexing/runtime.js +378 -0
  61. package/dist/indexing/runtime.js.map +1 -0
  62. package/dist/indexing.d.ts +93 -0
  63. package/dist/indexing.d.ts.map +1 -0
  64. package/dist/indexing.js +394 -0
  65. package/dist/indexing.js.map +1 -0
  66. package/dist/indexingErrors.d.ts +9 -0
  67. package/dist/indexingErrors.d.ts.map +1 -0
  68. package/dist/indexingErrors.js +11 -0
  69. package/dist/indexingErrors.js.map +1 -0
  70. package/dist/indexingRoomStore.d.ts +26 -0
  71. package/dist/indexingRoomStore.d.ts.map +1 -0
  72. package/dist/indexingRoomStore.js +125 -0
  73. package/dist/indexingRoomStore.js.map +1 -0
  74. package/dist/indexingRows.d.ts +8 -0
  75. package/dist/indexingRows.d.ts.map +1 -0
  76. package/dist/indexingRows.js +114 -0
  77. package/dist/indexingRows.js.map +1 -0
  78. package/dist/indexingTypes.d.ts +9 -0
  79. package/dist/indexingTypes.d.ts.map +1 -0
  80. package/dist/indexingTypes.js +2 -0
  81. package/dist/indexingTypes.js.map +1 -0
  82. package/dist/loginFlow.d.ts +10 -3
  83. package/dist/loginFlow.d.ts.map +1 -1
  84. package/dist/loginFlow.js +19 -14
  85. package/dist/loginFlow.js.map +1 -1
  86. package/dist/matrix-crdt-shim.d.ts +43 -0
  87. package/dist/matrix-crdt-shim.d.ts.map +1 -0
  88. package/dist/matrix-crdt-shim.js +2 -0
  89. package/dist/matrix-crdt-shim.js.map +1 -0
  90. package/dist/roomMetadata.d.ts +3 -0
  91. package/dist/roomMetadata.d.ts.map +1 -0
  92. package/dist/roomMetadata.js +3 -0
  93. package/dist/roomMetadata.js.map +1 -0
  94. package/dist/singletonRoom.d.ts.map +1 -1
  95. package/dist/singletonRoom.js +5 -36
  96. package/dist/singletonRoom.js.map +1 -1
  97. package/dist/types.d.ts +63 -13
  98. package/dist/types.d.ts.map +1 -1
  99. package/package.json +6 -5
  100. package/patches/matrix-crdt+0.2.1-alpha.1.patch +108 -0
@@ -0,0 +1,378 @@
1
+ import * as Y from "yjs";
2
+ import { Room } from "../Room";
3
+ import { ROOM_METADATA_TX_ORIGIN, ROOM_TYPE_TEXT_KEY } from "../roomMetadata";
4
+ import { IndexRoomStore } from "./indexRoomStore";
5
+ import { buildIndexItem, compareIndexItems, pageRows, readQueryRows, } from "./rows";
6
+ import { IndexCapacityError } from "./errors";
7
+ import { RuntimeIndexHandle } from "./handle";
8
+ import { CollaborativeIndexSync } from "./collaborativeSync";
9
+ const INDEX_ROWS_MAP_KEY = "rows";
10
+ const DEFAULT_ROOM_NAME = "Untitled";
11
+ const ROOM_NAME_EVENT_TYPE = "m.room.name";
12
+ export class IndexRuntime {
13
+ namespace;
14
+ matrixClient;
15
+ schema;
16
+ openRoom;
17
+ roomStore;
18
+ indexEntries;
19
+ // `roomDescriptors` caches resolved metadata; `trackedRooms` owns listener lifecycle.
20
+ roomDescriptors = new Map();
21
+ trackedRooms = new Map();
22
+ collaborativeSync;
23
+ handles = new Map();
24
+ roomTypesInIndexes = new Set();
25
+ roomWriteListenerSetupInFlight = new Map();
26
+ constructor(options) {
27
+ this.namespace = options.namespace;
28
+ this.matrixClient = options.matrixClient;
29
+ this.schema = options.schema;
30
+ this.openRoom = options.openRoom;
31
+ this.roomStore = new IndexRoomStore({
32
+ namespace: this.namespace,
33
+ matrixClient: this.matrixClient,
34
+ });
35
+ this.indexEntries = Object.entries(this.schema.indexes);
36
+ this.collaborativeSync = new CollaborativeIndexSync({
37
+ getOrCreateHandle: (indexName, indexRoomId) => this.getOrCreateHandle(indexName, indexRoomId),
38
+ upsertRoomToIndex: (handle, descriptor, room) => this.upsertRoomToIndex(handle, descriptor, room),
39
+ removeRoomFromIndex: (handle, roomId) => this.removeRoomFromIndex(handle, roomId),
40
+ });
41
+ this.validateSchemaIndexes();
42
+ }
43
+ // Public runtime API (used by MayDb and index handles)
44
+ hasIndexes() {
45
+ return this.indexEntries.length > 0;
46
+ }
47
+ isRoomTypeIndexed(roomType) {
48
+ return this.roomTypesInIndexes.has(roomType);
49
+ }
50
+ validateRoomType(roomType) {
51
+ if (!(roomType in this.schema.roomTypes)) {
52
+ throw new Error(`Unknown roomType "${roomType}"`);
53
+ }
54
+ }
55
+ openIndex(options) {
56
+ const indexDefinition = this.getIndexDefinition(options.indexName);
57
+ const indexRoomId = options.indexRoomId ?? null;
58
+ this.validateIndexScopeOptions(options.indexName, indexDefinition, indexRoomId);
59
+ return this.getOrCreateHandle(options.indexName, indexRoomId);
60
+ }
61
+ dispose() {
62
+ for (const tracked of this.trackedRooms.values()) {
63
+ if (tracked.transactionListener) {
64
+ tracked.room.doc.off("afterTransaction", tracked.transactionListener);
65
+ }
66
+ }
67
+ this.trackedRooms.clear();
68
+ this.collaborativeSync.clear();
69
+ this.roomWriteListenerSetupInFlight.clear();
70
+ for (const handle of this.handles.values()) {
71
+ if (handle.roomObserverCleanup) {
72
+ handle.roomObserverCleanup();
73
+ }
74
+ handle.activeCount = 0;
75
+ }
76
+ }
77
+ trackRoom(room) {
78
+ if (!this.trackedRooms.has(room.id)) {
79
+ this.trackedRooms.set(room.id, {
80
+ room,
81
+ transactionListener: null,
82
+ });
83
+ }
84
+ void this.ensureRoomWriteListener(room.id);
85
+ }
86
+ async ensureRoomIndexed(options) {
87
+ // Called when the app explicitly acquires a room; await guarantees first index sync is done.
88
+ const roomType = await this.resolveRoomType(options.roomId);
89
+ if (!roomType)
90
+ return;
91
+ const descriptor = {
92
+ roomId: options.roomId,
93
+ roomName: options.roomNameHint,
94
+ roomType,
95
+ };
96
+ this.roomDescriptors.set(options.roomId, descriptor);
97
+ this.trackRoom(this.openRoom(options.roomId));
98
+ await this.ensureRoomWriteListener(options.roomId);
99
+ }
100
+ onHandleActivated(handle) {
101
+ void handle.ensureReady().catch((error) => {
102
+ console.error(`Failed to initialize index "${handle.indexName}"`, error);
103
+ });
104
+ }
105
+ onHandleDeactivated(handle) {
106
+ void handle;
107
+ // Index maintenance is no longer tied to active handles.
108
+ }
109
+ async ensureHandleReady(handle) {
110
+ if (handle.rowsMap && handle.indexRoom) {
111
+ return;
112
+ }
113
+ if (handle.readyPromise) {
114
+ return handle.readyPromise;
115
+ }
116
+ handle.readyPromise = this.initializeHandle(handle);
117
+ try {
118
+ await handle.readyPromise;
119
+ }
120
+ catch (error) {
121
+ handle.readyPromise = null;
122
+ throw error;
123
+ }
124
+ }
125
+ async queryHandlePage(handle, options) {
126
+ await this.ensureHandleReady(handle);
127
+ const rowsMap = handle.rowsMap;
128
+ if (!rowsMap) {
129
+ return { items: [], hasMore: false };
130
+ }
131
+ const rows = readQueryRows(rowsMap, options.where);
132
+ rows.sort((a, b) => compareIndexItems(a, b, options.orderBy));
133
+ return pageRows(rows, options.limit, options.after?.roomId ?? null);
134
+ }
135
+ // Handle lifecycle and validation helpers
136
+ validateSchemaIndexes() {
137
+ for (const [indexName, definition] of this.indexEntries) {
138
+ if (definition.maxEntries <= 0) {
139
+ throw new Error(`Index "${indexName}" maxEntries must be > 0`);
140
+ }
141
+ if (!(definition.defaultOrderBy.column in definition.columns)) {
142
+ throw new Error(`Index "${indexName}" defaultOrderBy column must be in columns`);
143
+ }
144
+ if (definition.scope === "collaborative" &&
145
+ typeof definition.resolveIndexRoomIds !== "function") {
146
+ throw new Error(`Index "${indexName}" is collaborative and must define resolveIndexRoomIds`);
147
+ }
148
+ if (definition.scope === "private" && definition.resolveIndexRoomIds) {
149
+ throw new Error(`Index "${indexName}" is private and must not define resolveIndexRoomIds`);
150
+ }
151
+ for (const roomType of definition.roomTypes) {
152
+ if (!(roomType in this.schema.roomTypes)) {
153
+ throw new Error(`Index "${indexName}" references unknown roomType "${roomType}"`);
154
+ }
155
+ this.roomTypesInIndexes.add(roomType);
156
+ }
157
+ }
158
+ }
159
+ getIndexDefinition(indexName) {
160
+ const definition = this.schema.indexes[indexName];
161
+ if (!definition) {
162
+ throw new Error(`Unknown index "${indexName}"`);
163
+ }
164
+ return definition;
165
+ }
166
+ validateIndexScopeOptions(indexName, definition, indexRoomId) {
167
+ if (definition.scope === "collaborative" && !indexRoomId) {
168
+ throw new Error(`Index "${indexName}" requires indexRoomId`);
169
+ }
170
+ if (definition.scope === "private" && indexRoomId) {
171
+ throw new Error(`Private index "${indexName}" must not set indexRoomId`);
172
+ }
173
+ }
174
+ getOrCreateHandle(indexName, indexRoomId) {
175
+ const key = this.handleKey(indexName, indexRoomId);
176
+ let handle = this.handles.get(key);
177
+ if (!handle) {
178
+ const definition = this.schema.indexes[indexName];
179
+ handle = new RuntimeIndexHandle({
180
+ runtime: this,
181
+ indexName,
182
+ indexRoomId,
183
+ definition,
184
+ });
185
+ this.handles.set(key, handle);
186
+ }
187
+ return handle;
188
+ }
189
+ async initializeHandle(handle) {
190
+ const roomId = await this.resolveHandleIndexRoomId(handle);
191
+ const room = this.openRoom(roomId);
192
+ this.trackRoom(room);
193
+ await room.ensureJoined();
194
+ await room.connect();
195
+ handle.indexRoom = room;
196
+ const rowsMap = room.doc.getMap(INDEX_ROWS_MAP_KEY);
197
+ handle.rowsMap = rowsMap;
198
+ if (handle.roomObserverCleanup) {
199
+ handle.roomObserverCleanup();
200
+ }
201
+ const observer = () => handle.notifyChange();
202
+ rowsMap.observe(observer);
203
+ handle.roomObserverCleanup = () => rowsMap.unobserve(observer);
204
+ handle.notifyChange();
205
+ }
206
+ // Room activity ingestion and index updates
207
+ async ensureRoomWriteListener(roomId) {
208
+ const tracked = this.trackedRooms.get(roomId);
209
+ if (!tracked || tracked.transactionListener)
210
+ return;
211
+ const existingSetup = this.roomWriteListenerSetupInFlight.get(roomId);
212
+ if (existingSetup) {
213
+ await existingSetup;
214
+ return;
215
+ }
216
+ // Single-flight prevents duplicate listeners during re-entrant setup.
217
+ const setupPromise = this.setupRoomWriteListener(roomId).finally(() => {
218
+ this.roomWriteListenerSetupInFlight.delete(roomId);
219
+ });
220
+ this.roomWriteListenerSetupInFlight.set(roomId, setupPromise);
221
+ await setupPromise;
222
+ }
223
+ async setupRoomWriteListener(roomId) {
224
+ const tracked = this.trackedRooms.get(roomId);
225
+ if (!tracked || tracked.transactionListener)
226
+ return;
227
+ const descriptor = await this.getRoomDescriptor(roomId);
228
+ if (!descriptor)
229
+ return;
230
+ if (!this.isRoomTypeIndexed(descriptor.roomType))
231
+ return;
232
+ const onTransaction = (tx) => {
233
+ if (!tx.local)
234
+ return;
235
+ if (tx.origin === ROOM_METADATA_TX_ORIGIN)
236
+ return;
237
+ void this.onLocalRoomWrite(roomId);
238
+ };
239
+ tracked.room.doc.on("afterTransaction", onTransaction);
240
+ tracked.transactionListener = onTransaction;
241
+ await this.syncRoomIntoIndexes(descriptor);
242
+ }
243
+ async onLocalRoomWrite(roomId) {
244
+ const descriptor = await this.getRoomDescriptor(roomId);
245
+ if (!descriptor)
246
+ return;
247
+ descriptor.roomName = await this.resolveRoomName(roomId, descriptor.roomName);
248
+ await this.syncRoomIntoIndexes(descriptor);
249
+ }
250
+ async syncRoomIntoIndexes(roomDescriptor) {
251
+ // Every ingest resolves once, then fans out to private and collaborative indexes.
252
+ const sourceRoom = this.openRoom(roomDescriptor.roomId);
253
+ for (const [indexName, definition] of this.indexEntries) {
254
+ await this.syncRoomIntoIndex({
255
+ indexName,
256
+ definition,
257
+ roomDescriptor,
258
+ sourceRoom,
259
+ });
260
+ }
261
+ }
262
+ async syncRoomIntoIndex(options) {
263
+ if (!options.definition.roomTypes.includes(options.roomDescriptor.roomType)) {
264
+ return;
265
+ }
266
+ if (options.definition.scope === "private") {
267
+ const handle = this.getOrCreateHandle(options.indexName, null);
268
+ await this.upsertRoomToIndex(handle, options.roomDescriptor, options.sourceRoom);
269
+ return;
270
+ }
271
+ await this.collaborativeSync.sync(options);
272
+ }
273
+ async removeRoomFromIndex(indexHandle, roomId) {
274
+ await this.ensureHandleReady(indexHandle);
275
+ indexHandle.rowsMap?.delete(roomId);
276
+ }
277
+ async upsertRoomToIndex(indexHandle, roomDescriptor, sourceRoom) {
278
+ if (indexHandle.paused) {
279
+ throw new IndexCapacityError({
280
+ indexName: indexHandle.indexName,
281
+ indexRoomId: indexHandle.indexRoomId,
282
+ });
283
+ }
284
+ await this.ensureHandleReady(indexHandle);
285
+ const rowsMap = indexHandle.rowsMap;
286
+ if (!rowsMap)
287
+ return;
288
+ const item = buildIndexItem(indexHandle.definition, roomDescriptor, sourceRoom.doc);
289
+ const encoded = JSON.stringify(item);
290
+ const alreadyPresent = rowsMap.has(roomDescriptor.roomId);
291
+ if (!alreadyPresent && rowsMap.size >= indexHandle.definition.maxEntries) {
292
+ indexHandle.paused = true;
293
+ throw new IndexCapacityError({
294
+ indexName: indexHandle.indexName,
295
+ indexRoomId: indexHandle.indexRoomId,
296
+ });
297
+ }
298
+ if (rowsMap.get(roomDescriptor.roomId) !== encoded) {
299
+ rowsMap.set(roomDescriptor.roomId, encoded);
300
+ }
301
+ }
302
+ async getRoomDescriptor(roomId) {
303
+ const existing = this.roomDescriptors.get(roomId);
304
+ if (existing)
305
+ return existing;
306
+ const descriptor = await this.readRoomDescriptor(roomId);
307
+ if (!descriptor)
308
+ return null;
309
+ this.roomDescriptors.set(roomId, descriptor);
310
+ return descriptor;
311
+ }
312
+ async readRoomDescriptor(roomId) {
313
+ const roomType = await this.resolveRoomType(roomId);
314
+ if (!roomType)
315
+ return null;
316
+ const roomName = await this.resolveRoomName(roomId, DEFAULT_ROOM_NAME);
317
+ return {
318
+ roomId,
319
+ roomName,
320
+ roomType,
321
+ };
322
+ }
323
+ async resolveRoomName(roomId, fallback) {
324
+ try {
325
+ const state = await this.matrixClient.roomState(roomId);
326
+ const nameEvent = state.find((event) => event.type === ROOM_NAME_EVENT_TYPE);
327
+ return typeof nameEvent?.content?.name === "string"
328
+ ? nameEvent.content.name
329
+ : fallback;
330
+ }
331
+ catch {
332
+ return fallback;
333
+ }
334
+ }
335
+ async resolveRoomType(roomId) {
336
+ const roomType = await this.readRoomTypeFromDocument(roomId);
337
+ if (!roomType)
338
+ return null;
339
+ if (!(roomType in this.schema.roomTypes))
340
+ return null;
341
+ return roomType;
342
+ }
343
+ normalizeRoomType(roomType) {
344
+ if (typeof roomType !== "string")
345
+ return null;
346
+ const normalized = roomType.trim();
347
+ return normalized.length > 0 ? normalized : null;
348
+ }
349
+ async readRoomTypeFromDocument(roomId) {
350
+ try {
351
+ const room = this.openRoom(roomId);
352
+ await room.ensureJoined();
353
+ await room.connect();
354
+ const roomType = room.doc.getText(ROOM_TYPE_TEXT_KEY).toString();
355
+ return this.normalizeRoomType(roomType);
356
+ }
357
+ catch {
358
+ return null;
359
+ }
360
+ }
361
+ async resolveHandleIndexRoomId(handle) {
362
+ if (handle.definition.scope === "private") {
363
+ return this.roomStore.resolveOrCreatePrivateIndexRoomId(handle.indexName);
364
+ }
365
+ const indexRoomId = handle.indexRoomId;
366
+ if (!indexRoomId) {
367
+ throw new Error(`Index "${handle.indexName}" requires indexRoomId`);
368
+ }
369
+ await this.roomStore.ensureJoined(indexRoomId);
370
+ return indexRoomId;
371
+ }
372
+ handleKey(indexName, indexRoomId) {
373
+ return indexRoomId
374
+ ? `${indexName}::${indexRoomId}`
375
+ : `${indexName}::private`;
376
+ }
377
+ }
378
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/indexing/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import * as Y from "yjs";
2
+ import { Room } from "./Room";
3
+ import type { MayDbIndexDefinition, MayDbIndexHandle, MayDbIndexQueryPageOptions, MayDbIndexQueryPageResult, MayDbSchema, MatrixClient } from "./types";
4
+ export declare class IndexCapacityError extends Error {
5
+ readonly indexName: string;
6
+ readonly ownerRoomId: string | null;
7
+ constructor(options: {
8
+ indexName: string;
9
+ ownerRoomId: string | null;
10
+ });
11
+ }
12
+ declare class RuntimeIndexHandle implements MayDbIndexHandle {
13
+ readonly indexName: string;
14
+ readonly ownerRoomId: string | null;
15
+ readonly definition: MayDbIndexDefinition;
16
+ activeCount: number;
17
+ paused: boolean;
18
+ indexRoom: Room | null;
19
+ rowsMap: Y.Map<string> | null;
20
+ roomObserverCleanup: (() => void) | null;
21
+ readyPromise: Promise<void> | null;
22
+ private readonly runtime;
23
+ private readonly listeners;
24
+ constructor(options: {
25
+ runtime: IndexRuntime;
26
+ indexName: string;
27
+ ownerRoomId: string | null;
28
+ definition: MayDbIndexDefinition;
29
+ });
30
+ activate(): () => void;
31
+ ensureReady(): Promise<void>;
32
+ queryPage(options: MayDbIndexQueryPageOptions): Promise<MayDbIndexQueryPageResult>;
33
+ subscribe(listener: () => void): () => void;
34
+ notifyChange(): void;
35
+ }
36
+ export declare class IndexRuntime {
37
+ private readonly namespace;
38
+ private readonly matrixClient;
39
+ private readonly schema;
40
+ private readonly openRoom;
41
+ private readonly roomStore;
42
+ private readonly indexEntries;
43
+ private readonly roomDescriptors;
44
+ private readonly trackedRooms;
45
+ private readonly handles;
46
+ private readonly activeHandles;
47
+ private readonly roomTypesInIndexes;
48
+ constructor(options: {
49
+ namespace: string;
50
+ matrixClient: MatrixClient;
51
+ schema: MayDbSchema;
52
+ openRoom: (roomId: string) => Room;
53
+ });
54
+ hasIndexes(): boolean;
55
+ isRoomTypeIndexed(roomType: string): boolean;
56
+ validateRoomType(roomType: string): void;
57
+ openIndex(options: {
58
+ indexName: string;
59
+ ownerRoomId?: string;
60
+ }): MayDbIndexHandle;
61
+ dispose(): void;
62
+ registerRoom(room: Room): void;
63
+ onRoomAcquired(options: {
64
+ roomId: string;
65
+ roomName: string;
66
+ roomType: string;
67
+ ownerRoomId?: string | null;
68
+ activityAt?: string;
69
+ }): Promise<void>;
70
+ onHandleActivated(handle: RuntimeIndexHandle): void;
71
+ onHandleDeactivated(handle: RuntimeIndexHandle): void;
72
+ ensureHandleReady(handle: RuntimeIndexHandle): Promise<void>;
73
+ queryHandlePage(handle: RuntimeIndexHandle, options: MayDbIndexQueryPageOptions): Promise<MayDbIndexQueryPageResult>;
74
+ private validateSchemaIndexes;
75
+ private getIndexDefinition;
76
+ private validateIndexScopeOptions;
77
+ private getOrCreateHandle;
78
+ private initializeHandle;
79
+ private maybeAttachRoomActivityListener;
80
+ private onRoomActivity;
81
+ private upsertRoomAcrossAllRelevantIndexes;
82
+ private upsertRoomAcrossActiveIndexes;
83
+ private isDescriptorRelevantForHandle;
84
+ private upsertRoomToIndex;
85
+ private getRoomDescriptor;
86
+ private readRoomDescriptorFromState;
87
+ private resolveRoomName;
88
+ private readRoomNameFromState;
89
+ private nowIso;
90
+ private handleKey;
91
+ }
92
+ export {};
93
+ //# sourceMappingURL=indexing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexing.d.ts","sourceRoot":"","sources":["../src/indexing.ts"],"names":[],"mappings":"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"}