@trainstar/synchro-react-native 0.1.0

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 (57) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +122 -0
  3. package/SynchroReactNative.podspec +22 -0
  4. package/android/build.gradle +81 -0
  5. package/android/src/main/AndroidManifest.xml +3 -0
  6. package/android/src/main/kotlin/com/trainstar/synchro/rn/SynchroModule.kt +808 -0
  7. package/android/src/main/kotlin/com/trainstar/synchro/rn/SynchroPackage.kt +32 -0
  8. package/ios/SynchroModule.mm +368 -0
  9. package/ios/SynchroModule.swift +970 -0
  10. package/lib/module/NativeSynchro.js +5 -0
  11. package/lib/module/NativeSynchro.js.map +1 -0
  12. package/lib/module/SynchroClient.js +295 -0
  13. package/lib/module/SynchroClient.js.map +1 -0
  14. package/lib/module/errors.js +150 -0
  15. package/lib/module/errors.js.map +1 -0
  16. package/lib/module/hooks/index.js +6 -0
  17. package/lib/module/hooks/index.js.map +1 -0
  18. package/lib/module/hooks/usePendingChanges.js +25 -0
  19. package/lib/module/hooks/usePendingChanges.js.map +1 -0
  20. package/lib/module/hooks/useQuery.js +74 -0
  21. package/lib/module/hooks/useQuery.js.map +1 -0
  22. package/lib/module/hooks/useSyncStatus.js +15 -0
  23. package/lib/module/hooks/useSyncStatus.js.map +1 -0
  24. package/lib/module/index.js +8 -0
  25. package/lib/module/index.js.map +1 -0
  26. package/lib/module/package.json +1 -0
  27. package/lib/module/types.js +2 -0
  28. package/lib/module/types.js.map +1 -0
  29. package/lib/typescript/package.json +1 -0
  30. package/lib/typescript/src/NativeSynchro.d.ts +84 -0
  31. package/lib/typescript/src/NativeSynchro.d.ts.map +1 -0
  32. package/lib/typescript/src/SynchroClient.d.ts +30 -0
  33. package/lib/typescript/src/SynchroClient.d.ts.map +1 -0
  34. package/lib/typescript/src/errors.d.ts +61 -0
  35. package/lib/typescript/src/errors.d.ts.map +1 -0
  36. package/lib/typescript/src/hooks/index.d.ts +4 -0
  37. package/lib/typescript/src/hooks/index.d.ts.map +1 -0
  38. package/lib/typescript/src/hooks/usePendingChanges.d.ts +3 -0
  39. package/lib/typescript/src/hooks/usePendingChanges.d.ts.map +1 -0
  40. package/lib/typescript/src/hooks/useQuery.d.ts +12 -0
  41. package/lib/typescript/src/hooks/useQuery.d.ts.map +1 -0
  42. package/lib/typescript/src/hooks/useSyncStatus.d.ts +4 -0
  43. package/lib/typescript/src/hooks/useSyncStatus.d.ts.map +1 -0
  44. package/lib/typescript/src/index.d.ts +8 -0
  45. package/lib/typescript/src/index.d.ts.map +1 -0
  46. package/lib/typescript/src/types.d.ts +55 -0
  47. package/lib/typescript/src/types.d.ts.map +1 -0
  48. package/package.json +146 -0
  49. package/src/NativeSynchro.ts +114 -0
  50. package/src/SynchroClient.ts +424 -0
  51. package/src/errors.ts +205 -0
  52. package/src/hooks/index.ts +3 -0
  53. package/src/hooks/usePendingChanges.ts +32 -0
  54. package/src/hooks/useQuery.ts +93 -0
  55. package/src/hooks/useSyncStatus.ts +17 -0
  56. package/src/index.ts +41 -0
  57. package/src/types.ts +71 -0
