@powersync/react-native 1.25.1 → 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.
Files changed (29) hide show
  1. package/dist/index.js +20450 -3
  2. package/dist/index.js.map +1 -0
  3. package/lib/db/PowerSyncDatabase.js +1 -0
  4. package/lib/db/PowerSyncDatabase.js.map +1 -0
  5. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.js +1 -0
  6. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.js.map +1 -0
  7. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.js +1 -0
  8. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.js.map +1 -0
  9. package/lib/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.js +1 -0
  10. package/lib/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.js.map +1 -0
  11. package/lib/index.js +1 -0
  12. package/lib/index.js.map +1 -0
  13. package/lib/sync/bucket/ReactNativeBucketStorageAdapter.js +1 -0
  14. package/lib/sync/bucket/ReactNativeBucketStorageAdapter.js.map +1 -0
  15. package/lib/sync/stream/ReactNativeRemote.d.ts +2 -0
  16. package/lib/sync/stream/ReactNativeRemote.js +5 -0
  17. package/lib/sync/stream/ReactNativeRemote.js.map +1 -0
  18. package/lib/sync/stream/ReactNativeStreamingSyncImplementation.d.ts +2 -2
  19. package/lib/sync/stream/ReactNativeStreamingSyncImplementation.js +5 -4
  20. package/lib/sync/stream/ReactNativeStreamingSyncImplementation.js.map +1 -0
  21. package/package.json +9 -9
  22. package/src/db/PowerSyncDatabase.ts +63 -0
  23. package/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts +156 -0
  24. package/src/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.ts +44 -0
  25. package/src/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.ts +43 -0
  26. package/src/index.ts +10 -0
  27. package/src/sync/bucket/ReactNativeBucketStorageAdapter.ts +24 -0
  28. package/src/sync/stream/ReactNativeRemote.ts +98 -0
  29. package/src/sync/stream/ReactNativeStreamingSyncImplementation.ts +55 -0
@@ -45,3 +45,4 @@ export class PowerSyncDatabase extends AbstractPowerSyncDatabase {
45
45
  });
46
46
  }
47
47
  }
48
+ //# sourceMappingURL=PowerSyncDatabase.js.map
@@ -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"}
@@ -120,3 +120,4 @@ export class RNQSDBAdapter extends BaseObserver {
120
120
  await this.baseDB.refreshSchema();
121
121
  }
122
122
  }
123
+ //# sourceMappingURL=RNQSDBAdapter.js.map
@@ -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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"}
@@ -31,3 +31,4 @@ export class RNQSPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseO
31
31
  return new PowerSyncDatabase(options);
32
32
  }
33
33
  }
34
+ //# sourceMappingURL=RNQSDBOpenFactory.js.map
@@ -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"}
@@ -42,3 +42,4 @@ To open databases with React Native Quick SQLite please install @journeyapps/rea
42
42
  return new RNQSDBAdapter(DB, this.options.dbFilename);
43
43
  }
44
44
  }
45
+ //# sourceMappingURL=ReactNativeQuickSQLiteOpenFactory.js.map
@@ -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
@@ -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"}
@@ -20,3 +20,4 @@ function uint8ArrayToArrayBuffer(array) {
20
20
  return arrayBuffer.slice(array.byteOffset, array.byteOffset + array.byteLength);
21
21
  }
22
22
  }
23
+ //# sourceMappingURL=ReactNativeBucketStorageAdapter.js.map
@@ -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 Lock from 'async-lock';
2
+ import { Mutex } from 'async-mutex';
3
3
  export declare class ReactNativeStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
4
- locks: Map<LockType, Lock>;
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 Lock from 'async-lock';
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 Lock());
25
- this.locks.set(LockType.SYNC, new Lock());
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.acquire(lockOptions.type, async () => {
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.25.1",
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.40.0",
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
- "@powersync/common": "1.40.0",
39
- "@powersync/react": "1.8.1"
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
- "@types/async-lock": "^1.4.0",
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 --sourceMap false && rollup -c rollup.config.mjs --sourceMap false",
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
+ }