@trainstar/synchro-react-native 0.1.2 → 0.3.1

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 (62) hide show
  1. package/README.md +103 -24
  2. package/SynchroReactNative.podspec +3 -2
  3. package/android/build.gradle +8 -3
  4. package/android/src/main/kotlin/com/trainstar/synchro/rn/SynchroModule.kt +1105 -238
  5. package/ios/SynchroModule.mm +178 -51
  6. package/ios/SynchroModule.swift +1382 -295
  7. package/lib/module/NativeSynchro.js +5 -0
  8. package/lib/module/NativeSynchro.js.map +1 -1
  9. package/lib/module/SynchroClient.js +637 -65
  10. package/lib/module/SynchroClient.js.map +1 -1
  11. package/lib/module/digest.js +82 -0
  12. package/lib/module/digest.js.map +1 -0
  13. package/lib/module/errors.js +165 -22
  14. package/lib/module/errors.js.map +1 -1
  15. package/lib/module/hooks/useQuery.js +37 -3
  16. package/lib/module/hooks/useQuery.js.map +1 -1
  17. package/lib/module/hooks/useSyncStatus.js +51 -6
  18. package/lib/module/hooks/useSyncStatus.js.map +1 -1
  19. package/lib/module/index.js +2 -1
  20. package/lib/module/index.js.map +1 -1
  21. package/lib/module/inspection.js +121 -0
  22. package/lib/module/inspection.js.map +1 -0
  23. package/lib/module/sqliteValues.js +87 -0
  24. package/lib/module/sqliteValues.js.map +1 -0
  25. package/lib/module/types.js +10 -0
  26. package/lib/module/types.js.map +1 -1
  27. package/lib/typescript/example/e2e/corpus-harness.d.ts +34 -0
  28. package/lib/typescript/example/e2e/corpus-harness.d.ts.map +1 -0
  29. package/lib/typescript/example/src/conformance/runner.d.ts +125 -0
  30. package/lib/typescript/example/src/conformance/runner.d.ts.map +1 -0
  31. package/lib/typescript/example/src/conformance/types.d.ts +71 -0
  32. package/lib/typescript/example/src/conformance/types.d.ts.map +1 -0
  33. package/lib/typescript/src/NativeSynchro.d.ts +59 -17
  34. package/lib/typescript/src/NativeSynchro.d.ts.map +1 -1
  35. package/lib/typescript/src/SynchroClient.d.ts +27 -10
  36. package/lib/typescript/src/SynchroClient.d.ts.map +1 -1
  37. package/lib/typescript/src/digest.d.ts +3 -0
  38. package/lib/typescript/src/digest.d.ts.map +1 -0
  39. package/lib/typescript/src/errors.d.ts +37 -9
  40. package/lib/typescript/src/errors.d.ts.map +1 -1
  41. package/lib/typescript/src/hooks/useQuery.d.ts +2 -2
  42. package/lib/typescript/src/hooks/useQuery.d.ts.map +1 -1
  43. package/lib/typescript/src/hooks/useSyncStatus.d.ts.map +1 -1
  44. package/lib/typescript/src/index.d.ts +4 -3
  45. package/lib/typescript/src/index.d.ts.map +1 -1
  46. package/lib/typescript/src/inspection.d.ts +43 -0
  47. package/lib/typescript/src/inspection.d.ts.map +1 -0
  48. package/lib/typescript/src/sqliteValues.d.ts +8 -0
  49. package/lib/typescript/src/sqliteValues.d.ts.map +1 -0
  50. package/lib/typescript/src/types.d.ts +203 -11
  51. package/lib/typescript/src/types.d.ts.map +1 -1
  52. package/package.json +20 -8
  53. package/src/NativeSynchro.ts +93 -26
  54. package/src/SynchroClient.ts +899 -120
  55. package/src/digest.ts +93 -0
  56. package/src/errors.ts +273 -33
  57. package/src/hooks/useQuery.ts +59 -16
  58. package/src/hooks/useSyncStatus.ts +40 -7
  59. package/src/index.ts +44 -3
  60. package/src/inspection.ts +226 -0
  61. package/src/sqliteValues.ts +105 -0
  62. package/src/types.ts +317 -16
@@ -1,4 +1,16 @@
1
1
  export type Row = Record<string, unknown>;
