-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathPowerSyncDatabase.ts
96 lines (84 loc) · 2.94 KB
/
PowerSyncDatabase.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import {
AbstractPowerSyncDatabase,
AbstractStreamingSyncImplementation,
AdditionalConnectionOptions,
BucketStorageAdapter,
DBAdapter,
PowerSyncBackendConnector,
PowerSyncConnectionOptions,
PowerSyncDatabaseOptions,
PowerSyncDatabaseOptionsWithSettings,
RequiredAdditionalConnectionOptions,
SqliteBucketStorage,
SQLOpenFactory
} from '@powersync/common';
import { NodeRemote } from '../sync/stream/NodeRemote.js';
import { NodeStreamingSyncImplementation } from '../sync/stream/NodeStreamingSyncImplementation.js';
import { BetterSQLite3DBAdapter } from './BetterSQLite3DBAdapter.js';
import { NodeSQLOpenOptions } from './options.js';
import { Dispatcher } from 'undici';
export type NodePowerSyncDatabaseOptions = PowerSyncDatabaseOptions & {
database: DBAdapter | SQLOpenFactory | NodeSQLOpenOptions;
};
export type NodeAdditionalConnectionOptions = AdditionalConnectionOptions & {
/**
* Optional custom dispatcher for HTTP connections (e.g. using undici).
* Only used when the connection method is SyncStreamConnectionMethod.HTTP
*/
dispatcher?: Dispatcher;
};
export type NodePowerSyncConnectionOptions = PowerSyncConnectionOptions & NodeAdditionalConnectionOptions;
/**
* A PowerSync database which provides SQLite functionality
* which is automatically synced.
*
* @example
* ```typescript
* export const db = new PowerSyncDatabase({
* schema: AppSchema,
* database: {
* dbFilename: 'example.db'
* }
* });
* ```
*/
export class PowerSyncDatabase extends AbstractPowerSyncDatabase {
constructor(options: NodePowerSyncDatabaseOptions) {
super(options);
}
async _initialize(): Promise<void> {
await (this.database as BetterSQLite3DBAdapter).initialize();
}
/**
* Opens a DBAdapter using better-sqlite3 as the default SQLite open factory.
*/
protected openDBAdapter(options: PowerSyncDatabaseOptionsWithSettings): DBAdapter {
return new BetterSQLite3DBAdapter(options.database);
}
protected generateBucketStorageAdapter(): BucketStorageAdapter {
return new SqliteBucketStorage(this.database, AbstractPowerSyncDatabase.transactionMutex);
}
connect(
connector: PowerSyncBackendConnector,
options?: PowerSyncConnectionOptions & { dispatcher?: Dispatcher }
): Promise<void> {
return super.connect(connector, options);
}
protected generateSyncStreamImplementation(
connector: PowerSyncBackendConnector,
options: NodeAdditionalConnectionOptions
): AbstractStreamingSyncImplementation {
const remote = new NodeRemote(connector, this.options.logger, { dispatcher: options.dispatcher });
return new NodeStreamingSyncImplementation({
adapter: this.bucketStorageAdapter,
remote,
uploadCrud: async () => {
await this.waitForReady();
await connector.uploadData(this);
},
retryDelayMs: this.options.retryDelayMs,
crudUploadThrottleMs: this.options.crudUploadThrottleMs,
identifier: this.database.name
});
}
}