@sqlite-sync/core 0.8.1 → 0.9.0

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.
@@ -1,713 +0,0 @@
1
- import { CreateTableBuilder, Compilable, Kysely, CreateIndexBuilder, ColumnDataType, Expression, ColumnDefinitionBuilderCallback, ColumnType, CompiledQuery } from 'kysely';
2
- import { Sqlite3Static, Database, SqlValue, FunctionOptions } from '@sqlite.org/sqlite-wasm';
3
-
4
- type NewCrdtEvent = {
5
- type: CrdtEventType;
6
- dataset: string;
7
- item_id: string;
8
- payload: Record<string, unknown>;
9
- };
10
- type CrdtEventType = "item-created" | "item-updated" | "item-deleted";
11
- type CrdtEventStatus = "pending" | "applied" | "failed" | "deduped";
12
- /** Persisted on applied events that were accepted but did not mutate materialized state. */
13
- declare const CRDT_EVENT_NO_OP_PAYLOAD = "no-op";
14
- declare function isNoOpCrdtEventPayload(payload: string): payload is "no-op";
15
- type CrdtEventOrigin = "remote" | "own" | "own-applied" | "local";
16
- type PersistedCrdtEvent = {
17
- schema_version: number;
18
- sync_id: number;
19
- status: CrdtEventStatus;
20
- type: CrdtEventType;
21
- timestamp: string;
22
- origin: CrdtEventOrigin;
23
- source_node_id: string;
24
- dataset: string;
25
- item_id: string;
26
- payload: string;
27
- };
28
- type CrdtUpdateLogItem = {
29
- dataset: string;
30
- item_id: string;
31
- payload: string;
32
- };
33
- type CrdtUpdateLogPayload = Record<string, string>;
34
-
35
- type StoredValue<T> = {
36
- get current(): T;
37
- set current(newValue: T);
38
- };
39
- declare function createStoredValue<T>({ initialValue, saveToStorage, }: {
40
- initialValue: T;
41
- saveToStorage?: (value: T) => void;
42
- }): StoredValue<T>;
43
-
44
- type MigratableEvent = {
45
- schema_version: number;
46
- type: CrdtEventType;
47
- dataset: string;
48
- item_id: string;
49
- payload: string;
50
- };
51
- type CrdtEventTransformer = (event: NewCrdtEvent) => NewCrdtEvent | null;
52
- type MigrationStepSql = {
53
- sql: string;
54
- parameters?: readonly unknown[];
55
- } | Compilable | ((db: Kysely<unknown>) => Compilable);
56
- type TableRename = {
57
- oldTable: string;
58
- newTable: string;
59
- };
60
- type MigrationStep = {
61
- sql: MigrationStepSql | MigrationStepSql[];
62
- eventTransformer?: MigrationEventTransformers;
63
- tableRenames?: TableRename[];
64
- tableDrops?: string[];
65
- };
66
- type RawMigrationStep = {
67
- sql: MigrationSql[];
68
- eventTransformer?: CompiledMigrationEventTransformer;
69
- tableRenames?: TableRename[];
70
- tableDrops?: string[];
71
- };
72
- type MigrationSql = {
73
- sql: string;
74
- parameters: readonly unknown[];
75
- };
76
- type DataTypeExpression = ColumnDataType | Expression<any>;
77
- declare const migrationSteps: {
78
- createTable: (table: string, build: (table: CreateTableBuilder<string, never>) => Compilable) => MigrationStep;
79
- dropTable: (table: string) => MigrationStep;
80
- createIndex: (indexName: string, build: (index: CreateIndexBuilder) => Compilable) => MigrationStep;
81
- dropIndex: (indexName: string) => MigrationStep;
82
- renameTable: ({ oldTable, newTable }: {
83
- oldTable: string;
84
- newTable: string;
85
- }) => MigrationStep;
86
- renameColumn: ({ table, oldColumn, newColumn, }: {
87
- table: string;
88
- oldColumn: string;
89
- newColumn: string;
90
- }) => MigrationStep;
91
- addColumn: ({ table, column, type, defaultValue, build, }: {
92
- table: string;
93
- column: string;
94
- type: DataTypeExpression;
95
- defaultValue: number | boolean | string | null;
96
- build?: ColumnDefinitionBuilderCallback;
97
- }) => MigrationStep;
98
- dropColumn: ({ table, column }: {
99
- table: string;
100
- column: string;
101
- }) => MigrationStep;
102
- };
103
- type MigrationEventTransformers = Record<string, CrdtEventTransformer>;
104
- type CompiledMigrationEventTransformer = (event: NewCrdtEvent) => NewCrdtEvent | null;
105
- declare function createMigrations(buildMigrations: (builder: typeof migrationSteps) => Record<number, MigrationStep[]>): Record<number, RawMigrationStep>;
106
- type Migrations = ReturnType<typeof createMigrations>;
107
- type MigrationsDb = {
108
- startTransaction: (callback: (tx: MigrationsTransaction) => void) => void;
109
- };
110
- type MigrationsTransaction = {
111
- execute: (sql: string, parameters: readonly unknown[], meta?: {
112
- loggerLevel?: "system";
113
- }) => void;
114
- };
115
- declare function createMigrator({ migrations, schemaVersion, updateLogTableName, }: {
116
- migrations: Migrations;
117
- schemaVersion: StoredValue<number>;
118
- updateLogTableName?: string;
119
- }): {
120
- latestSchemaVersion: number;
121
- readonly currentSchemaVersion: number;
122
- migrateDbToLatest: (db: MigrationsDb) => void;
123
- migrateEvent: <Event extends MigratableEvent>(event: Event, targetVersion?: number) => Event | null;
124
- migrateEvents: <Event extends MigratableEvent>(events: Event[], targetVersion?: number) => Event[];
125
- };
126
- type SyncDbMigrator = ReturnType<typeof createMigrator>;
127
-
128
- type ColumnKind = "text" | "integer" | "real" | "boolean" | "enum";
129
- type SqliteStorageType = "text" | "integer" | "real";
130
- type ColumnMeta = {
131
- kind: ColumnKind;
132
- /** Storage type used in generated DDL. Booleans store as integer 0/1. */
133
- sqlType: SqliteStorageType;
134
- nullable: boolean;
135
- hasDefault: boolean;
136
- /** Declared default in JS form (booleans as booleans). */
137
- defaultValue?: unknown;
138
- /** Allowed values for `enum` columns. */
139
- enumValues?: readonly string[];
140
- description?: string;
141
- };
142
- declare class ColumnBuilder<Value, HasDefault extends boolean = false> {
143
- readonly meta: ColumnMeta;
144
- readonly "~types": {
145
- value: Value;
146
- hasDefault: HasDefault;
147
- };
148
- constructor(meta: ColumnMeta);
149
- /** Allow SQL NULL; widens the value type with `null`. */
150
- nullable(): ColumnBuilder<Value | null, HasDefault>;
151
- /** Declare a column default. The value is used both in DDL and when migrating older events. */
152
- default(value: Value): ColumnBuilder<Value, true>;
153
- /** Narrow the TypeScript value type without changing storage, e.g. `t.text().$type<"movie" | "tv">()`. */
154
- $type<Narrowed extends Value>(): ColumnBuilder<Narrowed, HasDefault>;
155
- /** Human/AI-readable description, surfaced in generated schema docs. */
156
- describe(description: string): ColumnBuilder<Value, HasDefault>;
157
- }
158
- type AnyColumnBuilder = ColumnBuilder<any, boolean>;
159
- type TableColumns = Record<string, AnyColumnBuilder>;
160
- type AnyTableBuilder = TableBuilder<any, any>;
161
- type SyncSchemaTables = Record<string, AnyTableBuilder>;
162
- type TableOptions<BaseName extends string | undefined = string | undefined> = {
163
- /** Override the materialized base table name (defaults to the crdt table name prefixed with "_"). */
164
- baseName?: BaseName;
165
- description?: string;
166
- };
167
- type Simplify<T> = {
168
- [K in keyof T]: T[K];
169
- } & {};
170
- type ColumnValue<Column> = Column extends ColumnBuilder<infer Value, boolean> ? Value : never;
171
- type InferRow<Cols extends TableColumns> = Simplify<{
172
- id: string;
173
- } & {
174
- [K in keyof Cols]: ColumnValue<Cols[K]>;
175
- } & {
176
- tombstone?: boolean;
177
- }>;
178
- type PayloadValidationResult = {
179
- success: true;
180
- } | {
181
- success: false;
182
- errors: string[];
183
- };
184
- declare class TableBuilder<Cols extends TableColumns, BaseName extends string | undefined = undefined> {
185
- readonly userColumns: Cols;
186
- readonly "~baseName": BaseName;
187
- /** All columns in DDL order, including the auto-injected `id` and `tombstone`. */
188
- readonly columns: Record<string, ColumnMeta>;
189
- readonly baseName: BaseName;
190
- readonly description: string | undefined;
191
- constructor(userColumns: Cols, options?: TableOptions<BaseName>);
192
- describe(description: string): TableBuilder<Cols, BaseName>;
193
- /** Type-only: the row shape returned by queries. Do not access at runtime. */
194
- get $row(): InferRow<Cols>;
195
- /**
196
- * Validate a CRDT event payload against the declared columns.
197
- * `item-created` payloads must contain every column without a default (nullable columns may be omitted);
198
- * `item-updated` payloads are partial and must not touch `id` or set `tombstone` to a deleted value.
199
- */
200
- validatePayload(payload: Record<string, unknown>, options?: {
201
- event?: "item-created" | "item-updated";
202
- }): PayloadValidationResult;
203
- }
204
- declare const t: {
205
- text: () => ColumnBuilder<string, false>;
206
- integer: () => ColumnBuilder<number, false>;
207
- real: () => ColumnBuilder<number, false>;
208
- /** Stored as INTEGER 0/1; always bind booleans as 0/1 when writing raw SQL. */
209
- boolean: () => ColumnBuilder<boolean, false>;
210
- /**
211
- * Union of string literals stored as TEXT, e.g. `t.enum(["movie", "tv"])`. Unlike `$type`, the
212
- * allowed values are kept as runtime metadata, so payloads are validated against them.
213
- * For an open-ended set, use `t.text().$type<"idle" | (string & {})>()` instead.
214
- */
215
- enum: <const Values extends readonly [string, ...string[]]>(values: Values) => ColumnBuilder<Values[number], false>;
216
- table: <Cols extends TableColumns, const BaseName extends string | undefined = undefined>(columns: Cols, options?: TableOptions<BaseName>) => TableBuilder<Cols, BaseName>;
217
- };
218
-
219
- type CrdtTableConfig = {
220
- baseTableName: string;
221
- crdtTableName: string;
222
- };
223
- interface SyncDbSchema<ClientDB = {}, ServerDB = {}, MutationsDB = {}> {
224
- get tablesConfig(): CrdtTableConfig[];
225
- get migrations(): Migrations;
226
- get tables(): SyncSchemaTables;
227
- "~clientSchema": ClientDB;
228
- "~serverSchema": ServerDB;
229
- "~mutationsSchema": MutationsDB;
230
- }
231
- type ReadonlyTable<Table extends Record<string, unknown>> = {
232
- [K in keyof Table]: ColumnType<Table[K], never, never>;
233
- };
234
-
235
- interface HLC {
236
- timestamp: number;
237
- counter: number;
238
- nodeId: string;
239
- }
240
- declare class HLCCounter {
241
- private timestamp;
242
- private counter;
243
- private nodeId;
244
- private readonly getTimestamp;
245
- private readonly maxDrift;
246
- constructor(nodeId: string, getTimestamp: () => number, maxDrift?: number);
247
- getCurrentHLC(): HLC;
248
- getNextHLC(): HLC;
249
- mergeHLC(hlc: HLC): void;
250
- }
251
- declare function serializeHLC(hlc: HLC): string;
252
- declare function deserializeHLC(serialized: string): HLC;
253
- declare function compareHLC(one: HLC, two: HLC): number;
254
-
255
- type TableMetadata = {
256
- name: string;
257
- isView: boolean;
258
- columns: ColumnMetadata[];
259
- };
260
- type DatabaseIntrospection = Record<string, TableMetadata>;
261
- type ColumnMetadata = {
262
- name: string;
263
- dataType: string;
264
- isNullable: boolean;
265
- isAutoIncrementing: boolean;
266
- hasDefaultValue: boolean;
267
- defaultValueSql: string | null;
268
- isPrimaryKey: boolean;
269
- comment: undefined;
270
- };
271
- declare function introspectDb<BaseDatabase>(_db: SQLiteDbWrapper<BaseDatabase>): DatabaseIntrospection;
272
-
273
- type LogLevel = "info" | "warning" | "error" | "trace" | "system";
274
- type Logger = (type: string, message: string, level?: LogLevel) => void;
275
- declare const startPerformanceLogger: (logger: Logger) => {
276
- restart: () => void;
277
- logEnd: (type: string, message: string, level?: LogLevel) => void;
278
- };
279
-
280
- type ExecuteParams = {
281
- sql: string;
282
- parameters: readonly unknown[];
283
- };
284
- type ExecuteResult<T> = {
285
- rows: T[];
286
- };
287
- type PreparedStatement<TParams extends unknown[], TResult> = {
288
- execute: (parameters: TParams) => TResult[];
289
- finalize: () => void;
290
- isFinalized: boolean;
291
- };
292
- type ScalarFunctionOptions<TArgs extends readonly SqlValue[], TResult extends SqlValue | undefined> = {
293
- name: string;
294
- callback: (...args: TArgs) => TResult;
295
- } & Pick<FunctionOptions, "deterministic" | "directOnly" | "innocuous">;
296
- type SqliteWrapperOptions = {
297
- logger?: Logger;
298
- loggerPrefix?: string;
299
- sqlite3: Sqlite3Static;
300
- db: () => Database;
301
- };
302
- type SQLiteTransactionWrapper<TDatabase = unknown> = Pick<SQLiteDbWrapper<TDatabase>, "sql" | "execute" | "executePrepared" | "executePreparedRaw" | "executeKysely">;
303
- type InternalSQLiteTransactionWrapper<TDatabase = unknown> = Pick<SQLiteDbWrapper<TDatabase>, "executePrepared" | "executePreparedRaw">;
304
- type InternalSQLiteWrapper<TDatabase = unknown> = InternalSQLiteTransactionWrapper<TDatabase> & {
305
- executeTransaction: (callback: (db: InternalSQLiteTransactionWrapper<TDatabase>) => void) => void;
306
- };
307
- type QueryMetaOpts = {
308
- loggerLevel?: "info" | "system";
309
- };
310
- declare class SQLiteDbWrapper<TDatabase = unknown> {
311
- private db;
312
- private sqlite3;
313
- private logger?;
314
- private loggerPrefix?;
315
- private loadedDbSchema;
316
- private readonly dataPointers;
317
- private preparedStatements;
318
- private preparedStatementsMap;
319
- private preparedRawStatementsMap;
320
- constructor(opts: SqliteWrapperOptions);
321
- get ensureDb(): Database;
322
- get dbSchema(): DatabaseIntrospection;
323
- execute<T = unknown>(opts: ExecuteParams | string | CompiledQuery<T>, meta?: QueryMetaOpts): ExecuteResult<T>;
324
- executeTransaction<T>(callback: (db: SQLiteTransactionWrapper<TDatabase>) => T): T;
325
- isInTransaction(): boolean;
326
- beginTransaction(): {
327
- commit: () => void;
328
- rollback: () => void;
329
- };
330
- prepare<TParams extends unknown[], TResult>(sql: string, opts?: QueryMetaOpts): PreparedStatement<TParams, TResult>;
331
- prepareKysely<TParams extends Record<string, unknown>>(opts?: QueryMetaOpts): <TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>>(factory: KyselyStatementFactory<TParams, TDatabase, TQuery, TResult>) => TypedStatement<TParams, TResult>;
332
- executeKysely<TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>>(factory: KyselyQueryFactory<TDatabase, TQuery, TResult>, meta?: QueryMetaOpts): ExecuteResult<TResult>;
333
- executePrepared<TParams extends Record<string, unknown>, TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>>(key: string, params: TParams, factory: KyselyStatementFactory<TParams, TDatabase, TQuery, TResult>, meta?: QueryMetaOpts): TResult[];
334
- executePreparedRaw<TParams extends unknown[], TResult>({ key, sql, params, meta, }: {
335
- key: string;
336
- sql: string;
337
- params?: TParams;
338
- meta?: QueryMetaOpts;
339
- }): TResult[];
340
- sql<T = unknown>(templateOrString: TemplateStringsArray | string, ...parameters: unknown[]): ExecuteResult<T>;
341
- createScalarFunction<TArgs extends SqlValue[], TResult extends SqlValue | undefined>({ name, callback, deterministic, directOnly, innocuous, }: ScalarFunctionOptions<TArgs, TResult>): Database;
342
- useSnapshot(snapshot: Uint8Array<ArrayBufferLike>): void;
343
- createSnapshot(): Uint8Array<ArrayBuffer>;
344
- invalidateDbSchema(): void;
345
- cleanup(): void;
346
- close(): void;
347
- }
348
- type QueryBuilderOutput<QB> = QB extends Compilable<infer O> ? O : never;
349
- type ParamsGetter<TParams> = <TKey extends keyof TParams>(key: TKey) => TParams[TKey];
350
- type TypedStatement<TParams extends Record<string, unknown>, TResult> = {
351
- execute: (parameters: TParams) => TResult[];
352
- };
353
- type KyselyStatementFactory<TParams extends Record<string, unknown>, TDatabase, TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>> = (kysely: Kysely<TDatabase>, params: ParamsGetter<TParams>) => TQuery;
354
- type KyselyQueryFactory<TDatabase, TQuery extends Compilable<TResult>, TResult = QueryBuilderOutput<TQuery>> = (kysely: Kysely<TDatabase>) => TQuery;
355
-
356
- type DeferredPromise<T> = {
357
- promise: Promise<T>;
358
- resolve: (value: T) => void;
359
- reject: (error: Error) => void;
360
- };
361
- type DeferredPromiseOptions = {
362
- timeout?: number;
363
- onTimeout?: () => void;
364
- };
365
- declare function createDeferredPromise<T>(opts?: DeferredPromiseOptions): DeferredPromise<T>;
366
- declare const generateId: () => `${string}-${string}-${string}-${string}-${string}`;
367
- type DistributiveOmit<T, K extends keyof T> = T extends any ? Omit<T, K> : never;
368
- declare class TypedBroadcastChannel<TMessage> {
369
- private readonly channel;
370
- constructor(name: string);
371
- postMessage(message: TMessage): void;
372
- set onmessage(callback: ((event: MessageEvent<TMessage>) => void) | null);
373
- close(): void;
374
- }
375
- declare class TypedEvent<T = unknown> extends Event {
376
- readonly payload: T;
377
- constructor(type: string, payload: T);
378
- }
379
- type TypedEventTarget<T extends Record<string, unknown>> = {
380
- addEventListener: <K extends keyof T & string>(type: K, listener: (event: TypedEvent<T[K]>) => void) => {
381
- unsubscribe: () => void;
382
- };
383
- removeEventListener: <K extends keyof T & string>(type: K, listener: (event: TypedEvent<T[K]>) => void) => void;
384
- dispatchEvent: <K extends keyof T & string>(type: K, payload: T[K]) => void;
385
- };
386
- declare const createTypedEventTarget: <T extends Record<string, unknown>>() => TypedEventTarget<T>;
387
- type TryCatchResult<T> = {
388
- success: true;
389
- data: T;
390
- } | {
391
- success: false;
392
- error: unknown;
393
- };
394
- declare function tryCatch<T>(fn: () => T): TryCatchResult<T>;
395
- declare function tryCatchAsync<T>(fn: () => Promise<T>): Promise<TryCatchResult<T>>;
396
- declare function jsonSafeParse<T>(json: string): TryCatchResult<T>;
397
- /** Quote a SQLite identifier (table/column name), handling dot-separated schema qualifiers. */
398
- declare function quoteId(name: string): string;
399
- type ParsedTableName = {
400
- schema: "main" | (string & {});
401
- table: string;
402
- fullIdentifier: string;
403
- };
404
-
405
- type SystemDbConfig = {
406
- eventsTable: ParsedTableName;
407
- updateLogTable: ParsedTableName;
408
- };
409
- declare function createSystemDbConfig({ eventsTableName, updateLogTableName, }: {
410
- eventsTableName: string;
411
- updateLogTableName: string;
412
- }): SystemDbConfig;
413
- type SystemMigrationContext = SystemDbConfig & {
414
- execute: (sql: string) => void;
415
- };
416
- type SystemMigration = {
417
- version: number;
418
- up: (ctx: SystemMigrationContext) => void;
419
- };
420
- declare const baseSystemMigrations: SystemMigration[];
421
- declare function runSystemMigrations(opts: {
422
- version: StoredValue<number>;
423
- migrations: SystemMigration[];
424
- dbConfig: SystemDbConfig;
425
- execute: (sql: string) => void;
426
- transaction: (callback: () => void) => void;
427
- }): void;
428
- declare function applyWorkerDbSchema(db: SQLiteDbWrapper<any>): {
429
- kvStore: {
430
- get: (key: string) => string | null;
431
- set: (key: string, value: string) => void;
432
- remove: (key: string) => void;
433
- createStringStoredValue: (key: string, defaultValue: string) => StoredValue<string>;
434
- createNumberStoredValue: (key: string, defaultValue: number) => StoredValue<number>;
435
- };
436
- };
437
- declare function applyMemoryDbSchema(db: SQLiteDbWrapper<any>): void;
438
-
439
- type LocalCrdtEvent = {
440
- type: CrdtEventType;
441
- dataset: string;
442
- item_id: string;
443
- payload: string;
444
- timestamp: string;
445
- schema_version: number;
446
- };
447
- type OwnCrdtEvent = {
448
- type: CrdtEventType;
449
- dataset: string;
450
- item_id: string;
451
- payload: string;
452
- timestamp?: undefined;
453
- schema_version?: undefined;
454
- };
455
- type RemoteCrdtEvent = {
456
- type: CrdtEventType;
457
- dataset: string;
458
- item_id: string;
459
- payload: string;
460
- timestamp: string;
461
- schema_version: number;
462
- };
463
- type GetEventsBatchQuery = {
464
- afterSyncId: number;
465
- status: CrdtEventStatus;
466
- limit: number;
467
- } & ({
468
- excludeOrigin: CrdtEventOrigin;
469
- excludeNodeId?: undefined;
470
- } | {
471
- excludeOrigin?: undefined;
472
- excludeNodeId: string;
473
- });
474
- type GetEventsBatch = {
475
- events: PersistedCrdtEvent[];
476
- hasMore: boolean;
477
- nextSyncId: number;
478
- };
479
- type EnqueueEventsResult = {
480
- beforeSyncId: number;
481
- afterSyncId: number;
482
- /** Resolves when the enqueued events have been processed (applied/deduped/failed). */
483
- processed: Promise<void>;
484
- };
485
- type StorageHLC = Pick<HLCCounter, "getNextHLC" | "mergeHLC">;
486
- type DbSyncerStorage = {
487
- nodeId: string;
488
- initialLocalSyncId: number;
489
- migrator: SyncDbMigrator;
490
- db: InternalSQLiteWrapper<any>;
491
- dbConfig: SystemDbConfig;
492
- hlc: StorageHLC;
493
- eventHlcAccumulator?: StoredValue<string>;
494
- onEventApplied?: (event: PersistedCrdtEvent) => void;
495
- schema: Pick<SyncDbSchema, "tables" | "tablesConfig">;
496
- };
497
- type CrdtStorage = Omit<ReturnType<typeof createCrdtStorage>, "internal">;
498
- type EventsAppliedPayload = {
499
- syncId: number;
500
- eventHlcSum: string | null;
501
- };
502
- type InternalDbSchema = {
503
- _crdt_events: PersistedCrdtEvent;
504
- _crdt_update_log: CrdtUpdateLogItem;
505
- };
506
- declare function createCrdtStorage(storage: DbSyncerStorage): {
507
- getEventsBatch: (options: GetEventsBatchQuery) => GetEventsBatch;
508
- enqueueLocalEvents: (events: LocalCrdtEvent[], sourceNodeId: string) => EnqueueEventsResult;
509
- enqueueOwnEvents: (events: OwnCrdtEvent[]) => EnqueueEventsResult;
510
- enqueueRemoteEvents: (events: RemoteCrdtEvent[]) => EnqueueEventsResult;
511
- applyOwnEvents: (events: OwnCrdtEvent[]) => void;
512
- checkIsQuiescent: (pushedSyncId: number) => boolean;
513
- getEventHlcAccumulator: () => string | null;
514
- addEventListener: <K extends "events-applied" | "remote-event-apply-failed">(type: K, listener: (event: TypedEvent<{
515
- "events-applied": EventsAppliedPayload;
516
- "remote-event-apply-failed": {
517
- syncId: number;
518
- };
519
- }[K]>) => void) => {
520
- unsubscribe: () => void;
521
- };
522
- removeEventListener: <K extends "events-applied" | "remote-event-apply-failed">(type: K, listener: (event: TypedEvent<{
523
- "events-applied": EventsAppliedPayload;
524
- "remote-event-apply-failed": {
525
- syncId: number;
526
- };
527
- }[K]>) => void) => void;
528
- internal: {
529
- applyOwnEventFromTransaction: (tx: InternalSQLiteTransactionWrapper<InternalDbSchema>, event: OwnCrdtEvent) => void;
530
- processEnqueuedEvents: {
531
- (): Promise<void>;
532
- promise(): Promise<void> | null;
533
- isExecuting(): boolean;
534
- };
535
- };
536
- };
537
-
538
- type PendingCrdtEvent = {
539
- type: CrdtEventType;
540
- dataset: string;
541
- item_id: string;
542
- timestamp: string;
543
- payload: string;
544
- };
545
- declare const createSQLiteCrdtApplyFunction: ({ db, dbConfig, }: {
546
- db: InternalSQLiteWrapper<any>;
547
- dbConfig: SystemDbConfig;
548
- }) => (event: PendingCrdtEvent) => void;
549
- type CreateCrdtApplyOpts = {
550
- getCrdtUpdateLog: (opts: {
551
- itemId: string;
552
- dataset: string;
553
- }) => CrdtUpdateLogPayload | null;
554
- insertItem: (opts: {
555
- dataset: string;
556
- payload: Record<string, unknown>;
557
- }) => void;
558
- insertCrdtUpdateLog: (opts: {
559
- dataset: string;
560
- itemId: string;
561
- payload: string;
562
- }) => void;
563
- updateItem: (opts: {
564
- dataset: string;
565
- itemId: string;
566
- payload: Record<string, unknown>;
567
- }) => void;
568
- updateCrdtUpdateLog: (opts: {
569
- dataset: string;
570
- itemId: string;
571
- payload: string;
572
- }) => void;
573
- };
574
- declare function createCrdtApplyFunction({ getCrdtUpdateLog, insertItem, insertCrdtUpdateLog, updateItem, updateCrdtUpdateLog, }: CreateCrdtApplyOpts): (event: PendingCrdtEvent) => void;
575
-
576
- type WorkerNotificationMessage = {
577
- notificationType: "new-event-chunk-applied";
578
- newSyncId: number;
579
- /** Worker's HLC checksum after applying up to `newSyncId`. */
580
- eventHlcSum: string | null;
581
- } | {
582
- notificationType: "state-changed";
583
- state: WorkerState;
584
- } | {
585
- notificationType: "reload-requested";
586
- reloadEpoch: string;
587
- clean: boolean;
588
- } | {
589
- notificationType: "de-sync-detected";
590
- reason: DeSyncDetectedReason;
591
- } | {
592
- notificationType: "remote-schema-version-mismatch";
593
- remoteSchemaVersion: number;
594
- localSchemaVersion: number;
595
- };
596
- type WorkerState = {
597
- remoteState: "online" | "offline" | "pending";
598
- deSynced: boolean;
599
- schemaVersionMismatched: boolean;
600
- };
601
- type EventsPullResponse = {
602
- events: {
603
- schema_version: number;
604
- type: CrdtEventType;
605
- timestamp: string;
606
- dataset: string;
607
- item_id: string;
608
- payload: string;
609
- }[];
610
- hasMore: boolean;
611
- nextSyncId: number;
612
- };
613
- type WorkerConfig<Props = any> = {
614
- dbId: string;
615
- clientId: string;
616
- props: Props;
617
- };
618
-
619
- type CrdtSyncRemoteSourceConfig = {
620
- bufferSize: number;
621
- storage: CrdtStorage;
622
- migrator: SyncDbMigrator;
623
- pullSyncId: StoredValue<number>;
624
- pushSyncId: StoredValue<number>;
625
- nodeId: string;
626
- remoteFactory?: CreateRemoteSourceFactory;
627
- };
628
- type EventsPullRequest = {
629
- afterSyncId: number;
630
- excludeNodeId?: string;
631
- };
632
- type EventsPushRequest = {
633
- nodeId: string;
634
- events: (PendingCrdtEvent & {
635
- schema_version: number;
636
- })[];
637
- };
638
- type EventsPushResponse = {
639
- ok: boolean;
640
- /** Remote sync_id right before the pushed events were enqueued. */
641
- beforeSyncId?: number;
642
- /** Remote sync_id right after the pushed events were enqueued. */
643
- afterSyncId?: number;
644
- };
645
- type CrdtSyncRemoteSource = ReturnType<typeof createCrdtSyncRemoteSource>;
646
- type EventsAvailable = {
647
- newSyncId: number;
648
- remoteEventHlcSum: string | null;
649
- };
650
- type CreateRemoteSourceFactory = (opts: {
651
- onEventsAvailable: (event: EventsAvailable) => void;
652
- }) => RemoteSource | Promise<RemoteSource>;
653
- type RemoteSource = {
654
- pullEvents: (request: EventsPullRequest) => Promise<EventsPullResponse>;
655
- pushEvents: (request: EventsPushRequest) => Promise<EventsPushResponse>;
656
- disconnect?: () => void | Promise<void>;
657
- };
658
- type RemoteSourceState = {
659
- type: "pending";
660
- deSynced: boolean;
661
- schemaVersionMismatched: boolean;
662
- } | {
663
- type: "offline";
664
- reason: OfflineReason;
665
- deSynced: boolean;
666
- schemaVersionMismatched: boolean;
667
- } | {
668
- type: "online";
669
- source: RemoteSource;
670
- deSynced: boolean;
671
- schemaVersionMismatched: boolean;
672
- };
673
- type OfflineReason = "NOT_INITIALIZED" | "INITIALIZATION_FAILED" | "REMOTE_PUSH_ERROR" | "REMOTE_PULL_ERROR" | "DISCONNECTED";
674
- type DeSyncDetectedReason = "CHECKSUM_MISMATCH" | "ERROR_APPLYING_REMOTE_EVENT";
675
- declare const createCrdtSyncRemoteSource: ({ bufferSize, storage, migrator, pullSyncId, pushSyncId, nodeId, remoteFactory, }: CrdtSyncRemoteSourceConfig) => {
676
- goOnline: () => Promise<void>;
677
- goOffline: {
678
- (reason: OfflineReason): Promise<void>;
679
- promise(): Promise<void> | null;
680
- isExecuting(): boolean;
681
- };
682
- syncWithRemote: {
683
- (): Promise<void>;
684
- promise(): Promise<void> | null;
685
- isExecuting(): boolean;
686
- };
687
- getState: () => WorkerState;
688
- dispose: () => Promise<void>;
689
- addEventListener: <K extends "state-changed" | "de-sync-detected" | "remote-schema-version-mismatch">(type: K, listener: (event: TypedEvent<{
690
- "state-changed": RemoteSourceState["type"];
691
- "de-sync-detected": {
692
- reason: DeSyncDetectedReason;
693
- };
694
- "remote-schema-version-mismatch": {
695
- remoteSchemaVersion: number;
696
- localSchemaVersion: number;
697
- };
698
- }[K]>) => void) => {
699
- unsubscribe: () => void;
700
- };
701
- removeEventListener: <K extends "state-changed" | "de-sync-detected" | "remote-schema-version-mismatch">(type: K, listener: (event: TypedEvent<{
702
- "state-changed": RemoteSourceState["type"];
703
- "de-sync-detected": {
704
- reason: DeSyncDetectedReason;
705
- };
706
- "remote-schema-version-mismatch": {
707
- remoteSchemaVersion: number;
708
- localSchemaVersion: number;
709
- };
710
- }[K]>) => void) => void;
711
- };
712
-
713
- export { type SqliteStorageType as $, type AnyTableBuilder as A, baseSystemMigrations as B, type CrdtTableConfig as C, type DeSyncDetectedReason as D, type ExecuteResult as E, createSystemDbConfig as F, runSystemMigrations as G, type HLC as H, type InternalSQLiteWrapper as I, type SystemDbConfig as J, type KyselyQueryFactory as K, type Logger as L, type Migrations as M, type NewCrdtEvent as N, type OwnCrdtEvent as O, type SystemMigration as P, type QueryBuilderOutput as Q, type ReadonlyTable as R, type StoredValue as S, TypedEvent as T, type SystemMigrationContext as U, type AnyColumnBuilder as V, type WorkerState as W, ColumnBuilder as X, type ColumnKind as Y, type ColumnMeta as Z, type PayloadValidationResult as _, type SyncDbMigrator as a, type TableOptions as a0, t as a1, createCrdtApplyFunction as a2, createSQLiteCrdtApplyFunction as a3, type PendingCrdtEvent as a4, createCrdtStorage as a5, type CrdtSyncRemoteSource as a6, createCrdtSyncRemoteSource as a7, type EventsPullRequest as a8, type EventsPushRequest as a9, type GetEventsBatch as aA, type EventsPullResponse as aB, type EventsPushResponse as aa, CRDT_EVENT_NO_OP_PAYLOAD as ab, type CrdtEventOrigin as ac, type CrdtEventStatus as ad, type CrdtEventType as ae, type CrdtUpdateLogItem as af, type CrdtUpdateLogPayload as ag, isNoOpCrdtEventPayload as ah, type PersistedCrdtEvent as ai, createStoredValue as aj, type KyselyStatementFactory as ak, type PreparedStatement as al, createDeferredPromise as am, createTypedEventTarget as an, type DeferredPromise as ao, type DistributiveOmit as ap, generateId as aq, jsonSafeParse as ar, quoteId as as, TypedBroadcastChannel as at, type TypedEventTarget as au, tryCatch as av, tryCatchAsync as aw, type WorkerConfig as ax, type WorkerNotificationMessage as ay, type CreateRemoteSourceFactory as az, SQLiteDbWrapper as b, type SyncSchemaTables as c, type SyncDbSchema as d, TableBuilder as e, type TableColumns as f, type InferRow as g, type CrdtStorage as h, type ExecuteParams as i, type SQLiteTransactionWrapper as j, compareHLC as k, deserializeHLC as l, HLCCounter as m, type ColumnMetadata as n, type DatabaseIntrospection as o, introspectDb as p, type TableMetadata as q, type LogLevel as r, serializeHLC as s, startPerformanceLogger as t, createMigrations as u, createMigrator as v, type MigratableEvent as w, type MigrationsDb as x, applyMemoryDbSchema as y, applyWorkerDbSchema as z };