@trainstar/synchro-react-native 0.4.0-rc.2 → 0.4.0-rc.3
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/README.md +10 -10
- package/SynchroReactNative.podspec +1 -0
- package/android/build.gradle +1 -1
- package/android/src/androidTest/kotlin/com/trainstar/synchro/rn/SynchroModuleTransactionTest.kt +7 -10
- package/ios/SynchroModule.swift +277 -273
- package/ios-tests/SynchroModuleTransactionTests.swift +264 -0
- package/lib/module/NativeSynchro.js.map +1 -1
- package/lib/typescript/src/NativeSynchro.d.ts +13 -14
- package/lib/typescript/src/NativeSynchro.d.ts.map +1 -1
- package/package.json +9 -8
- package/src/NativeSynchro.ts +13 -17
|
@@ -4,6 +4,7 @@ import Synchro
|
|
|
4
4
|
import XCTest
|
|
5
5
|
|
|
6
6
|
private let settlementTimeout: TimeInterval = 60
|
|
7
|
+
private let promptDispatchTimeout: TimeInterval = 4
|
|
7
8
|
private let sqliteTransient = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
|
|
8
9
|
private let columnsJSON = #"[{"name":"id","type":"TEXT","primaryKey":true},{"name":"name","type":"TEXT"}]"#
|
|
9
10
|
private let insertSQL = "INSERT INTO bridge_items (id, name) VALUES (?, ?)"
|
|
@@ -365,6 +366,236 @@ final class SynchroModuleTransactionTests: XCTestCase {
|
|
|
365
366
|
XCTAssertEqual(events.names, [])
|
|
366
367
|
}
|
|
367
368
|
|
|
369
|
+
func testFourReadersLeaveCapacityForOrdinaryQuery() throws {
|
|
370
|
+
try initializeModule()
|
|
371
|
+
let held = try holdReadTransactions(count: 4)
|
|
372
|
+
let ordinary = settle("ordinary query with four readers") {
|
|
373
|
+
module.query("SELECT 1", params: [], resolve: $0.resolve, reject: $0.reject)
|
|
374
|
+
}
|
|
375
|
+
XCTAssertEqual((try resolvedValue(ordinary) as? [[String: Any]])?.count, 1)
|
|
376
|
+
|
|
377
|
+
let commits = try held.ids.enumerated().map { index, txID in
|
|
378
|
+
let commit = settle("commit reader \(index)") {
|
|
379
|
+
module.commitTransaction(txID, resolve: $0.resolve, reject: $0.reject)
|
|
380
|
+
}
|
|
381
|
+
_ = try resolvedValue(commit)
|
|
382
|
+
return commit
|
|
383
|
+
}
|
|
384
|
+
let close = try closeModule()
|
|
385
|
+
|
|
386
|
+
requireSettledOnce(held.recorders + [ordinary] + commits + [close])
|
|
387
|
+
XCTAssertEqual(events.names, [])
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
func testFiveReadersDoNotBlockOrdinaryQueryAheadOfCommits() throws {
|
|
391
|
+
try initializeModule()
|
|
392
|
+
let held = try holdReadTransactions(count: 5)
|
|
393
|
+
let ordinary = PromiseRecorder("ordinary query with five readers")
|
|
394
|
+
let commits = held.ids.indices.map { PromiseRecorder("commit reader \($0)") }
|
|
395
|
+
let invocationReturned = XCTestExpectation(description: "ordinary query invocation returns")
|
|
396
|
+
let methodQueue = DispatchQueue(label: "test.react-native.query-dispatch")
|
|
397
|
+
let module = try XCTUnwrap(self.module)
|
|
398
|
+
|
|
399
|
+
methodQueue.async {
|
|
400
|
+
module.query("SELECT 1", params: [], resolve: ordinary.resolve, reject: ordinary.reject)
|
|
401
|
+
invocationReturned.fulfill()
|
|
402
|
+
}
|
|
403
|
+
methodQueue.async {
|
|
404
|
+
for (index, txID) in held.ids.enumerated() {
|
|
405
|
+
module.commitTransaction(txID, resolve: commits[index].resolve, reject: commits[index].reject)
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
XCTAssertEqual(XCTWaiter().wait(for: [invocationReturned], timeout: promptDispatchTimeout), .completed)
|
|
410
|
+
waitForSettlements([ordinary] + commits, timeout: promptDispatchTimeout)
|
|
411
|
+
XCTAssertEqual((try resolvedValue(ordinary) as? [[String: Any]])?.count, 1)
|
|
412
|
+
let close = try closeModule()
|
|
413
|
+
|
|
414
|
+
requireSettledOnce(held.recorders + [ordinary] + commits + [close])
|
|
415
|
+
XCTAssertEqual(events.names, [])
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
func testFiveReadersDoNotBlockOrdinaryQueryOneAheadOfRollbacks() throws {
|
|
419
|
+
try initializeModule()
|
|
420
|
+
let held = try holdReadTransactions(count: 5)
|
|
421
|
+
let ordinary = PromiseRecorder("ordinary query one with five readers")
|
|
422
|
+
let rollbacks = held.ids.indices.map { PromiseRecorder("rollback reader \($0)") }
|
|
423
|
+
let invocationReturned = XCTestExpectation(description: "ordinary query one invocation returns")
|
|
424
|
+
let methodQueue = DispatchQueue(label: "test.react-native.query-one-dispatch")
|
|
425
|
+
let module = try XCTUnwrap(self.module)
|
|
426
|
+
|
|
427
|
+
methodQueue.async {
|
|
428
|
+
module.queryOne("SELECT 1", params: [], resolve: ordinary.resolve, reject: ordinary.reject)
|
|
429
|
+
invocationReturned.fulfill()
|
|
430
|
+
}
|
|
431
|
+
methodQueue.async {
|
|
432
|
+
for (index, txID) in held.ids.enumerated() {
|
|
433
|
+
module.rollbackTransaction(txID, resolve: rollbacks[index].resolve, reject: rollbacks[index].reject)
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
XCTAssertEqual(XCTWaiter().wait(for: [invocationReturned], timeout: promptDispatchTimeout), .completed)
|
|
438
|
+
waitForSettlements([ordinary] + rollbacks, timeout: promptDispatchTimeout)
|
|
439
|
+
XCTAssertEqual((try resolvedValue(ordinary) as? [String: Any])?.count, 1)
|
|
440
|
+
let close = try closeModule()
|
|
441
|
+
|
|
442
|
+
requireSettledOnce(held.recorders + [ordinary] + rollbacks + [close])
|
|
443
|
+
XCTAssertEqual(events.names, [])
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
func testOrdinaryWriterSurfacesDoNotBlockWriteTransactionCommands() throws {
|
|
447
|
+
try initializeModule()
|
|
448
|
+
let module = try XCTUnwrap(self.module)
|
|
449
|
+
let methodQueue = DispatchQueue(label: "test.react-native.writer-dispatch")
|
|
450
|
+
let ordinaryCalls: [(String, (PromiseRecorder) -> Void)] = [
|
|
451
|
+
("execute", { recorder in
|
|
452
|
+
module.execute("SELECT 1", params: [], resolve: recorder.resolve, reject: recorder.reject)
|
|
453
|
+
}),
|
|
454
|
+
("authored write", { recorder in
|
|
455
|
+
module.executeAuthoredWrite(
|
|
456
|
+
"bridge_items",
|
|
457
|
+
operation: "update",
|
|
458
|
+
columnNames: ["name"],
|
|
459
|
+
sql: "SELECT 1",
|
|
460
|
+
values: [],
|
|
461
|
+
resolve: recorder.resolve,
|
|
462
|
+
reject: recorder.reject
|
|
463
|
+
)
|
|
464
|
+
}),
|
|
465
|
+
("batch", { recorder in
|
|
466
|
+
module.executeBatch(
|
|
467
|
+
[["sql": "SELECT 1", "params": []]],
|
|
468
|
+
resolve: recorder.resolve,
|
|
469
|
+
reject: recorder.reject
|
|
470
|
+
)
|
|
471
|
+
}),
|
|
472
|
+
]
|
|
473
|
+
var recorders: [PromiseRecorder] = []
|
|
474
|
+
|
|
475
|
+
for (name, call) in ordinaryCalls {
|
|
476
|
+
let begin = settle("begin before \(name)") {
|
|
477
|
+
module.beginWriteTransaction($0.resolve, reject: $0.reject)
|
|
478
|
+
}
|
|
479
|
+
let txID = try XCTUnwrap(try resolvedValue(begin) as? String)
|
|
480
|
+
let probe = settle("transaction query before \(name)") {
|
|
481
|
+
module.txQuery(txID, sql: "SELECT 1", params: [], resolve: $0.resolve, reject: $0.reject)
|
|
482
|
+
}
|
|
483
|
+
let ordinary = PromiseRecorder(name)
|
|
484
|
+
let commit = PromiseRecorder("commit after \(name)")
|
|
485
|
+
let invocationReturned = XCTestExpectation(description: "\(name) invocation returns")
|
|
486
|
+
|
|
487
|
+
methodQueue.async {
|
|
488
|
+
call(ordinary)
|
|
489
|
+
invocationReturned.fulfill()
|
|
490
|
+
}
|
|
491
|
+
methodQueue.async {
|
|
492
|
+
module.commitTransaction(txID, resolve: commit.resolve, reject: commit.reject)
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
XCTAssertEqual(
|
|
496
|
+
XCTWaiter().wait(for: [invocationReturned], timeout: promptDispatchTimeout),
|
|
497
|
+
.completed,
|
|
498
|
+
name
|
|
499
|
+
)
|
|
500
|
+
waitForSettlements([ordinary, commit])
|
|
501
|
+
recorders += [begin, probe, ordinary, commit]
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
let close = try closeModule()
|
|
505
|
+
requireSettledOnce(recorders + [close])
|
|
506
|
+
XCTAssertEqual(events.names, [])
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
func testCloseDrainsAdmittedQueryAfterAbortingSaturatedReaders() throws {
|
|
510
|
+
try initializeModule()
|
|
511
|
+
let held = try holdReadTransactions(count: 5)
|
|
512
|
+
let pendingBegin = PromiseRecorder("pending sixth reader")
|
|
513
|
+
module.beginReadTransaction(pendingBegin.resolve, reject: pendingBegin.reject)
|
|
514
|
+
let query = PromiseRecorder("admitted query")
|
|
515
|
+
module.query("SELECT 1", params: [], resolve: query.resolve, reject: query.reject)
|
|
516
|
+
|
|
517
|
+
let close = PromiseRecorder("close with admitted query")
|
|
518
|
+
let recordClose = close.resolve
|
|
519
|
+
module.close({ value in
|
|
520
|
+
XCTAssertEqual(pendingBegin.rejections, ["NOT_CONNECTED"])
|
|
521
|
+
XCTAssertEqual(pendingBegin.settlementCount, 1)
|
|
522
|
+
XCTAssertEqual(query.settlementCount, 1)
|
|
523
|
+
recordClose(value)
|
|
524
|
+
}, reject: close.reject)
|
|
525
|
+
waitForSettlements([query, pendingBegin, close], timeout: promptDispatchTimeout)
|
|
526
|
+
|
|
527
|
+
XCTAssertEqual(query.settlementCount, 1)
|
|
528
|
+
XCTAssertEqual((try resolvedValue(query) as? [[String: Any]])?.count, 1)
|
|
529
|
+
requireSettledOnce(held.recorders + [query, close])
|
|
530
|
+
XCTAssertEqual(pendingBegin.resolutions.count, 0)
|
|
531
|
+
XCTAssertEqual(pendingBegin.rejections, ["NOT_CONNECTED"])
|
|
532
|
+
XCTAssertEqual(pendingBegin.settlementCount, 1)
|
|
533
|
+
|
|
534
|
+
let afterClose = settle("query after close") {
|
|
535
|
+
module.query("SELECT 1", params: [], resolve: $0.resolve, reject: $0.reject)
|
|
536
|
+
}
|
|
537
|
+
XCTAssertEqual(afterClose.resolutions.count, 0)
|
|
538
|
+
XCTAssertEqual(afterClose.rejections, ["NOT_CONNECTED"])
|
|
539
|
+
XCTAssertEqual(afterClose.settlementCount, 1)
|
|
540
|
+
XCTAssertEqual(events.names, [])
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
func testCloseDrainsQueuedOrdinaryCallsBeforeClosingClient() throws {
|
|
544
|
+
try initializeModule()
|
|
545
|
+
let external = try openExternalConnection()
|
|
546
|
+
let client = try XCTUnwrap(module.client)
|
|
547
|
+
let hold = ChangeHold()
|
|
548
|
+
let subscription = client.onChange(tables: ["bridge_items"]) { hold.enter() }
|
|
549
|
+
addTeardownBlock {
|
|
550
|
+
hold.release()
|
|
551
|
+
subscription.cancel()
|
|
552
|
+
}
|
|
553
|
+
let activeReader = try holdReadTransactions(count: 1)
|
|
554
|
+
let id = UUID().uuidString
|
|
555
|
+
|
|
556
|
+
let write = PromiseRecorder("held ordinary write")
|
|
557
|
+
module.execute(insertSQL, params: [id, "ordinary-held"], resolve: write.resolve, reject: write.reject)
|
|
558
|
+
XCTAssertEqual(XCTWaiter().wait(for: [hold.entered], timeout: settlementTimeout), .completed)
|
|
559
|
+
XCTAssertEqual(try external.names(id: id), ["ordinary-held"])
|
|
560
|
+
XCTAssertEqual(write.settlementCount, 0)
|
|
561
|
+
|
|
562
|
+
let read = PromiseRecorder("queued ordinary read")
|
|
563
|
+
module.queryOne(selectNameSQL, params: [id], resolve: read.resolve, reject: read.reject)
|
|
564
|
+
let close = PromiseRecorder("close draining ordinary calls")
|
|
565
|
+
let recordClose = close.resolve
|
|
566
|
+
module.close({ value in
|
|
567
|
+
XCTAssertEqual(write.settlementCount, 1)
|
|
568
|
+
XCTAssertEqual(read.settlementCount, 1)
|
|
569
|
+
recordClose(value)
|
|
570
|
+
}, reject: close.reject)
|
|
571
|
+
|
|
572
|
+
XCTAssertTrue(try waitUntilCloseDetachesSessions())
|
|
573
|
+
XCTAssertEqual(write.settlementCount, 0)
|
|
574
|
+
XCTAssertEqual(read.settlementCount, 0)
|
|
575
|
+
XCTAssertEqual(close.settlementCount, 0)
|
|
576
|
+
|
|
577
|
+
let rejected = PromiseRecorder("ordinary call after close admission stops")
|
|
578
|
+
module.query("SELECT 1", params: [], resolve: rejected.resolve, reject: rejected.reject)
|
|
579
|
+
waitForSettlements([rejected], timeout: promptDispatchTimeout)
|
|
580
|
+
XCTAssertEqual(rejected.resolutions.count, 0)
|
|
581
|
+
XCTAssertEqual(rejected.rejections, ["NOT_CONNECTED"])
|
|
582
|
+
XCTAssertEqual(rejected.settlementCount, 1)
|
|
583
|
+
XCTAssertEqual(write.settlementCount, 0)
|
|
584
|
+
XCTAssertEqual(read.settlementCount, 0)
|
|
585
|
+
XCTAssertEqual(close.settlementCount, 0)
|
|
586
|
+
|
|
587
|
+
hold.release()
|
|
588
|
+
waitForSettlements([write, read, close], timeout: promptDispatchTimeout)
|
|
589
|
+
XCTAssertTrue(hold.heldUntilRelease)
|
|
590
|
+
XCTAssertEqual(hold.entryCount, 1)
|
|
591
|
+
subscription.cancel()
|
|
592
|
+
let row = try XCTUnwrap(try resolvedValue(read) as? [String: Any])
|
|
593
|
+
XCTAssertEqual(row["name"] as? String, "ordinary-held")
|
|
594
|
+
requireSettledOnce(activeReader.recorders + [write, read, close])
|
|
595
|
+
XCTAssertEqual(try external.names(id: id), ["ordinary-held"])
|
|
596
|
+
XCTAssertEqual(events.names, [])
|
|
597
|
+
}
|
|
598
|
+
|
|
368
599
|
/// Observes an accepted commit after its durable write and before its SDK call returns.
|
|
369
600
|
/// This is not a window inside SQLite COMMIT.
|
|
370
601
|
func testCloseWaitsForAcceptedCommitHeldAfterDurableWrite() throws {
|
|
@@ -602,6 +833,26 @@ final class SynchroModuleTransactionTests: XCTestCase {
|
|
|
602
833
|
requireSettledOnce([inspect, snapshot, close])
|
|
603
834
|
}
|
|
604
835
|
|
|
836
|
+
// MARK: - Transaction capacity
|
|
837
|
+
|
|
838
|
+
private func holdReadTransactions(count: Int) throws -> (ids: [String], recorders: [PromiseRecorder]) {
|
|
839
|
+
var ids: [String] = []
|
|
840
|
+
var recorders: [PromiseRecorder] = []
|
|
841
|
+
for index in 0..<count {
|
|
842
|
+
let begin = settle("begin reader \(index)") {
|
|
843
|
+
module.beginReadTransaction($0.resolve, reject: $0.reject)
|
|
844
|
+
}
|
|
845
|
+
let txID = try XCTUnwrap(try resolvedValue(begin) as? String)
|
|
846
|
+
let query = settle("query reader \(index)") {
|
|
847
|
+
module.txQuery(txID, sql: "SELECT 1", params: [], resolve: $0.resolve, reject: $0.reject)
|
|
848
|
+
}
|
|
849
|
+
XCTAssertEqual((try resolvedValue(query) as? [[String: Any]])?.count, 1)
|
|
850
|
+
ids.append(txID)
|
|
851
|
+
recorders += [begin, query]
|
|
852
|
+
}
|
|
853
|
+
return (ids, recorders)
|
|
854
|
+
}
|
|
855
|
+
|
|
605
856
|
// MARK: - Bridge calls
|
|
606
857
|
|
|
607
858
|
private func initializeModule() throws {
|
|
@@ -686,6 +937,19 @@ final class SynchroModuleTransactionTests: XCTestCase {
|
|
|
686
937
|
return recorder
|
|
687
938
|
}
|
|
688
939
|
|
|
940
|
+
private func waitForSettlements(
|
|
941
|
+
_ recorders: [PromiseRecorder],
|
|
942
|
+
timeout: TimeInterval = settlementTimeout,
|
|
943
|
+
file: StaticString = #filePath,
|
|
944
|
+
line: UInt = #line
|
|
945
|
+
) {
|
|
946
|
+
let result = XCTWaiter().wait(
|
|
947
|
+
for: recorders.map(\.firstSettlement),
|
|
948
|
+
timeout: timeout
|
|
949
|
+
)
|
|
950
|
+
XCTAssertEqual(result, .completed, "promises did not settle", file: file, line: line)
|
|
951
|
+
}
|
|
952
|
+
|
|
689
953
|
private func resolvedValue(
|
|
690
954
|
_ recorder: PromiseRecorder,
|
|
691
955
|
file: StaticString = #filePath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSynchro.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSynchro.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAElD;AACA;AACA;;AAgLA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,eAAe,CAAC","ignoreList":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { TurboModule } from 'react-native';
|
|
2
|
-
|
|
3
|
-
type
|
|
4
|
-
type NativeRow = UnsafeObject;
|
|
1
|
+
import type { CodegenTypes, TurboModule } from 'react-native';
|
|
2
|
+
type NativeSQLiteBindValue = string | number | boolean | null | CodegenTypes.UnsafeObject;
|
|
3
|
+
type NativeRow = CodegenTypes.UnsafeObject;
|
|
5
4
|
type NativeSQLStatement = {
|
|
6
5
|
sql: string;
|
|
7
6
|
params: ReadonlyArray<NativeSQLiteBindValue>;
|
|
@@ -10,7 +9,7 @@ type StatusEvent = {
|
|
|
10
9
|
status: string;
|
|
11
10
|
retryAt: string | null;
|
|
12
11
|
operation: string | null;
|
|
13
|
-
failure: UnsafeObject | null;
|
|
12
|
+
failure: CodegenTypes.UnsafeObject | null;
|
|
14
13
|
};
|
|
15
14
|
type ConflictEvent = {
|
|
16
15
|
table: string;
|
|
@@ -25,8 +24,8 @@ type SyncEvent = {
|
|
|
25
24
|
operation: string | null;
|
|
26
25
|
attempt: number | null;
|
|
27
26
|
retryAt: string | null;
|
|
28
|
-
source: UnsafeObject | null;
|
|
29
|
-
target: UnsafeObject | null;
|
|
27
|
+
source: CodegenTypes.UnsafeObject | null;
|
|
28
|
+
target: CodegenTypes.UnsafeObject | null;
|
|
30
29
|
action: string | null;
|
|
31
30
|
mutationID: string | null;
|
|
32
31
|
tableID: string | null;
|
|
@@ -34,7 +33,7 @@ type SyncEvent = {
|
|
|
34
33
|
rejectionCode: string | null;
|
|
35
34
|
scopeID: string | null;
|
|
36
35
|
rebuildID: string | null;
|
|
37
|
-
failure: UnsafeObject | null;
|
|
36
|
+
failure: CodegenTypes.UnsafeObject | null;
|
|
38
37
|
};
|
|
39
38
|
type AuthRequestEvent = {
|
|
40
39
|
requestID: string;
|
|
@@ -118,12 +117,12 @@ export interface Spec extends TurboModule {
|
|
|
118
117
|
clearRejectedMutations(): Promise<void>;
|
|
119
118
|
resolveAuthRequest(requestID: string, token: string): void;
|
|
120
119
|
rejectAuthRequest(requestID: string, error: string): void;
|
|
121
|
-
readonly onStatusChange: EventEmitter<StatusEvent>;
|
|
122
|
-
readonly onSyncEvent: EventEmitter<SyncEvent>;
|
|
123
|
-
readonly onConflict: EventEmitter<ConflictEvent>;
|
|
124
|
-
readonly onAuthRequest: EventEmitter<AuthRequestEvent>;
|
|
125
|
-
readonly onChange: EventEmitter<ChangeEvent>;
|
|
126
|
-
readonly onQueryResult: EventEmitter<QueryResultEvent>;
|
|
120
|
+
readonly onStatusChange: CodegenTypes.EventEmitter<StatusEvent>;
|
|
121
|
+
readonly onSyncEvent: CodegenTypes.EventEmitter<SyncEvent>;
|
|
122
|
+
readonly onConflict: CodegenTypes.EventEmitter<ConflictEvent>;
|
|
123
|
+
readonly onAuthRequest: CodegenTypes.EventEmitter<AuthRequestEvent>;
|
|
124
|
+
readonly onChange: CodegenTypes.EventEmitter<ChangeEvent>;
|
|
125
|
+
readonly onQueryResult: CodegenTypes.EventEmitter<QueryResultEvent>;
|
|
127
126
|
addListener(eventName: string): void;
|
|
128
127
|
removeListeners(count: number): void;
|
|
129
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeSynchro.d.ts","sourceRoot":"","sources":["../../../src/NativeSynchro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeSynchro.d.ts","sourceRoot":"","sources":["../../../src/NativeSynchro.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trainstar/synchro-react-native",
|
|
3
|
-
"version": "0.4.0-rc.
|
|
3
|
+
"version": "0.4.0-rc.3",
|
|
4
4
|
"description": "React Native bridge for Synchro sync SDK",
|
|
5
5
|
"source": "./src/index.ts",
|
|
6
6
|
"main": "./lib/module/index.js",
|
|
@@ -76,25 +76,26 @@
|
|
|
76
76
|
"node": ">=20.19.4"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@react-native/babel-preset": "0.
|
|
79
|
+
"@react-native/babel-preset": "0.88.0",
|
|
80
|
+
"@react-native/jest-preset": "0.88.0",
|
|
80
81
|
"@testing-library/react-native": "^12.4.0",
|
|
81
82
|
"@types/jest": "^29.5.14",
|
|
82
|
-
"@types/react": "^19.
|
|
83
|
+
"@types/react": "^19.3.0",
|
|
83
84
|
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
84
85
|
"@typescript-eslint/parser": "^8.0.0",
|
|
85
86
|
"del-cli": "^6.0.0",
|
|
86
87
|
"eslint": "^9.0.0",
|
|
87
88
|
"jest": "^29.7.0",
|
|
88
|
-
"react": "19.
|
|
89
|
-
"react-native": "0.
|
|
89
|
+
"react": "19.3.0",
|
|
90
|
+
"react-native": "0.88.0",
|
|
90
91
|
"react-native-builder-bob": "^0.40.18",
|
|
91
|
-
"react-test-renderer": "
|
|
92
|
+
"react-test-renderer": "19.3.0",
|
|
92
93
|
"ts-jest": "^29.1.0",
|
|
93
94
|
"typescript": "^5.9.2"
|
|
94
95
|
},
|
|
95
96
|
"peerDependencies": {
|
|
96
97
|
"react": ">=19.1.1 <20.0.0",
|
|
97
|
-
"react-native": ">=0.82.1 <0.
|
|
98
|
+
"react-native": ">=0.82.1 <0.89.0"
|
|
98
99
|
},
|
|
99
100
|
"workspaces": [
|
|
100
101
|
"example"
|
|
@@ -139,7 +140,7 @@
|
|
|
139
140
|
}
|
|
140
141
|
},
|
|
141
142
|
"jest": {
|
|
142
|
-
"preset": "react-native",
|
|
143
|
+
"preset": "@react-native/jest-preset",
|
|
143
144
|
"transform": {
|
|
144
145
|
"^.+\\.tsx?$": [
|
|
145
146
|
"ts-jest",
|
package/src/NativeSynchro.ts
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import type { TurboModule } from 'react-native';
|
|
2
|
-
import type {
|
|
3
|
-
EventEmitter,
|
|
4
|
-
UnsafeObject,
|
|
5
|
-
} from 'react-native/Libraries/Types/CodegenTypes';
|
|
1
|
+
import type { CodegenTypes, TurboModule } from 'react-native';
|
|
6
2
|
import { TurboModuleRegistry } from 'react-native';
|
|
7
3
|
|
|
8
4
|
// Codegen does not support a discriminated union of object and primitive
|
|
9
5
|
// parameter types. UnsafeObject keeps the TurboModule boundary representable,
|
|
10
6
|
// while the public client validates the tagged values before crossing it.
|
|
11
|
-
type NativeSQLiteBindValue = string | number | boolean | null | UnsafeObject;
|
|
12
|
-
type NativeRow = UnsafeObject;
|
|
7
|
+
type NativeSQLiteBindValue = string | number | boolean | null | CodegenTypes.UnsafeObject;
|
|
8
|
+
type NativeRow = CodegenTypes.UnsafeObject;
|
|
13
9
|
type NativeSQLStatement = {
|
|
14
10
|
sql: string;
|
|
15
11
|
params: ReadonlyArray<NativeSQLiteBindValue>;
|
|
@@ -18,7 +14,7 @@ type StatusEvent = {
|
|
|
18
14
|
status: string;
|
|
19
15
|
retryAt: string | null;
|
|
20
16
|
operation: string | null;
|
|
21
|
-
failure: UnsafeObject | null;
|
|
17
|
+
failure: CodegenTypes.UnsafeObject | null;
|
|
22
18
|
};
|
|
23
19
|
type ConflictEvent = {
|
|
24
20
|
table: string;
|
|
@@ -33,8 +29,8 @@ type SyncEvent = {
|
|
|
33
29
|
operation: string | null;
|
|
34
30
|
attempt: number | null;
|
|
35
31
|
retryAt: string | null;
|
|
36
|
-
source: UnsafeObject | null;
|
|
37
|
-
target: UnsafeObject | null;
|
|
32
|
+
source: CodegenTypes.UnsafeObject | null;
|
|
33
|
+
target: CodegenTypes.UnsafeObject | null;
|
|
38
34
|
action: string | null;
|
|
39
35
|
mutationID: string | null;
|
|
40
36
|
tableID: string | null;
|
|
@@ -42,7 +38,7 @@ type SyncEvent = {
|
|
|
42
38
|
rejectionCode: string | null;
|
|
43
39
|
scopeID: string | null;
|
|
44
40
|
rebuildID: string | null;
|
|
45
|
-
failure: UnsafeObject | null;
|
|
41
|
+
failure: CodegenTypes.UnsafeObject | null;
|
|
46
42
|
};
|
|
47
43
|
type AuthRequestEvent = { requestID: string };
|
|
48
44
|
type ChangeEvent = { observerID: string };
|
|
@@ -171,12 +167,12 @@ export interface Spec extends TurboModule {
|
|
|
171
167
|
rejectAuthRequest(requestID: string, error: string): void;
|
|
172
168
|
|
|
173
169
|
// Typed events
|
|
174
|
-
readonly onStatusChange: EventEmitter<StatusEvent>;
|
|
175
|
-
readonly onSyncEvent: EventEmitter<SyncEvent>;
|
|
176
|
-
readonly onConflict: EventEmitter<ConflictEvent>;
|
|
177
|
-
readonly onAuthRequest: EventEmitter<AuthRequestEvent>;
|
|
178
|
-
readonly onChange: EventEmitter<ChangeEvent>;
|
|
179
|
-
readonly onQueryResult: EventEmitter<QueryResultEvent>;
|
|
170
|
+
readonly onStatusChange: CodegenTypes.EventEmitter<StatusEvent>;
|
|
171
|
+
readonly onSyncEvent: CodegenTypes.EventEmitter<SyncEvent>;
|
|
172
|
+
readonly onConflict: CodegenTypes.EventEmitter<ConflictEvent>;
|
|
173
|
+
readonly onAuthRequest: CodegenTypes.EventEmitter<AuthRequestEvent>;
|
|
174
|
+
readonly onChange: CodegenTypes.EventEmitter<ChangeEvent>;
|
|
175
|
+
readonly onQueryResult: CodegenTypes.EventEmitter<QueryResultEvent>;
|
|
180
176
|
|
|
181
177
|
// NativeEventEmitter compatibility
|
|
182
178
|
addListener(eventName: string): void;
|