@@ -0,0 +1,84 @@
1
+ import type { TurboModule } from 'react-native';
2
+ import type { EventEmitter } from 'react-native/Libraries/Types/CodegenTypes';
3
+ type StatusEvent = {
4
+ status: string;
5
+ retryAt: string | null;
6
+ };
7
+ type ConflictEvent = {
8
+ table: string;
9
+ recordID: string;
10
+ clientDataJson: string | null;
11
+ serverDataJson: string | null;
12
+ };
13
+ type AuthRequestEvent = {
14
+ requestID: string;
15
+ };
16
+ type SnapshotRequiredEvent = {
17
+ requestID: string;
18
+ };
19
+ type ChangeEvent = {
20
+ observerID: string;
21
+ };
22
+ type QueryResultEvent = {
23
+ observerID: string;
24
+ rowsJson: string;
25
+ };
26
+ export interface Spec extends TurboModule {
27
+ initialize(config: {
28
+ dbPath: string;
29
+ serverURL: string;
30
+ clientID: string;
31
+ platform: string;
32
+ appVersion: string;
33
+ syncInterval: number;
34
+ pushDebounce: number;
35
+ maxRetryAttempts: number;
36
+ pullPageSize: number;
37
+ pushBatchSize: number;
38
+ snapshotPageSize: number;
39
+ }): Promise<void>;
40
+ close(): Promise<void>;
41
+ getPath(): Promise<string>;
42
+ query(sql: string, paramsJson: string): Promise<string>;
43
+ queryOne(sql: string, paramsJson: string): Promise<string | null>;
44
+ execute(sql: string, paramsJson: string): Promise<{
45
+ rowsAffected: number;
46
+ }>;
47
+ executeBatch(statementsJson: string): Promise<{
48
+ totalRowsAffected: number;
49
+ }>;
50
+ beginWriteTransaction(): Promise<string>;
51
+ beginReadTransaction(): Promise<string>;
52
+ txQuery(txID: string, sql: string, paramsJson: string): Promise<string>;
53
+ txQueryOne(txID: string, sql: string, paramsJson: string): Promise<string | null>;
54
+ txExecute(txID: string, sql: string, paramsJson: string): Promise<{
55
+ rowsAffected: number;
56
+ }>;
57
+ commitTransaction(txID: string): Promise<void>;
58
+ rollbackTransaction(txID: string): Promise<void>;
59
+ createTable(name: string, columnsJson: string, optionsJson: string | null): Promise<void>;
60
+ alterTable(name: string, columnsJson: string): Promise<void>;
61
+ createIndex(table: string, columns: ReadonlyArray<string>, unique: boolean): Promise<void>;
62
+ addChangeObserver(observerID: string, tables: ReadonlyArray<string>): Promise<void>;
63
+ addQueryObserver(observerID: string, sql: string, paramsJson: string, tables: ReadonlyArray<string>): Promise<void>;
64
+ removeObserver(observerID: string): Promise<void>;
65
+ checkpoint(mode: string): Promise<void>;
66
+ start(): Promise<void>;
67
+ stop(): Promise<void>;
68
+ syncNow(): Promise<void>;
69
+ pendingChangeCount(): Promise<number>;
70
+ resolveAuthRequest(requestID: string, token: string): void;
71
+ rejectAuthRequest(requestID: string, error: string): void;
72
+ resolveSnapshotRequest(requestID: string, approved: boolean): void;
73
+ readonly onStatusChange: EventEmitter<StatusEvent>;
74
+ readonly onConflict: EventEmitter<ConflictEvent>;
75
+ readonly onAuthRequest: EventEmitter<AuthRequestEvent>;
76
+ readonly onSnapshotRequired: EventEmitter<SnapshotRequiredEvent>;
77
+ readonly onChange: EventEmitter<ChangeEvent>;
78
+ readonly onQueryResult: EventEmitter<QueryResultEvent>;
79
+ addListener(eventName: string): void;
80
+ removeListeners(count: number): void;
81
+ }
82
+ declare const _default: Spec;
83
+ export default _default;
84
+ //# sourceMappingURL=NativeSynchro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeSynchro.d.ts","sourceRoot":"","sources":["../../../src/NativeSynchro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Row, ExecResult, BatchResult, SQLStatement, ColumnDef, TableOptions, Transaction, CheckpointMode, SyncStatus, ConflictEvent, SynchroConfig, Unsubscribe } from './types';
2
+ export declare class SynchroClient {
3
+ private readonly native;
4
+ private readonly config;
5
+ private authSubscription;
6
+ constructor(config: SynchroConfig);
7
+ initialize(): Promise<void>;
8
+ query(sql: string, params?: unknown[]): Promise<Row[]>;
9
+ queryOne(sql: string, params?: unknown[]): Promise<Row | null>;
10
+ execute(sql: string, params?: unknown[]): Promise<ExecResult>;
11
+ executeBatch(statements: SQLStatement[]): Promise<BatchResult>;
12
+ writeTransaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T>;
13
+ readTransaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T>;
14
+ createTable(name: string, columns: ColumnDef[], options?: TableOptions): Promise<void>;
15
+ alterTable(name: string, addColumns: ColumnDef[]): Promise<void>;
16
+ createIndex(table: string, columns: string[], unique?: boolean): Promise<void>;
17
+ onChange(tables: string[], callback: () => void): Unsubscribe;
18
+ watch(sql: string, params: unknown[] | undefined, tables: string[], callback: (rows: Row[]) => void): Unsubscribe;
19
+ checkpoint(mode?: CheckpointMode): Promise<void>;
20
+ close(): Promise<void>;
21
+ getPath(): Promise<string>;
22
+ pendingChangeCount(): Promise<number>;
23
+ start(): Promise<void>;
24
+ stop(): Promise<void>;
25
+ syncNow(): Promise<void>;
26
+ onStatusChange(callback: (status: SyncStatus) => void): Unsubscribe;
27
+ onConflict(callback: (event: ConflictEvent) => void): Unsubscribe;
28
+ onSnapshotRequired(handler: () => Promise<boolean>): Unsubscribe;
29
+ }
30
+ //# sourceMappingURL=SynchroClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SynchroClient.d.ts","sourceRoot":"","sources":["../../../src/SynchroClient.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,GAAG,EACH,UAAU,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EAEV,aAAa,EACb,aAAa,EACb,WAAW,EACZ,MAAM,SAAS,CAAC;AAOjB,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,gBAAgB,CAAkC;gBAE9C,MAAM,EAAE,aAAa;IAqB3B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAYtD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAY9D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAW7D,YAAY,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAc9D,gBAAgB,CAAC,CAAC,EACtB,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC;IA+CP,eAAe,CAAC,CAAC,EACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC;IAiDP,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,EAAE,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAYV,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhE,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,UAAQ,GACb,OAAO,CAAC,IAAI,CAAC;IAUhB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW;IAmB7D,KAAK,CACH,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAC9B,WAAW;IA0BR,UAAU,CAAC,IAAI,GAAE,cAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ1B,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,WAAW;IAYnE,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,WAAW;IAuBjE,kBAAkB,CAChB,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC9B,WAAW;CAcf"}
@@ -0,0 +1,61 @@
1
+ export declare class SynchroError extends Error {
2
+ readonly code: string;
3
+ constructor(code: string, message: string);
4
+ }
5
+ export declare class NotConnectedError extends SynchroError {
6
+ constructor();
7
+ }
8
+ export declare class SchemaNotLoadedError extends SynchroError {
9
+ constructor();
10
+ }
11
+ export declare class TableNotSyncedError extends SynchroError {
12
+ readonly table: string;
13
+ constructor(table: string);
14
+ }
15
+ export declare class UpgradeRequiredError extends SynchroError {
16
+ readonly currentVersion: string;
17
+ readonly minimumVersion: string;
18
+ constructor(currentVersion: string, minimumVersion: string);
19
+ }
20
+ export declare class SchemaMismatchError extends SynchroError {
21
+ readonly serverVersion: number;
22
+ readonly serverHash: string;
23
+ constructor(serverVersion: number, serverHash: string);
24
+ }
25
+ export declare class SnapshotRequiredError extends SynchroError {
26
+ constructor();
27
+ }
28
+ export interface PushResultItem {
29
+ recordID: string;
30
+ table: string;
31
+ status: string;
32
+ message?: string;
33
+ }
34
+ export declare class PushRejectedError extends SynchroError {
35
+ readonly results: PushResultItem[];
36
+ constructor(results: PushResultItem[]);
37
+ }
38
+ export declare class NetworkError extends SynchroError {
39
+ constructor(message: string);
40
+ }
41
+ export declare class ServerError extends SynchroError {
42
+ readonly status: number;
43
+ constructor(status: number, message: string);
44
+ }
45
+ export declare class DatabaseError extends SynchroError {
46
+ constructor(message: string);
47
+ }
48
+ export declare class InvalidResponseError extends SynchroError {
49
+ constructor(message: string);
50
+ }
51
+ export declare class AlreadyStartedError extends SynchroError {
52
+ constructor();
53
+ }
54
+ export declare class NotStartedError extends SynchroError {
55
+ constructor();
56
+ }
57
+ export declare class TransactionTimeoutError extends SynchroError {
58
+ constructor();
59
+ }
60
+ export declare function mapNativeError(error: unknown): SynchroError;
61
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,iBAAkB,SAAQ,YAAY;;CAKlD;AAED,qBAAa,oBAAqB,SAAQ,YAAY;;CAKrD;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM;CAK1B;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;gBAEpB,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;CAS3D;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAStD;AAED,qBAAa,qBAAsB,SAAQ,YAAY;;CAKtD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;gBAEvB,OAAO,EAAE,cAAc,EAAE;CAKtC;AAED,qBAAa,YAAa,SAAQ,YAAY;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAED,qBAAa,aAAc,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,YAAY;;CAKpD;AAED,qBAAa,eAAgB,SAAQ,YAAY;;CAKhD;AAED,qBAAa,uBAAwB,SAAQ,YAAY;;CAKxD;AAQD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CA0D3D"}
@@ -0,0 +1,4 @@
1
+ export { useQuery } from './useQuery';
2
+ export { useSyncStatus } from './useSyncStatus';
3
+ export { usePendingChanges } from './usePendingChanges';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SynchroClient } from '../SynchroClient';
2
+ export declare function usePendingChanges(client: SynchroClient, pollInterval?: number): number;
3
+ //# sourceMappingURL=usePendingChanges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePendingChanges.d.ts","sourceRoot":"","sources":["../../../../src/hooks/usePendingChanges.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,YAAY,SAAO,GAClB,MAAM,CAyBR"}
@@ -0,0 +1,12 @@
1
+ import type { SynchroClient } from '../SynchroClient';
2
+ import type { Row } from '../types';
3
+ import type { SynchroError } from '../errors';
4
+ interface UseQueryResult {
5
+ data: Row[];
6
+ loading: boolean;
7
+ error: SynchroError | null;
8
+ refresh: () => void;
9
+ }
10
+ export declare function useQuery(client: SynchroClient, sql: string, params?: unknown[], tables?: string[]): UseQueryResult;
11
+ export {};
12
+ //# sourceMappingURL=useQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,UAAU,cAAc;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAuBD,wBAAgB,QAAQ,CACtB,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,EAClB,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc,CAsDhB"}
@@ -0,0 +1,4 @@
1
+ import type { SynchroClient } from '../SynchroClient';
2
+ import type { SyncStatus } from '../types';
3
+ export declare function useSyncStatus(client: SynchroClient): SyncStatus;
4
+ //# sourceMappingURL=useSyncStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncStatus.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useSyncStatus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAY/D"}
@@ -0,0 +1,8 @@
1
+ export { SynchroClient } from './SynchroClient';
2
+ export { useQuery } from './hooks/useQuery';
3
+ export { useSyncStatus } from './hooks/useSyncStatus';
4
+ export { usePendingChanges } from './hooks/usePendingChanges';
5
+ export type { Row, ExecResult, BatchResult, SQLStatement, ColumnDef, TableOptions, Transaction, CheckpointMode, SyncStatus, SyncStatusType, ConflictEvent, SynchroConfig, Unsubscribe, } from './types';
6
+ export { SynchroError, NotConnectedError, SchemaNotLoadedError, TableNotSyncedError, UpgradeRequiredError, SchemaMismatchError, SnapshotRequiredError, PushRejectedError, NetworkError, ServerError, DatabaseError, InvalidResponseError, AlreadyStartedError, NotStartedError, TransactionTimeoutError, mapNativeError, } from './errors';
7
+ export type { PushResultItem } from './errors';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,YAAY,EACV,GAAG,EACH,UAAU,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,55 @@
1
+ export type Row = Record<string, unknown>;
2
+ export interface ExecResult {
3
+ rowsAffected: number;
4
+ }
5
+ export interface BatchResult {
6
+ totalRowsAffected: number;
7
+ }
8
+ export interface SQLStatement {
9
+ sql: string;
10
+ params?: unknown[];
11
+ }
12
+ export interface ColumnDef {
13
+ name: string;
14
+ type: string;
15
+ nullable?: boolean;
16
+ primaryKey?: boolean;
17
+ defaultValue?: string;
18
+ }
19
+ export interface TableOptions {
20
+ ifNotExists?: boolean;
21
+ withoutRowid?: boolean;
22
+ }
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>;
27
+ }
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;
33
+ }
34
+ export interface ConflictEvent {
35
+ table: string;
36
+ recordID: string;
37
+ clientData: Row | null;
38
+ serverData: Row | null;
39
+ }
40
+ export interface SynchroConfig {
41
+ dbPath: string;
42
+ serverURL: string;
43
+ authProvider: () => Promise<string>;
44
+ clientID: string;
45
+ platform?: string;
46
+ appVersion: string;
47
+ syncInterval?: number;
48
+ pushDebounce?: number;
49
+ maxRetryAttempts?: number;
50
+ pullPageSize?: number;
51
+ pushBatchSize?: number;
52
+ snapshotPageSize?: number;
53
+ }
54
+ export type Unsubscribe = () => void;
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,146 @@
1
+ {
2
+ "name": "@trainstar/synchro-react-native",
3
+ "version": "0.1.0",
4
+ "description": "React Native bridge for Synchro sync SDK",
5
+ "source": "./src/index.ts",
6
+ "main": "./lib/module/index.js",
7
+ "types": "./lib/typescript/src/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "source": "./src/index.ts",
11
+ "types": "./lib/typescript/src/index.d.ts",
12
+ "default": "./lib/module/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "files": [
17
+ "src",
18
+ "lib",
19
+ "android",
20
+ "ios",
21
+ "*.podspec",
22
+ "!ios/build",
23
+ "!android/build",
24
+ "!android/gradle",
25
+ "!android/gradlew",
26
+ "!android/gradlew.bat",
27
+ "!android/local.properties",
28
+ "!**/__tests__",
29
+ "!**/__fixtures__",
30
+ "!**/__mocks__",
31
+ "!**/.*"
32
+ ],
33
+ "scripts": {
34
+ "example": "yarn workspace @trainstar/synchro-react-native-example",
35
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
36
+ "prepare": "bob build",
37
+ "pack:dry-run": "npm pack --dry-run",
38
+ "test:unit": "jest --runInBand",
39
+ "typecheck": "tsc",
40
+ "test": "jest"
41
+ },
42
+ "keywords": [
43
+ "react-native",
44
+ "synchro",
45
+ "sync",
46
+ "offline-first"
47
+ ],
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/trainstar/synchro.git"
51
+ },
52
+ "author": "Trainstar <dev@trainstar.com> (https://trainstar.com)",
53
+ "license": "MIT",
54
+ "bugs": {
55
+ "url": "https://github.com/trainstar/synchro/issues"
56
+ },
57
+ "homepage": "https://github.com/trainstar/synchro#readme",
58
+ "publishConfig": {
59
+ "registry": "https://registry.npmjs.org/"
60
+ },
61
+ "devDependencies": {
62
+ "@react-native/babel-preset": "0.83.0",
63
+ "@testing-library/react-native": "^12.4.0",
64
+ "@types/jest": "^29.5.14",
65
+ "@types/react": "^19.2.0",
66
+ "del-cli": "^6.0.0",
67
+ "jest": "^29.7.0",
68
+ "react": "19.2.0",
69
+ "react-native": "0.83.0",
70
+ "react-native-builder-bob": "^0.40.18",
71
+ "react-test-renderer": "^19.2.0",
72
+ "ts-jest": "^29.1.0",
73
+ "turbo": "^2.5.6",
74
+ "typescript": "^5.9.2"
75
+ },
76
+ "peerDependencies": {
77
+ "react": "*",
78
+ "react-native": "*"
79
+ },
80
+ "workspaces": [
81
+ "example"
82
+ ],
83
+ "packageManager": "yarn@4.11.0",
84
+ "react-native-builder-bob": {
85
+ "source": "src",
86
+ "output": "lib",
87
+ "targets": [
88
+ [
89
+ "module",
90
+ {
91
+ "esm": true
92
+ }
93
+ ],
94
+ [
95
+ "typescript",
96
+ {
97
+ "project": "tsconfig.build.json"
98
+ }
99
+ ]
100
+ ]
101
+ },
102
+ "codegenConfig": {
103
+ "name": "SynchroModuleSpec",
104
+ "type": "modules",
105
+ "jsSrcsDir": "src",
106
+ "android": {
107
+ "javaPackageName": "com.trainstar.synchro.rn"
108
+ },
109
+ "ios": {
110
+ "modulesProvider": {
111
+ "SynchroModule": "SynchroModule"
112
+ }
113
+ }
114
+ },
115
+ "jest": {
116
+ "preset": "react-native",
117
+ "transform": {
118
+ "^.+\\.tsx?$": [
119
+ "ts-jest",
120
+ {
121
+ "tsconfig": "tsconfig.json"
122
+ }
123
+ ]
124
+ },
125
+ "moduleNameMapper": {
126
+ "^react-native$": "<rootDir>/__tests__/__mocks__/react-native"
127
+ },
128
+ "modulePathIgnorePatterns": [
129
+ "<rootDir>/example/node_modules",
130
+ "<rootDir>/lib/"
131
+ ],
132
+ "testPathIgnorePatterns": [
133
+ "<rootDir>/example/e2e",
134
+ "<rootDir>/node_modules",
135
+ "<rootDir>/__tests__/__mocks__"
136
+ ]
137
+ },
138
+ "create-react-native-library": {
139
+ "type": "turbo-module",
140
+ "languages": "kotlin-objc",
141
+ "tools": [
142
+ "jest"
143
+ ],
144
+ "version": "0.57.2"
145
+ }
146
+ }
@@ -0,0 +1,114 @@
1
+ import type { TurboModule } from 'react-native';
2
+ import type { EventEmitter } from 'react-native/Libraries/Types/CodegenTypes';
3
+ import { TurboModuleRegistry } from 'react-native';
4
+
5
+ type StatusEvent = { status: string; retryAt: string | null };
6
+ type ConflictEvent = {
7
+ table: string;
8
+ recordID: string;
9
+ clientDataJson: string | null;
10
+ serverDataJson: string | null;
11
+ };
12
+ type AuthRequestEvent = { requestID: string };
13
+ type SnapshotRequiredEvent = { requestID: string };
14
+ type ChangeEvent = { observerID: string };
15
+ type QueryResultEvent = { observerID: string; rowsJson: string };
16
+
17
+ export interface Spec extends TurboModule {
18
+ // -- Lifecycle --
19
+ initialize(config: {
20
+ dbPath: string;
21
+ serverURL: string;
22
+ clientID: string;
23
+ platform: string;
24
+ appVersion: string;
25
+ syncInterval: number;
26
+ pushDebounce: number;
27
+ maxRetryAttempts: number;
28
+ pullPageSize: number;
29
+ pushBatchSize: number;
30
+ snapshotPageSize: number;
31
+ }): Promise<void>;
32
+ close(): Promise<void>;
33
+ getPath(): Promise<string>;
34
+
35
+ // -- Core SQL --
36
+ query(sql: string, paramsJson: string): Promise<string>;
37
+ queryOne(sql: string, paramsJson: string): Promise<string | null>;
38
+ execute(
39
+ sql: string,
40
+ paramsJson: string
41
+ ): Promise<{ rowsAffected: number }>;
42
+ executeBatch(
43
+ statementsJson: string
44
+ ): Promise<{ totalRowsAffected: number }>;
45
+
46
+ // -- Transactions --
47
+ beginWriteTransaction(): Promise<string>;
48
+ beginReadTransaction(): Promise<string>;
49
+ txQuery(txID: string, sql: string, paramsJson: string): Promise<string>;
50
+ txQueryOne(
51
+ txID: string,
52
+ sql: string,
53
+ paramsJson: string
54
+ ): Promise<string | null>;
55
+ txExecute(
56
+ txID: string,
57
+ sql: string,
58
+ paramsJson: string
59
+ ): Promise<{ rowsAffected: number }>;
60
+ commitTransaction(txID: string): Promise<void>;
61
+ rollbackTransaction(txID: string): Promise<void>;
62
+
63
+ // -- Schema --
64
+ createTable(
65
+ name: string,
66
+ columnsJson: string,
67
+ optionsJson: string | null
68
+ ): Promise<void>;
69
+ alterTable(name: string, columnsJson: string): Promise<void>;
70
+ createIndex(
71
+ table: string,
72
+ columns: ReadonlyArray<string>,
73
+ unique: boolean
74
+ ): Promise<void>;
75
+
76
+ // -- Observation --
77
+ addChangeObserver(
78
+ observerID: string,
79
+ tables: ReadonlyArray<string>
80
+ ): Promise<void>;
81
+ addQueryObserver(
82
+ observerID: string,
83
+ sql: string,
84
+ paramsJson: string,
85
+ tables: ReadonlyArray<string>
86
+ ): Promise<void>;
87
+ removeObserver(observerID: string): Promise<void>;
88
+
89
+ // -- Sync --
90
+ checkpoint(mode: string): Promise<void>;
91
+ start(): Promise<void>;
92
+ stop(): Promise<void>;
93
+ syncNow(): Promise<void>;
94
+ pendingChangeCount(): Promise<number>;
95
+
96
+ // -- Bidirectional responses --
97
+ resolveAuthRequest(requestID: string, token: string): void;
98
+ rejectAuthRequest(requestID: string, error: string): void;
99
+ resolveSnapshotRequest(requestID: string, approved: boolean): void;
100
+
101
+ // -- Typed events --
102
+ readonly onStatusChange: EventEmitter<StatusEvent>;
103
+ readonly onConflict: EventEmitter<ConflictEvent>;
104
+ readonly onAuthRequest: EventEmitter<AuthRequestEvent>;
105
+ readonly onSnapshotRequired: EventEmitter<SnapshotRequiredEvent>;
106
+ readonly onChange: EventEmitter<ChangeEvent>;
107
+ readonly onQueryResult: EventEmitter<QueryResultEvent>;
108
+
109
+ // -- NativeEventEmitter compatibility --
110
+ addListener(eventName: string): void;
111
+ removeListeners(count: number): void;
112
+ }
113
+
114
+ export default TurboModuleRegistry.getEnforcing<Spec>('SynchroModule');