@sqlite-sync/core 0.0.1
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/chunk-LK5FJCUD.js +522 -0
- package/dist/chunk-LK5FJCUD.js.map +1 -0
- package/dist/chunk-YLXMST5Z.js +490 -0
- package/dist/chunk-YLXMST5Z.js.map +1 -0
- package/dist/crdt-sync-producer-0toEpGf0.d.ts +15 -0
- package/dist/crdt-sync-remote-source-rrqinqLn.d.ts +271 -0
- package/dist/index.d.ts +268 -0
- package/dist/index.js +710 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +45 -0
- package/dist/server.js +45 -0
- package/dist/server.js.map +1 -0
- package/dist/worker.d.ts +19 -0
- package/dist/worker.js +261 -0
- package/dist/worker.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { Sqlite3Static, Database, SqlValue, FunctionOptions } from '@sqlite.org/sqlite-wasm';
|
|
2
|
+
import * as kysely from 'kysely';
|
|
3
|
+
import { CompiledQuery, Compilable, Kysely, SchemaModule } from 'kysely';
|
|
4
|
+
|
|
5
|
+
type DeferredPromise<T> = {
|
|
6
|
+
promise: Promise<T>;
|
|
7
|
+
resolve: (value: T) => void;
|
|
8
|
+
reject: (error: Error) => void;
|
|
9
|
+
};
|
|
10
|
+
declare function createDeferredPromise<T>(): DeferredPromise<T>;
|
|
11
|
+
declare const generateId: () => `${string}-${string}-${string}-${string}-${string}`;
|
|
12
|
+
type DistributiveOmit<T, K extends keyof T> = T extends any ? Omit<T, K> : never;
|
|
13
|
+
declare function ensureSingletonExecution(fn: () => Promise<void>): {
|
|
14
|
+
(): void;
|
|
15
|
+
isExecuting(): boolean;
|
|
16
|
+
};
|
|
17
|
+
declare function orderBy<T>(inputArray: T[], picker: (item: T) => any, opts?: {
|
|
18
|
+
direction?: "asc" | "desc";
|
|
19
|
+
inPlace?: boolean;
|
|
20
|
+
}): T[];
|
|
21
|
+
declare function createAutoFlushBuffer<T>({ size, flush, }: {
|
|
22
|
+
size: number;
|
|
23
|
+
flush: (items: T[]) => void;
|
|
24
|
+
}): {
|
|
25
|
+
add(item: T): void;
|
|
26
|
+
flush(): void;
|
|
27
|
+
};
|
|
28
|
+
declare function createAsyncAutoFlushBuffer<T>({ size, flush, }: {
|
|
29
|
+
size: number;
|
|
30
|
+
flush: (items: T[]) => void | Promise<void>;
|
|
31
|
+
}): {
|
|
32
|
+
add(item: T): Promise<void>;
|
|
33
|
+
flush(): Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
declare class TypedBroadcastChannel<TMessage> {
|
|
36
|
+
private readonly channel;
|
|
37
|
+
constructor(name: string);
|
|
38
|
+
postMessage(message: TMessage): void;
|
|
39
|
+
set onmessage(callback: (event: MessageEvent<TMessage>) => void);
|
|
40
|
+
}
|
|
41
|
+
declare class TypedEvent<T = unknown> extends Event {
|
|
42
|
+
readonly payload: T;
|
|
43
|
+
constructor(type: string, payload: T);
|
|
44
|
+
}
|
|
45
|
+
declare const createTypedEventTarget: <T extends Record<string, unknown>>() => {
|
|
46
|
+
addEventListener: <K extends keyof T & string>(type: K, listener: (event: TypedEvent<T[K]>) => void) => void;
|
|
47
|
+
removeEventListener: <K extends keyof T & string>(type: K, listener: (event: TypedEvent<T[K]>) => void) => void;
|
|
48
|
+
dispatchEvent: <K extends keyof T & string>(type: K, payload: T[K]) => void;
|
|
49
|
+
};
|
|
50
|
+
declare function jsonSafeParse<T>(json: string): {
|
|
51
|
+
status: "ok";
|
|
52
|
+
data: T;
|
|
53
|
+
} | {
|
|
54
|
+
status: "error";
|
|
55
|
+
error: unknown;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
type LogLevel = "info" | "warning" | "error" | "trace";
|
|
59
|
+
type Logger = (type: string, message: string, level?: LogLevel) => void;
|
|
60
|
+
declare const startPerformanceLogger: (logger: Logger) => {
|
|
61
|
+
restart: () => void;
|
|
62
|
+
logEnd: (type: string, message: string, level?: LogLevel) => void;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
type TableMetadata = {
|
|
66
|
+
name: string;
|
|
67
|
+
isView: boolean;
|
|
68
|
+
columns: ColumnMetadata[];
|
|
69
|
+
};
|
|
70
|
+
type DatabaseIntrospection = Record<string, TableMetadata>;
|
|
71
|
+
type ColumnMetadata = {
|
|
72
|
+
name: string;
|
|
73
|
+
dataType: string;
|
|
74
|
+
isNullable: boolean;
|
|
75
|
+
isAutoIncrementing: boolean;
|
|
76
|
+
hasDefaultValue: boolean;
|
|
77
|
+
comment: undefined;
|
|
78
|
+
};
|
|
79
|
+
declare function introspectDb<BaseDatabase>(_db: SQLiteDbWrapper<BaseDatabase>): DatabaseIntrospection;
|
|
80
|
+
|
|
81
|
+
type ExecuteParams = {
|
|
82
|
+
sql: string;
|
|
83
|
+
parameters: readonly unknown[];
|
|
84
|
+
};
|
|
85
|
+
type ExecuteResult<T> = {
|
|
86
|
+
rows: T[];
|
|
87
|
+
};
|
|
88
|
+
type PreparedStatement<TParams extends SqlValue[], TResult> = {
|
|
89
|
+
execute: (parameters: TParams) => TResult[];
|
|
90
|
+
finalize: () => void;
|
|
91
|
+
isFinalized: boolean;
|
|
92
|
+
};
|
|
93
|
+
type ScalarFunctionOptions<TArgs extends readonly SqlValue[], TResult extends SqlValue | void> = {
|
|
94
|
+
name: string;
|
|
95
|
+
callback: (...args: TArgs) => TResult;
|
|
96
|
+
} & Pick<FunctionOptions, "deterministic" | "directOnly" | "innocuous">;
|
|
97
|
+
type SqliteWrapperOptions = {
|
|
98
|
+
logger?: Logger;
|
|
99
|
+
loggerPrefix?: string;
|
|
100
|
+
sqlite3: Sqlite3Static;
|
|
101
|
+
db: Database;
|
|
102
|
+
};
|
|
103
|
+
type SQLiteTransactionWrapper<TDatabase = unknown> = Pick<SQLiteDbWrapper<TDatabase>, "execute" | "sql" | "executeKysely" | "prepare" | "executePrepared" | "prepareKysely">;
|
|
104
|
+
declare class SQLiteDbWrapper<TDatabase = unknown> {
|
|
105
|
+
private db;
|
|
106
|
+
private sqlite3;
|
|
107
|
+
private logger?;
|
|
108
|
+
private loggerPrefix?;
|
|
109
|
+
private loadedDbSchema;
|
|
110
|
+
private readonly dataPointers;
|
|
111
|
+
private preparedStatements;
|
|
112
|
+
private preparedStatementsMap;
|
|
113
|
+
constructor(opts: SqliteWrapperOptions);
|
|
114
|
+
get ensureDb(): Database;
|
|
115
|
+
get dbSchema(): DatabaseIntrospection;
|
|
116
|
+
execute<T = unknown>(opts: ExecuteParams | string | CompiledQuery<T>): ExecuteResult<T>;
|
|
117
|
+
executeTransaction<T>(callback: (db: SQLiteTransactionWrapper<TDatabase>) => T): T;
|
|
118
|
+
prepare<TParams extends SqlValue[], TResult>(sql: string): PreparedStatement<TParams, TResult>;
|
|
119
|
+
prepareKysely<TParams extends Record<string, unknown>>(): <TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>>(factory: KyselyStatementFactory<TParams, TDatabase, TQuery, TResult>) => TypedStatement<TParams, TResult>;
|
|
120
|
+
executeKysely<TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>>(factory: KyselyQueryFactory<TDatabase, TQuery, TResult>): ExecuteResult<TResult>;
|
|
121
|
+
executePrepared<TParams extends Record<string, unknown>, TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>>(key: string, params: TParams, factory: KyselyStatementFactory<TParams, TDatabase, TQuery, TResult>): TResult[];
|
|
122
|
+
sql<T = unknown>(templateOrString: TemplateStringsArray | string, ...parameters: unknown[]): ExecuteResult<T>;
|
|
123
|
+
createScalarFunction<TArgs extends SqlValue[], TResult extends SqlValue | void>({ name, callback, deterministic, directOnly, innocuous, }: ScalarFunctionOptions<TArgs, TResult>): Database;
|
|
124
|
+
useSnapshot(snapshot: Uint8Array<ArrayBufferLike>): void;
|
|
125
|
+
createSnapshot(): Uint8Array<ArrayBuffer>;
|
|
126
|
+
invalidateDbSchema(): void;
|
|
127
|
+
cleanup(): void;
|
|
128
|
+
close(): void;
|
|
129
|
+
}
|
|
130
|
+
type QueryBuilderOutput<QB> = QB extends Compilable<infer O> ? O : never;
|
|
131
|
+
type ParamsGetter<TParams> = <TKey extends keyof TParams>(key: TKey) => TParams[TKey];
|
|
132
|
+
type TypedStatement<TParams extends Record<string, unknown>, TResult> = {
|
|
133
|
+
execute: (parameters: TParams) => TResult[];
|
|
134
|
+
};
|
|
135
|
+
type KyselyStatementFactory<TParams extends Record<string, unknown>, TDatabase, TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>> = (kysely: Kysely<TDatabase>, params: ParamsGetter<TParams>) => TQuery;
|
|
136
|
+
type KyselyQueryFactory<TDatabase, TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>> = (kysely: Kysely<TDatabase>) => TQuery;
|
|
137
|
+
|
|
138
|
+
type PendingCrdtEvent = {
|
|
139
|
+
type: CrdtEventType;
|
|
140
|
+
dataset: string;
|
|
141
|
+
item_id: string;
|
|
142
|
+
timestamp: string;
|
|
143
|
+
payload: string;
|
|
144
|
+
};
|
|
145
|
+
type ApplyCrdtParams = {
|
|
146
|
+
updateLogTableName: string;
|
|
147
|
+
db: SQLiteTransactionWrapper<any>;
|
|
148
|
+
event: PendingCrdtEvent;
|
|
149
|
+
};
|
|
150
|
+
declare function applyCrdtEventMutations({ db, event, updateLogTableName, }: ApplyCrdtParams): void;
|
|
151
|
+
|
|
152
|
+
type CrdtEventType = "item-created" | "item-updated";
|
|
153
|
+
type CrdtEventStatus = "pending" | "applied" | "failed";
|
|
154
|
+
type CrdtEventOrigin = "remote" | (string & {});
|
|
155
|
+
type PersistedCrdtEvent = {
|
|
156
|
+
sync_id: number;
|
|
157
|
+
status: CrdtEventStatus;
|
|
158
|
+
type: CrdtEventType;
|
|
159
|
+
timestamp: string;
|
|
160
|
+
origin: CrdtEventOrigin;
|
|
161
|
+
dataset: string;
|
|
162
|
+
item_id: string;
|
|
163
|
+
payload: string;
|
|
164
|
+
};
|
|
165
|
+
type CrdtUpdateLogItem = {
|
|
166
|
+
dataset: string;
|
|
167
|
+
item_id: string;
|
|
168
|
+
payload: string;
|
|
169
|
+
};
|
|
170
|
+
type CrdtUpdateLogPayload = Record<string, string>;
|
|
171
|
+
type MetaItem = {
|
|
172
|
+
key: string;
|
|
173
|
+
value: string;
|
|
174
|
+
};
|
|
175
|
+
declare const crdtSchema: {
|
|
176
|
+
metaTable: typeof createMetaTableQuery;
|
|
177
|
+
persistedEventsTable: typeof createPersistedEventsTable;
|
|
178
|
+
crdtUpdateLogTable: typeof createCrdtUpdateLogTableQuery;
|
|
179
|
+
};
|
|
180
|
+
declare function createMetaTableQuery(schema: SchemaModule, tableName: string): kysely.CreateTableBuilder<string, "key" | "value">;
|
|
181
|
+
declare function createPersistedEventsTable(schema: SchemaModule, tableName: string): kysely.CreateTableBuilder<string, "type" | "timestamp" | "sync_id" | "status" | "origin" | "dataset" | "item_id" | "payload">;
|
|
182
|
+
declare function createCrdtUpdateLogTableQuery(schema: SchemaModule, tableName: string): kysely.CreateTableBuilder<string, "dataset" | "item_id" | "payload">;
|
|
183
|
+
declare function registerCrdtFunctions({ db, onEventApplied, getNextTimestamp, getTableSchema, updateLogTableName, }: {
|
|
184
|
+
db: SQLiteDbWrapper<any>;
|
|
185
|
+
onEventApplied: (event: PendingCrdtEvent) => void;
|
|
186
|
+
getNextTimestamp: () => string;
|
|
187
|
+
getTableSchema: (dataset: string) => TableMetadata;
|
|
188
|
+
updateLogTableName: string;
|
|
189
|
+
}): void;
|
|
190
|
+
|
|
191
|
+
type SyncIdCounter = {
|
|
192
|
+
get current(): number;
|
|
193
|
+
set current(newSyncId: number);
|
|
194
|
+
};
|
|
195
|
+
declare function createSyncIdCounter({ initialSyncId, saveToStorage, }: {
|
|
196
|
+
initialSyncId: number;
|
|
197
|
+
saveToStorage?: (syncId: number) => void;
|
|
198
|
+
}): SyncIdCounter;
|
|
199
|
+
|
|
200
|
+
type LocalCrdtEvent = {
|
|
201
|
+
type: CrdtEventType;
|
|
202
|
+
timestamp: string;
|
|
203
|
+
dataset: string;
|
|
204
|
+
item_id: string;
|
|
205
|
+
payload: string;
|
|
206
|
+
origin: CrdtEventOrigin;
|
|
207
|
+
};
|
|
208
|
+
type PendingEventsBatch = {
|
|
209
|
+
events: PersistedCrdtEvent[];
|
|
210
|
+
hasMore: boolean;
|
|
211
|
+
};
|
|
212
|
+
type DbSyncerStorage = {
|
|
213
|
+
syncId: SyncIdCounter;
|
|
214
|
+
persistEvents: (events: PersistedCrdtEvent[]) => void;
|
|
215
|
+
popPendingEventsBatch: () => PendingEventsBatch;
|
|
216
|
+
updateEventStatus: (syncId: number, status: CrdtEventStatus) => void;
|
|
217
|
+
applyCrdtEventMutations: (event: PersistedCrdtEvent) => void;
|
|
218
|
+
};
|
|
219
|
+
type CrdtStorage = ReturnType<typeof createCrdtStorage>;
|
|
220
|
+
declare function createCrdtStorage(storage: DbSyncerStorage): {
|
|
221
|
+
enqueueEvents: (events: LocalCrdtEvent[]) => {
|
|
222
|
+
firstEventSyncId: number;
|
|
223
|
+
lastEventSyncId: number;
|
|
224
|
+
};
|
|
225
|
+
addEventListener: <K extends "event-applied" | "event-processing-done">(type: K, listener: (event: TypedEvent<{
|
|
226
|
+
"event-applied": PersistedCrdtEvent;
|
|
227
|
+
"event-processing-done": void;
|
|
228
|
+
}[K]>) => void) => void;
|
|
229
|
+
removeEventListener: <K extends "event-applied" | "event-processing-done">(type: K, listener: (event: TypedEvent<{
|
|
230
|
+
"event-applied": PersistedCrdtEvent;
|
|
231
|
+
"event-processing-done": void;
|
|
232
|
+
}[K]>) => void) => void;
|
|
233
|
+
dispatchEvent: <K extends "event-applied" | "event-processing-done">(type: K, payload: {
|
|
234
|
+
"event-applied": PersistedCrdtEvent;
|
|
235
|
+
"event-processing-done": void;
|
|
236
|
+
}[K]) => void;
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
type CrdtSyncRemoteSourceConfig = {
|
|
240
|
+
bufferSize: number;
|
|
241
|
+
storage: CrdtStorage;
|
|
242
|
+
syncId: SyncIdCounter;
|
|
243
|
+
nodeId: string;
|
|
244
|
+
pullEvents: (request: EventsPullRequest) => EventsPullResponse | Promise<EventsPullResponse>;
|
|
245
|
+
pushEvents: (request: EventsPushRequest) => EventsPushResponse | Promise<EventsPushResponse>;
|
|
246
|
+
};
|
|
247
|
+
type EventsPullRequest = {
|
|
248
|
+
afterSyncId: number;
|
|
249
|
+
excludeNodeId?: string;
|
|
250
|
+
};
|
|
251
|
+
type EventsPullResponse = {
|
|
252
|
+
events: PersistedCrdtEvent[];
|
|
253
|
+
newSyncId: number;
|
|
254
|
+
hasMore: boolean;
|
|
255
|
+
};
|
|
256
|
+
type EventsPushRequest = {
|
|
257
|
+
nodeId: string;
|
|
258
|
+
events: PendingCrdtEvent[];
|
|
259
|
+
};
|
|
260
|
+
type EventsPushResponse = {
|
|
261
|
+
ok: boolean;
|
|
262
|
+
};
|
|
263
|
+
type CrdtSyncRemoteSource = ReturnType<typeof createCrdtSyncRemoteSource>;
|
|
264
|
+
declare const createCrdtSyncRemoteSource: ({ bufferSize, storage, syncId, nodeId, pullEvents: pullEventsChunk, pushEvents, }: CrdtSyncRemoteSourceConfig) => {
|
|
265
|
+
pullEvents: (request?: {
|
|
266
|
+
afterSyncId?: number;
|
|
267
|
+
includeSelf?: boolean;
|
|
268
|
+
}) => Promise<void>;
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
export { createAutoFlushBuffer as A, createAsyncAutoFlushBuffer as B, type CrdtEventType as C, createTypedEventTarget as D, type EventsPushRequest as E, jsonSafeParse as F, type DeferredPromise as G, type DistributiveOmit as H, startPerformanceLogger as I, type LogLevel as J, type KyselyQueryFactory as K, type Logger as L, type MetaItem as M, introspectDb as N, type TableMetadata as O, type PersistedCrdtEvent as P, type QueryBuilderOutput as Q, type DatabaseIntrospection as R, SQLiteDbWrapper as S, TypedEvent as T, type CrdtEventOrigin as a, type EventsPushResponse as b, type ExecuteParams as c, type ExecuteResult as d, type EventsPullRequest as e, type EventsPullResponse as f, TypedBroadcastChannel as g, type PreparedStatement as h, type SQLiteTransactionWrapper as i, applyCrdtEventMutations as j, type PendingCrdtEvent as k, createCrdtStorage as l, type CrdtStorage as m, createCrdtSyncRemoteSource as n, type CrdtSyncRemoteSource as o, crdtSchema as p, type CrdtEventStatus as q, registerCrdtFunctions as r, type CrdtUpdateLogItem as s, type CrdtUpdateLogPayload as t, createSyncIdCounter as u, type SyncIdCounter as v, generateId as w, createDeferredPromise as x, ensureSingletonExecution as y, orderBy as z };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { S as SQLiteDbWrapper, L as Logger, T as TypedEvent, C as CrdtEventType, a as CrdtEventOrigin, P as PersistedCrdtEvent, E as EventsPushRequest, b as EventsPushResponse, c as ExecuteParams, d as ExecuteResult, e as EventsPullRequest, f as EventsPullResponse, g as TypedBroadcastChannel } from './crdt-sync-remote-source-rrqinqLn.js';
|
|
2
|
+
export { q as CrdtEventStatus, m as CrdtStorage, o as CrdtSyncRemoteSource, s as CrdtUpdateLogItem, t as CrdtUpdateLogPayload, R as DatabaseIntrospection, G as DeferredPromise, H as DistributiveOmit, K as KyselyQueryFactory, J as LogLevel, M as MetaItem, k as PendingCrdtEvent, h as PreparedStatement, Q as QueryBuilderOutput, i as SQLiteTransactionWrapper, v as SyncIdCounter, O as TableMetadata, j as applyCrdtEventMutations, p as crdtSchema, B as createAsyncAutoFlushBuffer, A as createAutoFlushBuffer, l as createCrdtStorage, n as createCrdtSyncRemoteSource, x as createDeferredPromise, u as createSyncIdCounter, D as createTypedEventTarget, y as ensureSingletonExecution, w as generateId, N as introspectDb, F as jsonSafeParse, z as orderBy, r as registerCrdtFunctions, I as startPerformanceLogger } from './crdt-sync-remote-source-rrqinqLn.js';
|
|
3
|
+
import { Driver, DatabaseConnection, Kysely, Migration, Migrator } from 'kysely';
|
|
4
|
+
export { c as createCrdtSyncProducer, d as dummyKysely } from './crdt-sync-producer-0toEpGf0.js';
|
|
5
|
+
import '@sqlite.org/sqlite-wasm';
|
|
6
|
+
|
|
7
|
+
type TableName<Database> = keyof Database extends string ? keyof Database : never;
|
|
8
|
+
type SQLiteReactiveDbOptions = {
|
|
9
|
+
snapshot?: Uint8Array<ArrayBufferLike>;
|
|
10
|
+
logger?: Logger;
|
|
11
|
+
};
|
|
12
|
+
type EventsMap = {
|
|
13
|
+
"transaction-committed": void;
|
|
14
|
+
"transaction-rolled-back": void;
|
|
15
|
+
"any-table-changed": void;
|
|
16
|
+
} & Record<`table:${string}`, void>;
|
|
17
|
+
declare function createSQLiteReactiveDb<Database>(opts: SQLiteReactiveDbOptions): Promise<SQLiteReactiveDb<Database>>;
|
|
18
|
+
declare class SQLiteReactiveDb<Database> {
|
|
19
|
+
readonly db: SQLiteDbWrapper<Database>;
|
|
20
|
+
private sqlite3;
|
|
21
|
+
private readonly logger;
|
|
22
|
+
private tablesUsedStatement;
|
|
23
|
+
private eventTarget;
|
|
24
|
+
private constructor();
|
|
25
|
+
static create<Database>(opts: SQLiteReactiveDbOptions): Promise<SQLiteReactiveDb<Database>>;
|
|
26
|
+
createLiveQuery<TResult>(query: {
|
|
27
|
+
sql: string;
|
|
28
|
+
parameters: readonly unknown[];
|
|
29
|
+
}): {
|
|
30
|
+
getRows: () => TResult[];
|
|
31
|
+
refresh: () => void;
|
|
32
|
+
subscribe: (onchange: () => void) => () => void;
|
|
33
|
+
};
|
|
34
|
+
subscribeToQueryChanges(params: {
|
|
35
|
+
sql: string;
|
|
36
|
+
onDataChange: () => void;
|
|
37
|
+
}): {
|
|
38
|
+
unsubscribe: () => void;
|
|
39
|
+
};
|
|
40
|
+
subscribeToTableChanges(table: string, onChanges: () => void): {
|
|
41
|
+
unsubscribe: () => void;
|
|
42
|
+
};
|
|
43
|
+
getTablesUsed(query: string): {
|
|
44
|
+
name: string;
|
|
45
|
+
isWrite: boolean;
|
|
46
|
+
}[];
|
|
47
|
+
private getClearedTables;
|
|
48
|
+
addEventListener<K extends keyof EventsMap>(type: K, listener: (event: TypedEvent<EventsMap[K]>) => void): void;
|
|
49
|
+
removeEventListener<K extends keyof EventsMap>(type: K, listener: (event: TypedEvent<EventsMap[K]>) => void): void;
|
|
50
|
+
notifyTableSubscribers(tables?: (TableName<Database> | (string & {}))[]): void;
|
|
51
|
+
private registerDbHooks;
|
|
52
|
+
createSnapshot(): Uint8Array<ArrayBuffer>;
|
|
53
|
+
useSnapshot(snapshot: Uint8Array<ArrayBufferLike>): void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface HLC {
|
|
57
|
+
timestamp: number;
|
|
58
|
+
counter: number;
|
|
59
|
+
nodeId: string;
|
|
60
|
+
}
|
|
61
|
+
declare class HLCCounter {
|
|
62
|
+
private timestamp;
|
|
63
|
+
private counter;
|
|
64
|
+
private nodeId;
|
|
65
|
+
private readonly getTimestamp;
|
|
66
|
+
constructor(nodeId: string, getTimestamp: () => number);
|
|
67
|
+
getCurrentHLC(): HLC;
|
|
68
|
+
getNextHLC(): HLC;
|
|
69
|
+
mergeHLC(hlc: HLC): void;
|
|
70
|
+
}
|
|
71
|
+
declare function serializeHLC(hlc: HLC): string;
|
|
72
|
+
declare function deserializeHLC(serialized: string): {
|
|
73
|
+
timestamp: number;
|
|
74
|
+
counter: number;
|
|
75
|
+
nodeId: string;
|
|
76
|
+
};
|
|
77
|
+
declare function compareHLC(one: HLC, two: HLC): number;
|
|
78
|
+
|
|
79
|
+
type MemoryDbCrdtTableConfig = {
|
|
80
|
+
baseTableName: string;
|
|
81
|
+
crdtTableName: string;
|
|
82
|
+
};
|
|
83
|
+
type MemoryDbOptions<Database> = {
|
|
84
|
+
reactiveDb: SQLiteReactiveDb<Database>;
|
|
85
|
+
hlcCounter: HLCCounter;
|
|
86
|
+
tabId: string;
|
|
87
|
+
crdtTables: MemoryDbCrdtTableConfig[];
|
|
88
|
+
};
|
|
89
|
+
declare function createMemoryDb<Database>({ reactiveDb: _reactiveDb, hlcCounter, tabId, crdtTables, }: MemoryDbOptions<Database>): Promise<{
|
|
90
|
+
crdtStorage: {
|
|
91
|
+
enqueueEvents: (events: {
|
|
92
|
+
type: CrdtEventType;
|
|
93
|
+
timestamp: string;
|
|
94
|
+
dataset: string;
|
|
95
|
+
item_id: string;
|
|
96
|
+
payload: string;
|
|
97
|
+
origin: CrdtEventOrigin;
|
|
98
|
+
}[]) => {
|
|
99
|
+
firstEventSyncId: number;
|
|
100
|
+
lastEventSyncId: number;
|
|
101
|
+
};
|
|
102
|
+
addEventListener: <K extends "event-applied" | "event-processing-done">(type: K, listener: (event: TypedEvent<{
|
|
103
|
+
"event-applied": PersistedCrdtEvent;
|
|
104
|
+
"event-processing-done": void;
|
|
105
|
+
}[K]>) => void) => void;
|
|
106
|
+
removeEventListener: <K extends "event-applied" | "event-processing-done">(type: K, listener: (event: TypedEvent<{
|
|
107
|
+
"event-applied": PersistedCrdtEvent;
|
|
108
|
+
"event-processing-done": void;
|
|
109
|
+
}[K]>) => void) => void;
|
|
110
|
+
dispatchEvent: <K extends "event-applied" | "event-processing-done">(type: K, payload: {
|
|
111
|
+
"event-applied": PersistedCrdtEvent;
|
|
112
|
+
"event-processing-done": void;
|
|
113
|
+
}[K]) => void;
|
|
114
|
+
};
|
|
115
|
+
}>;
|
|
116
|
+
|
|
117
|
+
type SyncedDbOptions = {
|
|
118
|
+
dbPath: string;
|
|
119
|
+
clearOnInit?: boolean;
|
|
120
|
+
crdtTables: MemoryDbCrdtTableConfig[];
|
|
121
|
+
worker: Worker;
|
|
122
|
+
};
|
|
123
|
+
declare function createSyncedDb<Database>(options: SyncedDbOptions): Promise<{
|
|
124
|
+
db: SQLiteDbWrapper<Database>;
|
|
125
|
+
reactiveDb: Omit<SQLiteReactiveDb<Database>, "db">;
|
|
126
|
+
workerDb: {
|
|
127
|
+
addEventListener: <K extends "new-notification">(type: K, listener: (event: TypedEvent<{
|
|
128
|
+
"new-notification": WorkerNotificationMessage;
|
|
129
|
+
}[K]>) => void) => void;
|
|
130
|
+
removeEventListener: <K extends "new-notification">(type: K, listener: (event: TypedEvent<{
|
|
131
|
+
"new-notification": WorkerNotificationMessage;
|
|
132
|
+
}[K]>) => void) => void;
|
|
133
|
+
getSnapshot: () => Promise<GetSnapshotResponse>;
|
|
134
|
+
pushTabEvents: (request: EventsPushRequest) => Promise<EventsPushResponse>;
|
|
135
|
+
execute: (query: ExecuteParams) => Promise<ExecuteResult<unknown>>;
|
|
136
|
+
pullEvents: (params: EventsPullRequest) => Promise<EventsPullResponse>;
|
|
137
|
+
postInitReady: () => Promise<void>;
|
|
138
|
+
};
|
|
139
|
+
}>;
|
|
140
|
+
type SyncedDb<Database> = Awaited<ReturnType<typeof createSyncedDb<Database>>>;
|
|
141
|
+
|
|
142
|
+
type SqliteDatabase = {
|
|
143
|
+
execute: (opts: {
|
|
144
|
+
sql: string;
|
|
145
|
+
parameters: readonly unknown[];
|
|
146
|
+
}) => {
|
|
147
|
+
rows: unknown[];
|
|
148
|
+
};
|
|
149
|
+
close: () => void;
|
|
150
|
+
};
|
|
151
|
+
declare class SqliteDriver implements Driver {
|
|
152
|
+
#private;
|
|
153
|
+
constructor(db: SqliteDatabase);
|
|
154
|
+
init(): Promise<void>;
|
|
155
|
+
acquireConnection(): Promise<DatabaseConnection>;
|
|
156
|
+
beginTransaction(connection: DatabaseConnection): Promise<void>;
|
|
157
|
+
commitTransaction(connection: DatabaseConnection): Promise<void>;
|
|
158
|
+
rollbackTransaction(connection: DatabaseConnection): Promise<void>;
|
|
159
|
+
releaseConnection(): Promise<void>;
|
|
160
|
+
destroy(): Promise<void>;
|
|
161
|
+
}
|
|
162
|
+
declare function createSQLiteKysely<Database>(sqliteDb: SqliteDatabase): Kysely<Database>;
|
|
163
|
+
|
|
164
|
+
type SyncDbMigratorOptions = {
|
|
165
|
+
db: Kysely<unknown>;
|
|
166
|
+
migrations: Record<string, Migration>;
|
|
167
|
+
};
|
|
168
|
+
declare function createSyncDbMigrator(options: SyncDbMigratorOptions): Migrator;
|
|
169
|
+
declare function createSyncDbMigrations(migrations: Record<number, Migration>): Record<number, Migration>;
|
|
170
|
+
|
|
171
|
+
declare function applyWorkerDbSchema(db: SQLiteDbWrapper<any>): void;
|
|
172
|
+
declare function applyMemoryDbSchema(db: SQLiteDbWrapper<any>): void;
|
|
173
|
+
|
|
174
|
+
declare function makeCrdtTable({ db, baseTableName, crdtTableName, }: {
|
|
175
|
+
db: SQLiteDbWrapper<any>;
|
|
176
|
+
baseTableName: string;
|
|
177
|
+
crdtTableName: string;
|
|
178
|
+
}): void;
|
|
179
|
+
|
|
180
|
+
declare const syncDbWorkerLockName = "sync-db-worker-lock";
|
|
181
|
+
type WorkerNotificationMessage = {
|
|
182
|
+
notificationType: "new-event-chunk-applied";
|
|
183
|
+
newSyncId: number;
|
|
184
|
+
};
|
|
185
|
+
type PushTabEventsResponse = {
|
|
186
|
+
firstEventSyncId: number;
|
|
187
|
+
lastEventSyncId: number;
|
|
188
|
+
};
|
|
189
|
+
type GetSnapshotResponse = {
|
|
190
|
+
file: Uint8Array<ArrayBufferLike>;
|
|
191
|
+
syncId: number;
|
|
192
|
+
};
|
|
193
|
+
interface WorkerRpc {
|
|
194
|
+
getSnapshot: () => GetSnapshotResponse;
|
|
195
|
+
pushTabEvents: (request: EventsPushRequest) => EventsPushResponse;
|
|
196
|
+
execute: (query: ExecuteParams) => ExecuteResult<unknown>;
|
|
197
|
+
pullEvents: (params: EventsPullRequest) => EventsPullResponse;
|
|
198
|
+
postInitReady: () => void;
|
|
199
|
+
}
|
|
200
|
+
type WorkerRequestMethod = keyof WorkerRpc;
|
|
201
|
+
type WorkerRequestMessage<TMethod extends WorkerRequestMethod = WorkerRequestMethod> = {
|
|
202
|
+
type: "request";
|
|
203
|
+
requestId: string;
|
|
204
|
+
method: TMethod;
|
|
205
|
+
args: Parameters<WorkerRpc[TMethod]>;
|
|
206
|
+
};
|
|
207
|
+
type WorkerResponseMessage<TMethod extends WorkerRequestMethod = WorkerRequestMethod> = {
|
|
208
|
+
type: "response";
|
|
209
|
+
requestId: string;
|
|
210
|
+
data: ReturnType<WorkerRpc[TMethod]>;
|
|
211
|
+
};
|
|
212
|
+
type AsyncRpc<T> = {
|
|
213
|
+
[K in keyof T]: T[K] extends (...args: infer U) => infer V ? (...args: U) => V extends Promise<infer W> ? Promise<W> : Promise<V> : never;
|
|
214
|
+
};
|
|
215
|
+
declare const broadcastChannelNames: {
|
|
216
|
+
readonly requests: "sync-db-worker-requests";
|
|
217
|
+
readonly responses: "sync-db-worker-responses";
|
|
218
|
+
};
|
|
219
|
+
type WorkerBroadcastChannels = {
|
|
220
|
+
requests: TypedBroadcastChannel<WorkerRequestMessage>;
|
|
221
|
+
responses: TypedBroadcastChannel<WorkerResponseMessage | WorkerNotificationMessage | WorkerInitResponse>;
|
|
222
|
+
};
|
|
223
|
+
declare const createBroadcastChannels: () => WorkerBroadcastChannels;
|
|
224
|
+
type WorkerConfig = {
|
|
225
|
+
dbPath: string;
|
|
226
|
+
clientId: string;
|
|
227
|
+
clearOnInit?: boolean;
|
|
228
|
+
syncServer: SyncServerConfig;
|
|
229
|
+
};
|
|
230
|
+
type SyncServerConfig = {
|
|
231
|
+
host: string;
|
|
232
|
+
room: string;
|
|
233
|
+
};
|
|
234
|
+
type WorkerInitMessage = {
|
|
235
|
+
type: "init";
|
|
236
|
+
config: WorkerConfig;
|
|
237
|
+
};
|
|
238
|
+
declare function isWorkerInitMessage(message: unknown): message is WorkerInitMessage;
|
|
239
|
+
type WorkerInitResponse = {
|
|
240
|
+
type: "init-ready";
|
|
241
|
+
};
|
|
242
|
+
declare function isWorkerInitResponse(message: unknown): message is WorkerInitResponse;
|
|
243
|
+
declare function isWorkerRequestMessage(message: unknown): message is WorkerRequestMessage;
|
|
244
|
+
declare function isWorkerResponseMessage(message: unknown): message is WorkerResponseMessage;
|
|
245
|
+
declare function isWorkerNotificationMessage(message: unknown): message is WorkerNotificationMessage;
|
|
246
|
+
|
|
247
|
+
declare const createWorkerDbClient: ({ broadcastChannels, }: {
|
|
248
|
+
broadcastChannels: WorkerBroadcastChannels;
|
|
249
|
+
}) => {
|
|
250
|
+
addEventListener: <K extends "new-notification">(type: K, listener: (event: TypedEvent<{
|
|
251
|
+
"new-notification": WorkerNotificationMessage;
|
|
252
|
+
}[K]>) => void) => void;
|
|
253
|
+
removeEventListener: <K extends "new-notification">(type: K, listener: (event: TypedEvent<{
|
|
254
|
+
"new-notification": WorkerNotificationMessage;
|
|
255
|
+
}[K]>) => void) => void;
|
|
256
|
+
getSnapshot: () => Promise<GetSnapshotResponse>;
|
|
257
|
+
pushTabEvents: (request: EventsPushRequest) => Promise<EventsPushResponse>;
|
|
258
|
+
execute: (query: ExecuteParams) => Promise<ExecuteResult<unknown>>;
|
|
259
|
+
pullEvents: (params: EventsPullRequest) => Promise<EventsPullResponse>;
|
|
260
|
+
postInitReady: () => Promise<void>;
|
|
261
|
+
};
|
|
262
|
+
declare function initializeWorkerDb({ worker, broadcastChannels, config, }: {
|
|
263
|
+
worker: Worker;
|
|
264
|
+
broadcastChannels: WorkerBroadcastChannels;
|
|
265
|
+
config: WorkerConfig;
|
|
266
|
+
}): Promise<void>;
|
|
267
|
+
|
|
268
|
+
export { type AsyncRpc, CrdtEventOrigin, CrdtEventType, EventsPullRequest, EventsPullResponse, EventsPushRequest, EventsPushResponse, ExecuteParams, ExecuteResult, type GetSnapshotResponse, type HLC, HLCCounter, Logger, type MemoryDbCrdtTableConfig, PersistedCrdtEvent, type PushTabEventsResponse, SQLiteDbWrapper, SQLiteReactiveDb, SqliteDriver, type SyncServerConfig, type SyncedDb, TypedBroadcastChannel, TypedEvent, type WorkerBroadcastChannels, type WorkerConfig, type WorkerInitMessage, type WorkerInitResponse, type WorkerNotificationMessage, type WorkerRequestMessage, type WorkerRequestMethod, type WorkerResponseMessage, type WorkerRpc, applyMemoryDbSchema, applyWorkerDbSchema, broadcastChannelNames, compareHLC, createBroadcastChannels, createMemoryDb, createSQLiteKysely, createSQLiteReactiveDb, createSyncDbMigrations, createSyncDbMigrator, createSyncedDb, createWorkerDbClient, deserializeHLC, initializeWorkerDb, isWorkerInitMessage, isWorkerInitResponse, isWorkerNotificationMessage, isWorkerRequestMessage, isWorkerResponseMessage, makeCrdtTable, serializeHLC, syncDbWorkerLockName };
|