@powersync/capacitor 0.0.0-dev-20250922105508
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/LICENSE +201 -0
- package/README.md +95 -0
- package/android/build.gradle +71 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/powersync_capacitor_jni.c +58 -0
- package/android/src/main/java/com/powersync/capacitor/PowerSync.java +13 -0
- package/android/src/main/java/com/powersync/capacitor/PowerSyncPlugin.java +20 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/dist/docs.json +39 -0
- package/dist/esm/PowerSyncDatabase.d.ts +15 -0
- package/dist/esm/PowerSyncDatabase.js +70 -0
- package/dist/esm/PowerSyncDatabase.js.map +1 -0
- package/dist/esm/adapter/CapacitorSQLiteAdapter.d.ts +35 -0
- package/dist/esm/adapter/CapacitorSQLiteAdapter.js +234 -0
- package/dist/esm/adapter/CapacitorSQLiteAdapter.js.map +1 -0
- package/dist/esm/adapter/CapacitorSQLiteOpenFactory.d.ts +6 -0
- package/dist/esm/adapter/CapacitorSQLiteOpenFactory.js +10 -0
- package/dist/esm/adapter/CapacitorSQLiteOpenFactory.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/plugin/PowerSyncCore.d.ts +2 -0
- package/dist/esm/plugin/PowerSyncCore.js +5 -0
- package/dist/esm/plugin/PowerSyncCore.js.map +1 -0
- package/dist/esm/plugin/PowerSyncPlugin.d.ts +15 -0
- package/dist/esm/plugin/PowerSyncPlugin.js +2 -0
- package/dist/esm/plugin/PowerSyncPlugin.js.map +1 -0
- package/dist/esm/plugin/web.d.ts +5 -0
- package/dist/esm/plugin/web.js +7 -0
- package/dist/esm/plugin/web.js.map +1 -0
- package/dist/esm/sync/CapacitorSyncImplementation.d.ts +7 -0
- package/dist/esm/sync/CapacitorSyncImplementation.js +20 -0
- package/dist/esm/sync/CapacitorSyncImplementation.js.map +1 -0
- package/dist/plugin.cjs.js +349 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +349 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Sources/CPowerSyncCore/PowerSyncCore.c +13 -0
- package/ios/Sources/CPowerSyncCore/include/PowerSyncCore.h +6 -0
- package/ios/Sources/PowerSyncPlugin/PowerSync.swift +7 -0
- package/ios/Sources/PowerSyncPlugin/PowerSyncPlugin.swift +22 -0
- package/ios/Tests/PowerSyncPluginTests/PowerSyncPluginTests.swift +15 -0
- package/package.json +84 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';
|
|
2
|
+
import { BaseObserver } from '@powersync/web';
|
|
3
|
+
import Lock from 'async-lock';
|
|
4
|
+
import { PowerSyncCore } from '../plugin/PowerSyncCore';
|
|
5
|
+
/**
|
|
6
|
+
* An implementation of {@link DBAdapter} using the Capacitor Community SQLite [plugin](https://github.com/capacitor-community/sqlite).
|
|
7
|
+
*
|
|
8
|
+
* @experimental
|
|
9
|
+
* @alpha This is currently experimental and may change without a major version bump.
|
|
10
|
+
*/
|
|
11
|
+
export class CapacitorSQLiteAdapter extends BaseObserver {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super();
|
|
14
|
+
this.options = options;
|
|
15
|
+
this._writeConnection = null;
|
|
16
|
+
this._readConnection = null;
|
|
17
|
+
this.lock = new Lock();
|
|
18
|
+
this.initializedPromise = this.init();
|
|
19
|
+
}
|
|
20
|
+
get writeConnection() {
|
|
21
|
+
if (!this._writeConnection) {
|
|
22
|
+
throw new Error('Init not completed yet');
|
|
23
|
+
}
|
|
24
|
+
return this._writeConnection;
|
|
25
|
+
}
|
|
26
|
+
get readConnection() {
|
|
27
|
+
if (!this._readConnection) {
|
|
28
|
+
throw new Error('Init not completed yet');
|
|
29
|
+
}
|
|
30
|
+
return this._readConnection;
|
|
31
|
+
}
|
|
32
|
+
async init() {
|
|
33
|
+
await PowerSyncCore.registerCore();
|
|
34
|
+
const sqlite = new SQLiteConnection(CapacitorSQLite);
|
|
35
|
+
// It seems like the isConnection and retrieveConnection methods
|
|
36
|
+
// only check a JS side map of connections.
|
|
37
|
+
// On hot reload this JS cache can be cleared, while the connection
|
|
38
|
+
// still exists natively. and `createConnection` will fail if it already exists.
|
|
39
|
+
await sqlite.closeConnection(this.options.dbFilename, false).catch(() => { });
|
|
40
|
+
await sqlite.closeConnection(this.options.dbFilename, true).catch(() => { });
|
|
41
|
+
// TODO support encryption eventually
|
|
42
|
+
this._writeConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, false);
|
|
43
|
+
this._readConnection = await sqlite.createConnection(this.options.dbFilename, false, 'no-encryption', 1, true);
|
|
44
|
+
// TODO validate WAL mode
|
|
45
|
+
await this._writeConnection.open();
|
|
46
|
+
await this._readConnection.open();
|
|
47
|
+
this.writeConnection.query("SELECT powersync_update_hooks('install')");
|
|
48
|
+
}
|
|
49
|
+
async close() {
|
|
50
|
+
await this.initializedPromise;
|
|
51
|
+
await this.writeConnection.close();
|
|
52
|
+
await this.readConnection.close();
|
|
53
|
+
}
|
|
54
|
+
get name() {
|
|
55
|
+
return this.options.dbFilename;
|
|
56
|
+
}
|
|
57
|
+
generateLockContext(db) {
|
|
58
|
+
const execute = async (query, params = []) => {
|
|
59
|
+
var _a, _b, _c, _d;
|
|
60
|
+
// This driver does not support returning results for execute methods
|
|
61
|
+
if (query.toLowerCase().trim().startsWith('select')) {
|
|
62
|
+
let result = await db.query(query, params);
|
|
63
|
+
let arrayResult = (_a = result.values) !== null && _a !== void 0 ? _a : [];
|
|
64
|
+
return {
|
|
65
|
+
rowsAffected: 0,
|
|
66
|
+
rows: {
|
|
67
|
+
_array: arrayResult,
|
|
68
|
+
length: arrayResult.length,
|
|
69
|
+
item: (idx) => arrayResult[idx]
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
let result = await db.executeSet([{ statement: query, values: params }], false);
|
|
75
|
+
return {
|
|
76
|
+
insertId: (_b = result.changes) === null || _b === void 0 ? void 0 : _b.lastId,
|
|
77
|
+
rowsAffected: (_d = (_c = result.changes) === null || _c === void 0 ? void 0 : _c.changes) !== null && _d !== void 0 ? _d : 0,
|
|
78
|
+
rows: {
|
|
79
|
+
_array: [],
|
|
80
|
+
length: 0,
|
|
81
|
+
item: () => null
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const executeQuery = async (query, params) => {
|
|
87
|
+
var _a;
|
|
88
|
+
let result = await db.query(query, params);
|
|
89
|
+
let arrayResult = (_a = result.values) !== null && _a !== void 0 ? _a : [];
|
|
90
|
+
return {
|
|
91
|
+
rowsAffected: 0,
|
|
92
|
+
rows: {
|
|
93
|
+
_array: arrayResult,
|
|
94
|
+
length: arrayResult.length,
|
|
95
|
+
item: (idx) => arrayResult[idx]
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
const getAll = async (query, params) => {
|
|
100
|
+
var _a, _b;
|
|
101
|
+
const result = await executeQuery(query, params);
|
|
102
|
+
return (_b = (_a = result.rows) === null || _a === void 0 ? void 0 : _a._array) !== null && _b !== void 0 ? _b : [];
|
|
103
|
+
};
|
|
104
|
+
const getOptional = async (query, params) => {
|
|
105
|
+
const results = await getAll(query, params);
|
|
106
|
+
return results.length > 0 ? results[0] : null;
|
|
107
|
+
};
|
|
108
|
+
const get = async (query, params) => {
|
|
109
|
+
const result = await getOptional(query, params);
|
|
110
|
+
if (!result) {
|
|
111
|
+
throw new Error(`No results for query: ${query}`);
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
};
|
|
115
|
+
const executeRaw = async (query, params) => {
|
|
116
|
+
throw new Error('Not supported');
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
getAll,
|
|
120
|
+
getOptional,
|
|
121
|
+
get,
|
|
122
|
+
executeRaw,
|
|
123
|
+
execute
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
execute(query, params) {
|
|
127
|
+
return this.writeLock((tx) => tx.execute(query, params));
|
|
128
|
+
}
|
|
129
|
+
executeRaw(query, params) {
|
|
130
|
+
return this.writeLock((tx) => tx.executeRaw(query, params));
|
|
131
|
+
}
|
|
132
|
+
async executeBatch(query, params = []) {
|
|
133
|
+
return this.writeLock(async (tx) => {
|
|
134
|
+
var _a, _b, _c;
|
|
135
|
+
let result = await this.writeConnection.executeSet(params.map((param) => ({
|
|
136
|
+
statement: query,
|
|
137
|
+
values: param
|
|
138
|
+
})));
|
|
139
|
+
return {
|
|
140
|
+
rowsAffected: (_b = (_a = result.changes) === null || _a === void 0 ? void 0 : _a.changes) !== null && _b !== void 0 ? _b : 0,
|
|
141
|
+
insertId: (_c = result.changes) === null || _c === void 0 ? void 0 : _c.lastId
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
readLock(fn, options) {
|
|
146
|
+
return this.lock.acquire('read_lock', async () => {
|
|
147
|
+
await this.initializedPromise;
|
|
148
|
+
return await fn(this.generateLockContext(this.readConnection));
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
readTransaction(fn, options) {
|
|
152
|
+
return this.readLock(async (ctx) => {
|
|
153
|
+
return this.internalTransaction(ctx, fn);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
writeLock(fn, options) {
|
|
157
|
+
return this.lock.acquire('write_lock', async () => {
|
|
158
|
+
var _a;
|
|
159
|
+
await this.initializedPromise;
|
|
160
|
+
const result = await fn(this.generateLockContext(this.writeConnection));
|
|
161
|
+
// Fetch table updates
|
|
162
|
+
const updates = await this.writeConnection.query("SELECT powersync_update_hooks('get') AS table_name");
|
|
163
|
+
const jsonUpdates = (_a = updates.values) === null || _a === void 0 ? void 0 : _a[0];
|
|
164
|
+
if (!jsonUpdates || !jsonUpdates.table_name) {
|
|
165
|
+
throw new Error('Could not fetch table updates');
|
|
166
|
+
}
|
|
167
|
+
const notification = {
|
|
168
|
+
rawUpdates: [],
|
|
169
|
+
tables: JSON.parse(jsonUpdates.table_name),
|
|
170
|
+
groupedUpdates: {}
|
|
171
|
+
};
|
|
172
|
+
this.iterateListeners((l) => { var _a; return (_a = l.tablesUpdated) === null || _a === void 0 ? void 0 : _a.call(l, notification); });
|
|
173
|
+
return result;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
writeTransaction(fn, options) {
|
|
177
|
+
return this.writeLock(async (ctx) => {
|
|
178
|
+
return this.internalTransaction(ctx, fn);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
refreshSchema() {
|
|
182
|
+
return this.writeLock(async (writeTx) => {
|
|
183
|
+
return this.readLock(async (readTx) => {
|
|
184
|
+
const updateQuery = `PRAGMA table_info('sqlite_master')`;
|
|
185
|
+
await writeTx.get(updateQuery);
|
|
186
|
+
await readTx.get(updateQuery);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
getAll(sql, parameters) {
|
|
191
|
+
return this.readLock((tx) => tx.getAll(sql, parameters));
|
|
192
|
+
}
|
|
193
|
+
getOptional(sql, parameters) {
|
|
194
|
+
return this.readLock((tx) => tx.getOptional(sql, parameters));
|
|
195
|
+
}
|
|
196
|
+
get(sql, parameters) {
|
|
197
|
+
return this.readLock((tx) => tx.get(sql, parameters));
|
|
198
|
+
}
|
|
199
|
+
async internalTransaction(ctx, fn) {
|
|
200
|
+
let finalized = false;
|
|
201
|
+
const commit = async () => {
|
|
202
|
+
if (finalized) {
|
|
203
|
+
return { rowsAffected: 0 };
|
|
204
|
+
}
|
|
205
|
+
finalized = true;
|
|
206
|
+
return ctx.execute('COMMIT');
|
|
207
|
+
};
|
|
208
|
+
const rollback = async () => {
|
|
209
|
+
if (finalized) {
|
|
210
|
+
return { rowsAffected: 0 };
|
|
211
|
+
}
|
|
212
|
+
finalized = true;
|
|
213
|
+
return ctx.execute('ROLLBACK');
|
|
214
|
+
};
|
|
215
|
+
try {
|
|
216
|
+
await ctx.execute('BEGIN');
|
|
217
|
+
const result = await fn(Object.assign(Object.assign({}, ctx), { commit,
|
|
218
|
+
rollback }));
|
|
219
|
+
await commit();
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
catch (ex) {
|
|
223
|
+
try {
|
|
224
|
+
await rollback();
|
|
225
|
+
}
|
|
226
|
+
catch (ex2) {
|
|
227
|
+
// In rare cases, a rollback may fail.
|
|
228
|
+
// Safe to ignore.
|
|
229
|
+
}
|
|
230
|
+
throw ex;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=CapacitorSQLiteAdapter.js.map
|
|
@@ -0,0 +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';\n\nimport {\n BaseObserver,\n BatchedUpdateNotification,\n DBAdapter,\n DBAdapterListener,\n DBLockOptions,\n LockContext,\n QueryResult,\n SQLOpenOptions,\n Transaction\n} from '@powersync/web';\nimport Lock from 'async-lock';\nimport { PowerSyncCore } from '../plugin/PowerSyncCore';\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 BaseObserver<DBAdapterListener> implements DBAdapter {\n protected _writeConnection: SQLiteDBConnection | null;\n protected _readConnection: SQLiteDBConnection | null;\n protected initializedPromise: Promise<void>;\n protected lock: Lock;\n\n constructor(protected options: SQLOpenOptions) {\n super();\n this._writeConnection = null;\n this._readConnection = null;\n this.lock = new Lock();\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 private async init() {\n await PowerSyncCore.registerCore();\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 // TODO validate WAL mode\n await this._writeConnection.open();\n await this._readConnection.open();\n\n 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 get name() {\n return this.options.dbFilename;\n }\n\n protected generateLockContext(db: SQLiteDBConnection): LockContext {\n const execute = async (query: string, params: any[] = []): Promise<QueryResult> => {\n // This driver does not support returning results for execute methods\n if (query.toLowerCase().trim().startsWith('select')) {\n let result = await db.query(query, params);\n let 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 } else {\n let 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 const executeQuery = async (query: string, params?: any[]): Promise<QueryResult> => {\n let result = await db.query(query, params);\n\n let arrayResult = result.values ?? [];\n\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 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 throw new Error('Not supported');\n };\n\n return {\n getAll,\n getOptional,\n get,\n executeRaw,\n execute\n };\n }\n\n execute(query: string, params?: any[]): Promise<QueryResult> {\n return this.writeLock((tx) => tx.execute(query, params));\n }\n\n executeRaw(query: string, params?: any[]): Promise<any[][]> {\n return this.writeLock((tx) => tx.executeRaw(query, params));\n }\n\n async executeBatch(query: string, params: any[][] = []): Promise<QueryResult> {\n return this.writeLock(async (tx) => {\n let result = await this.writeConnection.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\n readLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return this.lock.acquire('read_lock', async () => {\n await this.initializedPromise;\n return await fn(this.generateLockContext(this.readConnection));\n });\n }\n\n readTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return this.readLock(async (ctx) => {\n return this.internalTransaction(ctx, fn);\n });\n }\n\n writeLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return this.lock.acquire('write_lock', 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 }\n\n writeTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T> {\n return this.writeLock(async (ctx) => {\n return this.internalTransaction(ctx, fn);\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 getAll<T>(sql: string, parameters?: any[]): Promise<T[]> {\n return this.readLock((tx) => tx.getAll<T>(sql, parameters));\n }\n\n getOptional<T>(sql: string, parameters?: any[]): Promise<T | null> {\n return this.readLock((tx) => tx.getOptional<T>(sql, parameters));\n }\n\n get<T>(sql: string, parameters?: any[]): Promise<T> {\n return this.readLock((tx) => tx.get<T>(sql, parameters));\n }\n\n protected async internalTransaction<T>(ctx: LockContext, fn: (tx: Transaction) => Promise<T>): Promise<T> {\n let finalized = false;\n const commit = async (): Promise<QueryResult> => {\n if (finalized) {\n return { rowsAffected: 0 };\n }\n finalized = true;\n return ctx.execute('COMMIT');\n };\n const rollback = async (): Promise<QueryResult> => {\n if (finalized) {\n return { rowsAffected: 0 };\n }\n finalized = true;\n return ctx.execute('ROLLBACK');\n };\n try {\n await ctx.execute('BEGIN');\n const result = await fn({\n ...ctx,\n commit,\n rollback\n });\n await commit();\n return result;\n } catch (ex) {\n try {\n await rollback();\n } catch (ex2) {\n // In rare cases, a rollback may fail.\n // Safe to ignore.\n }\n throw ex;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CapacitorSQLiteAdapter } from './CapacitorSQLiteAdapter';
|
|
2
|
+
export class CapacitorSQLiteOpenFactory {
|
|
3
|
+
constructor(options) {
|
|
4
|
+
this.options = options;
|
|
5
|
+
}
|
|
6
|
+
openDB() {
|
|
7
|
+
return new CapacitorSQLiteAdapter(this.options);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=CapacitorSQLiteOpenFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CapacitorSQLiteOpenFactory.js","sourceRoot":"","sources":["../../../src/adapter/CapacitorSQLiteOpenFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,OAAO,0BAA0B;IACrC,YAAsB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAEjD,MAAM;QACJ,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;CACF","sourcesContent":["import { DBAdapter, SQLOpenFactory, SQLOpenOptions } from '@powersync/web';\nimport { CapacitorSQLiteAdapter } from './CapacitorSQLiteAdapter';\n\nexport class CapacitorSQLiteOpenFactory implements SQLOpenFactory {\n constructor(protected options: SQLOpenOptions) {}\n\n openDB(): DBAdapter {\n return new CapacitorSQLiteAdapter(this.options);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["export { CapacitorSQLiteAdapter } from './adapter/CapacitorSQLiteAdapter';\nexport { CapacitorSQLiteOpenFactory } from './adapter/CapacitorSQLiteOpenFactory';\nexport { PowerSyncDatabase } from './PowerSyncDatabase';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PowerSyncCore.js","sourceRoot":"","sources":["../../../src/plugin/PowerSyncCore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAkB,WAAW,EAAE;IACxE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;CAC7D,CAAC,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\nimport { PowerSyncPlugin } from './PowerSyncPlugin';\n\nexport const PowerSyncCore = registerPlugin<PowerSyncPlugin>('PowerSync', {\n web: () => import('./web').then((m) => new m.PowerSyncWeb())\n});\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type RegistrationResponse = {
|
|
2
|
+
/**
|
|
3
|
+
* Zero for successful registration, non-zero for failure.
|
|
4
|
+
* - [Android] -1: SQLCipher library not found.
|
|
5
|
+
* - [Android] -2: Required symbols not found.
|
|
6
|
+
* - The result of sqlite3_auto_extension
|
|
7
|
+
*/
|
|
8
|
+
responseCode: number;
|
|
9
|
+
};
|
|
10
|
+
export interface PowerSyncPlugin {
|
|
11
|
+
/**
|
|
12
|
+
* Registers the PowerSync core extension with the SQLite library.
|
|
13
|
+
*/
|
|
14
|
+
registerCore(): Promise<RegistrationResponse>;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PowerSyncPlugin.js","sourceRoot":"","sources":["../../../src/plugin/PowerSyncPlugin.ts"],"names":[],"mappings":"","sourcesContent":["export type RegistrationResponse = {\n /**\n * Zero for successful registration, non-zero for failure.\n * - [Android] -1: SQLCipher library not found.\n * - [Android] -2: Required symbols not found.\n * - The result of sqlite3_auto_extension\n */\n responseCode: number;\n};\n\nexport interface PowerSyncPlugin {\n /**\n * Registers the PowerSync core extension with the SQLite library.\n */\n registerCore(): Promise<RegistrationResponse>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/plugin/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,OAAO,YAAa,SAAQ,SAAS;IACzC,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type { PowerSyncPlugin, RegistrationResponse } from './PowerSyncPlugin';\n\nexport class PowerSyncWeb extends WebPlugin implements PowerSyncPlugin {\n async registerCore(): Promise<RegistrationResponse> {\n throw new Error('This code path is not supported on web.');\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AbstractStreamingSyncImplementation, AbstractStreamingSyncImplementationOptions, LockOptions } from '@powersync/web';
|
|
2
|
+
import Lock from 'async-lock';
|
|
3
|
+
export declare class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
|
|
4
|
+
protected lock: Lock;
|
|
5
|
+
constructor(options: AbstractStreamingSyncImplementationOptions);
|
|
6
|
+
obtainLock<T>(lockOptions: LockOptions<T>): Promise<T>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AbstractStreamingSyncImplementation } from '@powersync/web';
|
|
2
|
+
import Lock from 'async-lock';
|
|
3
|
+
export class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
|
|
4
|
+
constructor(options) {
|
|
5
|
+
// Super will store and provide default values for options
|
|
6
|
+
super(options);
|
|
7
|
+
this.lock = new Lock();
|
|
8
|
+
}
|
|
9
|
+
async obtainLock(lockOptions) {
|
|
10
|
+
const identifier = `streaming-sync-${lockOptions.type}-${this.options.identifier}`;
|
|
11
|
+
return this.lock.acquire(identifier, async () => {
|
|
12
|
+
var _a;
|
|
13
|
+
if ((_a = lockOptions.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
|
|
14
|
+
throw new Error('Aborted');
|
|
15
|
+
}
|
|
16
|
+
return await lockOptions.callback();
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=CapacitorSyncImplementation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CapacitorSyncImplementation.js","sourceRoot":"","sources":["../../../src/sync/CapacitorSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EAGpC,MAAM,gBAAgB,CAAC;AACxB,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,MAAM,OAAO,oCAAqC,SAAQ,mCAAmC;IAE3F,YAAY,OAAmD;QAC7D,0DAA0D;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU,CAAI,WAA2B;QAC7C,MAAM,UAAU,GAAG,kBAAkB,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;;YAC9C,IAAI,MAAA,WAAW,CAAC,MAAM,0CAAE,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import {\n AbstractStreamingSyncImplementation,\n AbstractStreamingSyncImplementationOptions,\n LockOptions\n} from '@powersync/web';\nimport Lock from 'async-lock';\n\nexport class CapacitorStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n protected lock: Lock;\n constructor(options: AbstractStreamingSyncImplementationOptions) {\n // Super will store and provide default values for options\n super(options);\n this.lock = new Lock();\n }\n\n async obtainLock<T>(lockOptions: LockOptions<T>): Promise<T> {\n const identifier = `streaming-sync-${lockOptions.type}-${this.options.identifier}`;\n return this.lock.acquire(identifier, async () => {\n if (lockOptions.signal?.aborted) {\n throw new Error('Aborted');\n }\n return await lockOptions.callback();\n });\n }\n}\n"]}
|