@powersync/react-native 1.26.0 → 1.26.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/index.js +20450 -3
- package/dist/index.js.map +1 -0
- package/lib/db/PowerSyncDatabase.js +1 -0
- package/lib/db/PowerSyncDatabase.js.map +1 -0
- package/lib/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.js +1 -0
- package/lib/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.js.map +1 -0
- package/lib/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.js +1 -0
- package/lib/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.js.map +1 -0
- package/lib/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.js +1 -0
- package/lib/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.js.map +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -0
- package/lib/sync/bucket/ReactNativeBucketStorageAdapter.js +1 -0
- package/lib/sync/bucket/ReactNativeBucketStorageAdapter.js.map +1 -0
- package/lib/sync/stream/ReactNativeRemote.d.ts +2 -0
- package/lib/sync/stream/ReactNativeRemote.js +5 -0
- package/lib/sync/stream/ReactNativeRemote.js.map +1 -0
- package/lib/sync/stream/ReactNativeStreamingSyncImplementation.d.ts +2 -2
- package/lib/sync/stream/ReactNativeStreamingSyncImplementation.js +5 -4
- package/lib/sync/stream/ReactNativeStreamingSyncImplementation.js.map +1 -0
- package/package.json +9 -9
- package/src/db/PowerSyncDatabase.ts +63 -0
- package/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts +156 -0
- package/src/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.ts +44 -0
- package/src/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.ts +43 -0
- package/src/index.ts +10 -0
- package/src/sync/bucket/ReactNativeBucketStorageAdapter.ts +24 -0
- package/src/sync/stream/ReactNativeRemote.ts +98 -0
- package/src/sync/stream/ReactNativeStreamingSyncImplementation.ts +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PowerSyncDatabase.js","sourceRoot":"","sources":["../../src/db/PowerSyncDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EAO1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,sCAAsC,EAAE,MAAM,uDAAuD,CAAC;AAC/G,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,iCAAiC,EAAE,MAAM,wEAAwE,CAAC;AAE3H;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,iBAAkB,SAAQ,yBAAyB;IAC9D,KAAK,CAAC,WAAW,KAAmB,CAAC;IAErC;;;OAGG;IACO,aAAa,CAAC,OAA6C;QACnE,MAAM,cAAc,GAAG,IAAI,iCAAiC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/E,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAES,4BAA4B;QACpC,OAAO,IAAI,+BAA+B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IAES,gCAAgC,CACxC,SAAoC,EACpC,OAA4C;QAE5C,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7D,OAAO,IAAI,sCAAsC,CAAC;YAChD,GAAG,OAAO;YACV,OAAO,EAAE,IAAI,CAAC,oBAAoB;YAClC,MAAM;YACN,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1B,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RNQSDBAdapter.js","sourceRoot":"","sources":["../../../../src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RNQSDBOpenFactory.js","sourceRoot":"","sources":["../../../../src/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oCAAoC,EAKrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AAExF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,gCAAiC,SAAQ,oCAAoC;IAC9E,iBAAiB,CAAU;IAC3B,cAAc,CAAiB;IAEzC,YAAY,OAAoC;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,iCAAiC,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IAES,MAAM;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,gBAAgB,CAAC,OAAiC;QAChD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,iFAAiF,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactNativeQuickSQLiteOpenFactory.js","sourceRoot":"","sources":["../../../../src/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,iCAAiC;IACtB;IAAtB,YAAsB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAEjD,MAAM;QACJ;;;;;;;WAOG;QAEH,IAAI,CAAC;YACH,IAAI,IAAI,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC;wGACkF,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1D,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,mFAAmF;YACnF,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACnC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;CACF"}
|
package/lib/index.js
CHANGED
|
@@ -7,3 +7,4 @@ export * from './db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory';
|
|
|
7
7
|
export * from './sync/stream/ReactNativeRemote';
|
|
8
8
|
export * from './sync/stream/ReactNativeStreamingSyncImplementation';
|
|
9
9
|
export * from './db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAEjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uDAAuD,CAAC;AACtE,cAAc,2DAA2D,CAAC;AAC1E,cAAc,iCAAiC,CAAC;AAChD,cAAc,sDAAsD,CAAC;AACrE,cAAc,2EAA2E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactNativeBucketStorageAdapter.js","sourceRoot":"","sources":["../../../src/sync/bucket/ReactNativeBucketStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,MAAM,OAAO,+BAAgC,SAAQ,mBAAmB;IACtE,OAAO,CAAC,EAA2B,EAAE,OAAiD;QACpF,IAAI,OAAO,YAAY,UAAU,EAAE,CAAC;YAClC,2EAA2E;YAC3E,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;CACF;AAED,SAAS,uBAAuB,CAAC,KAAiB;IAChD,mFAAmF;IACnF,MAAM,WAAW,GAAG,KAAK,CAAC,MAAqB,CAAC;IAChD,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;QACxE,gDAAgD;QAChD,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,sBAAsB;QACtB,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ILogger } from 'js-logger';
|
|
2
2
|
import { AbstractRemote, AbstractRemoteOptions, BSONImplementation, DataStream, RemoteConnector, SyncStreamOptions } from '@powersync/common';
|
|
3
|
+
import { TextDecoder } from 'text-encoding';
|
|
3
4
|
export declare const STREAMING_POST_TIMEOUT_MS = 30000;
|
|
4
5
|
export declare class ReactNativeRemote extends AbstractRemote {
|
|
5
6
|
protected connector: RemoteConnector;
|
|
@@ -7,5 +8,6 @@ export declare class ReactNativeRemote extends AbstractRemote {
|
|
|
7
8
|
constructor(connector: RemoteConnector, logger?: ILogger, options?: Partial<AbstractRemoteOptions>);
|
|
8
9
|
getUserAgent(): string;
|
|
9
10
|
getBSON(): Promise<BSONImplementation>;
|
|
11
|
+
protected createTextDecoder(): TextDecoder;
|
|
10
12
|
postStreamRaw<T>(options: SyncStreamOptions, mapLine: (line: string) => T): Promise<DataStream<T>>;
|
|
11
13
|
}
|
|
@@ -2,6 +2,7 @@ import { AbstractRemote, DEFAULT_REMOTE_LOGGER, FetchImplementationProvider } fr
|
|
|
2
2
|
import { Platform } from 'react-native';
|
|
3
3
|
// Note docs for React Native https://github.com/mongodb/js-bson?tab=readme-ov-file#react-native
|
|
4
4
|
import { BSON } from 'bson';
|
|
5
|
+
import { TextDecoder } from 'text-encoding';
|
|
5
6
|
import { fetch } from 'react-native-fetch-api';
|
|
6
7
|
export const STREAMING_POST_TIMEOUT_MS = 30_000;
|
|
7
8
|
/**
|
|
@@ -36,6 +37,9 @@ export class ReactNativeRemote extends AbstractRemote {
|
|
|
36
37
|
async getBSON() {
|
|
37
38
|
return BSON;
|
|
38
39
|
}
|
|
40
|
+
createTextDecoder() {
|
|
41
|
+
return new TextDecoder();
|
|
42
|
+
}
|
|
39
43
|
async postStreamRaw(options, mapLine) {
|
|
40
44
|
const timeout = Platform.OS == 'android'
|
|
41
45
|
? setTimeout(() => {
|
|
@@ -64,3 +68,4 @@ export class ReactNativeRemote extends AbstractRemote {
|
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
70
|
}
|
|
71
|
+
//# sourceMappingURL=ReactNativeRemote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactNativeRemote.js","sourceRoot":"","sources":["../../../src/sync/stream/ReactNativeRemote.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EAGd,qBAAqB,EAGrB,2BAA2B,EAG5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,gGAAgG;AAChG,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD;;;;GAIG;AACH,MAAM,wBAAyB,SAAQ,2BAA2B;IAChE,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,cAAc;IAEvC;IACA;IAFZ,YACY,SAA0B,EAC1B,SAAkB,qBAAqB,EACjD,OAAwC;QAExC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE;YACvB,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;YAClB,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,IAAI,IAAI,wBAAwB,EAAE;SACpF,CAAC,CAAC;QAPO,cAAS,GAAT,SAAS,CAAiB;QAC1B,WAAM,GAAN,MAAM,CAAiC;IAOnD,CAAC;IAED,YAAY;QACV,OAAO;YACL,KAAK,CAAC,YAAY,EAAE;YACpB,wBAAwB;YACxB,gBAAgB,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,IAAI,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE;YAC5G,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,EAAE;SACrC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAES,iBAAiB;QACzB,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,aAAa,CAAI,OAA0B,EAAE,OAA4B;QAC7E,MAAM,OAAO,GACX,QAAQ,CAAC,EAAE,IAAI,SAAS;YACtB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,6CAA6C,IAAI,CAAC,IAAI,CACpD,yBAAyB,GAAG,IAAI,CACjC,gGAAgG,CAClG,CAAC;YACJ,CAAC,EAAE,yBAAyB,CAAC;YAC/B,CAAC,CAAC,IAAI,CAAC;QAEX,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,aAAa,CAC9B;gBACE,GAAG,OAAO;gBACV,YAAY,EAAE;oBACZ,GAAG,OAAO,CAAC,YAAY;oBACvB;;;;uBAIG;oBACH,yFAAyF;oBACzF,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;iBACrC;aACF,EACD,OAAO,CACR,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AbstractStreamingSyncImplementation, AbstractStreamingSyncImplementationOptions, LockOptions, LockType } from '@powersync/common';
|
|
2
|
-
import
|
|
2
|
+
import { Mutex } from 'async-mutex';
|
|
3
3
|
export declare class ReactNativeStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
|
|
4
|
-
locks: Map<LockType,
|
|
4
|
+
locks: Map<LockType, Mutex>;
|
|
5
5
|
constructor(options: AbstractStreamingSyncImplementationOptions);
|
|
6
6
|
/**
|
|
7
7
|
* Configures global locks on sync process
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AbstractStreamingSyncImplementation, LockType } from '@powersync/common';
|
|
2
|
-
import
|
|
2
|
+
import { Mutex } from 'async-mutex';
|
|
3
3
|
/**
|
|
4
4
|
* Global locks which prevent multiple instances from syncing
|
|
5
5
|
* concurrently.
|
|
@@ -21,8 +21,8 @@ export class ReactNativeStreamingSyncImplementation extends AbstractStreamingSyn
|
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
this.locks = new Map();
|
|
24
|
-
this.locks.set(LockType.CRUD, new
|
|
25
|
-
this.locks.set(LockType.SYNC, new
|
|
24
|
+
this.locks.set(LockType.CRUD, new Mutex());
|
|
25
|
+
this.locks.set(LockType.SYNC, new Mutex());
|
|
26
26
|
if (identifier) {
|
|
27
27
|
LOCKS.set(identifier, this.locks);
|
|
28
28
|
}
|
|
@@ -32,7 +32,7 @@ export class ReactNativeStreamingSyncImplementation extends AbstractStreamingSyn
|
|
|
32
32
|
if (!lock) {
|
|
33
33
|
throw new Error(`Lock type ${lockOptions.type} not found`);
|
|
34
34
|
}
|
|
35
|
-
return lock.
|
|
35
|
+
return lock.runExclusive(async () => {
|
|
36
36
|
if (lockOptions.signal?.aborted) {
|
|
37
37
|
throw new Error('Aborted');
|
|
38
38
|
}
|
|
@@ -40,3 +40,4 @@ export class ReactNativeStreamingSyncImplementation extends AbstractStreamingSyn
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
//# sourceMappingURL=ReactNativeStreamingSyncImplementation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactNativeStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/sync/stream/ReactNativeStreamingSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EAGnC,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;GAGG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;AAEtD,MAAM,OAAO,sCAAuC,SAAQ,mCAAmC;IAC7F,KAAK,CAAuB;IAE5B,YAAY,OAAmD;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;QAE3C,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,UAAU,CAAI,WAA2B;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,aAAa,WAAW,CAAC,IAAI,YAAY,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YAClC,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/react-native",
|
|
3
|
-
"version": "1.26.
|
|
3
|
+
"version": "1.26.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"types": "./lib/index.d.ts",
|
|
12
12
|
"files": [
|
|
13
13
|
"lib",
|
|
14
|
-
"dist"
|
|
14
|
+
"dist",
|
|
15
|
+
"src"
|
|
15
16
|
],
|
|
16
17
|
"repository": {
|
|
17
18
|
"type": "git",
|
|
@@ -25,7 +26,7 @@
|
|
|
25
26
|
"homepage": "https://docs.powersync.com/",
|
|
26
27
|
"peerDependencies": {
|
|
27
28
|
"@journeyapps/react-native-quick-sqlite": "^2.4.9",
|
|
28
|
-
"@powersync/common": "^1.41.
|
|
29
|
+
"@powersync/common": "^1.41.1",
|
|
29
30
|
"react": "*",
|
|
30
31
|
"react-native": "*"
|
|
31
32
|
},
|
|
@@ -35,8 +36,9 @@
|
|
|
35
36
|
}
|
|
36
37
|
},
|
|
37
38
|
"dependencies": {
|
|
38
|
-
"
|
|
39
|
-
"@powersync/
|
|
39
|
+
"async-mutex": "^0.5.0",
|
|
40
|
+
"@powersync/common": "1.41.1",
|
|
41
|
+
"@powersync/react": "1.8.2"
|
|
40
42
|
},
|
|
41
43
|
"devDependencies": {
|
|
42
44
|
"@craftzdog/react-native-buffer": "^6.0.5",
|
|
@@ -48,9 +50,7 @@
|
|
|
48
50
|
"@rollup/plugin-node-resolve": "15.2.3",
|
|
49
51
|
"@rollup/plugin-replace": "^5.0.7",
|
|
50
52
|
"@rollup/plugin-terser": "^0.4.4",
|
|
51
|
-
"
|
|
52
|
-
"async-lock": "^1.4.0",
|
|
53
|
-
"bson": "^6.6.0",
|
|
53
|
+
"bson": "^6.10.4",
|
|
54
54
|
"react": "18.3.1",
|
|
55
55
|
"react-native": "0.72.4",
|
|
56
56
|
"react-native-fetch-api": "^3.0.0",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
],
|
|
68
68
|
"scripts": {
|
|
69
69
|
"build": "tsc -b && rollup -c rollup.config.mjs",
|
|
70
|
-
"build:prod": "tsc -b
|
|
70
|
+
"build:prod": "tsc -b && rollup -c rollup.config.mjs",
|
|
71
71
|
"clean": "rm -rf lib dist tsconfig.tsbuildinfo",
|
|
72
72
|
"watch": "tsc -b -w",
|
|
73
73
|
"test:exports": "attw --pack ."
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AbstractPowerSyncDatabase,
|
|
3
|
+
AbstractStreamingSyncImplementation,
|
|
4
|
+
BucketStorageAdapter,
|
|
5
|
+
DBAdapter,
|
|
6
|
+
PowerSyncBackendConnector,
|
|
7
|
+
PowerSyncDatabaseOptionsWithSettings,
|
|
8
|
+
type RequiredAdditionalConnectionOptions
|
|
9
|
+
} from '@powersync/common';
|
|
10
|
+
import { ReactNativeRemote } from '../sync/stream/ReactNativeRemote';
|
|
11
|
+
import { ReactNativeStreamingSyncImplementation } from '../sync/stream/ReactNativeStreamingSyncImplementation';
|
|
12
|
+
import { ReactNativeBucketStorageAdapter } from './../sync/bucket/ReactNativeBucketStorageAdapter';
|
|
13
|
+
import { ReactNativeQuickSqliteOpenFactory } from './adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A PowerSync database which provides SQLite functionality
|
|
17
|
+
* which is automatically synced.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* export const db = new PowerSyncDatabase({
|
|
22
|
+
* schema: AppSchema,
|
|
23
|
+
* database: {
|
|
24
|
+
* dbFilename: 'example.db'
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export class PowerSyncDatabase extends AbstractPowerSyncDatabase {
|
|
30
|
+
async _initialize(): Promise<void> {}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Opens a DBAdapter using React Native Quick SQLite as the
|
|
34
|
+
* default SQLite open factory.
|
|
35
|
+
*/
|
|
36
|
+
protected openDBAdapter(options: PowerSyncDatabaseOptionsWithSettings): DBAdapter {
|
|
37
|
+
const defaultFactory = new ReactNativeQuickSqliteOpenFactory(options.database);
|
|
38
|
+
return defaultFactory.openDB();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected generateBucketStorageAdapter(): BucketStorageAdapter {
|
|
42
|
+
return new ReactNativeBucketStorageAdapter(this.database, this.logger);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected generateSyncStreamImplementation(
|
|
46
|
+
connector: PowerSyncBackendConnector,
|
|
47
|
+
options: RequiredAdditionalConnectionOptions
|
|
48
|
+
): AbstractStreamingSyncImplementation {
|
|
49
|
+
const remote = new ReactNativeRemote(connector, this.logger);
|
|
50
|
+
|
|
51
|
+
return new ReactNativeStreamingSyncImplementation({
|
|
52
|
+
...options,
|
|
53
|
+
adapter: this.bucketStorageAdapter,
|
|
54
|
+
remote,
|
|
55
|
+
uploadCrud: async () => {
|
|
56
|
+
await this.waitForReady();
|
|
57
|
+
await connector.uploadData(this);
|
|
58
|
+
},
|
|
59
|
+
identifier: this.database.name,
|
|
60
|
+
logger: this.logger
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseObserver,
|
|
3
|
+
DBAdapter,
|
|
4
|
+
DBAdapterListener,
|
|
5
|
+
LockContext as PowerSyncLockContext,
|
|
6
|
+
Transaction as PowerSyncTransaction,
|
|
7
|
+
DBLockOptions,
|
|
8
|
+
DBGetUtils,
|
|
9
|
+
QueryResult
|
|
10
|
+
} from '@powersync/common';
|
|
11
|
+
import type {
|
|
12
|
+
QuickSQLiteConnection,
|
|
13
|
+
LockContext as RNQSLockContext,
|
|
14
|
+
TransactionContext as RNQSTransactionContext
|
|
15
|
+
} from '@journeyapps/react-native-quick-sqlite';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Adapter for React Native Quick SQLite
|
|
19
|
+
*/
|
|
20
|
+
export class RNQSDBAdapter extends BaseObserver<DBAdapterListener> implements DBAdapter {
|
|
21
|
+
getAll: <T>(sql: string, parameters?: any[]) => Promise<T[]>;
|
|
22
|
+
getOptional: <T>(sql: string, parameters?: any[]) => Promise<T | null>;
|
|
23
|
+
get: <T>(sql: string, parameters?: any[]) => Promise<T>;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
protected baseDB: QuickSQLiteConnection,
|
|
27
|
+
public name: string
|
|
28
|
+
) {
|
|
29
|
+
super();
|
|
30
|
+
// link table update commands
|
|
31
|
+
baseDB.registerTablesChangedHook((update) => {
|
|
32
|
+
this.iterateListeners((cb) => cb.tablesUpdated?.(update));
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const topLevelUtils = this.generateDBHelpers({
|
|
36
|
+
// Arrow function binds `this` for use in readOnlyExecute
|
|
37
|
+
execute: (sql: string, params?: any[]) => this.readOnlyExecute(sql, params)
|
|
38
|
+
});
|
|
39
|
+
// Only assigning get helpers
|
|
40
|
+
this.getAll = topLevelUtils.getAll;
|
|
41
|
+
this.getOptional = topLevelUtils.getOptional;
|
|
42
|
+
this.get = topLevelUtils.get;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
close() {
|
|
46
|
+
return this.baseDB.close();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
readLock<T>(fn: (tx: PowerSyncLockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
50
|
+
return this.baseDB.readLock((dbTx) => fn(this.generateDBHelpers(this.generateContext(dbTx))), options);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
readTransaction<T>(fn: (tx: PowerSyncTransaction) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
54
|
+
return this.baseDB.readTransaction((dbTx) => fn(this.generateDBHelpers(this.generateContext(dbTx))), options);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
writeLock<T>(fn: (tx: PowerSyncLockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
58
|
+
return this.baseDB.writeLock((dbTx) => fn(this.generateDBHelpers(this.generateContext(dbTx))), options);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
writeTransaction<T>(fn: (tx: PowerSyncTransaction) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
62
|
+
return this.baseDB.writeTransaction((dbTx) => fn(this.generateDBHelpers(this.generateContext(dbTx))), options);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
execute(query: string, params?: any[]) {
|
|
66
|
+
return this.baseDB.execute(query, params);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 'executeRaw' is not implemented in RNQS, this falls back to 'execute'.
|
|
71
|
+
*/
|
|
72
|
+
async executeRaw(query: string, params?: any[]): Promise<any[][]> {
|
|
73
|
+
const result = await this.baseDB.execute(query, params);
|
|
74
|
+
const rows = result.rows?._array ?? [];
|
|
75
|
+
return rows.map((row) => Object.values(row));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async executeBatch(query: string, params: any[][] = []): Promise<QueryResult> {
|
|
79
|
+
const commands: any[] = [];
|
|
80
|
+
|
|
81
|
+
for (let i = 0; i < params.length; i++) {
|
|
82
|
+
commands.push([query, params[i]]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const result = await this.baseDB.executeBatch(commands);
|
|
86
|
+
return {
|
|
87
|
+
rowsAffected: result.rowsAffected ? result.rowsAffected : 0
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
generateContext<T extends RNQSLockContext>(ctx: T) {
|
|
92
|
+
return {
|
|
93
|
+
...ctx,
|
|
94
|
+
// 'executeRaw' is not implemented in RNQS, this falls back to 'execute'.
|
|
95
|
+
executeRaw: async (sql: string, params?: any[]) => {
|
|
96
|
+
const result = await ctx.execute(sql, params);
|
|
97
|
+
const rows = result.rows?._array ?? [];
|
|
98
|
+
return rows.map((row) => Object.values(row));
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* This provides a top-level read only execute method which is executed inside a read-lock.
|
|
105
|
+
* This is necessary since the high level `execute` method uses a write-lock under
|
|
106
|
+
* the hood. Helper methods such as `get`, `getAll` and `getOptional` are read only,
|
|
107
|
+
* and should use this method.
|
|
108
|
+
*/
|
|
109
|
+
private readOnlyExecute(sql: string, params?: any[]) {
|
|
110
|
+
return this.baseDB.readLock((ctx) => ctx.execute(sql, params));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Adds DB get utils to lock contexts and transaction contexts
|
|
115
|
+
* @param tx
|
|
116
|
+
* @returns
|
|
117
|
+
*/
|
|
118
|
+
private generateDBHelpers<T extends { execute: (sql: string, params?: any[]) => Promise<QueryResult> }>(
|
|
119
|
+
tx: T
|
|
120
|
+
): T & DBGetUtils {
|
|
121
|
+
return {
|
|
122
|
+
...tx,
|
|
123
|
+
/**
|
|
124
|
+
* Execute a read-only query and return results
|
|
125
|
+
*/
|
|
126
|
+
getAll: async <T>(sql: string, parameters?: any[]): Promise<T[]> => {
|
|
127
|
+
const res = await tx.execute(sql, parameters);
|
|
128
|
+
return res.rows?._array ?? [];
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Execute a read-only query and return the first result, or null if the ResultSet is empty.
|
|
133
|
+
*/
|
|
134
|
+
getOptional: async <T>(sql: string, parameters?: any[]): Promise<T | null> => {
|
|
135
|
+
const res = await tx.execute(sql, parameters);
|
|
136
|
+
return res.rows?.item(0) ?? null;
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Execute a read-only query and return the first result, error if the ResultSet is empty.
|
|
141
|
+
*/
|
|
142
|
+
get: async <T>(sql: string, parameters?: any[]): Promise<T> => {
|
|
143
|
+
const res = await tx.execute(sql, parameters);
|
|
144
|
+
const first = res.rows?.item(0);
|
|
145
|
+
if (!first) {
|
|
146
|
+
throw new Error('Result set is empty');
|
|
147
|
+
}
|
|
148
|
+
return first;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async refreshSchema() {
|
|
154
|
+
await this.baseDB.refreshSchema();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AbstractPowerSyncDatabase,
|
|
3
|
+
AbstractPowerSyncDatabaseOpenFactory,
|
|
4
|
+
DBAdapter,
|
|
5
|
+
PowerSyncDatabaseOptions,
|
|
6
|
+
PowerSyncOpenFactoryOptions,
|
|
7
|
+
SQLOpenFactory
|
|
8
|
+
} from '@powersync/common';
|
|
9
|
+
import { PowerSyncDatabase } from '../../../db/PowerSyncDatabase';
|
|
10
|
+
import { ReactNativeQuickSqliteOpenFactory } from './ReactNativeQuickSQLiteOpenFactory';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated {@link PowerSyncDatabase} can now be constructed directly
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const powersync = new PowerSyncDatabase({
|
|
17
|
+
* database: {
|
|
18
|
+
* dbFileName: 'powersync.db'
|
|
19
|
+
* }
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class RNQSPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseOpenFactory {
|
|
24
|
+
protected instanceGenerated: boolean;
|
|
25
|
+
protected sqlOpenFactory: SQLOpenFactory;
|
|
26
|
+
|
|
27
|
+
constructor(options: PowerSyncOpenFactoryOptions) {
|
|
28
|
+
super(options);
|
|
29
|
+
this.instanceGenerated = false;
|
|
30
|
+
this.sqlOpenFactory = new ReactNativeQuickSqliteOpenFactory(options);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected openDB(): DBAdapter {
|
|
34
|
+
return this.sqlOpenFactory.openDB();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
generateInstance(options: PowerSyncDatabaseOptions): AbstractPowerSyncDatabase {
|
|
38
|
+
if (this.instanceGenerated) {
|
|
39
|
+
this.options.logger?.warn('Generating multiple PowerSync instances can sometimes cause unexpected results.');
|
|
40
|
+
}
|
|
41
|
+
this.instanceGenerated = true;
|
|
42
|
+
return new PowerSyncDatabase(options);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { DBAdapter, SQLOpenFactory, SQLOpenOptions } from '@powersync/common';
|
|
2
|
+
import { RNQSDBAdapter } from './RNQSDBAdapter';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Opens a SQLite connection using React Native Quick SQLite
|
|
6
|
+
*/
|
|
7
|
+
export class ReactNativeQuickSqliteOpenFactory implements SQLOpenFactory {
|
|
8
|
+
constructor(protected options: SQLOpenOptions) {}
|
|
9
|
+
|
|
10
|
+
openDB(): DBAdapter {
|
|
11
|
+
/**
|
|
12
|
+
* React Native Quick SQLite opens files relative to the `Documents`dir on iOS and the `Files`
|
|
13
|
+
* dir on Android. Locations need to be relative to those dirs using with dot ("../") notation
|
|
14
|
+
* to navigate up the directory tree.
|
|
15
|
+
* This simple adapter assumes any platform specific relative directory is already catered for
|
|
16
|
+
* in the options (if provided)
|
|
17
|
+
* https://github.com/margelo/react-native-quick-sqlite/blob/main/README.md#loading-existing-dbs
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
var rnqs = require('@journeyapps/react-native-quick-sqlite');
|
|
22
|
+
} catch (e) {
|
|
23
|
+
throw new Error(`Could not resolve @journeyapps/react-native-quick-sqlite.
|
|
24
|
+
To open databases with React Native Quick SQLite please install @journeyapps/react-native-quick-sqlite.`);
|
|
25
|
+
}
|
|
26
|
+
const { dbFilename } = this.options;
|
|
27
|
+
const openOptions = { location: this.options.dbLocation };
|
|
28
|
+
let DB;
|
|
29
|
+
try {
|
|
30
|
+
// Hot reloads can sometimes clear global JS state, but not close DB on native side
|
|
31
|
+
DB = rnqs.open(dbFilename, openOptions);
|
|
32
|
+
} catch (ex) {
|
|
33
|
+
if (ex.message.includes('already open')) {
|
|
34
|
+
rnqs.QuickSQLite.close(dbFilename);
|
|
35
|
+
DB = rnqs.open(dbFilename, openOptions);
|
|
36
|
+
} else {
|
|
37
|
+
throw ex;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return new RNQSDBAdapter(DB, this.options.dbFilename);
|
|
42
|
+
}
|
|
43
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Re export to only require one import in client side code
|
|
2
|
+
export * from '@powersync/common';
|
|
3
|
+
export * from '@powersync/react';
|
|
4
|
+
|
|
5
|
+
export * from './db/PowerSyncDatabase';
|
|
6
|
+
export * from './db/adapters/react-native-quick-sqlite/RNQSDBAdapter';
|
|
7
|
+
export * from './db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory';
|
|
8
|
+
export * from './sync/stream/ReactNativeRemote';
|
|
9
|
+
export * from './sync/stream/ReactNativeStreamingSyncImplementation';
|
|
10
|
+
export * from './db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PowerSyncControlCommand, SqliteBucketStorage } from '@powersync/common';
|
|
2
|
+
|
|
3
|
+
export class ReactNativeBucketStorageAdapter extends SqliteBucketStorage {
|
|
4
|
+
control(op: PowerSyncControlCommand, payload: string | Uint8Array | ArrayBuffer | null): Promise<string> {
|
|
5
|
+
if (payload instanceof Uint8Array) {
|
|
6
|
+
// RNQS doesn't accept Uint8Array arguments - convert to ArrayBuffer first.
|
|
7
|
+
payload = uint8ArrayToArrayBuffer(payload);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return super.control(op, payload);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function uint8ArrayToArrayBuffer(array: Uint8Array): ArrayBuffer {
|
|
15
|
+
// SharedArrayBuffer isn't defined on ReactNative, so don't need to cater for that.
|
|
16
|
+
const arrayBuffer = array.buffer as ArrayBuffer;
|
|
17
|
+
if (array.byteOffset == 0 && array.byteLength == arrayBuffer.byteLength) {
|
|
18
|
+
// No copying needed - can use ArrayBuffer as-is
|
|
19
|
+
return arrayBuffer;
|
|
20
|
+
} else {
|
|
21
|
+
// Need to make a copy
|
|
22
|
+
return arrayBuffer.slice(array.byteOffset, array.byteOffset + array.byteLength);
|
|
23
|
+
}
|
|
24
|
+
}
|