@powersync/capacitor 0.5.1 → 0.5.2
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/esm/adapter/CapacitorSQLiteAdapter.d.ts +1 -2
- package/dist/esm/adapter/CapacitorSQLiteAdapter.js +6 -7
- package/dist/esm/adapter/CapacitorSQLiteAdapter.js.map +1 -1
- package/dist/esm/sync/CapacitorSyncImplementation.js +3 -8
- package/dist/esm/sync/CapacitorSyncImplementation.js.map +1 -1
- package/dist/plugin.cjs +11 -16
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +1 -2
- package/dist/plugin.js +13 -17
- package/dist/plugin.js.map +1 -1
- package/package.json +2 -5
- package/src/adapter/CapacitorSQLiteAdapter.ts +24 -32
- package/src/sync/CapacitorSyncImplementation.ts +3 -7
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { SQLiteDBConnection } from '@capacitor-community/sqlite';
|
|
2
|
-
import { BaseObserver, ConnectionPool, DBAdapterListener, DBLockOptions, LockContext, QueryResult, Transaction } from '@powersync/web';
|
|
3
|
-
import { Mutex } from 'async-mutex';
|
|
2
|
+
import { BaseObserver, ConnectionPool, DBAdapterListener, DBLockOptions, LockContext, Mutex, QueryResult, Transaction } from '@powersync/web';
|
|
4
3
|
import { CapacitorSQLiteOpenFactoryOptions } from './CapacitorSQLiteOpenFactory.js';
|
|
5
4
|
declare class CapacitorConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
6
5
|
protected options: CapacitorSQLiteOpenFactoryOptions;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';
|
|
2
2
|
import { Capacitor } from '@capacitor/core';
|
|
3
|
-
import { BaseObserver, DBAdapterDefaultMixin,
|
|
4
|
-
import { Mutex } from 'async-mutex';
|
|
3
|
+
import { BaseObserver, DBAdapterDefaultMixin, Mutex, timeoutSignal } from '@powersync/web';
|
|
5
4
|
import { PowerSyncCore } from '../plugin/PowerSyncCore.js';
|
|
6
5
|
import { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';
|
|
7
6
|
import { DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';
|
|
@@ -186,13 +185,13 @@ class CapacitorConnectionPool extends BaseObserver {
|
|
|
186
185
|
};
|
|
187
186
|
}
|
|
188
187
|
readLock(fn, options) {
|
|
189
|
-
return
|
|
188
|
+
return this.readMutex.runExclusive(async () => {
|
|
190
189
|
await this.initializedPromise;
|
|
191
|
-
return
|
|
192
|
-
}, options);
|
|
190
|
+
return fn(this.generateLockContext(this.readConnection));
|
|
191
|
+
}, timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));
|
|
193
192
|
}
|
|
194
193
|
writeLock(fn, options) {
|
|
195
|
-
return
|
|
194
|
+
return this.writeMutex.runExclusive(async () => {
|
|
196
195
|
var _a;
|
|
197
196
|
await this.initializedPromise;
|
|
198
197
|
const result = await fn(this.generateLockContext(this.writeConnection));
|
|
@@ -209,7 +208,7 @@ class CapacitorConnectionPool extends BaseObserver {
|
|
|
209
208
|
};
|
|
210
209
|
this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });
|
|
211
210
|
return result;
|
|
212
|
-
}, options);
|
|
211
|
+
}, timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));
|
|
213
212
|
}
|
|
214
213
|
refreshSchema() {
|
|
215
214
|
return this.writeLock(async (writeTx) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CapacitorSQLiteAdapter.js","sourceRoot":"","sources":["../../../src/adapter/CapacitorSQLiteAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { CapacitorSQLite, SQLiteConnection, SQLiteDBConnection } from '@capacitor-community/sqlite';\nimport { Capacitor } from '@capacitor/core';\n\nimport {\n BaseObserver,\n BatchedUpdateNotification,\n ConnectionPool,\n DBAdapter,\n DBAdapterDefaultMixin,\n DBAdapterListener,\n DBLockOptions,\n LockContext,\n mutexRunExclusive,\n QueryResult,\n Transaction\n} from '@powersync/web';\nimport { Mutex } from 'async-mutex';\nimport { PowerSyncCore } from '../plugin/PowerSyncCore.js';\nimport { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';\nimport { CapacitorSQLiteOpenFactoryOptions, DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';\n/**\n * Monitors the execution time of a query and logs it to the performance timeline.\n */\nasync function monitorQuery(sql: string, executor: () => Promise<QueryResult>): Promise<QueryResult> {\n const start = performance.now();\n try {\n const r = await executor();\n performance.measure(`[SQL] ${sql}`, { start });\n return r;\n } catch (e: any) {\n performance.measure(`[SQL] [ERROR: ${e.message}] ${sql}`, { start });\n throw e;\n }\n}\n\nclass CapacitorConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {\n protected _writeConnection: SQLiteDBConnection | null;\n protected _readConnection: SQLiteDBConnection | null;\n protected initializedPromise: Promise<void>;\n protected writeMutex: Mutex;\n protected readMutex: Mutex;\n\n constructor(protected options: CapacitorSQLiteOpenFactoryOptions) {\n super();\n this._writeConnection = null;\n this._readConnection = null;\n this.writeMutex = new Mutex();\n this.readMutex = new Mutex();\n this.initializedPromise = this.init();\n }\n\n protected get writeConnection(): SQLiteDBConnection {\n if (!this._writeConnection) {\n throw new Error('Init not completed yet');\n }\n return this._writeConnection;\n }\n\n protected get readConnection(): SQLiteDBConnection {\n if (!this._readConnection) {\n throw new Error('Init not completed yet');\n }\n return this._readConnection;\n }\n\n get name() {\n return this.options.dbFilename;\n }\n\n private async init() {\n const { responseCode: registrationResponseCode } = await PowerSyncCore.registerCore();\n if (registrationResponseCode != 0) {\n throw new Error(`Could not register PowerSync core extension: ${messageForErrorCode(registrationResponseCode)}`);\n }\n\n const sqlite = new SQLiteConnection(CapacitorSQLite);\n\n // It seems like the isConnection and retrieveConnection methods\n // only check a JS side map of connections.\n // On hot reload this JS cache can be cleared, while the connection\n // still exists natively. and `createConnection` will fail if it already exists.\n await sqlite.closeConnection(this.options.dbFilename, false).catch(() => {});\n await sqlite.closeConnection(this.options.dbFilename, true).catch(() => {});\n\n // TODO support encryption eventually\n this._writeConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, false);\n this._readConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, true);\n\n await this._writeConnection.open();\n\n const { cacheSizeKb, journalSizeLimit, synchronous } = { ...DEFAULT_SQLITE_OPTIONS, ...this.options.sqliteOptions };\n\n await this.writeConnection.query('PRAGMA journal_mode = WAL');\n await this.writeConnection.query(`PRAGMA journal_size_limit = ${journalSizeLimit}`);\n await this.writeConnection.query(`PRAGMA temp_store = memory`);\n await this.writeConnection.query(`PRAGMA synchronous = ${synchronous}`);\n await this.writeConnection.query(`PRAGMA cache_size = -${cacheSizeKb}`);\n\n await this._readConnection.open();\n\n const platform = Capacitor.getPlatform();\n if (platform == 'android') {\n /**\n * SQLCipher for Android enables dynamic loading of extensions.\n * On iOS we use a static auto extension registration.\n */\n const extensionQuery = \"SELECT load_extension('libpowersync.so', 'sqlite3_powersync_init')\";\n await this.writeConnection.query(extensionQuery);\n await this.readConnection.query(extensionQuery);\n }\n await this.writeConnection.query(\"SELECT powersync_update_hooks('install')\");\n }\n\n async close(): Promise<void> {\n await this.initializedPromise;\n await this.writeConnection.close();\n await this.readConnection.close();\n }\n\n protected generateLockContext(db: SQLiteDBConnection): LockContext {\n const _query = async (query: string, params: any[] = []) => {\n const result = await db.query(query, params);\n const arrayResult = result.values ?? [];\n return {\n rowsAffected: 0,\n rows: {\n _array: arrayResult,\n length: arrayResult.length,\n item: (idx: number) => arrayResult[idx]\n }\n };\n };\n\n const _execute = async (query: string, params: any[] = []): Promise<QueryResult> => {\n const platform = Capacitor.getPlatform();\n\n if (db.getConnectionReadOnly()) {\n return _query(query, params);\n }\n\n if (platform == 'android') {\n // Android: use query for SELECT and executeSet for mutations\n // We cannot use `run` here for both cases.\n if (query.toLowerCase().trim().startsWith('select')) {\n return _query(query, params);\n } else {\n const result = await db.executeSet([{ statement: query, values: params }], false);\n return {\n insertId: result.changes?.lastId,\n rowsAffected: result.changes?.changes ?? 0,\n rows: {\n _array: [],\n length: 0,\n item: () => null\n }\n };\n }\n }\n\n // iOS (and other platforms): use run(\"all\")\n const result = await db.run(query, params, false, 'all');\n const resultSet = result.changes?.values ?? [];\n return {\n insertId: result.changes?.lastId,\n rowsAffected: result.changes?.changes ?? 0,\n rows: {\n _array: resultSet,\n length: resultSet.length,\n item: (idx) => resultSet[idx]\n }\n };\n };\n\n const execute = this.options.debugMode\n ? (sql: string, params?: any[]) => monitorQuery(sql, () => _execute(sql, params))\n : _execute;\n\n const executeQuery = this.options.debugMode\n ? (sql: string, params?: any[]) => monitorQuery(sql, () => _query(sql, params))\n : _query;\n\n const getAll = async <T>(query: string, params?: any[]): Promise<T[]> => {\n const result = await executeQuery(query, params);\n return result.rows?._array ?? ([] as T[]);\n };\n\n const getOptional = async <T>(query: string, params?: any[]): Promise<T | null> => {\n const results = await getAll<T>(query, params);\n return results.length > 0 ? results[0] : null;\n };\n\n const get = async <T>(query: string, params?: any[]): Promise<T> => {\n const result = await getOptional<T>(query, params);\n if (!result) {\n throw new Error(`No results for query: ${query}`);\n }\n return result;\n };\n\n const executeRaw = async (query: string, params?: any[]): Promise<any[][]> => {\n // This is a workaround, we don't support multiple columns of the same name\n const results = await execute(query, params);\n return results.rows?._array.map((row) => Object.values(row)) ?? [];\n };\n\n const executeBatch = async (query: string, params: any[][] = []): Promise<QueryResult> => {\n let result = await db.executeSet(\n params.map((param) => ({\n statement: query,\n values: param\n }))\n );\n\n return {\n rowsAffected: result.changes?.changes ?? 0,\n insertId: result.changes?.lastId\n };\n };\n\n return {\n getAll,\n getOptional,\n get,\n executeRaw,\n execute,\n executeBatch\n };\n }\n\n readLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return mutexRunExclusive(\n this.readMutex,\n async () => {\n await this.initializedPromise;\n return await fn(this.generateLockContext(this.readConnection));\n },\n options\n );\n }\n\n writeLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return mutexRunExclusive(\n this.writeMutex,\n async () => {\n await this.initializedPromise;\n const result = await fn(this.generateLockContext(this.writeConnection));\n\n // Fetch table updates\n const updates = await this.writeConnection.query(\"SELECT powersync_update_hooks('get') AS table_name\");\n const jsonUpdates = updates.values?.[0];\n if (!jsonUpdates || !jsonUpdates.table_name) {\n throw new Error('Could not fetch table updates');\n }\n const notification: BatchedUpdateNotification = {\n rawUpdates: [],\n tables: JSON.parse(jsonUpdates.table_name),\n groupedUpdates: {}\n };\n this.iterateListeners((l) => l.tablesUpdated?.(notification));\n return result;\n },\n options\n );\n }\n\n refreshSchema(): Promise<void> {\n return this.writeLock(async (writeTx) => {\n return this.readLock(async (readTx) => {\n const updateQuery = `PRAGMA table_info('sqlite_master')`;\n await writeTx.get(updateQuery);\n await readTx.get(updateQuery);\n });\n });\n }\n}\n\n/**\n * An implementation of {@link DBAdapter} using the Capacitor Community SQLite [plugin](https://github.com/capacitor-community/sqlite).\n *\n * @experimental\n * @alpha This is currently experimental and may change without a major version bump.\n */\nexport class CapacitorSQLiteAdapter extends DBAdapterDefaultMixin(CapacitorConnectionPool) {}\n"]}
|
|
1
|
+
{"version":3,"file":"CapacitorSQLiteAdapter.js","sourceRoot":"","sources":["../../../src/adapter/CapacitorSQLiteAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { CapacitorSQLite, SQLiteConnection, SQLiteDBConnection } from '@capacitor-community/sqlite';\nimport { Capacitor } from '@capacitor/core';\n\nimport {\n BaseObserver,\n BatchedUpdateNotification,\n ConnectionPool,\n DBAdapter,\n DBAdapterDefaultMixin,\n DBAdapterListener,\n DBLockOptions,\n LockContext,\n Mutex,\n QueryResult,\n timeoutSignal,\n Transaction\n} from '@powersync/web';\nimport { PowerSyncCore } from '../plugin/PowerSyncCore.js';\nimport { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';\nimport { CapacitorSQLiteOpenFactoryOptions, DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';\n/**\n * Monitors the execution time of a query and logs it to the performance timeline.\n */\nasync function monitorQuery(sql: string, executor: () => Promise<QueryResult>): Promise<QueryResult> {\n const start = performance.now();\n try {\n const r = await executor();\n performance.measure(`[SQL] ${sql}`, { start });\n return r;\n } catch (e: any) {\n performance.measure(`[SQL] [ERROR: ${e.message}] ${sql}`, { start });\n throw e;\n }\n}\n\nclass CapacitorConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {\n protected _writeConnection: SQLiteDBConnection | null;\n protected _readConnection: SQLiteDBConnection | null;\n protected initializedPromise: Promise<void>;\n protected writeMutex: Mutex;\n protected readMutex: Mutex;\n\n constructor(protected options: CapacitorSQLiteOpenFactoryOptions) {\n super();\n this._writeConnection = null;\n this._readConnection = null;\n this.writeMutex = new Mutex();\n this.readMutex = new Mutex();\n this.initializedPromise = this.init();\n }\n\n protected get writeConnection(): SQLiteDBConnection {\n if (!this._writeConnection) {\n throw new Error('Init not completed yet');\n }\n return this._writeConnection;\n }\n\n protected get readConnection(): SQLiteDBConnection {\n if (!this._readConnection) {\n throw new Error('Init not completed yet');\n }\n return this._readConnection;\n }\n\n get name() {\n return this.options.dbFilename;\n }\n\n private async init() {\n const { responseCode: registrationResponseCode } = await PowerSyncCore.registerCore();\n if (registrationResponseCode != 0) {\n throw new Error(`Could not register PowerSync core extension: ${messageForErrorCode(registrationResponseCode)}`);\n }\n\n const sqlite = new SQLiteConnection(CapacitorSQLite);\n\n // It seems like the isConnection and retrieveConnection methods\n // only check a JS side map of connections.\n // On hot reload this JS cache can be cleared, while the connection\n // still exists natively. and `createConnection` will fail if it already exists.\n await sqlite.closeConnection(this.options.dbFilename, false).catch(() => {});\n await sqlite.closeConnection(this.options.dbFilename, true).catch(() => {});\n\n // TODO support encryption eventually\n this._writeConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, false);\n this._readConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, true);\n\n await this._writeConnection.open();\n\n const { cacheSizeKb, journalSizeLimit, synchronous } = { ...DEFAULT_SQLITE_OPTIONS, ...this.options.sqliteOptions };\n\n await this.writeConnection.query('PRAGMA journal_mode = WAL');\n await this.writeConnection.query(`PRAGMA journal_size_limit = ${journalSizeLimit}`);\n await this.writeConnection.query(`PRAGMA temp_store = memory`);\n await this.writeConnection.query(`PRAGMA synchronous = ${synchronous}`);\n await this.writeConnection.query(`PRAGMA cache_size = -${cacheSizeKb}`);\n\n await this._readConnection.open();\n\n const platform = Capacitor.getPlatform();\n if (platform == 'android') {\n /**\n * SQLCipher for Android enables dynamic loading of extensions.\n * On iOS we use a static auto extension registration.\n */\n const extensionQuery = \"SELECT load_extension('libpowersync.so', 'sqlite3_powersync_init')\";\n await this.writeConnection.query(extensionQuery);\n await this.readConnection.query(extensionQuery);\n }\n await this.writeConnection.query(\"SELECT powersync_update_hooks('install')\");\n }\n\n async close(): Promise<void> {\n await this.initializedPromise;\n await this.writeConnection.close();\n await this.readConnection.close();\n }\n\n protected generateLockContext(db: SQLiteDBConnection): LockContext {\n const _query = async (query: string, params: any[] = []) => {\n const result = await db.query(query, params);\n const arrayResult = result.values ?? [];\n return {\n rowsAffected: 0,\n rows: {\n _array: arrayResult,\n length: arrayResult.length,\n item: (idx: number) => arrayResult[idx]\n }\n };\n };\n\n const _execute = async (query: string, params: any[] = []): Promise<QueryResult> => {\n const platform = Capacitor.getPlatform();\n\n if (db.getConnectionReadOnly()) {\n return _query(query, params);\n }\n\n if (platform == 'android') {\n // Android: use query for SELECT and executeSet for mutations\n // We cannot use `run` here for both cases.\n if (query.toLowerCase().trim().startsWith('select')) {\n return _query(query, params);\n } else {\n const result = await db.executeSet([{ statement: query, values: params }], false);\n return {\n insertId: result.changes?.lastId,\n rowsAffected: result.changes?.changes ?? 0,\n rows: {\n _array: [],\n length: 0,\n item: () => null\n }\n };\n }\n }\n\n // iOS (and other platforms): use run(\"all\")\n const result = await db.run(query, params, false, 'all');\n const resultSet = result.changes?.values ?? [];\n return {\n insertId: result.changes?.lastId,\n rowsAffected: result.changes?.changes ?? 0,\n rows: {\n _array: resultSet,\n length: resultSet.length,\n item: (idx) => resultSet[idx]\n }\n };\n };\n\n const execute = this.options.debugMode\n ? (sql: string, params?: any[]) => monitorQuery(sql, () => _execute(sql, params))\n : _execute;\n\n const executeQuery = this.options.debugMode\n ? (sql: string, params?: any[]) => monitorQuery(sql, () => _query(sql, params))\n : _query;\n\n const getAll = async <T>(query: string, params?: any[]): Promise<T[]> => {\n const result = await executeQuery(query, params);\n return result.rows?._array ?? ([] as T[]);\n };\n\n const getOptional = async <T>(query: string, params?: any[]): Promise<T | null> => {\n const results = await getAll<T>(query, params);\n return results.length > 0 ? results[0] : null;\n };\n\n const get = async <T>(query: string, params?: any[]): Promise<T> => {\n const result = await getOptional<T>(query, params);\n if (!result) {\n throw new Error(`No results for query: ${query}`);\n }\n return result;\n };\n\n const executeRaw = async (query: string, params?: any[]): Promise<any[][]> => {\n // This is a workaround, we don't support multiple columns of the same name\n const results = await execute(query, params);\n return results.rows?._array.map((row) => Object.values(row)) ?? [];\n };\n\n const executeBatch = async (query: string, params: any[][] = []): Promise<QueryResult> => {\n let result = await db.executeSet(\n params.map((param) => ({\n statement: query,\n values: param\n }))\n );\n\n return {\n rowsAffected: result.changes?.changes ?? 0,\n insertId: result.changes?.lastId\n };\n };\n\n return {\n getAll,\n getOptional,\n get,\n executeRaw,\n execute,\n executeBatch\n };\n }\n\n readLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return this.readMutex.runExclusive(async () => {\n await this.initializedPromise;\n return fn(this.generateLockContext(this.readConnection));\n }, timeoutSignal(options?.timeoutMs));\n }\n\n writeLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return this.writeMutex.runExclusive(async () => {\n await this.initializedPromise;\n const result = await fn(this.generateLockContext(this.writeConnection));\n\n // Fetch table updates\n const updates = await this.writeConnection.query(\"SELECT powersync_update_hooks('get') AS table_name\");\n const jsonUpdates = updates.values?.[0];\n if (!jsonUpdates || !jsonUpdates.table_name) {\n throw new Error('Could not fetch table updates');\n }\n const notification: BatchedUpdateNotification = {\n rawUpdates: [],\n tables: JSON.parse(jsonUpdates.table_name),\n groupedUpdates: {}\n };\n this.iterateListeners((l) => l.tablesUpdated?.(notification));\n return result;\n }, timeoutSignal(options?.timeoutMs));\n }\n\n refreshSchema(): Promise<void> {\n return this.writeLock(async (writeTx) => {\n return this.readLock(async (readTx) => {\n const updateQuery = `PRAGMA table_info('sqlite_master')`;\n await writeTx.get(updateQuery);\n await readTx.get(updateQuery);\n });\n });\n }\n}\n\n/**\n * An implementation of {@link DBAdapter} using the Capacitor Community SQLite [plugin](https://github.com/capacitor-community/sqlite).\n *\n * @experimental\n * @alpha This is currently experimental and may change without a major version bump.\n */\nexport class CapacitorSQLiteAdapter extends DBAdapterDefaultMixin(CapacitorConnectionPool) {}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { AbstractStreamingSyncImplementation, LockType,
|
|
2
|
-
import { Mutex } from 'async-mutex';
|
|
1
|
+
import { AbstractStreamingSyncImplementation, LockType, Mutex } from '@powersync/web';
|
|
3
2
|
const GLOBAL_MUTEX_STORE = new Map();
|
|
4
3
|
/**
|
|
5
4
|
* Used to identify multiple instances of CapacitorStreamingSyncImplementation
|
|
@@ -40,13 +39,9 @@ export class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncI
|
|
|
40
39
|
const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier);
|
|
41
40
|
mutexRecord.tracking.add(this.instanceId);
|
|
42
41
|
const mutex = mutexRecord.locks[lockOptions.type];
|
|
43
|
-
return
|
|
44
|
-
var _a;
|
|
45
|
-
if ((_a = lockOptions.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
|
|
46
|
-
throw new Error('Aborted');
|
|
47
|
-
}
|
|
42
|
+
return mutex.runExclusive(async () => {
|
|
48
43
|
return await lockOptions.callback();
|
|
49
|
-
});
|
|
44
|
+
}, lockOptions.signal);
|
|
50
45
|
}
|
|
51
46
|
}
|
|
52
47
|
//# sourceMappingURL=CapacitorSyncImplementation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CapacitorSyncImplementation.js","sourceRoot":"","sources":["../../../src/sync/CapacitorSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAe,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"CapacitorSyncImplementation.js","sourceRoot":"","sources":["../../../src/sync/CapacitorSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAe,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAanG,MAAM,kBAAkB,GAA0B,IAAI,GAAG,EAAE,CAAC;AAE5D;;GAEG;AACH,IAAI,kCAAkC,GAAG,CAAC,CAAC;AAE3C,MAAM,OAAO,oCAAqC,SAAQ,mCAAmC;IAA7F;;QACE,yFAAyF;QAC/E,eAAU,GAAG,kCAAkC,EAAE,CAAC;IAuC9D,CAAC;IArCC,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,wDAAwD;QACxD,KAAK,MAAM,UAAU,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YACD,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC7B,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAI,WAA2B;QAC7C,4FAA4F;QAC5F,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAChE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,kBAAkB,CAAC,GAAG,CAAC,cAAc,EAAE;gBACrC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpC,KAAK,EAAE;oBACL,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE;oBAC5B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE;iBAC7B;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;QAC5D,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAElD,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACnC,OAAO,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;QACtC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;CACF","sourcesContent":["import { AbstractStreamingSyncImplementation, LockOptions, LockType, Mutex } from '@powersync/web';\n\ntype MutexMap = {\n /**\n * Used to track the consumers of this Mutex.\n * It should be safe to dispose the Mutex if this is empty.\n */\n tracking: Set<number>;\n locks: {\n [Type in LockType]: Mutex;\n };\n};\n\nconst GLOBAL_MUTEX_STORE: Map<string, MutexMap> = new Map();\n\n/**\n * Used to identify multiple instances of CapacitorStreamingSyncImplementation\n */\nlet _CAPACITOR_STREAMING_SYNC_SEQUENCE = 0;\n\nexport class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n // A unique ID for tacking this specific instance of CapacitorStreamingSyncImplementation\n protected instanceId = _CAPACITOR_STREAMING_SYNC_SEQUENCE++;\n\n async dispose(): Promise<void> {\n await super.dispose();\n\n // Clear up any global mutexes which aren't used anymore\n for (const mutexEntry of GLOBAL_MUTEX_STORE.entries()) {\n const [identifier, mutex] = mutexEntry;\n if (!mutex.tracking.has(this.instanceId)) {\n continue;\n }\n mutex.tracking.delete(this.instanceId);\n if (mutex.tracking.size == 0) {\n GLOBAL_MUTEX_STORE.delete(identifier);\n }\n }\n }\n\n async obtainLock<T>(lockOptions: LockOptions<T>): Promise<T> {\n // If we don't have an identifier for some reason (should not happen), we use a shared Mutex\n const { identifier: baseIdentifier = 'DEFAULT' } = this.options;\n if (!GLOBAL_MUTEX_STORE.has(baseIdentifier)) {\n GLOBAL_MUTEX_STORE.set(baseIdentifier, {\n tracking: new Set([this.instanceId]),\n locks: {\n [LockType.CRUD]: new Mutex(),\n [LockType.SYNC]: new Mutex()\n }\n });\n }\n\n const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier)!;\n mutexRecord.tracking.add(this.instanceId);\n const mutex = mutexRecord.locks[lockOptions.type];\n\n return mutex.runExclusive(async () => {\n return await lockOptions.callback();\n }, lockOptions.signal);\n }\n}\n"]}
|
package/dist/plugin.cjs
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
var sqlite = require('@capacitor-community/sqlite');
|
|
4
4
|
var core = require('@capacitor/core');
|
|
5
5
|
var web$1 = require('@powersync/web');
|
|
6
|
-
var asyncMutex = require('async-mutex');
|
|
7
6
|
|
|
8
7
|
const PowerSyncCore = core.registerPlugin('PowerSync', {
|
|
9
8
|
web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.PowerSyncWeb())
|
|
@@ -59,8 +58,8 @@ class CapacitorConnectionPool extends web$1.BaseObserver {
|
|
|
59
58
|
this.options = options;
|
|
60
59
|
this._writeConnection = null;
|
|
61
60
|
this._readConnection = null;
|
|
62
|
-
this.writeMutex = new
|
|
63
|
-
this.readMutex = new
|
|
61
|
+
this.writeMutex = new web$1.Mutex();
|
|
62
|
+
this.readMutex = new web$1.Mutex();
|
|
64
63
|
this.initializedPromise = this.init();
|
|
65
64
|
}
|
|
66
65
|
get writeConnection() {
|
|
@@ -219,13 +218,13 @@ class CapacitorConnectionPool extends web$1.BaseObserver {
|
|
|
219
218
|
};
|
|
220
219
|
}
|
|
221
220
|
readLock(fn, options) {
|
|
222
|
-
return
|
|
221
|
+
return this.readMutex.runExclusive(async () => {
|
|
223
222
|
await this.initializedPromise;
|
|
224
|
-
return
|
|
225
|
-
}, options);
|
|
223
|
+
return fn(this.generateLockContext(this.readConnection));
|
|
224
|
+
}, web$1.timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));
|
|
226
225
|
}
|
|
227
226
|
writeLock(fn, options) {
|
|
228
|
-
return
|
|
227
|
+
return this.writeMutex.runExclusive(async () => {
|
|
229
228
|
var _a;
|
|
230
229
|
await this.initializedPromise;
|
|
231
230
|
const result = await fn(this.generateLockContext(this.writeConnection));
|
|
@@ -242,7 +241,7 @@ class CapacitorConnectionPool extends web$1.BaseObserver {
|
|
|
242
241
|
};
|
|
243
242
|
this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });
|
|
244
243
|
return result;
|
|
245
|
-
}, options);
|
|
244
|
+
}, web$1.timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));
|
|
246
245
|
}
|
|
247
246
|
refreshSchema() {
|
|
248
247
|
return this.writeLock(async (writeTx) => {
|
|
@@ -295,21 +294,17 @@ class CapacitorStreamingSyncImplementation extends web$1.AbstractStreamingSyncIm
|
|
|
295
294
|
GLOBAL_MUTEX_STORE.set(baseIdentifier, {
|
|
296
295
|
tracking: new Set([this.instanceId]),
|
|
297
296
|
locks: {
|
|
298
|
-
[web$1.LockType.CRUD]: new
|
|
299
|
-
[web$1.LockType.SYNC]: new
|
|
297
|
+
[web$1.LockType.CRUD]: new web$1.Mutex(),
|
|
298
|
+
[web$1.LockType.SYNC]: new web$1.Mutex()
|
|
300
299
|
}
|
|
301
300
|
});
|
|
302
301
|
}
|
|
303
302
|
const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier);
|
|
304
303
|
mutexRecord.tracking.add(this.instanceId);
|
|
305
304
|
const mutex = mutexRecord.locks[lockOptions.type];
|
|
306
|
-
return
|
|
307
|
-
var _a;
|
|
308
|
-
if ((_a = lockOptions.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
|
|
309
|
-
throw new Error('Aborted');
|
|
310
|
-
}
|
|
305
|
+
return mutex.runExclusive(async () => {
|
|
311
306
|
return await lockOptions.callback();
|
|
312
|
-
});
|
|
307
|
+
}, lockOptions.signal);
|
|
313
308
|
}
|
|
314
309
|
}
|
|
315
310
|
|
package/dist/plugin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs","sources":["esm/plugin/PowerSyncCore.js","esm/plugin/PowerSyncPlugin.js","esm/adapter/CapacitorSQLiteOpenFactory.js","esm/adapter/CapacitorSQLiteAdapter.js","esm/sync/CapacitorSyncImplementation.js","esm/PowerSyncDatabase.js","esm/plugin/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nexport const PowerSyncCore = registerPlugin('PowerSync', {\n web: () => import('./web.js').then((m) => new m.PowerSyncWeb())\n});\n//# sourceMappingURL=PowerSyncCore.js.map","export const messageForErrorCode = (code) => {\n switch (code) {\n case 0:\n return 'Success';\n default:\n return `Extension registration failed with SQLite error code: ${code}`;\n }\n};\n//# sourceMappingURL=PowerSyncPlugin.js.map","import { CapacitorSQLiteAdapter } from './CapacitorSQLiteAdapter.js';\nvar SqliteSynchronous;\n(function (SqliteSynchronous) {\n SqliteSynchronous[\"normal\"] = \"NORMAL\";\n SqliteSynchronous[\"full\"] = \"FULL\";\n SqliteSynchronous[\"off\"] = \"OFF\";\n})(SqliteSynchronous || (SqliteSynchronous = {}));\nexport const DEFAULT_SQLITE_OPTIONS = {\n journalSizeLimit: 6 * 1024 * 1024,\n synchronous: SqliteSynchronous.normal,\n cacheSizeKb: 50 * 1024\n};\nexport class CapacitorSQLiteOpenFactory {\n constructor(options) {\n this.options = options;\n }\n openDB() {\n return new CapacitorSQLiteAdapter(this.options);\n }\n}\n//# sourceMappingURL=CapacitorSQLiteOpenFactory.js.map","import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';\nimport { Capacitor } from '@capacitor/core';\nimport { BaseObserver, DBAdapterDefaultMixin, mutexRunExclusive } from '@powersync/web';\nimport { Mutex } from 'async-mutex';\nimport { PowerSyncCore } from '../plugin/PowerSyncCore.js';\nimport { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';\nimport { DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';\n/**\n * Monitors the execution time of a query and logs it to the performance timeline.\n */\nasync function monitorQuery(sql, executor) {\n const start = performance.now();\n try {\n const r = await executor();\n performance.measure(`[SQL] ${sql}`, { start });\n return r;\n }\n catch (e) {\n performance.measure(`[SQL] [ERROR: ${e.message}] ${sql}`, { start });\n throw e;\n }\n}\nclass CapacitorConnectionPool extends BaseObserver {\n constructor(options) {\n super();\n this.options = options;\n this._writeConnection = null;\n this._readConnection = null;\n this.writeMutex = new Mutex();\n this.readMutex = new Mutex();\n this.initializedPromise = this.init();\n }\n get writeConnection() {\n if (!this._writeConnection) {\n throw new Error('Init not completed yet');\n }\n return this._writeConnection;\n }\n get readConnection() {\n if (!this._readConnection) {\n throw new Error('Init not completed yet');\n }\n return this._readConnection;\n }\n get name() {\n return this.options.dbFilename;\n }\n async init() {\n const { responseCode: registrationResponseCode } = await PowerSyncCore.registerCore();\n if (registrationResponseCode != 0) {\n throw new Error(`Could not register PowerSync core extension: ${messageForErrorCode(registrationResponseCode)}`);\n }\n const sqlite = new SQLiteConnection(CapacitorSQLite);\n // It seems like the isConnection and retrieveConnection methods\n // only check a JS side map of connections.\n // On hot reload this JS cache can be cleared, while the connection\n // still exists natively. and `createConnection` will fail if it already exists.\n await sqlite.closeConnection(this.options.dbFilename, false).catch(() => { });\n await sqlite.closeConnection(this.options.dbFilename, true).catch(() => { });\n // TODO support encryption eventually\n this._writeConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, false);\n this._readConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, true);\n await this._writeConnection.open();\n const { cacheSizeKb, journalSizeLimit, synchronous } = Object.assign(Object.assign({}, DEFAULT_SQLITE_OPTIONS), this.options.sqliteOptions);\n await this.writeConnection.query('PRAGMA journal_mode = WAL');\n await this.writeConnection.query(`PRAGMA journal_size_limit = ${journalSizeLimit}`);\n await this.writeConnection.query(`PRAGMA temp_store = memory`);\n await this.writeConnection.query(`PRAGMA synchronous = ${synchronous}`);\n await this.writeConnection.query(`PRAGMA cache_size = -${cacheSizeKb}`);\n await this._readConnection.open();\n const platform = Capacitor.getPlatform();\n if (platform == 'android') {\n /**\n * SQLCipher for Android enables dynamic loading of extensions.\n * On iOS we use a static auto extension registration.\n */\n const extensionQuery = \"SELECT load_extension('libpowersync.so', 'sqlite3_powersync_init')\";\n await this.writeConnection.query(extensionQuery);\n await this.readConnection.query(extensionQuery);\n }\n await this.writeConnection.query(\"SELECT powersync_update_hooks('install')\");\n }\n async close() {\n await this.initializedPromise;\n await this.writeConnection.close();\n await this.readConnection.close();\n }\n generateLockContext(db) {\n const _query = async (query, params = []) => {\n var _a;\n const result = await db.query(query, params);\n const arrayResult = (_a = result.values) !== null && _a !== void 0 ? _a : [];\n return {\n rowsAffected: 0,\n rows: {\n _array: arrayResult,\n length: arrayResult.length,\n item: (idx) => arrayResult[idx]\n }\n };\n };\n const _execute = async (query, params = []) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const platform = Capacitor.getPlatform();\n if (db.getConnectionReadOnly()) {\n return _query(query, params);\n }\n if (platform == 'android') {\n // Android: use query for SELECT and executeSet for mutations\n // We cannot use `run` here for both cases.\n if (query.toLowerCase().trim().startsWith('select')) {\n return _query(query, params);\n }\n else {\n const result = await db.executeSet([{ statement: query, values: params }], false);\n return {\n insertId: (_a = result.changes) === null || _a === void 0 ? void 0 : _a.lastId,\n rowsAffected: (_c = (_b = result.changes) === null || _b === void 0 ? void 0 : _b.changes) !== null && _c !== void 0 ? _c : 0,\n rows: {\n _array: [],\n length: 0,\n item: () => null\n }\n };\n }\n }\n // iOS (and other platforms): use run(\"all\")\n const result = await db.run(query, params, false, 'all');\n const resultSet = (_e = (_d = result.changes) === null || _d === void 0 ? void 0 : _d.values) !== null && _e !== void 0 ? _e : [];\n return {\n insertId: (_f = result.changes) === null || _f === void 0 ? void 0 : _f.lastId,\n rowsAffected: (_h = (_g = result.changes) === null || _g === void 0 ? void 0 : _g.changes) !== null && _h !== void 0 ? _h : 0,\n rows: {\n _array: resultSet,\n length: resultSet.length,\n item: (idx) => resultSet[idx]\n }\n };\n };\n const execute = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _execute(sql, params))\n : _execute;\n const executeQuery = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _query(sql, params))\n : _query;\n const getAll = async (query, params) => {\n var _a, _b;\n const result = await executeQuery(query, params);\n return (_b = (_a = result.rows) === null || _a === void 0 ? void 0 : _a._array) !== null && _b !== void 0 ? _b : [];\n };\n const getOptional = async (query, params) => {\n const results = await getAll(query, params);\n return results.length > 0 ? results[0] : null;\n };\n const get = async (query, params) => {\n const result = await getOptional(query, params);\n if (!result) {\n throw new Error(`No results for query: ${query}`);\n }\n return result;\n };\n const executeRaw = async (query, params) => {\n var _a, _b;\n // This is a workaround, we don't support multiple columns of the same name\n const results = await execute(query, params);\n return (_b = (_a = results.rows) === null || _a === void 0 ? void 0 : _a._array.map((row) => Object.values(row))) !== null && _b !== void 0 ? _b : [];\n };\n const executeBatch = async (query, params = []) => {\n var _a, _b, _c;\n let result = await db.executeSet(params.map((param) => ({\n statement: query,\n values: param\n })));\n return {\n rowsAffected: (_b = (_a = result.changes) === null || _a === void 0 ? void 0 : _a.changes) !== null && _b !== void 0 ? _b : 0,\n insertId: (_c = result.changes) === null || _c === void 0 ? void 0 : _c.lastId\n };\n };\n return {\n getAll,\n getOptional,\n get,\n executeRaw,\n execute,\n executeBatch\n };\n }\n readLock(fn, options) {\n return mutexRunExclusive(this.readMutex, async () => {\n await this.initializedPromise;\n return await fn(this.generateLockContext(this.readConnection));\n }, options);\n }\n writeLock(fn, options) {\n return mutexRunExclusive(this.writeMutex, async () => {\n var _a;\n await this.initializedPromise;\n const result = await fn(this.generateLockContext(this.writeConnection));\n // Fetch table updates\n const updates = await this.writeConnection.query(\"SELECT powersync_update_hooks('get') AS table_name\");\n const jsonUpdates = (_a = updates.values) === null || _a === void 0 ? void 0 : _a[0];\n if (!jsonUpdates || !jsonUpdates.table_name) {\n throw new Error('Could not fetch table updates');\n }\n const notification = {\n rawUpdates: [],\n tables: JSON.parse(jsonUpdates.table_name),\n groupedUpdates: {}\n };\n this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });\n return result;\n }, options);\n }\n refreshSchema() {\n return this.writeLock(async (writeTx) => {\n return this.readLock(async (readTx) => {\n const updateQuery = `PRAGMA table_info('sqlite_master')`;\n await writeTx.get(updateQuery);\n await readTx.get(updateQuery);\n });\n });\n }\n}\n/**\n * An implementation of {@link DBAdapter} using the Capacitor Community SQLite [plugin](https://github.com/capacitor-community/sqlite).\n *\n * @experimental\n * @alpha This is currently experimental and may change without a major version bump.\n */\nexport class CapacitorSQLiteAdapter extends DBAdapterDefaultMixin(CapacitorConnectionPool) {\n}\n//# sourceMappingURL=CapacitorSQLiteAdapter.js.map","import { AbstractStreamingSyncImplementation, LockType, mutexRunExclusive } from '@powersync/web';\nimport { Mutex } from 'async-mutex';\nconst GLOBAL_MUTEX_STORE = new Map();\n/**\n * Used to identify multiple instances of CapacitorStreamingSyncImplementation\n */\nlet _CAPACITOR_STREAMING_SYNC_SEQUENCE = 0;\nexport class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n constructor() {\n super(...arguments);\n // A unique ID for tacking this specific instance of CapacitorStreamingSyncImplementation\n this.instanceId = _CAPACITOR_STREAMING_SYNC_SEQUENCE++;\n }\n async dispose() {\n await super.dispose();\n // Clear up any global mutexes which aren't used anymore\n for (const mutexEntry of GLOBAL_MUTEX_STORE.entries()) {\n const [identifier, mutex] = mutexEntry;\n if (!mutex.tracking.has(this.instanceId)) {\n continue;\n }\n mutex.tracking.delete(this.instanceId);\n if (mutex.tracking.size == 0) {\n GLOBAL_MUTEX_STORE.delete(identifier);\n }\n }\n }\n async obtainLock(lockOptions) {\n // If we don't have an identifier for some reason (should not happen), we use a shared Mutex\n const { identifier: baseIdentifier = 'DEFAULT' } = this.options;\n if (!GLOBAL_MUTEX_STORE.has(baseIdentifier)) {\n GLOBAL_MUTEX_STORE.set(baseIdentifier, {\n tracking: new Set([this.instanceId]),\n locks: {\n [LockType.CRUD]: new Mutex(),\n [LockType.SYNC]: new Mutex()\n }\n });\n }\n const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier);\n mutexRecord.tracking.add(this.instanceId);\n const mutex = mutexRecord.locks[lockOptions.type];\n return mutexRunExclusive(mutex, async () => {\n var _a;\n if ((_a = lockOptions.signal) === null || _a === void 0 ? void 0 : _a.aborted) {\n throw new Error('Aborted');\n }\n return await lockOptions.callback();\n });\n }\n}\n//# sourceMappingURL=CapacitorSyncImplementation.js.map","import { Capacitor } from '@capacitor/core';\nimport { MEMORY_TRIGGER_CLAIM_MANAGER, PowerSyncDatabase as WebPowerSyncDatabase, WebRemote } from '@powersync/web';\nimport { CapacitorSQLiteAdapter } from './adapter/CapacitorSQLiteAdapter.js';\nimport { CapacitorStreamingSyncImplementation } from './sync/CapacitorSyncImplementation.js';\n/**\n * PowerSyncDatabase class for managing database connections and sync implementations.\n * This extends the WebPowerSyncDatabase to provide platform-specific implementations\n * for Capacitor environments (iOS and Android).\n *\n * @experimental\n * @alpha\n */\nexport class PowerSyncDatabase extends WebPowerSyncDatabase {\n get isNativeCapacitorPlatform() {\n const platform = Capacitor.getPlatform();\n return platform == 'ios' || platform == 'android';\n }\n openDBAdapter(options) {\n var _a, _b, _c;\n const platform = Capacitor.getPlatform();\n if (platform == 'ios' || platform == 'android') {\n if (options.database.dbLocation) {\n (_a = options.logger) === null || _a === void 0 ? void 0 : _a.warn(`\n dbLocation is ignored on iOS and Android platforms. \n The database directory can be configured in the Capacitor project.\n See https://github.com/capacitor-community/sqlite?tab=readme-ov-file#installation`);\n }\n (_b = options.logger) === null || _b === void 0 ? void 0 : _b.debug(`Using CapacitorSQLiteAdapter for platform: ${platform}`);\n return new CapacitorSQLiteAdapter(Object.assign({}, options.database));\n }\n else {\n (_c = options.logger) === null || _c === void 0 ? void 0 : _c.debug(`Using default web adapter for web platform`);\n return super.openDBAdapter(options);\n }\n }\n generateTriggerManagerConfig() {\n const config = super.generateTriggerManagerConfig();\n if (this.isNativeCapacitorPlatform) {\n /**\n * We usually only ever have a single tab for capacitor.\n * Avoiding navigator locks allows insecure contexts (during development).\n */\n config.claimManager = MEMORY_TRIGGER_CLAIM_MANAGER;\n }\n return config;\n }\n runExclusive(cb) {\n if (this.isNativeCapacitorPlatform) {\n // Use mutex for mobile platforms.\n // This is mainly for testing purposes since navigator.locks require secure contexts.\n return this.runExclusiveMutex.runExclusive(cb);\n }\n else {\n // Use navigator.locks for web platform\n return super.runExclusive(cb);\n }\n }\n generateSyncStreamImplementation(connector, options) {\n var _a;\n if (this.isNativeCapacitorPlatform) {\n // We don't want to support multi-tab on mobile platforms.\n // We technically can, but it's not a common use case and requires additional work/testing.\n this.logger.debug(`Using Capacitor sync implementation`);\n if ((_a = this.options.flags) === null || _a === void 0 ? void 0 : _a.enableMultiTabs) {\n this.logger.warn(`enableMultiTabs is not supported on Capacitor mobile platforms. Ignoring the flag.`);\n }\n const remote = new WebRemote(connector, this.logger);\n return new CapacitorStreamingSyncImplementation(Object.assign(Object.assign({}, this.options), { retryDelayMs: options.retryDelayMs, crudUploadThrottleMs: options.crudUploadThrottleMs, adapter: this.bucketStorageAdapter, remote, uploadCrud: async () => {\n await this.waitForReady();\n await connector.uploadData(this);\n }, identifier: this.database.name, logger: this.logger, subscriptions: options.subscriptions }));\n }\n else {\n this.logger.debug(`Using default web sync implementation for web platform`);\n return super.generateSyncStreamImplementation(connector, options);\n }\n }\n}\n//# sourceMappingURL=PowerSyncDatabase.js.map","import { WebPlugin } from '@capacitor/core';\nexport class PowerSyncWeb extends WebPlugin {\n async registerCore() {\n throw new Error('This code path is not supported on web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","BaseObserver","Mutex","sqlite","SQLiteConnection","CapacitorSQLite","Capacitor","mutexRunExclusive","DBAdapterDefaultMixin","AbstractStreamingSyncImplementation","LockType","WebPowerSyncDatabase","MEMORY_TRIGGER_CLAIM_MANAGER","WebRemote","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs","sources":["esm/plugin/PowerSyncCore.js","esm/plugin/PowerSyncPlugin.js","esm/adapter/CapacitorSQLiteOpenFactory.js","esm/adapter/CapacitorSQLiteAdapter.js","esm/sync/CapacitorSyncImplementation.js","esm/PowerSyncDatabase.js","esm/plugin/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nexport const PowerSyncCore = registerPlugin('PowerSync', {\n web: () => import('./web.js').then((m) => new m.PowerSyncWeb())\n});\n//# sourceMappingURL=PowerSyncCore.js.map","export const messageForErrorCode = (code) => {\n switch (code) {\n case 0:\n return 'Success';\n default:\n return `Extension registration failed with SQLite error code: ${code}`;\n }\n};\n//# sourceMappingURL=PowerSyncPlugin.js.map","import { CapacitorSQLiteAdapter } from './CapacitorSQLiteAdapter.js';\nvar SqliteSynchronous;\n(function (SqliteSynchronous) {\n SqliteSynchronous[\"normal\"] = \"NORMAL\";\n SqliteSynchronous[\"full\"] = \"FULL\";\n SqliteSynchronous[\"off\"] = \"OFF\";\n})(SqliteSynchronous || (SqliteSynchronous = {}));\nexport const DEFAULT_SQLITE_OPTIONS = {\n journalSizeLimit: 6 * 1024 * 1024,\n synchronous: SqliteSynchronous.normal,\n cacheSizeKb: 50 * 1024\n};\nexport class CapacitorSQLiteOpenFactory {\n constructor(options) {\n this.options = options;\n }\n openDB() {\n return new CapacitorSQLiteAdapter(this.options);\n }\n}\n//# sourceMappingURL=CapacitorSQLiteOpenFactory.js.map","import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';\nimport { Capacitor } from '@capacitor/core';\nimport { BaseObserver, DBAdapterDefaultMixin, Mutex, timeoutSignal } from '@powersync/web';\nimport { PowerSyncCore } from '../plugin/PowerSyncCore.js';\nimport { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';\nimport { DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';\n/**\n * Monitors the execution time of a query and logs it to the performance timeline.\n */\nasync function monitorQuery(sql, executor) {\n const start = performance.now();\n try {\n const r = await executor();\n performance.measure(`[SQL] ${sql}`, { start });\n return r;\n }\n catch (e) {\n performance.measure(`[SQL] [ERROR: ${e.message}] ${sql}`, { start });\n throw e;\n }\n}\nclass CapacitorConnectionPool extends BaseObserver {\n constructor(options) {\n super();\n this.options = options;\n this._writeConnection = null;\n this._readConnection = null;\n this.writeMutex = new Mutex();\n this.readMutex = new Mutex();\n this.initializedPromise = this.init();\n }\n get writeConnection() {\n if (!this._writeConnection) {\n throw new Error('Init not completed yet');\n }\n return this._writeConnection;\n }\n get readConnection() {\n if (!this._readConnection) {\n throw new Error('Init not completed yet');\n }\n return this._readConnection;\n }\n get name() {\n return this.options.dbFilename;\n }\n async init() {\n const { responseCode: registrationResponseCode } = await PowerSyncCore.registerCore();\n if (registrationResponseCode != 0) {\n throw new Error(`Could not register PowerSync core extension: ${messageForErrorCode(registrationResponseCode)}`);\n }\n const sqlite = new SQLiteConnection(CapacitorSQLite);\n // It seems like the isConnection and retrieveConnection methods\n // only check a JS side map of connections.\n // On hot reload this JS cache can be cleared, while the connection\n // still exists natively. and `createConnection` will fail if it already exists.\n await sqlite.closeConnection(this.options.dbFilename, false).catch(() => { });\n await sqlite.closeConnection(this.options.dbFilename, true).catch(() => { });\n // TODO support encryption eventually\n this._writeConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, false);\n this._readConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, true);\n await this._writeConnection.open();\n const { cacheSizeKb, journalSizeLimit, synchronous } = Object.assign(Object.assign({}, DEFAULT_SQLITE_OPTIONS), this.options.sqliteOptions);\n await this.writeConnection.query('PRAGMA journal_mode = WAL');\n await this.writeConnection.query(`PRAGMA journal_size_limit = ${journalSizeLimit}`);\n await this.writeConnection.query(`PRAGMA temp_store = memory`);\n await this.writeConnection.query(`PRAGMA synchronous = ${synchronous}`);\n await this.writeConnection.query(`PRAGMA cache_size = -${cacheSizeKb}`);\n await this._readConnection.open();\n const platform = Capacitor.getPlatform();\n if (platform == 'android') {\n /**\n * SQLCipher for Android enables dynamic loading of extensions.\n * On iOS we use a static auto extension registration.\n */\n const extensionQuery = \"SELECT load_extension('libpowersync.so', 'sqlite3_powersync_init')\";\n await this.writeConnection.query(extensionQuery);\n await this.readConnection.query(extensionQuery);\n }\n await this.writeConnection.query(\"SELECT powersync_update_hooks('install')\");\n }\n async close() {\n await this.initializedPromise;\n await this.writeConnection.close();\n await this.readConnection.close();\n }\n generateLockContext(db) {\n const _query = async (query, params = []) => {\n var _a;\n const result = await db.query(query, params);\n const arrayResult = (_a = result.values) !== null && _a !== void 0 ? _a : [];\n return {\n rowsAffected: 0,\n rows: {\n _array: arrayResult,\n length: arrayResult.length,\n item: (idx) => arrayResult[idx]\n }\n };\n };\n const _execute = async (query, params = []) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const platform = Capacitor.getPlatform();\n if (db.getConnectionReadOnly()) {\n return _query(query, params);\n }\n if (platform == 'android') {\n // Android: use query for SELECT and executeSet for mutations\n // We cannot use `run` here for both cases.\n if (query.toLowerCase().trim().startsWith('select')) {\n return _query(query, params);\n }\n else {\n const result = await db.executeSet([{ statement: query, values: params }], false);\n return {\n insertId: (_a = result.changes) === null || _a === void 0 ? void 0 : _a.lastId,\n rowsAffected: (_c = (_b = result.changes) === null || _b === void 0 ? void 0 : _b.changes) !== null && _c !== void 0 ? _c : 0,\n rows: {\n _array: [],\n length: 0,\n item: () => null\n }\n };\n }\n }\n // iOS (and other platforms): use run(\"all\")\n const result = await db.run(query, params, false, 'all');\n const resultSet = (_e = (_d = result.changes) === null || _d === void 0 ? void 0 : _d.values) !== null && _e !== void 0 ? _e : [];\n return {\n insertId: (_f = result.changes) === null || _f === void 0 ? void 0 : _f.lastId,\n rowsAffected: (_h = (_g = result.changes) === null || _g === void 0 ? void 0 : _g.changes) !== null && _h !== void 0 ? _h : 0,\n rows: {\n _array: resultSet,\n length: resultSet.length,\n item: (idx) => resultSet[idx]\n }\n };\n };\n const execute = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _execute(sql, params))\n : _execute;\n const executeQuery = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _query(sql, params))\n : _query;\n const getAll = async (query, params) => {\n var _a, _b;\n const result = await executeQuery(query, params);\n return (_b = (_a = result.rows) === null || _a === void 0 ? void 0 : _a._array) !== null && _b !== void 0 ? _b : [];\n };\n const getOptional = async (query, params) => {\n const results = await getAll(query, params);\n return results.length > 0 ? results[0] : null;\n };\n const get = async (query, params) => {\n const result = await getOptional(query, params);\n if (!result) {\n throw new Error(`No results for query: ${query}`);\n }\n return result;\n };\n const executeRaw = async (query, params) => {\n var _a, _b;\n // This is a workaround, we don't support multiple columns of the same name\n const results = await execute(query, params);\n return (_b = (_a = results.rows) === null || _a === void 0 ? void 0 : _a._array.map((row) => Object.values(row))) !== null && _b !== void 0 ? _b : [];\n };\n const executeBatch = async (query, params = []) => {\n var _a, _b, _c;\n let result = await db.executeSet(params.map((param) => ({\n statement: query,\n values: param\n })));\n return {\n rowsAffected: (_b = (_a = result.changes) === null || _a === void 0 ? void 0 : _a.changes) !== null && _b !== void 0 ? _b : 0,\n insertId: (_c = result.changes) === null || _c === void 0 ? void 0 : _c.lastId\n };\n };\n return {\n getAll,\n getOptional,\n get,\n executeRaw,\n execute,\n executeBatch\n };\n }\n readLock(fn, options) {\n return this.readMutex.runExclusive(async () => {\n await this.initializedPromise;\n return fn(this.generateLockContext(this.readConnection));\n }, timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));\n }\n writeLock(fn, options) {\n return this.writeMutex.runExclusive(async () => {\n var _a;\n await this.initializedPromise;\n const result = await fn(this.generateLockContext(this.writeConnection));\n // Fetch table updates\n const updates = await this.writeConnection.query(\"SELECT powersync_update_hooks('get') AS table_name\");\n const jsonUpdates = (_a = updates.values) === null || _a === void 0 ? void 0 : _a[0];\n if (!jsonUpdates || !jsonUpdates.table_name) {\n throw new Error('Could not fetch table updates');\n }\n const notification = {\n rawUpdates: [],\n tables: JSON.parse(jsonUpdates.table_name),\n groupedUpdates: {}\n };\n this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });\n return result;\n }, timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));\n }\n refreshSchema() {\n return this.writeLock(async (writeTx) => {\n return this.readLock(async (readTx) => {\n const updateQuery = `PRAGMA table_info('sqlite_master')`;\n await writeTx.get(updateQuery);\n await readTx.get(updateQuery);\n });\n });\n }\n}\n/**\n * An implementation of {@link DBAdapter} using the Capacitor Community SQLite [plugin](https://github.com/capacitor-community/sqlite).\n *\n * @experimental\n * @alpha This is currently experimental and may change without a major version bump.\n */\nexport class CapacitorSQLiteAdapter extends DBAdapterDefaultMixin(CapacitorConnectionPool) {\n}\n//# sourceMappingURL=CapacitorSQLiteAdapter.js.map","import { AbstractStreamingSyncImplementation, LockType, Mutex } from '@powersync/web';\nconst GLOBAL_MUTEX_STORE = new Map();\n/**\n * Used to identify multiple instances of CapacitorStreamingSyncImplementation\n */\nlet _CAPACITOR_STREAMING_SYNC_SEQUENCE = 0;\nexport class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n constructor() {\n super(...arguments);\n // A unique ID for tacking this specific instance of CapacitorStreamingSyncImplementation\n this.instanceId = _CAPACITOR_STREAMING_SYNC_SEQUENCE++;\n }\n async dispose() {\n await super.dispose();\n // Clear up any global mutexes which aren't used anymore\n for (const mutexEntry of GLOBAL_MUTEX_STORE.entries()) {\n const [identifier, mutex] = mutexEntry;\n if (!mutex.tracking.has(this.instanceId)) {\n continue;\n }\n mutex.tracking.delete(this.instanceId);\n if (mutex.tracking.size == 0) {\n GLOBAL_MUTEX_STORE.delete(identifier);\n }\n }\n }\n async obtainLock(lockOptions) {\n // If we don't have an identifier for some reason (should not happen), we use a shared Mutex\n const { identifier: baseIdentifier = 'DEFAULT' } = this.options;\n if (!GLOBAL_MUTEX_STORE.has(baseIdentifier)) {\n GLOBAL_MUTEX_STORE.set(baseIdentifier, {\n tracking: new Set([this.instanceId]),\n locks: {\n [LockType.CRUD]: new Mutex(),\n [LockType.SYNC]: new Mutex()\n }\n });\n }\n const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier);\n mutexRecord.tracking.add(this.instanceId);\n const mutex = mutexRecord.locks[lockOptions.type];\n return mutex.runExclusive(async () => {\n return await lockOptions.callback();\n }, lockOptions.signal);\n }\n}\n//# sourceMappingURL=CapacitorSyncImplementation.js.map","import { Capacitor } from '@capacitor/core';\nimport { MEMORY_TRIGGER_CLAIM_MANAGER, PowerSyncDatabase as WebPowerSyncDatabase, WebRemote } from '@powersync/web';\nimport { CapacitorSQLiteAdapter } from './adapter/CapacitorSQLiteAdapter.js';\nimport { CapacitorStreamingSyncImplementation } from './sync/CapacitorSyncImplementation.js';\n/**\n * PowerSyncDatabase class for managing database connections and sync implementations.\n * This extends the WebPowerSyncDatabase to provide platform-specific implementations\n * for Capacitor environments (iOS and Android).\n *\n * @experimental\n * @alpha\n */\nexport class PowerSyncDatabase extends WebPowerSyncDatabase {\n get isNativeCapacitorPlatform() {\n const platform = Capacitor.getPlatform();\n return platform == 'ios' || platform == 'android';\n }\n openDBAdapter(options) {\n var _a, _b, _c;\n const platform = Capacitor.getPlatform();\n if (platform == 'ios' || platform == 'android') {\n if (options.database.dbLocation) {\n (_a = options.logger) === null || _a === void 0 ? void 0 : _a.warn(`\n dbLocation is ignored on iOS and Android platforms. \n The database directory can be configured in the Capacitor project.\n See https://github.com/capacitor-community/sqlite?tab=readme-ov-file#installation`);\n }\n (_b = options.logger) === null || _b === void 0 ? void 0 : _b.debug(`Using CapacitorSQLiteAdapter for platform: ${platform}`);\n return new CapacitorSQLiteAdapter(Object.assign({}, options.database));\n }\n else {\n (_c = options.logger) === null || _c === void 0 ? void 0 : _c.debug(`Using default web adapter for web platform`);\n return super.openDBAdapter(options);\n }\n }\n generateTriggerManagerConfig() {\n const config = super.generateTriggerManagerConfig();\n if (this.isNativeCapacitorPlatform) {\n /**\n * We usually only ever have a single tab for capacitor.\n * Avoiding navigator locks allows insecure contexts (during development).\n */\n config.claimManager = MEMORY_TRIGGER_CLAIM_MANAGER;\n }\n return config;\n }\n runExclusive(cb) {\n if (this.isNativeCapacitorPlatform) {\n // Use mutex for mobile platforms.\n // This is mainly for testing purposes since navigator.locks require secure contexts.\n return this.runExclusiveMutex.runExclusive(cb);\n }\n else {\n // Use navigator.locks for web platform\n return super.runExclusive(cb);\n }\n }\n generateSyncStreamImplementation(connector, options) {\n var _a;\n if (this.isNativeCapacitorPlatform) {\n // We don't want to support multi-tab on mobile platforms.\n // We technically can, but it's not a common use case and requires additional work/testing.\n this.logger.debug(`Using Capacitor sync implementation`);\n if ((_a = this.options.flags) === null || _a === void 0 ? void 0 : _a.enableMultiTabs) {\n this.logger.warn(`enableMultiTabs is not supported on Capacitor mobile platforms. Ignoring the flag.`);\n }\n const remote = new WebRemote(connector, this.logger);\n return new CapacitorStreamingSyncImplementation(Object.assign(Object.assign({}, this.options), { retryDelayMs: options.retryDelayMs, crudUploadThrottleMs: options.crudUploadThrottleMs, adapter: this.bucketStorageAdapter, remote, uploadCrud: async () => {\n await this.waitForReady();\n await connector.uploadData(this);\n }, identifier: this.database.name, logger: this.logger, subscriptions: options.subscriptions }));\n }\n else {\n this.logger.debug(`Using default web sync implementation for web platform`);\n return super.generateSyncStreamImplementation(connector, options);\n }\n }\n}\n//# sourceMappingURL=PowerSyncDatabase.js.map","import { WebPlugin } from '@capacitor/core';\nexport class PowerSyncWeb extends WebPlugin {\n async registerCore() {\n throw new Error('This code path is not supported on web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","BaseObserver","Mutex","sqlite","SQLiteConnection","CapacitorSQLite","Capacitor","timeoutSignal","DBAdapterDefaultMixin","AbstractStreamingSyncImplementation","LockType","WebPowerSyncDatabase","MEMORY_TRIGGER_CLAIM_MANAGER","WebRemote","WebPlugin"],"mappings":";;;;;;AACO,MAAM,aAAa,GAAGA,mBAAc,CAAC,WAAW,EAAE;AACzD,IAAI,GAAG,EAAE,MAAM,mDAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,EAAE;AAClE,CAAC,CAAC;;ACHK,MAAM,mBAAmB,GAAG,CAAC,IAAI,KAAK;AAC7C,IAAI,QAAQ,IAAI;AAChB,QAAQ,KAAK,CAAC;AACd,YAAY,OAAO,SAAS;AAC5B,QAAQ;AACR,YAAY,OAAO,CAAC,sDAAsD,EAAE,IAAI,CAAC,CAAC;AAClF;AACA,CAAC;;ACND,IAAI,iBAAiB;AACrB,CAAC,UAAU,iBAAiB,EAAE;AAC9B,IAAI,iBAAiB,CAAC,QAAQ,CAAC,GAAG,QAAQ;AAC1C,IAAI,iBAAiB,CAAC,MAAM,CAAC,GAAG,MAAM;AACtC,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,KAAK;AACpC,CAAC,EAAE,iBAAiB,KAAK,iBAAiB,GAAG,EAAE,CAAC,CAAC;AAC1C,MAAM,sBAAsB,GAAG;AACtC,IAAI,gBAAgB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;AACrC,IAAI,WAAW,EAAE,iBAAiB,CAAC,MAAM;AACzC,IAAI,WAAW,EAAE,EAAE,GAAG;AACtB,CAAC;AACM,MAAM,0BAA0B,CAAC;AACxC,IAAI,WAAW,CAAC,OAAO,EAAE;AACzB,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO;AAC9B,IAAI;AACJ,IAAI,MAAM,GAAG;AACb,QAAQ,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;AACvD,IAAI;AACJ;;ACbA;AACA;AACA;AACA,eAAe,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE;AAC3C,IAAI,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;AACnC,IAAI,IAAI;AACR,QAAQ,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE;AAClC,QAAQ,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AACtD,QAAQ,OAAO,CAAC;AAChB,IAAI;AACJ,IAAI,OAAO,CAAC,EAAE;AACd,QAAQ,WAAW,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAC5E,QAAQ,MAAM,CAAC;AACf,IAAI;AACJ;AACA,MAAM,uBAAuB,SAASC,kBAAY,CAAC;AACnD,IAAI,WAAW,CAAC,OAAO,EAAE;AACzB,QAAQ,KAAK,EAAE;AACf,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO;AAC9B,QAAQ,IAAI,CAAC,gBAAgB,GAAG,IAAI;AACpC,QAAQ,IAAI,CAAC,eAAe,GAAG,IAAI;AACnC,QAAQ,IAAI,CAAC,UAAU,GAAG,IAAIC,WAAK,EAAE;AACrC,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAIA,WAAK,EAAE;AACpC,QAAQ,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7C,IAAI;AACJ,IAAI,IAAI,eAAe,GAAG;AAC1B,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AACpC,YAAY,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AACrD,QAAQ;AACR,QAAQ,OAAO,IAAI,CAAC,gBAAgB;AACpC,IAAI;AACJ,IAAI,IAAI,cAAc,GAAG;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACnC,YAAY,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AACrD,QAAQ;AACR,QAAQ,OAAO,IAAI,CAAC,eAAe;AACnC,IAAI;AACJ,IAAI,IAAI,IAAI,GAAG;AACf,QAAQ,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU;AACtC,IAAI;AACJ,IAAI,MAAM,IAAI,GAAG;AACjB,QAAQ,MAAM,EAAE,YAAY,EAAE,wBAAwB,EAAE,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE;AAC7F,QAAQ,IAAI,wBAAwB,IAAI,CAAC,EAAE;AAC3C,YAAY,MAAM,IAAI,KAAK,CAAC,CAAC,6CAA6C,EAAE,mBAAmB,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAC5H,QAAQ;AACR,QAAQ,MAAMC,QAAM,GAAG,IAAIC,uBAAgB,CAACC,sBAAe,CAAC;AAC5D;AACA;AACA;AACA;AACA,QAAQ,MAAMF,QAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACrF,QAAQ,MAAMA,QAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACpF;AACA,QAAQ,IAAI,CAAC,gBAAgB,GAAG,MAAMA,QAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,KAAK,CAAC;AACxH,QAAQ,IAAI,CAAC,eAAe,GAAG,MAAMA,QAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,IAAI,CAAC;AACtH,QAAQ,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;AAC1C,QAAQ,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,sBAAsB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;AACnJ,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,2BAA2B,CAAC;AACrE,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,4BAA4B,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC3F,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,0BAA0B,CAAC,CAAC;AACtE,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC;AAC/E,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC;AAC/E,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;AACzC,QAAQ,MAAM,QAAQ,GAAGG,cAAS,CAAC,WAAW,EAAE;AAChD,QAAQ,IAAI,QAAQ,IAAI,SAAS,EAAE;AACnC;AACA;AACA;AACA;AACA,YAAY,MAAM,cAAc,GAAG,oEAAoE;AACvG,YAAY,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC;AAC5D,YAAY,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC;AAC3D,QAAQ;AACR,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,0CAA0C,CAAC;AACpF,IAAI;AACJ,IAAI,MAAM,KAAK,GAAG;AAClB,QAAQ,MAAM,IAAI,CAAC,kBAAkB;AACrC,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC1C,QAAQ,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AACzC,IAAI;AACJ,IAAI,mBAAmB,CAAC,EAAE,EAAE;AAC5B,QAAQ,MAAM,MAAM,GAAG,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK;AACrD,YAAY,IAAI,EAAE;AAClB,YAAY,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;AACxD,YAAY,MAAM,WAAW,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,EAAE;AACxF,YAAY,OAAO;AACnB,gBAAgB,YAAY,EAAE,CAAC;AAC/B,gBAAgB,IAAI,EAAE;AACtB,oBAAoB,MAAM,EAAE,WAAW;AACvC,oBAAoB,MAAM,EAAE,WAAW,CAAC,MAAM;AAC9C,oBAAoB,IAAI,EAAE,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG;AAClD;AACA,aAAa;AACb,QAAQ,CAAC;AACT,QAAQ,MAAM,QAAQ,GAAG,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK;AACvD,YAAY,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAC9C,YAAY,MAAM,QAAQ,GAAGA,cAAS,CAAC,WAAW,EAAE;AACpD,YAAY,IAAI,EAAE,CAAC,qBAAqB,EAAE,EAAE;AAC5C,gBAAgB,OAAO,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;AAC5C,YAAY;AACZ,YAAY,IAAI,QAAQ,IAAI,SAAS,EAAE;AACvC;AACA;AACA,gBAAgB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACrE,oBAAoB,OAAO,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;AAChD,gBAAgB;AAChB,qBAAqB;AACrB,oBAAoB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC;AACrG,oBAAoB,OAAO;AAC3B,wBAAwB,QAAQ,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM;AACtG,wBAAwB,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC;AACrJ,wBAAwB,IAAI,EAAE;AAC9B,4BAA4B,MAAM,EAAE,EAAE;AACtC,4BAA4B,MAAM,EAAE,CAAC;AACrC,4BAA4B,IAAI,EAAE,MAAM;AACxC;AACA,qBAAqB;AACrB,gBAAgB;AAChB,YAAY;AACZ;AACA,YAAY,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;AACpE,YAAY,MAAM,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,EAAE;AAC7I,YAAY,OAAO;AACnB,gBAAgB,QAAQ,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM;AAC9F,gBAAgB,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC;AAC7I,gBAAgB,IAAI,EAAE;AACtB,oBAAoB,MAAM,EAAE,SAAS;AACrC,oBAAoB,MAAM,EAAE,SAAS,CAAC,MAAM;AAC5C,oBAAoB,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG;AAChD;AACA,aAAa;AACb,QAAQ,CAAC;AACT,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AACrC,cAAc,CAAC,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC,GAAG,EAAE,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;AAC5E,cAAc,QAAQ;AACtB,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;AAC1C,cAAc,CAAC,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;AAC1E,cAAc,MAAM;AACpB,QAAQ,MAAM,MAAM,GAAG,OAAO,KAAK,EAAE,MAAM,KAAK;AAChD,YAAY,IAAI,EAAE,EAAE,EAAE;AACtB,YAAY,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;AAC5D,YAAY,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,EAAE;AAC/H,QAAQ,CAAC;AACT,QAAQ,MAAM,WAAW,GAAG,OAAO,KAAK,EAAE,MAAM,KAAK;AACrD,YAAY,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;AACvD,YAAY,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;AACzD,QAAQ,CAAC;AACT,QAAQ,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE,MAAM,KAAK;AAC7C,YAAY,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;AAC3D,YAAY,IAAI,CAAC,MAAM,EAAE;AACzB,gBAAgB,MAAM,IAAI,KAAK,CAAC,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC,CAAC;AACjE,YAAY;AACZ,YAAY,OAAO,MAAM;AACzB,QAAQ,CAAC;AACT,QAAQ,MAAM,UAAU,GAAG,OAAO,KAAK,EAAE,MAAM,KAAK;AACpD,YAAY,IAAI,EAAE,EAAE,EAAE;AACtB;AACA,YAAY,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AACxD,YAAY,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,EAAE;AACjK,QAAQ,CAAC;AACT,QAAQ,MAAM,YAAY,GAAG,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK;AAC3D,YAAY,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;AAC1B,YAAY,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;AACpE,gBAAgB,SAAS,EAAE,KAAK;AAChC,gBAAgB,MAAM,EAAE;AACxB,aAAa,CAAC,CAAC,CAAC;AAChB,YAAY,OAAO;AACnB,gBAAgB,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC;AAC7I,gBAAgB,QAAQ,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;AACxF,aAAa;AACb,QAAQ,CAAC;AACT,QAAQ,OAAO;AACf,YAAY,MAAM;AAClB,YAAY,WAAW;AACvB,YAAY,GAAG;AACf,YAAY,UAAU;AACtB,YAAY,OAAO;AACnB,YAAY;AACZ,SAAS;AACT,IAAI;AACJ,IAAI,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY;AACvD,YAAY,MAAM,IAAI,CAAC,kBAAkB;AACzC,YAAY,OAAO,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACpE,QAAQ,CAAC,EAAEC,mBAAa,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAC9F,IAAI;AACJ,IAAI,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE;AAC3B,QAAQ,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,YAAY;AACxD,YAAY,IAAI,EAAE;AAClB,YAAY,MAAM,IAAI,CAAC,kBAAkB;AACzC,YAAY,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACnF;AACA,YAAY,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,oDAAoD,CAAC;AAClH,YAAY,MAAM,WAAW,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AAChG,YAAY,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AACzD,gBAAgB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;AAChE,YAAY;AACZ,YAAY,MAAM,YAAY,GAAG;AACjC,gBAAgB,UAAU,EAAE,EAAE;AAC9B,gBAAgB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC;AAC1D,gBAAgB,cAAc,EAAE;AAChC,aAAa;AACb,YAAY,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAClJ,YAAY,OAAO,MAAM;AACzB,QAAQ,CAAC,EAAEA,mBAAa,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAC9F,IAAI;AACJ,IAAI,aAAa,GAAG;AACpB,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,OAAO,KAAK;AACjD,YAAY,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,MAAM,KAAK;AACnD,gBAAgB,MAAM,WAAW,GAAG,CAAC,kCAAkC,CAAC;AACxE,gBAAgB,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAC9C,gBAAgB,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;AAC7C,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,sBAAsB,SAASC,2BAAqB,CAAC,uBAAuB,CAAC,CAAC;AAC3F;;ACpOA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE;AACpC;AACA;AACA;AACA,IAAI,kCAAkC,GAAG,CAAC;AACnC,MAAM,oCAAoC,SAASC,yCAAmC,CAAC;AAC9F,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,CAAC,GAAG,SAAS,CAAC;AAC3B;AACA,QAAQ,IAAI,CAAC,UAAU,GAAG,kCAAkC,EAAE;AAC9D,IAAI;AACJ,IAAI,MAAM,OAAO,GAAG;AACpB,QAAQ,MAAM,KAAK,CAAC,OAAO,EAAE;AAC7B;AACA,QAAQ,KAAK,MAAM,UAAU,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE;AAC/D,YAAY,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,UAAU;AAClD,YAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACtD,gBAAgB;AAChB,YAAY;AACZ,YAAY,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE;AAC1C,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC;AACrD,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ,IAAI,MAAM,UAAU,CAAC,WAAW,EAAE;AAClC;AACA,QAAQ,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO;AACvE,QAAQ,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;AACrD,YAAY,kBAAkB,CAAC,GAAG,CAAC,cAAc,EAAE;AACnD,gBAAgB,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACpD,gBAAgB,KAAK,EAAE;AACvB,oBAAoB,CAACC,cAAQ,CAAC,IAAI,GAAG,IAAIR,WAAK,EAAE;AAChD,oBAAoB,CAACQ,cAAQ,CAAC,IAAI,GAAG,IAAIR,WAAK;AAC9C;AACA,aAAa,CAAC;AACd,QAAQ;AACR,QAAQ,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC;AAClE,QAAQ,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;AACjD,QAAQ,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AACzD,QAAQ,OAAO,KAAK,CAAC,YAAY,CAAC,YAAY;AAC9C,YAAY,OAAO,MAAM,WAAW,CAAC,QAAQ,EAAE;AAC/C,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;AAC9B,IAAI;AACJ;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,iBAAiB,SAASS,uBAAoB,CAAC;AAC5D,IAAI,IAAI,yBAAyB,GAAG;AACpC,QAAQ,MAAM,QAAQ,GAAGL,cAAS,CAAC,WAAW,EAAE;AAChD,QAAQ,OAAO,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,SAAS;AACzD,IAAI;AACJ,IAAI,aAAa,CAAC,OAAO,EAAE;AAC3B,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;AACtB,QAAQ,MAAM,QAAQ,GAAGA,cAAS,CAAC,WAAW,EAAE;AAChD,QAAQ,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE;AACxD,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC7C,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;AACnF;AACA;AACA,2FAA2F,CAAC,CAAC;AAC7F,YAAY;AACZ,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,2CAA2C,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzI,YAAY,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AAClF,QAAQ;AACR,aAAa;AACb,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,0CAA0C,CAAC,CAAC;AAC7H,YAAY,OAAO,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC;AAC/C,QAAQ;AACR,IAAI;AACJ,IAAI,4BAA4B,GAAG;AACnC,QAAQ,MAAM,MAAM,GAAG,KAAK,CAAC,4BAA4B,EAAE;AAC3D,QAAQ,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAC5C;AACA;AACA;AACA;AACA,YAAY,MAAM,CAAC,YAAY,GAAGM,kCAA4B;AAC9D,QAAQ;AACR,QAAQ,OAAO,MAAM;AACrB,IAAI;AACJ,IAAI,YAAY,CAAC,EAAE,EAAE;AACrB,QAAQ,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAC5C;AACA;AACA,YAAY,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;AAC1D,QAAQ;AACR,aAAa;AACb;AACA,YAAY,OAAO,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;AACzC,QAAQ;AACR,IAAI;AACJ,IAAI,gCAAgC,CAAC,SAAS,EAAE,OAAO,EAAE;AACzD,QAAQ,IAAI,EAAE;AACd,QAAQ,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAC5C;AACA;AACA,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,mCAAmC,CAAC,CAAC;AACpE,YAAY,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,eAAe,EAAE;AACnG,gBAAgB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,kFAAkF,CAAC,CAAC;AACtH,YAAY;AACZ,YAAY,MAAM,MAAM,GAAG,IAAIC,eAAS,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;AAChE,YAAY,OAAO,IAAI,oCAAoC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY;AACzQ,oBAAoB,MAAM,IAAI,CAAC,YAAY,EAAE;AAC7C,oBAAoB,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;AACpD,gBAAgB,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AAChH,QAAQ;AACR,aAAa;AACb,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,sDAAsD,CAAC,CAAC;AACvF,YAAY,OAAO,KAAK,CAAC,gCAAgC,CAAC,SAAS,EAAE,OAAO,CAAC;AAC7E,QAAQ;AACR,IAAI;AACJ;;AC5EO,MAAM,YAAY,SAASC,cAAS,CAAC;AAC5C,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;AAClE,IAAI;AACJ;;;;;;;;;;;"}
|
package/dist/plugin.d.cts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { SQLiteDBConnection } from '@capacitor-community/sqlite';
|
|
2
|
-
import { SQLOpenOptions, SQLOpenFactory, DBAdapter, Transaction, DBLockOptions, QueryResult, LockContext, DBAdapterListener, BaseObserver, ConnectionPool, PowerSyncDatabase as PowerSyncDatabase$1, WebPowerSyncDatabaseOptionsWithSettings, TriggerManagerConfig, PowerSyncBackendConnector, RequiredAdditionalConnectionOptions, StreamingSyncImplementation } from '@powersync/web';
|
|
3
|
-
import { Mutex } from 'async-mutex';
|
|
2
|
+
import { SQLOpenOptions, SQLOpenFactory, DBAdapter, Transaction, DBLockOptions, QueryResult, LockContext, DBAdapterListener, BaseObserver, ConnectionPool, Mutex, PowerSyncDatabase as PowerSyncDatabase$1, WebPowerSyncDatabaseOptionsWithSettings, TriggerManagerConfig, PowerSyncBackendConnector, RequiredAdditionalConnectionOptions, StreamingSyncImplementation } from '@powersync/web';
|
|
4
3
|
|
|
5
4
|
declare enum SqliteSynchronous {
|
|
6
5
|
normal = "NORMAL",
|
package/dist/plugin.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var capacitorPowerSync = (function (exports, sqlite, core, web$1
|
|
1
|
+
var capacitorPowerSync = (function (exports, sqlite, core, web$1) {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
const PowerSyncCore = core.registerPlugin('PowerSync', {
|
|
@@ -55,8 +55,8 @@ var capacitorPowerSync = (function (exports, sqlite, core, web$1, asyncMutex) {
|
|
|
55
55
|
this.options = options;
|
|
56
56
|
this._writeConnection = null;
|
|
57
57
|
this._readConnection = null;
|
|
58
|
-
this.writeMutex = new
|
|
59
|
-
this.readMutex = new
|
|
58
|
+
this.writeMutex = new web$1.Mutex();
|
|
59
|
+
this.readMutex = new web$1.Mutex();
|
|
60
60
|
this.initializedPromise = this.init();
|
|
61
61
|
}
|
|
62
62
|
get writeConnection() {
|
|
@@ -215,13 +215,13 @@ var capacitorPowerSync = (function (exports, sqlite, core, web$1, asyncMutex) {
|
|
|
215
215
|
};
|
|
216
216
|
}
|
|
217
217
|
readLock(fn, options) {
|
|
218
|
-
return
|
|
218
|
+
return this.readMutex.runExclusive(async () => {
|
|
219
219
|
await this.initializedPromise;
|
|
220
|
-
return
|
|
221
|
-
}, options);
|
|
220
|
+
return fn(this.generateLockContext(this.readConnection));
|
|
221
|
+
}, web$1.timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));
|
|
222
222
|
}
|
|
223
223
|
writeLock(fn, options) {
|
|
224
|
-
return
|
|
224
|
+
return this.writeMutex.runExclusive(async () => {
|
|
225
225
|
var _a;
|
|
226
226
|
await this.initializedPromise;
|
|
227
227
|
const result = await fn(this.generateLockContext(this.writeConnection));
|
|
@@ -238,7 +238,7 @@ var capacitorPowerSync = (function (exports, sqlite, core, web$1, asyncMutex) {
|
|
|
238
238
|
};
|
|
239
239
|
this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });
|
|
240
240
|
return result;
|
|
241
|
-
}, options);
|
|
241
|
+
}, web$1.timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));
|
|
242
242
|
}
|
|
243
243
|
refreshSchema() {
|
|
244
244
|
return this.writeLock(async (writeTx) => {
|
|
@@ -291,21 +291,17 @@ var capacitorPowerSync = (function (exports, sqlite, core, web$1, asyncMutex) {
|
|
|
291
291
|
GLOBAL_MUTEX_STORE.set(baseIdentifier, {
|
|
292
292
|
tracking: new Set([this.instanceId]),
|
|
293
293
|
locks: {
|
|
294
|
-
[web$1.LockType.CRUD]: new
|
|
295
|
-
[web$1.LockType.SYNC]: new
|
|
294
|
+
[web$1.LockType.CRUD]: new web$1.Mutex(),
|
|
295
|
+
[web$1.LockType.SYNC]: new web$1.Mutex()
|
|
296
296
|
}
|
|
297
297
|
});
|
|
298
298
|
}
|
|
299
299
|
const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier);
|
|
300
300
|
mutexRecord.tracking.add(this.instanceId);
|
|
301
301
|
const mutex = mutexRecord.locks[lockOptions.type];
|
|
302
|
-
return
|
|
303
|
-
var _a;
|
|
304
|
-
if ((_a = lockOptions.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
|
|
305
|
-
throw new Error('Aborted');
|
|
306
|
-
}
|
|
302
|
+
return mutex.runExclusive(async () => {
|
|
307
303
|
return await lockOptions.callback();
|
|
308
|
-
});
|
|
304
|
+
}, lockOptions.signal);
|
|
309
305
|
}
|
|
310
306
|
}
|
|
311
307
|
|
|
@@ -401,5 +397,5 @@ var capacitorPowerSync = (function (exports, sqlite, core, web$1, asyncMutex) {
|
|
|
401
397
|
|
|
402
398
|
return exports;
|
|
403
399
|
|
|
404
|
-
})({}, sqlite, capacitorExports, web$1
|
|
400
|
+
})({}, sqlite, capacitorExports, web$1);
|
|
405
401
|
//# sourceMappingURL=plugin.js.map
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/plugin/PowerSyncCore.js","esm/plugin/PowerSyncPlugin.js","esm/adapter/CapacitorSQLiteOpenFactory.js","esm/adapter/CapacitorSQLiteAdapter.js","esm/sync/CapacitorSyncImplementation.js","esm/PowerSyncDatabase.js","esm/plugin/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nexport const PowerSyncCore = registerPlugin('PowerSync', {\n web: () => import('./web.js').then((m) => new m.PowerSyncWeb())\n});\n//# sourceMappingURL=PowerSyncCore.js.map","export const messageForErrorCode = (code) => {\n switch (code) {\n case 0:\n return 'Success';\n default:\n return `Extension registration failed with SQLite error code: ${code}`;\n }\n};\n//# sourceMappingURL=PowerSyncPlugin.js.map","import { CapacitorSQLiteAdapter } from './CapacitorSQLiteAdapter.js';\nvar SqliteSynchronous;\n(function (SqliteSynchronous) {\n SqliteSynchronous[\"normal\"] = \"NORMAL\";\n SqliteSynchronous[\"full\"] = \"FULL\";\n SqliteSynchronous[\"off\"] = \"OFF\";\n})(SqliteSynchronous || (SqliteSynchronous = {}));\nexport const DEFAULT_SQLITE_OPTIONS = {\n journalSizeLimit: 6 * 1024 * 1024,\n synchronous: SqliteSynchronous.normal,\n cacheSizeKb: 50 * 1024\n};\nexport class CapacitorSQLiteOpenFactory {\n constructor(options) {\n this.options = options;\n }\n openDB() {\n return new CapacitorSQLiteAdapter(this.options);\n }\n}\n//# sourceMappingURL=CapacitorSQLiteOpenFactory.js.map","import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';\nimport { Capacitor } from '@capacitor/core';\nimport { BaseObserver, DBAdapterDefaultMixin, mutexRunExclusive } from '@powersync/web';\nimport { Mutex } from 'async-mutex';\nimport { PowerSyncCore } from '../plugin/PowerSyncCore.js';\nimport { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';\nimport { DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';\n/**\n * Monitors the execution time of a query and logs it to the performance timeline.\n */\nasync function monitorQuery(sql, executor) {\n const start = performance.now();\n try {\n const r = await executor();\n performance.measure(`[SQL] ${sql}`, { start });\n return r;\n }\n catch (e) {\n performance.measure(`[SQL] [ERROR: ${e.message}] ${sql}`, { start });\n throw e;\n }\n}\nclass CapacitorConnectionPool extends BaseObserver {\n constructor(options) {\n super();\n this.options = options;\n this._writeConnection = null;\n this._readConnection = null;\n this.writeMutex = new Mutex();\n this.readMutex = new Mutex();\n this.initializedPromise = this.init();\n }\n get writeConnection() {\n if (!this._writeConnection) {\n throw new Error('Init not completed yet');\n }\n return this._writeConnection;\n }\n get readConnection() {\n if (!this._readConnection) {\n throw new Error('Init not completed yet');\n }\n return this._readConnection;\n }\n get name() {\n return this.options.dbFilename;\n }\n async init() {\n const { responseCode: registrationResponseCode } = await PowerSyncCore.registerCore();\n if (registrationResponseCode != 0) {\n throw new Error(`Could not register PowerSync core extension: ${messageForErrorCode(registrationResponseCode)}`);\n }\n const sqlite = new SQLiteConnection(CapacitorSQLite);\n // It seems like the isConnection and retrieveConnection methods\n // only check a JS side map of connections.\n // On hot reload this JS cache can be cleared, while the connection\n // still exists natively. and `createConnection` will fail if it already exists.\n await sqlite.closeConnection(this.options.dbFilename, false).catch(() => { });\n await sqlite.closeConnection(this.options.dbFilename, true).catch(() => { });\n // TODO support encryption eventually\n this._writeConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, false);\n this._readConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, true);\n await this._writeConnection.open();\n const { cacheSizeKb, journalSizeLimit, synchronous } = Object.assign(Object.assign({}, DEFAULT_SQLITE_OPTIONS), this.options.sqliteOptions);\n await this.writeConnection.query('PRAGMA journal_mode = WAL');\n await this.writeConnection.query(`PRAGMA journal_size_limit = ${journalSizeLimit}`);\n await this.writeConnection.query(`PRAGMA temp_store = memory`);\n await this.writeConnection.query(`PRAGMA synchronous = ${synchronous}`);\n await this.writeConnection.query(`PRAGMA cache_size = -${cacheSizeKb}`);\n await this._readConnection.open();\n const platform = Capacitor.getPlatform();\n if (platform == 'android') {\n /**\n * SQLCipher for Android enables dynamic loading of extensions.\n * On iOS we use a static auto extension registration.\n */\n const extensionQuery = \"SELECT load_extension('libpowersync.so', 'sqlite3_powersync_init')\";\n await this.writeConnection.query(extensionQuery);\n await this.readConnection.query(extensionQuery);\n }\n await this.writeConnection.query(\"SELECT powersync_update_hooks('install')\");\n }\n async close() {\n await this.initializedPromise;\n await this.writeConnection.close();\n await this.readConnection.close();\n }\n generateLockContext(db) {\n const _query = async (query, params = []) => {\n var _a;\n const result = await db.query(query, params);\n const arrayResult = (_a = result.values) !== null && _a !== void 0 ? _a : [];\n return {\n rowsAffected: 0,\n rows: {\n _array: arrayResult,\n length: arrayResult.length,\n item: (idx) => arrayResult[idx]\n }\n };\n };\n const _execute = async (query, params = []) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const platform = Capacitor.getPlatform();\n if (db.getConnectionReadOnly()) {\n return _query(query, params);\n }\n if (platform == 'android') {\n // Android: use query for SELECT and executeSet for mutations\n // We cannot use `run` here for both cases.\n if (query.toLowerCase().trim().startsWith('select')) {\n return _query(query, params);\n }\n else {\n const result = await db.executeSet([{ statement: query, values: params }], false);\n return {\n insertId: (_a = result.changes) === null || _a === void 0 ? void 0 : _a.lastId,\n rowsAffected: (_c = (_b = result.changes) === null || _b === void 0 ? void 0 : _b.changes) !== null && _c !== void 0 ? _c : 0,\n rows: {\n _array: [],\n length: 0,\n item: () => null\n }\n };\n }\n }\n // iOS (and other platforms): use run(\"all\")\n const result = await db.run(query, params, false, 'all');\n const resultSet = (_e = (_d = result.changes) === null || _d === void 0 ? void 0 : _d.values) !== null && _e !== void 0 ? _e : [];\n return {\n insertId: (_f = result.changes) === null || _f === void 0 ? void 0 : _f.lastId,\n rowsAffected: (_h = (_g = result.changes) === null || _g === void 0 ? void 0 : _g.changes) !== null && _h !== void 0 ? _h : 0,\n rows: {\n _array: resultSet,\n length: resultSet.length,\n item: (idx) => resultSet[idx]\n }\n };\n };\n const execute = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _execute(sql, params))\n : _execute;\n const executeQuery = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _query(sql, params))\n : _query;\n const getAll = async (query, params) => {\n var _a, _b;\n const result = await executeQuery(query, params);\n return (_b = (_a = result.rows) === null || _a === void 0 ? void 0 : _a._array) !== null && _b !== void 0 ? _b : [];\n };\n const getOptional = async (query, params) => {\n const results = await getAll(query, params);\n return results.length > 0 ? results[0] : null;\n };\n const get = async (query, params) => {\n const result = await getOptional(query, params);\n if (!result) {\n throw new Error(`No results for query: ${query}`);\n }\n return result;\n };\n const executeRaw = async (query, params) => {\n var _a, _b;\n // This is a workaround, we don't support multiple columns of the same name\n const results = await execute(query, params);\n return (_b = (_a = results.rows) === null || _a === void 0 ? void 0 : _a._array.map((row) => Object.values(row))) !== null && _b !== void 0 ? _b : [];\n };\n const executeBatch = async (query, params = []) => {\n var _a, _b, _c;\n let result = await db.executeSet(params.map((param) => ({\n statement: query,\n values: param\n })));\n return {\n rowsAffected: (_b = (_a = result.changes) === null || _a === void 0 ? void 0 : _a.changes) !== null && _b !== void 0 ? _b : 0,\n insertId: (_c = result.changes) === null || _c === void 0 ? void 0 : _c.lastId\n };\n };\n return {\n getAll,\n getOptional,\n get,\n executeRaw,\n execute,\n executeBatch\n };\n }\n readLock(fn, options) {\n return mutexRunExclusive(this.readMutex, async () => {\n await this.initializedPromise;\n return await fn(this.generateLockContext(this.readConnection));\n }, options);\n }\n writeLock(fn, options) {\n return mutexRunExclusive(this.writeMutex, async () => {\n var _a;\n await this.initializedPromise;\n const result = await fn(this.generateLockContext(this.writeConnection));\n // Fetch table updates\n const updates = await this.writeConnection.query(\"SELECT powersync_update_hooks('get') AS table_name\");\n const jsonUpdates = (_a = updates.values) === null || _a === void 0 ? void 0 : _a[0];\n if (!jsonUpdates || !jsonUpdates.table_name) {\n throw new Error('Could not fetch table updates');\n }\n const notification = {\n rawUpdates: [],\n tables: JSON.parse(jsonUpdates.table_name),\n groupedUpdates: {}\n };\n this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });\n return result;\n }, options);\n }\n refreshSchema() {\n return this.writeLock(async (writeTx) => {\n return this.readLock(async (readTx) => {\n const updateQuery = `PRAGMA table_info('sqlite_master')`;\n await writeTx.get(updateQuery);\n await readTx.get(updateQuery);\n });\n });\n }\n}\n/**\n * An implementation of {@link DBAdapter} using the Capacitor Community SQLite [plugin](https://github.com/capacitor-community/sqlite).\n *\n * @experimental\n * @alpha This is currently experimental and may change without a major version bump.\n */\nexport class CapacitorSQLiteAdapter extends DBAdapterDefaultMixin(CapacitorConnectionPool) {\n}\n//# sourceMappingURL=CapacitorSQLiteAdapter.js.map","import { AbstractStreamingSyncImplementation, LockType, mutexRunExclusive } from '@powersync/web';\nimport { Mutex } from 'async-mutex';\nconst GLOBAL_MUTEX_STORE = new Map();\n/**\n * Used to identify multiple instances of CapacitorStreamingSyncImplementation\n */\nlet _CAPACITOR_STREAMING_SYNC_SEQUENCE = 0;\nexport class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n constructor() {\n super(...arguments);\n // A unique ID for tacking this specific instance of CapacitorStreamingSyncImplementation\n this.instanceId = _CAPACITOR_STREAMING_SYNC_SEQUENCE++;\n }\n async dispose() {\n await super.dispose();\n // Clear up any global mutexes which aren't used anymore\n for (const mutexEntry of GLOBAL_MUTEX_STORE.entries()) {\n const [identifier, mutex] = mutexEntry;\n if (!mutex.tracking.has(this.instanceId)) {\n continue;\n }\n mutex.tracking.delete(this.instanceId);\n if (mutex.tracking.size == 0) {\n GLOBAL_MUTEX_STORE.delete(identifier);\n }\n }\n }\n async obtainLock(lockOptions) {\n // If we don't have an identifier for some reason (should not happen), we use a shared Mutex\n const { identifier: baseIdentifier = 'DEFAULT' } = this.options;\n if (!GLOBAL_MUTEX_STORE.has(baseIdentifier)) {\n GLOBAL_MUTEX_STORE.set(baseIdentifier, {\n tracking: new Set([this.instanceId]),\n locks: {\n [LockType.CRUD]: new Mutex(),\n [LockType.SYNC]: new Mutex()\n }\n });\n }\n const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier);\n mutexRecord.tracking.add(this.instanceId);\n const mutex = mutexRecord.locks[lockOptions.type];\n return mutexRunExclusive(mutex, async () => {\n var _a;\n if ((_a = lockOptions.signal) === null || _a === void 0 ? void 0 : _a.aborted) {\n throw new Error('Aborted');\n }\n return await lockOptions.callback();\n });\n }\n}\n//# sourceMappingURL=CapacitorSyncImplementation.js.map","import { Capacitor } from '@capacitor/core';\nimport { MEMORY_TRIGGER_CLAIM_MANAGER, PowerSyncDatabase as WebPowerSyncDatabase, WebRemote } from '@powersync/web';\nimport { CapacitorSQLiteAdapter } from './adapter/CapacitorSQLiteAdapter.js';\nimport { CapacitorStreamingSyncImplementation } from './sync/CapacitorSyncImplementation.js';\n/**\n * PowerSyncDatabase class for managing database connections and sync implementations.\n * This extends the WebPowerSyncDatabase to provide platform-specific implementations\n * for Capacitor environments (iOS and Android).\n *\n * @experimental\n * @alpha\n */\nexport class PowerSyncDatabase extends WebPowerSyncDatabase {\n get isNativeCapacitorPlatform() {\n const platform = Capacitor.getPlatform();\n return platform == 'ios' || platform == 'android';\n }\n openDBAdapter(options) {\n var _a, _b, _c;\n const platform = Capacitor.getPlatform();\n if (platform == 'ios' || platform == 'android') {\n if (options.database.dbLocation) {\n (_a = options.logger) === null || _a === void 0 ? void 0 : _a.warn(`\n dbLocation is ignored on iOS and Android platforms. \n The database directory can be configured in the Capacitor project.\n See https://github.com/capacitor-community/sqlite?tab=readme-ov-file#installation`);\n }\n (_b = options.logger) === null || _b === void 0 ? void 0 : _b.debug(`Using CapacitorSQLiteAdapter for platform: ${platform}`);\n return new CapacitorSQLiteAdapter(Object.assign({}, options.database));\n }\n else {\n (_c = options.logger) === null || _c === void 0 ? void 0 : _c.debug(`Using default web adapter for web platform`);\n return super.openDBAdapter(options);\n }\n }\n generateTriggerManagerConfig() {\n const config = super.generateTriggerManagerConfig();\n if (this.isNativeCapacitorPlatform) {\n /**\n * We usually only ever have a single tab for capacitor.\n * Avoiding navigator locks allows insecure contexts (during development).\n */\n config.claimManager = MEMORY_TRIGGER_CLAIM_MANAGER;\n }\n return config;\n }\n runExclusive(cb) {\n if (this.isNativeCapacitorPlatform) {\n // Use mutex for mobile platforms.\n // This is mainly for testing purposes since navigator.locks require secure contexts.\n return this.runExclusiveMutex.runExclusive(cb);\n }\n else {\n // Use navigator.locks for web platform\n return super.runExclusive(cb);\n }\n }\n generateSyncStreamImplementation(connector, options) {\n var _a;\n if (this.isNativeCapacitorPlatform) {\n // We don't want to support multi-tab on mobile platforms.\n // We technically can, but it's not a common use case and requires additional work/testing.\n this.logger.debug(`Using Capacitor sync implementation`);\n if ((_a = this.options.flags) === null || _a === void 0 ? void 0 : _a.enableMultiTabs) {\n this.logger.warn(`enableMultiTabs is not supported on Capacitor mobile platforms. Ignoring the flag.`);\n }\n const remote = new WebRemote(connector, this.logger);\n return new CapacitorStreamingSyncImplementation(Object.assign(Object.assign({}, this.options), { retryDelayMs: options.retryDelayMs, crudUploadThrottleMs: options.crudUploadThrottleMs, adapter: this.bucketStorageAdapter, remote, uploadCrud: async () => {\n await this.waitForReady();\n await connector.uploadData(this);\n }, identifier: this.database.name, logger: this.logger, subscriptions: options.subscriptions }));\n }\n else {\n this.logger.debug(`Using default web sync implementation for web platform`);\n return super.generateSyncStreamImplementation(connector, options);\n }\n }\n}\n//# sourceMappingURL=PowerSyncDatabase.js.map","import { WebPlugin } from '@capacitor/core';\nexport class PowerSyncWeb extends WebPlugin {\n async registerCore() {\n throw new Error('This code path is not supported on web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","BaseObserver","Mutex","sqlite","SQLiteConnection","CapacitorSQLite","Capacitor","mutexRunExclusive","DBAdapterDefaultMixin","AbstractStreamingSyncImplementation","LockType","WebPowerSyncDatabase","MEMORY_TRIGGER_CLAIM_MANAGER","WebRemote","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/plugin/PowerSyncCore.js","esm/plugin/PowerSyncPlugin.js","esm/adapter/CapacitorSQLiteOpenFactory.js","esm/adapter/CapacitorSQLiteAdapter.js","esm/sync/CapacitorSyncImplementation.js","esm/PowerSyncDatabase.js","esm/plugin/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nexport const PowerSyncCore = registerPlugin('PowerSync', {\n web: () => import('./web.js').then((m) => new m.PowerSyncWeb())\n});\n//# sourceMappingURL=PowerSyncCore.js.map","export const messageForErrorCode = (code) => {\n switch (code) {\n case 0:\n return 'Success';\n default:\n return `Extension registration failed with SQLite error code: ${code}`;\n }\n};\n//# sourceMappingURL=PowerSyncPlugin.js.map","import { CapacitorSQLiteAdapter } from './CapacitorSQLiteAdapter.js';\nvar SqliteSynchronous;\n(function (SqliteSynchronous) {\n SqliteSynchronous[\"normal\"] = \"NORMAL\";\n SqliteSynchronous[\"full\"] = \"FULL\";\n SqliteSynchronous[\"off\"] = \"OFF\";\n})(SqliteSynchronous || (SqliteSynchronous = {}));\nexport const DEFAULT_SQLITE_OPTIONS = {\n journalSizeLimit: 6 * 1024 * 1024,\n synchronous: SqliteSynchronous.normal,\n cacheSizeKb: 50 * 1024\n};\nexport class CapacitorSQLiteOpenFactory {\n constructor(options) {\n this.options = options;\n }\n openDB() {\n return new CapacitorSQLiteAdapter(this.options);\n }\n}\n//# sourceMappingURL=CapacitorSQLiteOpenFactory.js.map","import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';\nimport { Capacitor } from '@capacitor/core';\nimport { BaseObserver, DBAdapterDefaultMixin, Mutex, timeoutSignal } from '@powersync/web';\nimport { PowerSyncCore } from '../plugin/PowerSyncCore.js';\nimport { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';\nimport { DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';\n/**\n * Monitors the execution time of a query and logs it to the performance timeline.\n */\nasync function monitorQuery(sql, executor) {\n const start = performance.now();\n try {\n const r = await executor();\n performance.measure(`[SQL] ${sql}`, { start });\n return r;\n }\n catch (e) {\n performance.measure(`[SQL] [ERROR: ${e.message}] ${sql}`, { start });\n throw e;\n }\n}\nclass CapacitorConnectionPool extends BaseObserver {\n constructor(options) {\n super();\n this.options = options;\n this._writeConnection = null;\n this._readConnection = null;\n this.writeMutex = new Mutex();\n this.readMutex = new Mutex();\n this.initializedPromise = this.init();\n }\n get writeConnection() {\n if (!this._writeConnection) {\n throw new Error('Init not completed yet');\n }\n return this._writeConnection;\n }\n get readConnection() {\n if (!this._readConnection) {\n throw new Error('Init not completed yet');\n }\n return this._readConnection;\n }\n get name() {\n return this.options.dbFilename;\n }\n async init() {\n const { responseCode: registrationResponseCode } = await PowerSyncCore.registerCore();\n if (registrationResponseCode != 0) {\n throw new Error(`Could not register PowerSync core extension: ${messageForErrorCode(registrationResponseCode)}`);\n }\n const sqlite = new SQLiteConnection(CapacitorSQLite);\n // It seems like the isConnection and retrieveConnection methods\n // only check a JS side map of connections.\n // On hot reload this JS cache can be cleared, while the connection\n // still exists natively. and `createConnection` will fail if it already exists.\n await sqlite.closeConnection(this.options.dbFilename, false).catch(() => { });\n await sqlite.closeConnection(this.options.dbFilename, true).catch(() => { });\n // TODO support encryption eventually\n this._writeConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, false);\n this._readConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, true);\n await this._writeConnection.open();\n const { cacheSizeKb, journalSizeLimit, synchronous } = Object.assign(Object.assign({}, DEFAULT_SQLITE_OPTIONS), this.options.sqliteOptions);\n await this.writeConnection.query('PRAGMA journal_mode = WAL');\n await this.writeConnection.query(`PRAGMA journal_size_limit = ${journalSizeLimit}`);\n await this.writeConnection.query(`PRAGMA temp_store = memory`);\n await this.writeConnection.query(`PRAGMA synchronous = ${synchronous}`);\n await this.writeConnection.query(`PRAGMA cache_size = -${cacheSizeKb}`);\n await this._readConnection.open();\n const platform = Capacitor.getPlatform();\n if (platform == 'android') {\n /**\n * SQLCipher for Android enables dynamic loading of extensions.\n * On iOS we use a static auto extension registration.\n */\n const extensionQuery = \"SELECT load_extension('libpowersync.so', 'sqlite3_powersync_init')\";\n await this.writeConnection.query(extensionQuery);\n await this.readConnection.query(extensionQuery);\n }\n await this.writeConnection.query(\"SELECT powersync_update_hooks('install')\");\n }\n async close() {\n await this.initializedPromise;\n await this.writeConnection.close();\n await this.readConnection.close();\n }\n generateLockContext(db) {\n const _query = async (query, params = []) => {\n var _a;\n const result = await db.query(query, params);\n const arrayResult = (_a = result.values) !== null && _a !== void 0 ? _a : [];\n return {\n rowsAffected: 0,\n rows: {\n _array: arrayResult,\n length: arrayResult.length,\n item: (idx) => arrayResult[idx]\n }\n };\n };\n const _execute = async (query, params = []) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const platform = Capacitor.getPlatform();\n if (db.getConnectionReadOnly()) {\n return _query(query, params);\n }\n if (platform == 'android') {\n // Android: use query for SELECT and executeSet for mutations\n // We cannot use `run` here for both cases.\n if (query.toLowerCase().trim().startsWith('select')) {\n return _query(query, params);\n }\n else {\n const result = await db.executeSet([{ statement: query, values: params }], false);\n return {\n insertId: (_a = result.changes) === null || _a === void 0 ? void 0 : _a.lastId,\n rowsAffected: (_c = (_b = result.changes) === null || _b === void 0 ? void 0 : _b.changes) !== null && _c !== void 0 ? _c : 0,\n rows: {\n _array: [],\n length: 0,\n item: () => null\n }\n };\n }\n }\n // iOS (and other platforms): use run(\"all\")\n const result = await db.run(query, params, false, 'all');\n const resultSet = (_e = (_d = result.changes) === null || _d === void 0 ? void 0 : _d.values) !== null && _e !== void 0 ? _e : [];\n return {\n insertId: (_f = result.changes) === null || _f === void 0 ? void 0 : _f.lastId,\n rowsAffected: (_h = (_g = result.changes) === null || _g === void 0 ? void 0 : _g.changes) !== null && _h !== void 0 ? _h : 0,\n rows: {\n _array: resultSet,\n length: resultSet.length,\n item: (idx) => resultSet[idx]\n }\n };\n };\n const execute = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _execute(sql, params))\n : _execute;\n const executeQuery = this.options.debugMode\n ? (sql, params) => monitorQuery(sql, () => _query(sql, params))\n : _query;\n const getAll = async (query, params) => {\n var _a, _b;\n const result = await executeQuery(query, params);\n return (_b = (_a = result.rows) === null || _a === void 0 ? void 0 : _a._array) !== null && _b !== void 0 ? _b : [];\n };\n const getOptional = async (query, params) => {\n const results = await getAll(query, params);\n return results.length > 0 ? results[0] : null;\n };\n const get = async (query, params) => {\n const result = await getOptional(query, params);\n if (!result) {\n throw new Error(`No results for query: ${query}`);\n }\n return result;\n };\n const executeRaw = async (query, params) => {\n var _a, _b;\n // This is a workaround, we don't support multiple columns of the same name\n const results = await execute(query, params);\n return (_b = (_a = results.rows) === null || _a === void 0 ? void 0 : _a._array.map((row) => Object.values(row))) !== null && _b !== void 0 ? _b : [];\n };\n const executeBatch = async (query, params = []) => {\n var _a, _b, _c;\n let result = await db.executeSet(params.map((param) => ({\n statement: query,\n values: param\n })));\n return {\n rowsAffected: (_b = (_a = result.changes) === null || _a === void 0 ? void 0 : _a.changes) !== null && _b !== void 0 ? _b : 0,\n insertId: (_c = result.changes) === null || _c === void 0 ? void 0 : _c.lastId\n };\n };\n return {\n getAll,\n getOptional,\n get,\n executeRaw,\n execute,\n executeBatch\n };\n }\n readLock(fn, options) {\n return this.readMutex.runExclusive(async () => {\n await this.initializedPromise;\n return fn(this.generateLockContext(this.readConnection));\n }, timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));\n }\n writeLock(fn, options) {\n return this.writeMutex.runExclusive(async () => {\n var _a;\n await this.initializedPromise;\n const result = await fn(this.generateLockContext(this.writeConnection));\n // Fetch table updates\n const updates = await this.writeConnection.query(\"SELECT powersync_update_hooks('get') AS table_name\");\n const jsonUpdates = (_a = updates.values) === null || _a === void 0 ? void 0 : _a[0];\n if (!jsonUpdates || !jsonUpdates.table_name) {\n throw new Error('Could not fetch table updates');\n }\n const notification = {\n rawUpdates: [],\n tables: JSON.parse(jsonUpdates.table_name),\n groupedUpdates: {}\n };\n this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });\n return result;\n }, timeoutSignal(options === null || options === void 0 ? void 0 : options.timeoutMs));\n }\n refreshSchema() {\n return this.writeLock(async (writeTx) => {\n return this.readLock(async (readTx) => {\n const updateQuery = `PRAGMA table_info('sqlite_master')`;\n await writeTx.get(updateQuery);\n await readTx.get(updateQuery);\n });\n });\n }\n}\n/**\n * An implementation of {@link DBAdapter} using the Capacitor Community SQLite [plugin](https://github.com/capacitor-community/sqlite).\n *\n * @experimental\n * @alpha This is currently experimental and may change without a major version bump.\n */\nexport class CapacitorSQLiteAdapter extends DBAdapterDefaultMixin(CapacitorConnectionPool) {\n}\n//# sourceMappingURL=CapacitorSQLiteAdapter.js.map","import { AbstractStreamingSyncImplementation, LockType, Mutex } from '@powersync/web';\nconst GLOBAL_MUTEX_STORE = new Map();\n/**\n * Used to identify multiple instances of CapacitorStreamingSyncImplementation\n */\nlet _CAPACITOR_STREAMING_SYNC_SEQUENCE = 0;\nexport class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n constructor() {\n super(...arguments);\n // A unique ID for tacking this specific instance of CapacitorStreamingSyncImplementation\n this.instanceId = _CAPACITOR_STREAMING_SYNC_SEQUENCE++;\n }\n async dispose() {\n await super.dispose();\n // Clear up any global mutexes which aren't used anymore\n for (const mutexEntry of GLOBAL_MUTEX_STORE.entries()) {\n const [identifier, mutex] = mutexEntry;\n if (!mutex.tracking.has(this.instanceId)) {\n continue;\n }\n mutex.tracking.delete(this.instanceId);\n if (mutex.tracking.size == 0) {\n GLOBAL_MUTEX_STORE.delete(identifier);\n }\n }\n }\n async obtainLock(lockOptions) {\n // If we don't have an identifier for some reason (should not happen), we use a shared Mutex\n const { identifier: baseIdentifier = 'DEFAULT' } = this.options;\n if (!GLOBAL_MUTEX_STORE.has(baseIdentifier)) {\n GLOBAL_MUTEX_STORE.set(baseIdentifier, {\n tracking: new Set([this.instanceId]),\n locks: {\n [LockType.CRUD]: new Mutex(),\n [LockType.SYNC]: new Mutex()\n }\n });\n }\n const mutexRecord = GLOBAL_MUTEX_STORE.get(baseIdentifier);\n mutexRecord.tracking.add(this.instanceId);\n const mutex = mutexRecord.locks[lockOptions.type];\n return mutex.runExclusive(async () => {\n return await lockOptions.callback();\n }, lockOptions.signal);\n }\n}\n//# sourceMappingURL=CapacitorSyncImplementation.js.map","import { Capacitor } from '@capacitor/core';\nimport { MEMORY_TRIGGER_CLAIM_MANAGER, PowerSyncDatabase as WebPowerSyncDatabase, WebRemote } from '@powersync/web';\nimport { CapacitorSQLiteAdapter } from './adapter/CapacitorSQLiteAdapter.js';\nimport { CapacitorStreamingSyncImplementation } from './sync/CapacitorSyncImplementation.js';\n/**\n * PowerSyncDatabase class for managing database connections and sync implementations.\n * This extends the WebPowerSyncDatabase to provide platform-specific implementations\n * for Capacitor environments (iOS and Android).\n *\n * @experimental\n * @alpha\n */\nexport class PowerSyncDatabase extends WebPowerSyncDatabase {\n get isNativeCapacitorPlatform() {\n const platform = Capacitor.getPlatform();\n return platform == 'ios' || platform == 'android';\n }\n openDBAdapter(options) {\n var _a, _b, _c;\n const platform = Capacitor.getPlatform();\n if (platform == 'ios' || platform == 'android') {\n if (options.database.dbLocation) {\n (_a = options.logger) === null || _a === void 0 ? void 0 : _a.warn(`\n dbLocation is ignored on iOS and Android platforms. \n The database directory can be configured in the Capacitor project.\n See https://github.com/capacitor-community/sqlite?tab=readme-ov-file#installation`);\n }\n (_b = options.logger) === null || _b === void 0 ? void 0 : _b.debug(`Using CapacitorSQLiteAdapter for platform: ${platform}`);\n return new CapacitorSQLiteAdapter(Object.assign({}, options.database));\n }\n else {\n (_c = options.logger) === null || _c === void 0 ? void 0 : _c.debug(`Using default web adapter for web platform`);\n return super.openDBAdapter(options);\n }\n }\n generateTriggerManagerConfig() {\n const config = super.generateTriggerManagerConfig();\n if (this.isNativeCapacitorPlatform) {\n /**\n * We usually only ever have a single tab for capacitor.\n * Avoiding navigator locks allows insecure contexts (during development).\n */\n config.claimManager = MEMORY_TRIGGER_CLAIM_MANAGER;\n }\n return config;\n }\n runExclusive(cb) {\n if (this.isNativeCapacitorPlatform) {\n // Use mutex for mobile platforms.\n // This is mainly for testing purposes since navigator.locks require secure contexts.\n return this.runExclusiveMutex.runExclusive(cb);\n }\n else {\n // Use navigator.locks for web platform\n return super.runExclusive(cb);\n }\n }\n generateSyncStreamImplementation(connector, options) {\n var _a;\n if (this.isNativeCapacitorPlatform) {\n // We don't want to support multi-tab on mobile platforms.\n // We technically can, but it's not a common use case and requires additional work/testing.\n this.logger.debug(`Using Capacitor sync implementation`);\n if ((_a = this.options.flags) === null || _a === void 0 ? void 0 : _a.enableMultiTabs) {\n this.logger.warn(`enableMultiTabs is not supported on Capacitor mobile platforms. Ignoring the flag.`);\n }\n const remote = new WebRemote(connector, this.logger);\n return new CapacitorStreamingSyncImplementation(Object.assign(Object.assign({}, this.options), { retryDelayMs: options.retryDelayMs, crudUploadThrottleMs: options.crudUploadThrottleMs, adapter: this.bucketStorageAdapter, remote, uploadCrud: async () => {\n await this.waitForReady();\n await connector.uploadData(this);\n }, identifier: this.database.name, logger: this.logger, subscriptions: options.subscriptions }));\n }\n else {\n this.logger.debug(`Using default web sync implementation for web platform`);\n return super.generateSyncStreamImplementation(connector, options);\n }\n }\n}\n//# sourceMappingURL=PowerSyncDatabase.js.map","import { WebPlugin } from '@capacitor/core';\nexport class PowerSyncWeb extends WebPlugin {\n async registerCore() {\n throw new Error('This code path is not supported on web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","BaseObserver","Mutex","sqlite","SQLiteConnection","CapacitorSQLite","Capacitor","timeoutSignal","DBAdapterDefaultMixin","AbstractStreamingSyncImplementation","LockType","WebPowerSyncDatabase","MEMORY_TRIGGER_CLAIM_MANAGER","WebRemote","WebPlugin"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/capacitor",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Adds PowerSync Capacitor support for iOS/Android",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
69
|
"@capacitor-community/sqlite": "^7.0.2",
|
|
70
|
-
"@powersync/web": "^1.
|
|
70
|
+
"@powersync/web": "^1.37.0"
|
|
71
71
|
},
|
|
72
72
|
"swiftlint": "@ionic/swiftlint-config",
|
|
73
73
|
"capacitor": {
|
|
@@ -80,9 +80,6 @@
|
|
|
80
80
|
"src": "android"
|
|
81
81
|
}
|
|
82
82
|
},
|
|
83
|
-
"dependencies": {
|
|
84
|
-
"async-mutex": "^0.5.0"
|
|
85
|
-
},
|
|
86
83
|
"scripts": {
|
|
87
84
|
"verify": "pnpm verify:ios && pnpm verify:android && pnpm verify:web",
|
|
88
85
|
"verify:ios": "cd example-app && npm install && cd ios/App && pod install && xcodebuild -workspace App.xcworkspace -scheme App -destination 'platform=iOS Simulator,name=iPhone 16,OS=latest'",
|
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
DBAdapterListener,
|
|
11
11
|
DBLockOptions,
|
|
12
12
|
LockContext,
|
|
13
|
-
|
|
13
|
+
Mutex,
|
|
14
14
|
QueryResult,
|
|
15
|
+
timeoutSignal,
|
|
15
16
|
Transaction
|
|
16
17
|
} from '@powersync/web';
|
|
17
|
-
import { Mutex } from 'async-mutex';
|
|
18
18
|
import { PowerSyncCore } from '../plugin/PowerSyncCore.js';
|
|
19
19
|
import { messageForErrorCode } from '../plugin/PowerSyncPlugin.js';
|
|
20
20
|
import { CapacitorSQLiteOpenFactoryOptions, DEFAULT_SQLITE_OPTIONS } from './CapacitorSQLiteOpenFactory.js';
|
|
@@ -228,39 +228,31 @@ class CapacitorConnectionPool extends BaseObserver<DBAdapterListener> implements
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
readLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
231
|
-
return
|
|
232
|
-
this.
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
return await fn(this.generateLockContext(this.readConnection));
|
|
236
|
-
},
|
|
237
|
-
options
|
|
238
|
-
);
|
|
231
|
+
return this.readMutex.runExclusive(async () => {
|
|
232
|
+
await this.initializedPromise;
|
|
233
|
+
return fn(this.generateLockContext(this.readConnection));
|
|
234
|
+
}, timeoutSignal(options?.timeoutMs));
|
|
239
235
|
}
|
|
240
236
|
|
|
241
237
|
writeLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
242
|
-
return
|
|
243
|
-
this.
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
return result;
|
|
261
|
-
},
|
|
262
|
-
options
|
|
263
|
-
);
|
|
238
|
+
return this.writeMutex.runExclusive(async () => {
|
|
239
|
+
await this.initializedPromise;
|
|
240
|
+
const result = await fn(this.generateLockContext(this.writeConnection));
|
|
241
|
+
|
|
242
|
+
// Fetch table updates
|
|
243
|
+
const updates = await this.writeConnection.query("SELECT powersync_update_hooks('get') AS table_name");
|
|
244
|
+
const jsonUpdates = updates.values?.[0];
|
|
245
|
+
if (!jsonUpdates || !jsonUpdates.table_name) {
|
|
246
|
+
throw new Error('Could not fetch table updates');
|
|
247
|
+
}
|
|
248
|
+
const notification: BatchedUpdateNotification = {
|
|
249
|
+
rawUpdates: [],
|
|
250
|
+
tables: JSON.parse(jsonUpdates.table_name),
|
|
251
|
+
groupedUpdates: {}
|
|
252
|
+
};
|
|
253
|
+
this.iterateListeners((l) => l.tablesUpdated?.(notification));
|
|
254
|
+
return result;
|
|
255
|
+
}, timeoutSignal(options?.timeoutMs));
|
|
264
256
|
}
|
|
265
257
|
|
|
266
258
|
refreshSchema(): Promise<void> {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { AbstractStreamingSyncImplementation, LockOptions, LockType,
|
|
2
|
-
import { Mutex } from 'async-mutex';
|
|
1
|
+
import { AbstractStreamingSyncImplementation, LockOptions, LockType, Mutex } from '@powersync/web';
|
|
3
2
|
|
|
4
3
|
type MutexMap = {
|
|
5
4
|
/**
|
|
@@ -56,11 +55,8 @@ export class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncI
|
|
|
56
55
|
mutexRecord.tracking.add(this.instanceId);
|
|
57
56
|
const mutex = mutexRecord.locks[lockOptions.type];
|
|
58
57
|
|
|
59
|
-
return
|
|
60
|
-
if (lockOptions.signal?.aborted) {
|
|
61
|
-
throw new Error('Aborted');
|
|
62
|
-
}
|
|
58
|
+
return mutex.runExclusive(async () => {
|
|
63
59
|
return await lockOptions.callback();
|
|
64
|
-
});
|
|
60
|
+
}, lockOptions.signal);
|
|
65
61
|
}
|
|
66
62
|
}
|