2
+ /** A lossless SQLite BLOB value at the React Native boundary. */
3
+ export interface SQLiteBytes {
4
+ readonly type: 'bytes';
5
+ readonly base64: string;
6
+ }
7
+ /** A lossless SQLite INTEGER value outside JavaScript's safe integer range. */
8
+ export interface SQLiteInt64 {
9
+ readonly type: 'int64';
10
+ readonly value: string;
11
+ }
12
+ export type SQLiteTaggedValue = SQLiteBytes | SQLiteInt64;
13
+ export type SQLiteBindValue = null | string | number | boolean | SQLiteTaggedValue;
2
14
  export interface ExecResult {
3
15
  rowsAffected: number;
4
16
  }
@@ -7,7 +19,7 @@ export interface BatchResult {
7
19
  }
8
20
  export interface SQLStatement {
9
21
  sql: string;
10
- params?: unknown[];
22
+ params?: readonly SQLiteBindValue[];
11
23
  }
12
24
  export interface ColumnDef {
13
25
  name: string;
@@ -20,17 +32,195 @@ export interface TableOptions {
20
32
  ifNotExists?: boolean;
21
33
  withoutRowid?: boolean;
22
34
  }
23
- export interface Transaction {
24
- query(sql: string, params?: unknown[]): Promise<Row[]>;
25
- queryOne(sql: string, params?: unknown[]): Promise<Row | null>;
26
- execute(sql: string, params?: unknown[]): Promise<ExecResult>;
35
+ export interface ReadTransaction {
36
+ query(sql: string, params?: readonly SQLiteBindValue[]): Promise<Row[]>;
37
+ queryOne(sql: string, params?: readonly SQLiteBindValue[]): Promise<Row | null>;
38
+ }
39
+ export interface Transaction extends ReadTransaction {
40
+ execute(sql: string, params?: readonly SQLiteBindValue[]): Promise<ExecResult>;
41
+ }
42
+ export declare const SYNC_STATUS_TYPES: readonly ["uninitialized", "local_ready", "connecting", "schema_applying", "ready", "pushing", "pulling", "rebuilding", "backoff", "error", "stopped"];
43
+ export type SyncStatusType = (typeof SYNC_STATUS_TYPES)[number];
44
+ export declare const SYNC_OPERATION_KINDS: readonly ["opening", "connecting", "schema", "pushing", "pulling", "rebuilding", "lifecycle", "database"];
45
+ export type SyncOperationKind = (typeof SYNC_OPERATION_KINDS)[number];
46
+ export declare const SYNC_RECOVERY_ACTIONS: readonly ["retry", "schema_reset", "none"];
47
+ export type SyncRecoveryAction = (typeof SYNC_RECOVERY_ACTIONS)[number];
48
+ export declare const SYNC_FAILURE_CODES: readonly ["auth_required", "client_retired", "idempotency_conflict", "invalid_request", "invalid_response", "invalid_schema_reference", "invalid_state_transition", "local_database", "schema_application_failed", "sync_integrity_failure", "unsupported_schema", "upgrade_required", "schema_mismatch", "server_error", "network_error", "database_error", "local_failure"];
49
+ export type SyncFailureCode = (typeof SYNC_FAILURE_CODES)[number];
50
+ export declare const PROTOCOL_ERROR_CODES: readonly ["invalid_request", "invalid_schema_reference", "upgrade_required", "auth_required", "idempotency_conflict", "client_retired", "client_generation_expired", "rebuild_restart_required", "schema_mismatch", "retry_later", "sync_integrity_failure", "capture_pending", "temporary_unavailable"];
51
+ export type ProtocolErrorCode = (typeof PROTOCOL_ERROR_CODES)[number];
52
+ export interface SyncFailure {
53
+ operation: SyncOperationKind;
54
+ code: SyncFailureCode;
55
+ retryable: boolean;
56
+ message: string;
57
+ recoveryAction: SyncRecoveryAction;
58
+ metadata: Record<string, string>;
59
+ }
60
+ type DetailFreeSyncStatus = {
61
+ [K in Exclude<SyncStatusType, 'backoff' | 'error'>]: {
62
+ status: K;
63
+ retryAt: null;
64
+ operation: null;
65
+ failure: null;
66
+ };
67
+ }[Exclude<SyncStatusType, 'backoff' | 'error'>];
68
+ export type SyncStatus = DetailFreeSyncStatus | {
69
+ status: 'backoff';
70
+ retryAt: Date;
71
+ operation: SyncOperationKind;
72
+ failure: null;
73
+ } | {
74
+ status: 'error';
75
+ retryAt: null;
76
+ operation: null;
77
+ failure: SyncFailure;
78
+ };
79
+ export type JSONValue = null | boolean | number | string | JSONValue[] | {
80
+ [key: string]: JSONValue;
81
+ };
82
+ export type MutationOperation = 'insert' | 'upsert' | 'update' | 'delete';
83
+ export type LocalMutationStatus = 'pending' | 'sealed' | 'superseded_before_send' | 'cancelled_before_send' | 'blocked_by_predecessor' | 'server_rejected';
84
+ export type MutationStatus = 'applied' | 'conflict' | 'rejected_terminal';
85
+ export type MutationRejectionCode = 'version_conflict' | 'row_already_exists' | 'row_deleted' | 'row_not_found' | 'schema_incompatible' | 'policy_rejected' | 'validation_failed' | 'table_not_synced';
86
+ export interface SchemaRef {
87
+ version: number;
88
+ hash: string;
89
+ }
90
+ export interface AuthoredMutationField {
91
+ fieldID: string;
92
+ logicalType: string;
93
+ value: JSONValue;
94
+ }
95
+ export interface PendingMutationInspection {
96
+ mutationID: string;
97
+ localOrder: number;
98
+ tableID: string;
99
+ tableName: string;
100
+ recordID: string;
101
+ primaryKeyFieldID: string;
102
+ primaryKeyLogicalType: string;
103
+ operation: MutationOperation;
104
+ authoredSchema: SchemaRef;
105
+ baseVersion: string | null;
106
+ clientVersion: string;
107
+ status: LocalMutationStatus;
108
+ sourceKind: string;
109
+ dependsOnMutationID: string | null;
110
+ normalizedMutationID: string | null;
111
+ sealedBatchID: string | null;
112
+ sealedOrdinal: number | null;
113
+ authoredFields: AuthoredMutationField[];
114
+ }
115
+ export interface RejectedMutationInspection {
116
+ mutationID: string;
117
+ tableName: string;
118
+ recordID: string;
119
+ status: MutationStatus;
120
+ code: MutationRejectionCode;
121
+ message: string | null;
122
+ serverRowJSON: string | null;
123
+ serverVersion: string | null;
124
+ mutationJSON: string;
125
+ rejectionJSON: string;
126
+ createdAt: string;
127
+ updatedAt: string;
128
+ }
129
+ export interface ScopeStateInspection {
130
+ scopeID: string;
131
+ cursor: string | null;
132
+ checksum: string | null;
133
+ localChecksum: string;
134
+ generation: number;
135
+ }
136
+ export interface ScopeRowInspection {
137
+ scopeID: string;
138
+ tableName: string;
139
+ recordID: string;
140
+ checksum: string;
141
+ generation: number;
142
+ }
143
+ export interface RebuildAttemptInspection {
144
+ scopeID: string;
145
+ rebuildID: string;
146
+ clientGeneration: number;
147
+ schemaVersion: number;
148
+ schemaHash: string;
149
+ generation: number;
150
+ cursor: string | null;
151
+ pageLimit: number;
152
+ }
153
+ export interface ClientStateInspection {
154
+ schema: SchemaRef | null;
155
+ scopeStates: ScopeStateInspection[];
156
+ scopeRows: ScopeRowInspection[];
157
+ rebuildAttempts: RebuildAttemptInspection[];
158
+ applicationRowCount: number;
159
+ mutationLedgerCount: number;
160
+ mutationOutcomeCount: number;
161
+ sealedBatchCount: number;
162
+ rejectedMutationCount: number;
163
+ scopeStateCount: number;
164
+ scopeRowCount: number;
165
+ provenanceCount: number;
166
+ rowMetadataCount: number;
167
+ rebuildAttemptCount: number;
168
+ rebuildReceiptCount: number;
169
+ provenanceMaintenanceWorkCursor: string;
170
+ }
171
+ export type TransportOperationClass = 'connect' | 'pull' | 'push' | 'checkpoint' | 'schemas' | 'rebuild' | 'other';
172
+ export interface TransportObservation {
173
+ sequence: number;
174
+ operationClass: TransportOperationClass;
175
+ statusCode: number;
176
+ durationNanoseconds: number;
177
+ cursorFingerprints?: string[];
178
+ cursorFingerprintsComplete?: boolean;
179
+ requestFacts?: Record<string, JSONValue>;
180
+ rebuildResponseFacts?: Record<string, JSONValue>;
181
+ pullResponseFacts?: Record<string, JSONValue>;
182
+ }
183
+ export interface TransportObservationSnapshot {
184
+ observations: TransportObservation[];
185
+ overflowed: boolean;
186
+ sequenceCheckpoint: number;
187
+ }
188
+ export type SchemaAction = 'none' | 'replace' | 'rebuild_local' | 'unsupported';
189
+ export interface SyncSchemaEvent {
190
+ source: SchemaRef;
191
+ target: SchemaRef;
192
+ action: SchemaAction;
193
+ }
194
+ export interface SyncMutationEvent {
195
+ mutationID: string;
196
+ tableID: string;
197
+ status: MutationStatus;
198
+ rejectionCode: MutationRejectionCode | null;
27
199
  }
28
- export type CheckpointMode = 'passive' | 'full' | 'restart' | 'truncate';
29
- export type SyncStatusType = 'idle' | 'connecting' | 'syncing' | 'error' | 'stopped';
30
- export interface SyncStatus {
31
- status: SyncStatusType;
32
- retryAt: Date | null;
200
+ export interface SyncRebuildEvent {
201
+ scopeID: string;
202
+ rebuildID: string;
33
203
  }
204
+ export type SyncEvent = {
205
+ type: 'state_changed';
206
+ from: SyncStatusType;
207
+ to: SyncStatusType;
208
+ } | ({
209
+ type: 'backoff';
210
+ } & {
211
+ operation: SyncOperationKind;
212
+ attempt: number;
213
+ retryAt: Date;
214
+ }) | ({
215
+ type: 'schema_applying' | 'schema_applied';
216
+ } & SyncSchemaEvent) | ({
217
+ type: 'mutation_accepted' | 'mutation_rejected';
218
+ } & SyncMutationEvent) | ({
219
+ type: 'rebuild_requested' | 'rebuild_completed';
220
+ } & SyncRebuildEvent) | {
221
+ type: 'failure';
222
+ failure: SyncFailure;
223
+ };
34
224
  export interface ConflictEvent {
35
225
  table: string;
36
226
  recordID: string;
@@ -49,7 +239,9 @@ export interface SynchroConfig {
49
239
  maxRetryAttempts?: number;
50
240
  pullPageSize?: number;
51
241
  pushBatchSize?: number;
52
- snapshotPageSize?: number;
242
+ seedDatabasePath?: string;
53
243
  }
54
244
  export type Unsubscribe = () => void;
245
+ export type AsyncUnsubscribe = () => Promise<void>;
246
+ export {};
55
247
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC/D;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAEzE,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,YAAY,GACZ,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAEnF,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CACjF;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAChF;AAED,eAAO,MAAM,iBAAiB,wJAYpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB,2GASvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,qBAAqB,4CAA6C,CAAC;AAEhF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,eAAO,MAAM,kBAAkB,+WAkBrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,eAAO,MAAM,oBAAoB,0SAcvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,kBAAkB,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,KAAK,oBAAoB,GAAG;KACzB,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG;QACnD,MAAM,EAAE,CAAC,CAAC;QACV,OAAO,EAAE,IAAI,CAAC;QACd,SAAS,EAAE,IAAI,CAAC;QAChB,OAAO,EAAE,IAAI,CAAC;KACf;CACF,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,UAAU,GAClB,oBAAoB,GACpB;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,IAAI,CAAC;CACf,GACD;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAEN,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,QAAQ,GACR,wBAAwB,GACxB,uBAAuB,GACvB,wBAAwB,GACxB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,mBAAmB,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAC7B,kBAAkB,GAClB,oBAAoB,GACpB,aAAa,GACb,eAAe,GACf,qBAAqB,GACrB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,cAAc,EAAE,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,qBAAqB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,eAAe,EAAE,wBAAwB,EAAE,CAAC;IAC5C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+BAA+B,EAAE,MAAM,CAAC;CACzC;AAED,MAAM,MAAM,uBAAuB,GAC/B,SAAS,GACT,MAAM,GACN,MAAM,GACN,YAAY,GACZ,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,uBAAuB,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,aAAa,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GACjB;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,cAAc,CAAC;CACpB,GACD,CAAC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IACrB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;CACf,CAAC,GACF,CAAC;IAAE,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CAAA;CAAE,GAAG,eAAe,CAAC,GAClE,CAAC;IAAE,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,CAAA;CAAE,GAAG,iBAAiB,CAAC,GACzE,CAAC;IAAE,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACxE;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAEN,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AACrC,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trainstar/synchro-react-native",
3
- "version": "0.1.2",
3
+ "version": "0.3.1",
4
4
  "description": "React Native bridge for Synchro sync SDK",
5
5
  "source": "./src/index.ts",
6
6
  "main": "./lib/module/index.js",
@@ -11,6 +11,11 @@
11
11
  "types": "./lib/typescript/src/index.d.ts",
12
12
  "default": "./lib/module/index.js"
13
13
  },
14
+ "./inspection": {
15
+ "source": "./src/inspection.ts",
16
+ "types": "./lib/typescript/src/inspection.d.ts",
17
+ "default": "./lib/module/inspection.js"
18
+ },
14
19
  "./package.json": "./package.json"
15
20
  },
16
21
  "files": [
@@ -35,8 +40,9 @@
35
40
  "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
36
41
  "prepare": "bob build",
37
42
  "pack:dry-run": "npm pack --dry-run",
38
- "test:unit": "jest --runInBand",
43
+ "test:unit": "jest --runInBand --watchman=false",
39
44
  "typecheck": "tsc",
45
+ "lint": "eslint src/ __tests__/ example/e2e/",
40
46
  "test": "jest"
41
47
  },
42
48
  "keywords": [
@@ -58,24 +64,29 @@
58
64
  "publishConfig": {
59
65
  "registry": "https://registry.npmjs.org/"
60
66
  },
67
+ "engines": {
68
+ "node": ">=20.19.4"
69
+ },
61
70
  "devDependencies": {
62
71
  "@react-native/babel-preset": "0.83.0",
63
72
  "@testing-library/react-native": "^12.4.0",
64
73
  "@types/jest": "^29.5.14",
65
- "@types/react": "^19.2.0",
74
+ "@types/react": "^19.2.4",
75
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
76
+ "@typescript-eslint/parser": "^8.0.0",
66
77
  "del-cli": "^6.0.0",
78
+ "eslint": "^9.0.0",
67
79
  "jest": "^29.7.0",
68
- "react": "19.2.0",
80
+ "react": "19.2.4",
69
81
  "react-native": "0.83.0",
70
82
  "react-native-builder-bob": "^0.40.18",
71
- "react-test-renderer": "^19.2.0",
83
+ "react-test-renderer": "^19.2.4",
72
84
  "ts-jest": "^29.1.0",
73
- "turbo": "^2.5.6",
74
85
  "typescript": "^5.9.2"
75
86
  },
76
87
  "peerDependencies": {
77
- "react": "*",
78
- "react-native": "*"
88
+ "react": ">=19.2.0 <20.0.0",
89
+ "react-native": ">=0.83.0 <0.84.0"
79
90
  },
80
91
  "workspaces": [
81
92
  "example"
@@ -123,6 +134,7 @@
123
134
  ]
124
135
  },
125
136
  "moduleNameMapper": {
137
+ "^@trainstar/synchro-react-native/inspection$": "<rootDir>/src/inspection",
126
138
  "^react-native$": "<rootDir>/__tests__/__mocks__/react-native"
127
139
  },
128
140
  "modulePathIgnorePatterns": [
@@ -1,21 +1,55 @@
1
1
  import type { TurboModule } from 'react-native';
2
- import type { EventEmitter } from 'react-native/Libraries/Types/CodegenTypes';
2
+ import type {
3
+ EventEmitter,
4
+ UnsafeObject,
5
+ } from 'react-native/Libraries/Types/CodegenTypes';
3
6
  import { TurboModuleRegistry } from 'react-native';
4
7
 
5
- type StatusEvent = { status: string; retryAt: string | null };
8
+ // Codegen does not support a discriminated union of object and primitive
9
+ // parameter types. UnsafeObject keeps the TurboModule boundary representable,
10
+ // while the public client validates the tagged values before crossing it.
11
+ type NativeSQLiteBindValue = string | number | boolean | null | UnsafeObject;
12
+ type NativeRow = UnsafeObject;
13
+ type NativeSQLStatement = {
14
+ sql: string;
15
+ params: ReadonlyArray<NativeSQLiteBindValue>;
16
+ };
17
+ type StatusEvent = {
18
+ status: string;
19
+ retryAt: string | null;
20
+ operation: string | null;
21
+ failure: UnsafeObject | null;
22
+ };
6
23
  type ConflictEvent = {
7
24
  table: string;
8
25
  recordID: string;
9
26
  clientDataJson: string | null;
10
27
  serverDataJson: string | null;
11
28
  };
29
+ type SyncEvent = {
30
+ type: string;
31
+ from: string | null;
32
+ to: string | null;
33
+ operation: string | null;
34
+ attempt: number | null;
35
+ retryAt: string | null;
36
+ source: UnsafeObject | null;
37
+ target: UnsafeObject | null;
38
+ action: string | null;
39
+ mutationID: string | null;
40
+ tableID: string | null;
41
+ mutationStatus: string | null;
42
+ rejectionCode: string | null;
43
+ scopeID: string | null;
44
+ rebuildID: string | null;
45
+ failure: UnsafeObject | null;
46
+ };
12
47
  type AuthRequestEvent = { requestID: string };
13
- type SnapshotRequiredEvent = { requestID: string };
14
48
  type ChangeEvent = { observerID: string };
15
- type QueryResultEvent = { observerID: string; rowsJson: string };
49
+ type QueryResultEvent = { observerID: string; rows: ReadonlyArray<NativeRow> };
16
50
 
17
51
  export interface Spec extends TurboModule {
18
- // -- Lifecycle --
52
+ // Lifecycle
19
53
  initialize(config: {
20
54
  dbPath: string;
21
55
  serverURL: string;
@@ -27,40 +61,59 @@ export interface Spec extends TurboModule {
27
61
  maxRetryAttempts: number;
28
62
  pullPageSize: number;
29
63
  pushBatchSize: number;
30
- snapshotPageSize: number;
64
+ seedDatabasePath?: string;
65
+ transportObservationCapacity: number;
66
+ requireNewDatabase: boolean;
31
67
  }): Promise<void>;
32
68
  close(): Promise<void>;
33
69
  getPath(): Promise<string>;
34
70
 
35
- // -- Core SQL --
36
- query(sql: string, paramsJson: string): Promise<string>;
37
- queryOne(sql: string, paramsJson: string): Promise<string | null>;
71
+ // Core SQL
72
+ query(
73
+ sql: string,
74
+ params: ReadonlyArray<NativeSQLiteBindValue>
75
+ ): Promise<ReadonlyArray<NativeRow>>;
76
+ queryOne(
77
+ sql: string,
78
+ params: ReadonlyArray<NativeSQLiteBindValue>
79
+ ): Promise<NativeRow | null>;
38
80
  execute(
39
81
  sql: string,
40
- paramsJson: string
82
+ params: ReadonlyArray<NativeSQLiteBindValue>
83
+ ): Promise<{ rowsAffected: number }>;
84
+ executeAuthoredWrite(
85
+ tableName: string,
86
+ operation: string,
87
+ columnNames: ReadonlyArray<string>,
88
+ sql: string,
89
+ values: ReadonlyArray<NativeSQLiteBindValue>
41
90
  ): Promise<{ rowsAffected: number }>;
42
91
  executeBatch(
43
- statementsJson: string
92
+ statements: ReadonlyArray<NativeSQLStatement>
44
93
  ): Promise<{ totalRowsAffected: number }>;
45
94
 
46
- // -- Transactions --
95
+ // Transactions
47
96
  beginWriteTransaction(): Promise<string>;
48
97
  beginReadTransaction(): Promise<string>;
49
- txQuery(txID: string, sql: string, paramsJson: string): Promise<string>;
98
+ txQuery(
99
+ txID: string,
100
+ sql: string,
101
+ params: ReadonlyArray<NativeSQLiteBindValue>
102
+ ): Promise<ReadonlyArray<NativeRow>>;
50
103
  txQueryOne(
51
104
  txID: string,
52
105
  sql: string,
53
- paramsJson: string
54
- ): Promise<string | null>;
106
+ params: ReadonlyArray<NativeSQLiteBindValue>
107
+ ): Promise<NativeRow | null>;
55
108
  txExecute(
56
109
  txID: string,
57
110
  sql: string,
58
- paramsJson: string
111
+ params: ReadonlyArray<NativeSQLiteBindValue>
59
112
  ): Promise<{ rowsAffected: number }>;
60
113
  commitTransaction(txID: string): Promise<void>;
61
114
  rollbackTransaction(txID: string): Promise<void>;
62
115
 
63
- // -- Schema --
116
+ // Schema
64
117
  createTable(
65
118
  name: string,
66
119
  columnsJson: string,
@@ -73,7 +126,7 @@ export interface Spec extends TurboModule {
73
126
  unique: boolean
74
127
  ): Promise<void>;
75
128
 
76
- // -- Observation --
129
+ // Observation
77
130
  addChangeObserver(
78
131
  observerID: string,
79
132
  tables: ReadonlyArray<string>
@@ -81,32 +134,46 @@ export interface Spec extends TurboModule {
81
134
  addQueryObserver(
82
135
  observerID: string,
83
136
  sql: string,
84
- paramsJson: string,
137
+ params: ReadonlyArray<NativeSQLiteBindValue>,
85
138
  tables: ReadonlyArray<string>
86
139
  ): Promise<void>;
87
140
  removeObserver(observerID: string): Promise<void>;
88
141
 
89
- // -- Sync --
90
- checkpoint(mode: string): Promise<void>;
142
+ // Sync
91
143
  start(): Promise<void>;
92
144
  stop(): Promise<void>;
145
+ enterBackground(): Promise<void>;
146
+ enterForeground(): Promise<void>;
147
+ retryAfterError(): Promise<void>;
148
+ resetSchemaAndStart(): Promise<void>;
93
149
  syncNow(): Promise<void>;
94
150
  pendingChangeCount(): Promise<number>;
151
+ getSyncStatus(): Promise<string>;
152
+ inspectPendingMutations(): Promise<string>;
153
+ inspectRetainedMutations(): Promise<string>;
154
+ inspectRejectedMutations(): Promise<string>;
155
+ inspectClientState(): Promise<string>;
156
+ inspectDurableState(tableName: string, recordID: string): Promise<string>;
157
+ inspectTransportObservations(): Promise<string>;
158
+ armTransportPause(operationClass: string): Promise<void>;
159
+ awaitTransportPause(operationClass: string, timeoutMs: number): Promise<void>;
160
+ resumeTransportPause(): Promise<void>;
161
+ getProcessIdentity(): Promise<string>;
162
+ clearRejectedMutations(): Promise<void>;
95
163
 
96
- // -- Bidirectional responses --
164
+ // Bidirectional responses
97
165
  resolveAuthRequest(requestID: string, token: string): void;
98
166
  rejectAuthRequest(requestID: string, error: string): void;
99
- resolveSnapshotRequest(requestID: string, approved: boolean): void;
100
167
 
101
- // -- Typed events --
168
+ // Typed events
102
169
  readonly onStatusChange: EventEmitter<StatusEvent>;
170
+ readonly onSyncEvent: EventEmitter<SyncEvent>;
103
171
  readonly onConflict: EventEmitter<ConflictEvent>;
104
172
  readonly onAuthRequest: EventEmitter<AuthRequestEvent>;
105
- readonly onSnapshotRequired: EventEmitter<SnapshotRequiredEvent>;
106
173
  readonly onChange: EventEmitter<ChangeEvent>;
107
174
  readonly onQueryResult: EventEmitter<QueryResultEvent>;
108
175
 
109
- // -- NativeEventEmitter compatibility --
176
+ // NativeEventEmitter compatibility
110
177
  addListener(eventName: string): void;
111
178
  removeListeners(count: number): void;
112
179
  }