@tursodatabase/sync-react-native 0.5.0-pre.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +117 -0
  2. package/android/CMakeLists.txt +53 -0
  3. package/android/build.gradle +84 -0
  4. package/android/cpp-adapter.cpp +49 -0
  5. package/android/src/main/AndroidManifest.xml +2 -0
  6. package/android/src/main/java/com/turso/sync/reactnative/TursoBridge.java +44 -0
  7. package/android/src/main/java/com/turso/sync/reactnative/TursoModule.java +82 -0
  8. package/android/src/main/java/com/turso/sync/reactnative/TursoPackage.java +29 -0
  9. package/cpp/TursoConnectionHostObject.cpp +179 -0
  10. package/cpp/TursoConnectionHostObject.h +52 -0
  11. package/cpp/TursoDatabaseHostObject.cpp +98 -0
  12. package/cpp/TursoDatabaseHostObject.h +49 -0
  13. package/cpp/TursoHostObject.cpp +561 -0
  14. package/cpp/TursoHostObject.h +24 -0
  15. package/cpp/TursoStatementHostObject.cpp +414 -0
  16. package/cpp/TursoStatementHostObject.h +65 -0
  17. package/cpp/TursoSyncChangesHostObject.cpp +41 -0
  18. package/cpp/TursoSyncChangesHostObject.h +52 -0
  19. package/cpp/TursoSyncDatabaseHostObject.cpp +328 -0
  20. package/cpp/TursoSyncDatabaseHostObject.h +61 -0
  21. package/cpp/TursoSyncIoItemHostObject.cpp +304 -0
  22. package/cpp/TursoSyncIoItemHostObject.h +52 -0
  23. package/cpp/TursoSyncOperationHostObject.cpp +168 -0
  24. package/cpp/TursoSyncOperationHostObject.h +53 -0
  25. package/ios/TursoModule.h +8 -0
  26. package/ios/TursoModule.mm +95 -0
  27. package/lib/commonjs/Database.js +445 -0
  28. package/lib/commonjs/Database.js.map +1 -0
  29. package/lib/commonjs/Statement.js +339 -0
  30. package/lib/commonjs/Statement.js.map +1 -0
  31. package/lib/commonjs/index.js +229 -0
  32. package/lib/commonjs/index.js.map +1 -0
  33. package/lib/commonjs/internal/asyncOperation.js +124 -0
  34. package/lib/commonjs/internal/asyncOperation.js.map +1 -0
  35. package/lib/commonjs/internal/ioProcessor.js +315 -0
  36. package/lib/commonjs/internal/ioProcessor.js.map +1 -0
  37. package/lib/commonjs/package.json +1 -0
  38. package/lib/commonjs/types.js +133 -0
  39. package/lib/commonjs/types.js.map +1 -0
  40. package/lib/module/Database.js +441 -0
  41. package/lib/module/Database.js.map +1 -0
  42. package/lib/module/Statement.js +335 -0
  43. package/lib/module/Statement.js.map +1 -0
  44. package/lib/module/index.js +205 -0
  45. package/lib/module/index.js.map +1 -0
  46. package/lib/module/internal/asyncOperation.js +116 -0
  47. package/lib/module/internal/asyncOperation.js.map +1 -0
  48. package/lib/module/internal/ioProcessor.js +309 -0
  49. package/lib/module/internal/ioProcessor.js.map +1 -0
  50. package/lib/module/package.json +1 -0
  51. package/lib/module/types.js +163 -0
  52. package/lib/module/types.js.map +1 -0
  53. package/lib/typescript/Database.d.ts +140 -0
  54. package/lib/typescript/Database.d.ts.map +1 -0
  55. package/lib/typescript/Statement.d.ts +105 -0
  56. package/lib/typescript/Statement.d.ts.map +1 -0
  57. package/lib/typescript/index.d.ts +175 -0
  58. package/lib/typescript/index.d.ts.map +1 -0
  59. package/lib/typescript/internal/asyncOperation.d.ts +39 -0
  60. package/lib/typescript/internal/asyncOperation.d.ts.map +1 -0
  61. package/lib/typescript/internal/ioProcessor.d.ts +48 -0
  62. package/lib/typescript/internal/ioProcessor.d.ts.map +1 -0
  63. package/lib/typescript/types.d.ts +316 -0
  64. package/lib/typescript/types.d.ts.map +1 -0
  65. package/package.json +97 -0
  66. package/src/Database.ts +480 -0
  67. package/src/Statement.ts +372 -0
  68. package/src/index.ts +240 -0
  69. package/src/internal/asyncOperation.ts +147 -0
  70. package/src/internal/ioProcessor.ts +328 -0
  71. package/src/types.ts +391 -0
  72. package/turso-sync-react-native.podspec +56 -0
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Database = void 0;
7
+ var _Statement = require("./Statement");
8
+ var _asyncOperation = require("./internal/asyncOperation");
9
+ var _ioProcessor = require("./internal/ioProcessor");
10
+ /**
11
+ * Database
12
+ *
13
+ * Unified high-level API for both local and sync databases.
14
+ * Constructor determines whether to use local-only or sync mode based on config.
15
+ */
16
+
17
+ /**
18
+ * Check if config has sync properties (url field)
19
+ */
20
+ function isSyncConfig(opts) {
21
+ return opts.url !== undefined && opts.url !== null;
22
+ }
23
+
24
+ /**
25
+ * Calculate reserved bytes based on encryption cipher.
26
+ * These values match the Turso Cloud encryption settings.
27
+ */
28
+ function getReservedBytesForCipher(encryption) {
29
+ if (!encryption) {
30
+ return 0;
31
+ }
32
+ switch (encryption.cipher) {
33
+ case 'aes256gcm':
34
+ case 'aes128gcm':
35
+ case 'chacha20poly1305':
36
+ return 28;
37
+ case 'aegis128l':
38
+ case 'aegis128x2':
39
+ case 'aegis128x4':
40
+ return 32;
41
+ case 'aegis256':
42
+ case 'aegis256x2':
43
+ case 'aegis256x4':
44
+ return 48;
45
+ default:
46
+ return 0;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Database class - works for both local-only and sync databases
52
+ *
53
+ * All database operations are async to properly handle IO requirements:
54
+ * - For local databases: async allows yielding to JS event loop
55
+ * - For sync databases: async required for network operations
56
+ * - For partial sync: async required to load missing pages on-demand
57
+ */
58
+ class Database {
59
+ _nativeDb = null;
60
+ _nativeSyncDb = null;
61
+ _connection = null;
62
+ _isSync = false;
63
+ _connected = false;
64
+ _closed = false;
65
+ /**
66
+ * Create a new database (doesn't connect yet - call connect())
67
+ *
68
+ * @param opts - Database options
69
+ */
70
+ constructor(opts) {
71
+ this._opts = opts;
72
+ this._isSync = isSyncConfig(opts);
73
+ }
74
+
75
+ /**
76
+ * Connect to the database (matches JavaScript bindings)
77
+ * For local databases: opens immediately
78
+ * For sync databases: bootstraps if needed
79
+ */
80
+ async connect() {
81
+ if (this._connected) {
82
+ return;
83
+ }
84
+ if (this._isSync) {
85
+ await this.initSyncDatabase();
86
+ } else {
87
+ this.initLocalDatabase();
88
+ }
89
+ this._connected = true;
90
+ }
91
+
92
+ /**
93
+ * Initialize local-only database
94
+ */
95
+ initLocalDatabase() {
96
+ if (typeof __TursoProxy === 'undefined') {
97
+ throw new Error('Turso native module not loaded');
98
+ }
99
+ const dbConfig = {
100
+ path: this._opts.path,
101
+ async_io: true // Always use async IO in React Native
102
+ };
103
+
104
+ // Create native database (path normalization happens in C++ JSI layer)
105
+ this._nativeDb = __TursoProxy.newDatabase(this._opts.path, dbConfig);
106
+
107
+ // Open database
108
+ this._nativeDb.open();
109
+
110
+ // Get connection
111
+ this._connection = this._nativeDb.connect();
112
+ }
113
+
114
+ /**
115
+ * Initialize sync database
116
+ */
117
+ async initSyncDatabase() {
118
+ if (typeof __TursoProxy === 'undefined') {
119
+ throw new Error('Turso native module not loaded');
120
+ }
121
+
122
+ // Get URL (can be string or function)
123
+ let url = null;
124
+ if (typeof this._opts.url === 'function') {
125
+ url = this._opts.url();
126
+ } else if (typeof this._opts.url === 'string') {
127
+ url = this._opts.url;
128
+ }
129
+ if (!url) {
130
+ throw new Error('Sync database requires a URL');
131
+ }
132
+
133
+ // Build dbConfig (path normalization happens in C++ JSI layer)
134
+ const dbConfig = {
135
+ path: this._opts.path,
136
+ async_io: true // Always use async IO in React Native
137
+ };
138
+
139
+ // Calculate reserved bytes from cipher
140
+ const reservedBytes = getReservedBytesForCipher(this._opts.remoteEncryption);
141
+
142
+ // Build syncConfig with all options
143
+ const syncConfig = {
144
+ remoteUrl: url,
145
+ clientName: this._opts.clientName || 'turso-sync-react-native',
146
+ longPollTimeoutMs: this._opts.longPollTimeoutMs,
147
+ bootstrapIfEmpty: this._opts.bootstrapIfEmpty ?? true,
148
+ reservedBytes: reservedBytes,
149
+ // Remote encryption options (key is passed to sync engine for HTTP headers)
150
+ remoteEncryptionKey: this._opts.remoteEncryption?.key,
151
+ remoteEncryptionCipher: this._opts.remoteEncryption?.cipher
152
+ };
153
+
154
+ // Add partial sync options if present
155
+ if (this._opts.partialSyncExperimental) {
156
+ const partial = this._opts.partialSyncExperimental;
157
+ if (partial.bootstrapStrategy.kind === 'prefix') {
158
+ syncConfig.partialBootstrapStrategyPrefix = partial.bootstrapStrategy.length;
159
+ } else if (partial.bootstrapStrategy.kind === 'query') {
160
+ syncConfig.partialBootstrapStrategyQuery = partial.bootstrapStrategy.query;
161
+ }
162
+ syncConfig.partialBootstrapSegmentSize = partial.segmentSize;
163
+ syncConfig.partialBootstrapPrefetch = partial.prefetch;
164
+ }
165
+
166
+ // Create native sync database
167
+ this._nativeSyncDb = __TursoProxy.newSyncDatabase(dbConfig, syncConfig);
168
+
169
+ // Create IO context with auth token and base URL
170
+ this._ioContext = {
171
+ authToken: this._opts.authToken,
172
+ baseUrl: url
173
+ };
174
+
175
+ // Create extraIo callback for partial sync support
176
+ // This callback drains the sync engine's IO queue during statement execution
177
+ this._extraIo = async () => {
178
+ if (this._nativeSyncDb && this._ioContext) {
179
+ await (0, _ioProcessor.drainSyncIo)(this._nativeSyncDb, this._ioContext);
180
+ }
181
+ };
182
+
183
+ // Bootstrap/open database
184
+ const operation = this._nativeSyncDb.create();
185
+ await (0, _asyncOperation.driveVoidOperation)(operation, this._nativeSyncDb, this._ioContext);
186
+
187
+ // Get connection
188
+ const connOperation = this._nativeSyncDb.connect();
189
+ this._connection = await (0, _asyncOperation.driveConnectionOperation)(connOperation, this._nativeSyncDb, this._ioContext);
190
+ }
191
+
192
+ /**
193
+ * Prepare a SQL statement
194
+ *
195
+ * @param sql - SQL statement to prepare
196
+ * @returns Prepared statement
197
+ */
198
+ prepare(sql) {
199
+ this.checkOpen();
200
+ if (!this._connection) {
201
+ throw new Error('No connection available');
202
+ }
203
+ const nativeStmt = this._connection.prepareSingle(sql);
204
+ // Pass extraIo callback for partial sync support
205
+ return new _Statement.Statement(nativeStmt, this._extraIo);
206
+ }
207
+
208
+ /**
209
+ * Execute SQL without returning results (for DDL, multi-statement SQL)
210
+ *
211
+ * @param sql - SQL to execute
212
+ */
213
+ async exec(sql) {
214
+ this.checkOpen();
215
+ if (!this._connection) {
216
+ throw new Error('No connection available');
217
+ }
218
+
219
+ // Use prepareFirst to handle multiple statements
220
+ let remaining = sql.trim();
221
+ while (remaining.length > 0) {
222
+ const result = this._connection.prepareFirst(remaining);
223
+ if (!result.statement) {
224
+ break; // No more statements
225
+ }
226
+
227
+ // Wrap in Statement to get IO handling
228
+ const stmt = new _Statement.Statement(result.statement, this._extraIo);
229
+ try {
230
+ // Execute - will handle IO if needed
231
+ await stmt.run();
232
+ } finally {
233
+ stmt.finalize();
234
+ }
235
+
236
+ // Move to next statement
237
+ remaining = sql.substring(result.tailIdx).trim();
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Execute statement and return result info
243
+ *
244
+ * @param sql - SQL statement
245
+ * @param params - Bind parameters
246
+ * @returns Run result with changes and lastInsertRowid
247
+ */
248
+ async run(sql, ...params) {
249
+ const stmt = this.prepare(sql);
250
+ try {
251
+ return await stmt.run(...params);
252
+ } finally {
253
+ stmt.finalize();
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Execute query and return first row
259
+ *
260
+ * @param sql - SQL query
261
+ * @param params - Bind parameters
262
+ * @returns First row or undefined
263
+ */
264
+ async get(sql, ...params) {
265
+ const stmt = this.prepare(sql);
266
+ try {
267
+ return await stmt.get(...params);
268
+ } finally {
269
+ stmt.finalize();
270
+ }
271
+ }
272
+
273
+ /**
274
+ * Execute query and return all rows
275
+ *
276
+ * @param sql - SQL query
277
+ * @param params - Bind parameters
278
+ * @returns All rows
279
+ */
280
+ async all(sql, ...params) {
281
+ const stmt = this.prepare(sql);
282
+ try {
283
+ return await stmt.all(...params);
284
+ } finally {
285
+ stmt.finalize();
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Execute function within a transaction
291
+ *
292
+ * @param fn - Function to execute
293
+ * @returns Function result
294
+ */
295
+ async transaction(fn) {
296
+ this.checkOpen();
297
+ await this.exec('BEGIN');
298
+ try {
299
+ const result = await fn();
300
+ await this.exec('COMMIT');
301
+ return result;
302
+ } catch (error) {
303
+ await this.exec('ROLLBACK');
304
+ throw error;
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Push local changes to remote (sync databases only)
310
+ */
311
+ async push() {
312
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
313
+ throw new Error('push() is only available for sync databases');
314
+ }
315
+ const operation = this._nativeSyncDb.pushChanges();
316
+ await (0, _asyncOperation.driveVoidOperation)(operation, this._nativeSyncDb, this._ioContext);
317
+ }
318
+
319
+ /**
320
+ * Pull remote changes and apply locally (sync databases only)
321
+ *
322
+ * @returns true if changes were applied, false if no changes
323
+ */
324
+ async pull() {
325
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
326
+ throw new Error('pull() is only available for sync databases');
327
+ }
328
+
329
+ // Wait for changes
330
+ const waitOperation = this._nativeSyncDb.waitChanges();
331
+ const changes = await (0, _asyncOperation.driveChangesOperation)(waitOperation, this._nativeSyncDb, this._ioContext);
332
+
333
+ // If no changes, return false
334
+ if (!changes) {
335
+ return false;
336
+ }
337
+
338
+ // Apply changes
339
+ const applyOperation = this._nativeSyncDb.applyChanges(changes);
340
+ await (0, _asyncOperation.driveVoidOperation)(applyOperation, this._nativeSyncDb, this._ioContext);
341
+ return true;
342
+ }
343
+
344
+ /**
345
+ * Get sync statistics (sync databases only)
346
+ *
347
+ * @returns Sync stats
348
+ */
349
+ async stats() {
350
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
351
+ throw new Error('stats() is only available for sync databases');
352
+ }
353
+ const operation = this._nativeSyncDb.stats();
354
+ return (0, _asyncOperation.driveStatsOperation)(operation, this._nativeSyncDb, this._ioContext);
355
+ }
356
+
357
+ /**
358
+ * Checkpoint database (sync databases only)
359
+ */
360
+ async checkpoint() {
361
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
362
+ throw new Error('checkpoint() is only available for sync databases');
363
+ }
364
+ const operation = this._nativeSyncDb.checkpoint();
365
+ await (0, _asyncOperation.driveVoidOperation)(operation, this._nativeSyncDb, this._ioContext);
366
+ }
367
+
368
+ /**
369
+ * Close the database
370
+ */
371
+ close() {
372
+ if (this._closed) {
373
+ return;
374
+ }
375
+ if (this._connection) {
376
+ this._connection.close();
377
+ this._connection = null;
378
+ }
379
+ if (this._nativeDb) {
380
+ this._nativeDb.close();
381
+ this._nativeDb = null;
382
+ }
383
+ if (this._nativeSyncDb) {
384
+ this._nativeSyncDb.close();
385
+ this._nativeSyncDb = null;
386
+ }
387
+ this._connected = false;
388
+ this._closed = true;
389
+ }
390
+
391
+ /**
392
+ * Get database path
393
+ */
394
+ get path() {
395
+ return this._opts.path;
396
+ }
397
+
398
+ /**
399
+ * Check if database is a sync database
400
+ */
401
+ get isSync() {
402
+ return this._isSync;
403
+ }
404
+
405
+ /**
406
+ * Check if database is open
407
+ */
408
+ get open() {
409
+ return !this._closed && this._connection !== null;
410
+ }
411
+
412
+ /**
413
+ * Check if in transaction
414
+ */
415
+ get inTransaction() {
416
+ if (!this._connection) {
417
+ return false;
418
+ }
419
+ return !this._connection.getAutocommit();
420
+ }
421
+
422
+ /**
423
+ * Get last insert rowid
424
+ */
425
+ get lastInsertRowid() {
426
+ if (!this._connection) {
427
+ return 0;
428
+ }
429
+ return this._connection.lastInsertRowid();
430
+ }
431
+
432
+ /**
433
+ * Check if open and throw if not
434
+ */
435
+ checkOpen() {
436
+ if (this._closed) {
437
+ throw new Error('Database is closed');
438
+ }
439
+ if (!this._connected || !this._connection) {
440
+ throw new Error('Database not connected. Call connect() first.');
441
+ }
442
+ }
443
+ }
444
+ exports.Database = Database;
445
+ //# sourceMappingURL=Database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_Statement","require","_asyncOperation","_ioProcessor","isSyncConfig","opts","url","undefined","getReservedBytesForCipher","encryption","cipher","Database","_nativeDb","_nativeSyncDb","_connection","_isSync","_connected","_closed","constructor","_opts","connect","initSyncDatabase","initLocalDatabase","__TursoProxy","Error","dbConfig","path","async_io","newDatabase","open","reservedBytes","remoteEncryption","syncConfig","remoteUrl","clientName","longPollTimeoutMs","bootstrapIfEmpty","remoteEncryptionKey","key","remoteEncryptionCipher","partialSyncExperimental","partial","bootstrapStrategy","kind","partialBootstrapStrategyPrefix","length","partialBootstrapStrategyQuery","query","partialBootstrapSegmentSize","segmentSize","partialBootstrapPrefetch","prefetch","newSyncDatabase","_ioContext","authToken","baseUrl","_extraIo","drainSyncIo","operation","create","driveVoidOperation","connOperation","driveConnectionOperation","prepare","sql","checkOpen","nativeStmt","prepareSingle","Statement","exec","remaining","trim","result","prepareFirst","statement","stmt","run","finalize","substring","tailIdx","params","get","all","transaction","fn","error","push","pushChanges","pull","waitOperation","waitChanges","changes","driveChangesOperation","applyOperation","applyChanges","stats","driveStatsOperation","checkpoint","close","isSync","inTransaction","getAutocommit","lastInsertRowid","exports"],"sourceRoot":"../../src","sources":["Database.ts"],"mappings":"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","ignoreList":[]}