@polymorfa/store 0.1.0-dev.20260922094209

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,341 @@
1
+ export const SCHEMA_VERSION = 1;
2
+ const timeIndex = { name: "by_time", keyPath: "_t" };
3
+ const typeIndex = { name: "by_type", keyPath: "type" };
4
+ export const SCHEMA = {
5
+ conversations: [
6
+ timeIndex,
7
+ { name: "by_activity", keyPath: "lastActivity" },
8
+ ],
9
+ messages: [
10
+ timeIndex,
11
+ {
12
+ name: "by_conversation",
13
+ keyPath: ["conversationId", "createdAt"],
14
+ },
15
+ ],
16
+ contacts: [timeIndex],
17
+ presence: [timeIndex],
18
+ calls: [timeIndex, { name: "by_started", keyPath: "startedAt" }],
19
+ labels: [timeIndex],
20
+ sessions: [timeIndex],
21
+ templates: [timeIndex],
22
+ events: [timeIndex, typeIndex],
23
+ custom: [timeIndex, typeIndex],
24
+ checkpoints: [],
25
+ meta: [],
26
+ };
27
+ export const INTERNAL_STORE_NAMES = Object.keys(SCHEMA);
28
+ /** IndexedDB key ordering for the key types this package uses. */
29
+ export function compareKeys(a, b) {
30
+ const rank = (value) => typeof value === "number" ? 0 : typeof value === "string" ? 1 : 2;
31
+ const difference = rank(a) - rank(b);
32
+ if (difference !== 0)
33
+ return difference;
34
+ if (Array.isArray(a) && Array.isArray(b)) {
35
+ const length = Math.min(a.length, b.length);
36
+ for (let index = 0; index < length; index += 1) {
37
+ const result = compareKeys(a[index], b[index]);
38
+ if (result !== 0)
39
+ return result;
40
+ }
41
+ return a.length - b.length;
42
+ }
43
+ return a < b ? -1 : a > b ? 1 : 0;
44
+ }
45
+ export function isValidKey(value) {
46
+ if (typeof value === "number")
47
+ return !Number.isNaN(value);
48
+ if (typeof value === "string")
49
+ return true;
50
+ return Array.isArray(value) && value.every(isValidKey);
51
+ }
52
+ export function extractKey(row, keyPath) {
53
+ if (typeof keyPath === "string") {
54
+ const value = row[keyPath];
55
+ return isValidKey(value) ? value : undefined;
56
+ }
57
+ const values = keyPath.map((path) => row[path]);
58
+ return values.every(isValidKey) ? values : undefined;
59
+ }
60
+ export function inRange(key, range) {
61
+ if (range === undefined)
62
+ return true;
63
+ if (range.lower !== undefined) {
64
+ const result = compareKeys(key, range.lower);
65
+ if (result < 0 || (result === 0 && range.lowerOpen === true))
66
+ return false;
67
+ }
68
+ if (range.upper !== undefined) {
69
+ const result = compareKeys(key, range.upper);
70
+ if (result > 0 || (result === 0 && range.upperOpen === true))
71
+ return false;
72
+ }
73
+ return true;
74
+ }
75
+ function indexSpec(store, name) {
76
+ const spec = SCHEMA[store].find((candidate) => candidate.name === name);
77
+ if (spec === undefined)
78
+ throw new Error(`Store ${store} has no index ${name}.`);
79
+ return spec;
80
+ }
81
+ /** A bounded in-memory backend used when IndexedDB is unavailable. */
82
+ export class MemoryBackend {
83
+ mode = "memory";
84
+ #stores = new Map(INTERNAL_STORE_NAMES.map((name) => [name, new Map()]));
85
+ async getMany(requests) {
86
+ return requests.map(({ store, key }) => {
87
+ const row = this.#table(store).get(key);
88
+ return row === undefined ? undefined : structuredClone(row);
89
+ });
90
+ }
91
+ async commit(ops) {
92
+ const removed = new Map();
93
+ for (const op of ops) {
94
+ const table = this.#table(op.store);
95
+ if (op.kind === "put")
96
+ table.set(op.row.id, structuredClone(op.row));
97
+ else if (op.kind === "delete")
98
+ table.delete(op.key);
99
+ else {
100
+ const rows = this.#indexed(op.store, op.index, op.range, "next");
101
+ for (const row of rows)
102
+ table.delete(row.id);
103
+ const keys = removed.get(op.store) ?? [];
104
+ keys.push(...rows.map(({ id }) => id));
105
+ removed.set(op.store, keys);
106
+ }
107
+ }
108
+ return removed;
109
+ }
110
+ async query(store, query) {
111
+ const rows = query.index === undefined
112
+ ? [...this.#table(store).values()]
113
+ .filter((row) => inRange(row.id, query.range))
114
+ .sort((a, b) => compareKeys(a.id, b.id))
115
+ : this.#indexed(store, query.index, query.range, "next");
116
+ if (query.direction === "prev")
117
+ rows.reverse();
118
+ const result = [];
119
+ for (const row of rows) {
120
+ if (query.filter !== undefined && !query.filter(row))
121
+ continue;
122
+ result.push(structuredClone(row));
123
+ if (query.limit !== undefined && result.length >= query.limit)
124
+ break;
125
+ }
126
+ return result;
127
+ }
128
+ async sweep(rules) {
129
+ const removed = new Map();
130
+ for (const [store, rule] of rules) {
131
+ const table = this.#table(store);
132
+ const rows = this.#indexed(store, "by_time", undefined, "next");
133
+ const keys = [];
134
+ let remaining = rows.length;
135
+ for (const row of rows) {
136
+ const expired = rule.olderThan !== undefined && row._t < rule.olderThan;
137
+ const excess = rule.maxRows !== undefined && remaining > rule.maxRows;
138
+ if (!expired && !excess)
139
+ break;
140
+ table.delete(row.id);
141
+ keys.push(row.id);
142
+ remaining -= 1;
143
+ }
144
+ if (keys.length > 0)
145
+ removed.set(store, keys);
146
+ }
147
+ return removed;
148
+ }
149
+ async clear() {
150
+ for (const table of this.#stores.values())
151
+ table.clear();
152
+ }
153
+ close() {
154
+ // Nothing to release.
155
+ }
156
+ #table(store) {
157
+ const table = this.#stores.get(store);
158
+ if (table === undefined)
159
+ throw new Error(`Unknown store ${store}.`);
160
+ return table;
161
+ }
162
+ #indexed(store, index, range, direction) {
163
+ const spec = indexSpec(store, index);
164
+ const entries = [];
165
+ for (const row of this.#table(store).values()) {
166
+ const key = extractKey(row, spec.keyPath);
167
+ if (key !== undefined && inRange(key, range))
168
+ entries.push({ key, row });
169
+ }
170
+ entries.sort((a, b) => compareKeys(a.key, b.key) || compareKeys(a.row.id, b.row.id));
171
+ const rows = entries.map(({ row }) => row);
172
+ return direction === "prev" ? rows.reverse() : rows;
173
+ }
174
+ }
175
+ function request(target) {
176
+ return new Promise((resolve, reject) => {
177
+ target.onsuccess = () => resolve(target.result);
178
+ target.onerror = () => reject(target.error);
179
+ });
180
+ }
181
+ function done(transaction) {
182
+ return new Promise((resolve, reject) => {
183
+ transaction.oncomplete = () => resolve();
184
+ transaction.onerror = () => reject(transaction.error);
185
+ transaction.onabort = () => reject(transaction.error ?? new Error("Transaction aborted."));
186
+ });
187
+ }
188
+ function toRange(range) {
189
+ if (range === undefined)
190
+ return undefined;
191
+ const { lower, upper } = range;
192
+ if (lower !== undefined && upper !== undefined)
193
+ return IDBKeyRange.bound(lower, upper, range.lowerOpen === true, range.upperOpen === true);
194
+ if (lower !== undefined)
195
+ return IDBKeyRange.lowerBound(lower, range.lowerOpen === true);
196
+ if (upper !== undefined)
197
+ return IDBKeyRange.upperBound(upper, range.upperOpen === true);
198
+ return undefined;
199
+ }
200
+ /** Walks a cursor; `visit` returns `false` to stop. */
201
+ function walk(source, range, direction, visit) {
202
+ return new Promise((resolve, reject) => {
203
+ const cursorRequest = source.openCursor(range, direction);
204
+ cursorRequest.onerror = () => reject(cursorRequest.error);
205
+ cursorRequest.onsuccess = () => {
206
+ const cursor = cursorRequest.result;
207
+ if (cursor === null)
208
+ return resolve();
209
+ if (visit(cursor))
210
+ cursor.continue();
211
+ else
212
+ resolve();
213
+ };
214
+ });
215
+ }
216
+ export async function openIndexedDbBackend(factory, name) {
217
+ const opening = factory.open(name, SCHEMA_VERSION);
218
+ opening.onupgradeneeded = () => {
219
+ const database = opening.result;
220
+ const transaction = opening.transaction;
221
+ for (const store of INTERNAL_STORE_NAMES) {
222
+ const objectStore = database.objectStoreNames.contains(store)
223
+ ? transaction?.objectStore(store)
224
+ : database.createObjectStore(store, { keyPath: "id" });
225
+ if (objectStore === undefined)
226
+ continue;
227
+ for (const index of SCHEMA[store])
228
+ if (!objectStore.indexNames.contains(index.name))
229
+ objectStore.createIndex(index.name, index.keyPath);
230
+ }
231
+ };
232
+ const blocked = new Promise((_, reject) => {
233
+ opening.onblocked = () => reject(new Error("IndexedDB upgrade is blocked by another tab."));
234
+ });
235
+ const database = await Promise.race([request(opening), blocked]);
236
+ return new IndexedDbBackend(database);
237
+ }
238
+ export class IndexedDbBackend {
239
+ mode = "indexeddb";
240
+ #database;
241
+ constructor(database) {
242
+ this.#database = database;
243
+ // Let another tab upgrade the schema; this tab falls back to errors.
244
+ database.onversionchange = () => database.close();
245
+ }
246
+ async getMany(requests) {
247
+ if (requests.length === 0)
248
+ return [];
249
+ const stores = [...new Set(requests.map(({ store }) => store))];
250
+ const transaction = this.#database.transaction(stores, "readonly");
251
+ const completion = done(transaction);
252
+ const results = await Promise.all(requests.map(({ store, key }) => request(transaction.objectStore(store).get(key))));
253
+ await completion;
254
+ return results;
255
+ }
256
+ async commit(ops) {
257
+ const removed = new Map();
258
+ if (ops.length === 0)
259
+ return removed;
260
+ const stores = [...new Set(ops.map(({ store }) => store))];
261
+ const transaction = this.#database.transaction(stores, "readwrite");
262
+ const completion = done(transaction);
263
+ // Surface an abort even while a range walk is pending.
264
+ completion.catch(() => undefined);
265
+ // Apply ops strictly in order: a range walk sees rows put by this
266
+ // transaction, so a later put must not be issued until the walk ends.
267
+ for (const op of ops) {
268
+ const objectStore = transaction.objectStore(op.store);
269
+ if (op.kind === "put")
270
+ objectStore.put(op.row);
271
+ else if (op.kind === "delete")
272
+ objectStore.delete(op.key);
273
+ else {
274
+ const keys = removed.get(op.store) ?? [];
275
+ removed.set(op.store, keys);
276
+ await walk(objectStore.index(op.index), toRange(op.range), "next", (cursor) => {
277
+ keys.push(cursor.value.id);
278
+ cursor.delete();
279
+ return true;
280
+ });
281
+ }
282
+ }
283
+ await completion;
284
+ return removed;
285
+ }
286
+ async query(store, query) {
287
+ const transaction = this.#database.transaction(store, "readonly");
288
+ const completion = done(transaction);
289
+ const objectStore = transaction.objectStore(store);
290
+ const source = query.index === undefined ? objectStore : objectStore.index(query.index);
291
+ const rows = [];
292
+ await walk(source, toRange(query.range), query.direction ?? "next", (c) => {
293
+ const row = c.value;
294
+ if (query.filter === undefined || query.filter(row))
295
+ rows.push(row);
296
+ return query.limit === undefined || rows.length < query.limit;
297
+ });
298
+ await completion;
299
+ return rows;
300
+ }
301
+ async sweep(rules) {
302
+ const removed = new Map();
303
+ if (rules.size === 0)
304
+ return removed;
305
+ const transaction = this.#database.transaction([...rules.keys()], "readwrite");
306
+ const completion = done(transaction);
307
+ const work = [...rules].map(async ([store, rule]) => {
308
+ const objectStore = transaction.objectStore(store);
309
+ const index = objectStore.index("by_time");
310
+ const total = await request(objectStore.count());
311
+ let remaining = total;
312
+ const keys = [];
313
+ await walk(index, undefined, "next", (cursor) => {
314
+ const row = cursor.value;
315
+ const expired = rule.olderThan !== undefined && row._t < rule.olderThan;
316
+ const excess = rule.maxRows !== undefined && remaining > rule.maxRows;
317
+ if (!expired && !excess)
318
+ return false;
319
+ cursor.delete();
320
+ keys.push(row.id);
321
+ remaining -= 1;
322
+ return true;
323
+ });
324
+ if (keys.length > 0)
325
+ removed.set(store, keys);
326
+ });
327
+ await Promise.all([...work, completion]);
328
+ return removed;
329
+ }
330
+ async clear() {
331
+ const transaction = this.#database.transaction(INTERNAL_STORE_NAMES, "readwrite");
332
+ const completion = done(transaction);
333
+ for (const store of INTERNAL_STORE_NAMES)
334
+ transaction.objectStore(store).clear();
335
+ await completion;
336
+ }
337
+ close() {
338
+ this.#database.close();
339
+ }
340
+ }
341
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ConversationDataSource, ConversationMessage, ConversationPage, OutgoingMessage } from "@polymorfa/browser";
2
+ import type { PolymorfaStore } from "./store.js";
3
+ import type { StoredMessage } from "./types.js";
4
+ export interface StoreConversationSourceOptions {
5
+ readonly conversationId: string;
6
+ /** Messages per local page. */
7
+ readonly pageSize?: number;
8
+ /**
9
+ * Reads history from your backend. The first page reconciles the local
10
+ * copy in the background; later cursors page through the backend.
11
+ */
12
+ readonly load?: (cursor: string | undefined, signal?: AbortSignal) => Promise<ConversationPage>;
13
+ /** Sends through your backend or `BrowserMessagingClient`. */
14
+ readonly send: (message: OutgoingMessage, signal?: AbortSignal) => Promise<ConversationMessage>;
15
+ /** Session written on messages from `load` and `send`. */
16
+ readonly session?: string;
17
+ /** Reports a failed background reconcile or change read. */
18
+ readonly onError?: (error: unknown) => void;
19
+ }
20
+ /** Maps a stored row to the `@polymorfa/browser` message shape. */
21
+ export declare function toConversationMessage(row: StoredMessage): ConversationMessage;
22
+ /**
23
+ * A `ConversationDataSource` that reads the local store first, reconciles
24
+ * with your backend, and follows store changes, so `ConversationController`
25
+ * and the React and Web Component chat views work on top of it.
26
+ */
27
+ export declare function createStoreConversationSource(store: PolymorfaStore, options: StoreConversationSourceOptions): ConversationDataSource;
28
+ //# sourceMappingURL=conversation-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-source.d.ts","sourceRoot":"","sources":["../src/conversation-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EAEtB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAgB,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CACd,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,CACb,OAAO,EAAE,eAAe,EACxB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAKD,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,mBAAmB,CAc7E;AAqBD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,8BAA8B,GACtC,sBAAsB,CAkJxB"}
@@ -0,0 +1,160 @@
1
+ const LOCAL = "store:local:";
2
+ const REMOTE = "store:remote";
3
+ /** Maps a stored row to the `@polymorfa/browser` message shape. */
4
+ export function toConversationMessage(row) {
5
+ return {
6
+ id: row.id,
7
+ ...(row.clientId === undefined ? {} : { clientId: row.clientId }),
8
+ text: row.text ?? row.caption ?? "",
9
+ createdAt: row.createdAt,
10
+ direction: row.fromMe ? "outbound" : "inbound",
11
+ status: row.status === "pending" || row.status === "failed" ? row.status : "sent",
12
+ ...(row.replyTo === undefined ? {} : { replyTo: row.replyTo }),
13
+ ...(row.attachments === undefined || row.attachments.length === 0
14
+ ? {}
15
+ : { attachments: row.attachments }),
16
+ };
17
+ }
18
+ function toInput(conversationId, message) {
19
+ return {
20
+ id: message.id,
21
+ conversationId,
22
+ createdAt: message.createdAt,
23
+ fromMe: message.direction === "outbound",
24
+ text: message.text,
25
+ status: message.status,
26
+ ...(message.clientId === undefined ? {} : { clientId: message.clientId }),
27
+ ...(message.replyTo === undefined ? {} : { replyTo: message.replyTo }),
28
+ ...(message.attachments === undefined
29
+ ? {}
30
+ : { attachments: message.attachments }),
31
+ };
32
+ }
33
+ /**
34
+ * A `ConversationDataSource` that reads the local store first, reconciles
35
+ * with your backend, and follows store changes, so `ConversationController`
36
+ * and the React and Web Component chat views work on top of it.
37
+ */
38
+ export function createStoreConversationSource(store, options) {
39
+ const { conversationId } = options;
40
+ const pageSize = Math.max(1, options.pageSize ?? 50);
41
+ const upsertOptions = options.session === undefined ? {} : { session: options.session };
42
+ let reconcile;
43
+ const listeners = new Set();
44
+ let buffered = [];
45
+ let storeUnsubscribe;
46
+ const emit = (event) => {
47
+ if (listeners.size === 0)
48
+ buffered.push(event);
49
+ for (const listener of listeners)
50
+ listener(event);
51
+ };
52
+ const remotePage = async (cursor, signal) => {
53
+ if (options.load === undefined)
54
+ return { messages: [] };
55
+ const page = await options.load(cursor, signal);
56
+ await store.messages.upsert(page.messages.map((message) => toInput(conversationId, message)), upsertOptions);
57
+ return page;
58
+ };
59
+ const localPage = async (before) => {
60
+ const rows = await store.messages.list({
61
+ conversationId,
62
+ limit: pageSize,
63
+ ...(before === undefined ? {} : { before: before.at }),
64
+ ...(before?.id === undefined ? {} : { beforeId: before.id }),
65
+ });
66
+ const oldest = rows.at(-1);
67
+ // The ID breaks ties between messages that share a timestamp.
68
+ const nextCursor = rows.length === pageSize && oldest !== undefined
69
+ ? `${LOCAL}${oldest.createdAt}:${encodeURIComponent(oldest.id)}`
70
+ : options.load === undefined
71
+ ? undefined
72
+ : REMOTE;
73
+ return {
74
+ messages: rows.map(toConversationMessage),
75
+ ...(nextCursor === undefined ? {} : { nextCursor }),
76
+ };
77
+ };
78
+ return {
79
+ async load(cursor, signal) {
80
+ if (cursor === undefined) {
81
+ const local = await localPage(undefined);
82
+ if (options.load === undefined)
83
+ return local;
84
+ const remote = remotePage(undefined, signal);
85
+ reconcile = remote.then((page) => page.nextCursor, () => undefined);
86
+ if (local.messages.length === 0) {
87
+ const page = await remote;
88
+ return page.nextCursor === undefined
89
+ ? { messages: page.messages }
90
+ : { messages: page.messages, nextCursor: page.nextCursor };
91
+ }
92
+ buffered = [];
93
+ remote.then((page) => {
94
+ if (signal?.aborted === true)
95
+ return;
96
+ for (const message of page.messages)
97
+ emit({ type: "upsert", message });
98
+ }, (error) => options.onError?.(error));
99
+ return local;
100
+ }
101
+ if (cursor.startsWith(LOCAL)) {
102
+ const value = cursor.slice(LOCAL.length);
103
+ const split = value.indexOf(":");
104
+ return localPage(split === -1
105
+ ? { at: Number(value) }
106
+ : {
107
+ at: Number(value.slice(0, split)),
108
+ id: decodeURIComponent(value.slice(split + 1)),
109
+ });
110
+ }
111
+ if (cursor === REMOTE) {
112
+ const next = await (reconcile ?? Promise.resolve(undefined)).catch(() => undefined);
113
+ return next === undefined ? { messages: [] } : remotePage(next, signal);
114
+ }
115
+ return remotePage(cursor, signal);
116
+ },
117
+ subscribe(listener) {
118
+ listeners.add(listener);
119
+ const pending = buffered;
120
+ buffered = [];
121
+ for (const event of pending)
122
+ listener(event);
123
+ // One store subscription fans out to every listener.
124
+ storeUnsubscribe ??= store.subscribe("messages", (change) => {
125
+ for (const messageId of change.deleted)
126
+ emit({ type: "delete", messageId });
127
+ if (change.keys.length === 0)
128
+ return;
129
+ void Promise.all(change.keys.map((id) => store.messages.get(id))).then((rows) => {
130
+ for (const row of rows) {
131
+ if (row === undefined || row.conversationId !== conversationId)
132
+ continue;
133
+ if (row.deleted === true)
134
+ emit({ type: "delete", messageId: row.id });
135
+ else if (row.stub !== true)
136
+ emit({ type: "upsert", message: toConversationMessage(row) });
137
+ }
138
+ }, (error) => options.onError?.(error));
139
+ });
140
+ return () => {
141
+ listeners.delete(listener);
142
+ if (listeners.size === 0) {
143
+ storeUnsubscribe?.();
144
+ storeUnsubscribe = undefined;
145
+ }
146
+ };
147
+ },
148
+ async send(message, signal) {
149
+ const acknowledged = await options.send(message, signal);
150
+ await store.messages.upsert([
151
+ toInput(conversationId, {
152
+ ...acknowledged,
153
+ clientId: acknowledged.clientId ?? message.clientId,
154
+ }),
155
+ ], upsertOptions);
156
+ return acknowledged;
157
+ },
158
+ };
159
+ }
160
+ //# sourceMappingURL=conversation-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-source.js","sourceRoot":"","sources":["../src/conversation-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { InboxDataSource } from "@polymorfa/browser";
2
+ import type { PolymorfaStore } from "./store.js";
3
+ export interface StoreInboxSourceOptions {
4
+ /**
5
+ * The backend source, usually `createHandlerInboxSource(client)`. It
6
+ * serves history the store does not have yet and sends messages.
7
+ */
8
+ readonly backend: InboxDataSource;
9
+ /** Conversations read from the store. Default 200. */
10
+ readonly limit?: number;
11
+ readonly onError?: (error: unknown) => void;
12
+ }
13
+ /**
14
+ * An `<Inbox/>` source that renders from the local store first, fills gaps
15
+ * from your backend and follows store changes, so the list and open
16
+ * conversations update as events are ingested.
17
+ */
18
+ export declare function createStoreInboxSource(store: PolymorfaStore, options: StoreInboxSourceOptions): InboxDataSource;
19
+ //# sourceMappingURL=inbox-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-source.d.ts","sourceRoot":"","sources":["../src/inbox-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,uBAAuB,GAC/B,eAAe,CA+DjB"}