@powersync/common 1.31.0 → 1.32.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.
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Adapted from rsocket-websocket-client
3
+ * https://github.com/rsocket/rsocket-js/blob/e224cf379e747c4f1ddc4f2fa111854626cc8575/packages/rsocket-websocket-client/src/WebsocketClientTransport.ts#L17
4
+ * This adds additional error handling for React Native iOS.
5
+ * This particularly adds a close listener to handle cases where the WebSocket
6
+ * connection closes immediately after opening without emitting an error.
7
+ */
8
+ import { Deserializer } from 'rsocket-core';
9
+ import { WebsocketDuplexConnection } from 'rsocket-websocket-client/dist/WebsocketDuplexConnection.js';
10
+ export class WebsocketClientTransport {
11
+ url;
12
+ factory;
13
+ constructor(options) {
14
+ this.url = options.url;
15
+ this.factory = options.wsCreator ?? ((url) => new WebSocket(url));
16
+ }
17
+ connect(multiplexerDemultiplexerFactory) {
18
+ return new Promise((resolve, reject) => {
19
+ const websocket = this.factory(this.url);
20
+ websocket.binaryType = 'arraybuffer';
21
+ let removeListeners;
22
+ const openListener = () => {
23
+ removeListeners();
24
+ resolve(new WebsocketDuplexConnection(websocket, new Deserializer(), multiplexerDemultiplexerFactory));
25
+ };
26
+ const errorListener = (ev) => {
27
+ removeListeners();
28
+ // We add a default error in that case.
29
+ if (ev.error != null) {
30
+ // undici typically provides an error object
31
+ reject(ev.error);
32
+ }
33
+ else if (ev.message != null) {
34
+ // React Native typically does not provide an error object, but does provide a message
35
+ reject(new Error(`Failed to create websocket connection: ${ev.message}`));
36
+ }
37
+ else {
38
+ // Browsers often provide no details at all
39
+ reject(new Error(`Failed to create websocket connection to ${this.url}`));
40
+ }
41
+ };
42
+ /**
43
+ * In some cases, such as React Native iOS, the WebSocket connection may close immediately after opening
44
+ * without and error. In such cases, we need to handle the close event to reject the promise.
45
+ */
46
+ const closeListener = () => {
47
+ removeListeners();
48
+ reject(new Error('WebSocket connection closed while opening'));
49
+ };
50
+ removeListeners = () => {
51
+ websocket.removeEventListener('open', openListener);
52
+ websocket.removeEventListener('error', errorListener);
53
+ websocket.removeEventListener('close', closeListener);
54
+ };
55
+ websocket.addEventListener('open', openListener);
56
+ websocket.addEventListener('error', errorListener);
57
+ websocket.addEventListener('close', closeListener);
58
+ });
59
+ }
60
+ }
@@ -123,7 +123,21 @@ export class SyncStatus {
123
123
  * @returns {boolean} True if the instances are considered equal, false otherwise
124
124
  */
125
125
  isEqual(status) {
126
- return JSON.stringify(this.options) == JSON.stringify(status.options);
126
+ /**
127
+ * By default Error object are serialized to an empty object.
128
+ * This replaces Errors with more useful information before serialization.
129
+ */
130
+ const replacer = (_, value) => {
131
+ if (value instanceof Error) {
132
+ return {
133
+ name: value.name,
134
+ message: value.message,
135
+ stack: value.stack
136
+ };
137
+ }
138
+ return value;
139
+ };
140
+ return JSON.stringify(this.options, replacer) == JSON.stringify(status.options, replacer);
127
141
  }
128
142
  /**
129
143
  * Creates a human-readable string representation of the current sync status.
package/lib/index.d.ts CHANGED
@@ -1,35 +1,34 @@
1
1
  export * from './client/AbstractPowerSyncDatabase.js';
2
2
  export * from './client/AbstractPowerSyncOpenFactory.js';
3
- export * from './client/SQLOpenFactory.js';
3
+ export { compilableQueryWatch, CompilableQueryWatchHandler } from './client/compilableQueryWatch.js';
4
4
  export * from './client/connection/PowerSyncBackendConnector.js';
5
5
  export * from './client/connection/PowerSyncCredentials.js';
6
- export * from './client/sync/bucket/BucketStorageAdapter.js';
6
+ export { MAX_OP_ID } from './client/constants.js';
7
7
  export { runOnSchemaChange } from './client/runOnSchemaChange.js';
8
- export { CompilableQueryWatchHandler, compilableQueryWatch } from './client/compilableQueryWatch.js';
9
- export { UpdateType, CrudEntry, OpId } from './client/sync/bucket/CrudEntry.js';
10
- export * from './client/sync/bucket/SqliteBucketStorage.js';
8
+ export * from './client/SQLOpenFactory.js';
9
+ export * from './client/sync/bucket/BucketStorageAdapter.js';
11
10
  export * from './client/sync/bucket/CrudBatch.js';
11
+ export { CrudEntry, OpId, UpdateType } from './client/sync/bucket/CrudEntry.js';
12
12
  export * from './client/sync/bucket/CrudTransaction.js';
13
+ export * from './client/sync/bucket/OplogEntry.js';
14
+ export * from './client/sync/bucket/OpType.js';
15
+ export * from './client/sync/bucket/SqliteBucketStorage.js';
13
16
  export * from './client/sync/bucket/SyncDataBatch.js';
14
17
  export * from './client/sync/bucket/SyncDataBucket.js';
15
- export * from './client/sync/bucket/OpType.js';
16
- export * from './client/sync/bucket/OplogEntry.js';
17
18
  export * from './client/sync/stream/AbstractRemote.js';
18
19
  export * from './client/sync/stream/AbstractStreamingSyncImplementation.js';
19
20
  export * from './client/sync/stream/streaming-sync-types.js';
20
- export { MAX_OP_ID } from './client/constants.js';
21
+ export * from './client/ConnectionManager.js';
21
22
  export { ProgressWithOperations, SyncProgress } from './db/crud/SyncProgress.js';
22
23
  export * from './db/crud/SyncStatus.js';
23
24
  export * from './db/crud/UploadQueueStatus.js';
24
- export * from './db/schema/Schema.js';
25
- export * from './db/schema/Table.js';
25
+ export * from './db/DBAdapter.js';
26
+ export * from './db/schema/Column.js';
26
27
  export * from './db/schema/Index.js';
27
28
  export * from './db/schema/IndexedColumn.js';
28
- export * from './db/schema/Column.js';
29
+ export * from './db/schema/Schema.js';
30
+ export * from './db/schema/Table.js';
29
31
  export * from './db/schema/TableV2.js';
30
- export * from './db/crud/SyncStatus.js';
31
- export * from './db/crud/UploadQueueStatus.js';
32
- export * from './db/DBAdapter.js';
33
32
  export * from './utils/AbortOperation.js';
34
33
  export * from './utils/BaseObserver.js';
35
34
  export * from './utils/DataStream.js';
package/lib/index.js CHANGED
@@ -1,35 +1,34 @@
1
1
  export * from './client/AbstractPowerSyncDatabase.js';
2
2
  export * from './client/AbstractPowerSyncOpenFactory.js';
3
- export * from './client/SQLOpenFactory.js';
3
+ export { compilableQueryWatch } from './client/compilableQueryWatch.js';
4
4
  export * from './client/connection/PowerSyncBackendConnector.js';
5
5
  export * from './client/connection/PowerSyncCredentials.js';
6
- export * from './client/sync/bucket/BucketStorageAdapter.js';
6
+ export { MAX_OP_ID } from './client/constants.js';
7
7
  export { runOnSchemaChange } from './client/runOnSchemaChange.js';
8
- export { compilableQueryWatch } from './client/compilableQueryWatch.js';
9
- export { UpdateType, CrudEntry } from './client/sync/bucket/CrudEntry.js';
10
- export * from './client/sync/bucket/SqliteBucketStorage.js';
8
+ export * from './client/SQLOpenFactory.js';
9
+ export * from './client/sync/bucket/BucketStorageAdapter.js';
11
10
  export * from './client/sync/bucket/CrudBatch.js';
11
+ export { CrudEntry, UpdateType } from './client/sync/bucket/CrudEntry.js';
12
12
  export * from './client/sync/bucket/CrudTransaction.js';
13
+ export * from './client/sync/bucket/OplogEntry.js';
14
+ export * from './client/sync/bucket/OpType.js';
15
+ export * from './client/sync/bucket/SqliteBucketStorage.js';
13
16
  export * from './client/sync/bucket/SyncDataBatch.js';
14
17
  export * from './client/sync/bucket/SyncDataBucket.js';
15
- export * from './client/sync/bucket/OpType.js';
16
- export * from './client/sync/bucket/OplogEntry.js';
17
18
  export * from './client/sync/stream/AbstractRemote.js';
18
19
  export * from './client/sync/stream/AbstractStreamingSyncImplementation.js';
19
20
  export * from './client/sync/stream/streaming-sync-types.js';
20
- export { MAX_OP_ID } from './client/constants.js';
21
+ export * from './client/ConnectionManager.js';
21
22
  export { SyncProgress } from './db/crud/SyncProgress.js';
22
23
  export * from './db/crud/SyncStatus.js';
23
24
  export * from './db/crud/UploadQueueStatus.js';
24
- export * from './db/schema/Schema.js';
25
- export * from './db/schema/Table.js';
25
+ export * from './db/DBAdapter.js';
26
+ export * from './db/schema/Column.js';
26
27
  export * from './db/schema/Index.js';
27
28
  export * from './db/schema/IndexedColumn.js';
28
- export * from './db/schema/Column.js';
29
+ export * from './db/schema/Schema.js';
30
+ export * from './db/schema/Table.js';
29
31
  export * from './db/schema/TableV2.js';
30
- export * from './db/crud/SyncStatus.js';
31
- export * from './db/crud/UploadQueueStatus.js';
32
- export * from './db/DBAdapter.js';
33
32
  export * from './utils/AbortOperation.js';
34
33
  export * from './utils/BaseObserver.js';
35
34
  export * from './utils/DataStream.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powersync/common",
3
- "version": "1.31.0",
3
+ "version": "1.32.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"