@syncular/client 0.0.1-60

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 (176) hide show
  1. package/dist/blobs/index.d.ts +7 -0
  2. package/dist/blobs/index.d.ts.map +1 -0
  3. package/dist/blobs/index.js +7 -0
  4. package/dist/blobs/index.js.map +1 -0
  5. package/dist/blobs/manager.d.ts +345 -0
  6. package/dist/blobs/manager.d.ts.map +1 -0
  7. package/dist/blobs/manager.js +749 -0
  8. package/dist/blobs/manager.js.map +1 -0
  9. package/dist/blobs/migrate.d.ts +14 -0
  10. package/dist/blobs/migrate.d.ts.map +1 -0
  11. package/dist/blobs/migrate.js +59 -0
  12. package/dist/blobs/migrate.js.map +1 -0
  13. package/dist/blobs/types.d.ts +62 -0
  14. package/dist/blobs/types.d.ts.map +1 -0
  15. package/dist/blobs/types.js +5 -0
  16. package/dist/blobs/types.js.map +1 -0
  17. package/dist/client.d.ts +338 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +834 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/conflicts.d.ts +31 -0
  22. package/dist/conflicts.d.ts.map +1 -0
  23. package/dist/conflicts.js +118 -0
  24. package/dist/conflicts.js.map +1 -0
  25. package/dist/create-client.d.ts +115 -0
  26. package/dist/create-client.d.ts.map +1 -0
  27. package/dist/create-client.js +162 -0
  28. package/dist/create-client.js.map +1 -0
  29. package/dist/engine/SyncEngine.d.ts +215 -0
  30. package/dist/engine/SyncEngine.d.ts.map +1 -0
  31. package/dist/engine/SyncEngine.js +1066 -0
  32. package/dist/engine/SyncEngine.js.map +1 -0
  33. package/dist/engine/index.d.ts +6 -0
  34. package/dist/engine/index.d.ts.map +1 -0
  35. package/dist/engine/index.js +6 -0
  36. package/dist/engine/index.js.map +1 -0
  37. package/dist/engine/types.d.ts +230 -0
  38. package/dist/engine/types.d.ts.map +1 -0
  39. package/dist/engine/types.js +7 -0
  40. package/dist/engine/types.js.map +1 -0
  41. package/dist/handlers/create-handler.d.ts +110 -0
  42. package/dist/handlers/create-handler.d.ts.map +1 -0
  43. package/dist/handlers/create-handler.js +140 -0
  44. package/dist/handlers/create-handler.js.map +1 -0
  45. package/dist/handlers/registry.d.ts +15 -0
  46. package/dist/handlers/registry.d.ts.map +1 -0
  47. package/dist/handlers/registry.js +29 -0
  48. package/dist/handlers/registry.js.map +1 -0
  49. package/dist/handlers/types.d.ts +83 -0
  50. package/dist/handlers/types.d.ts.map +1 -0
  51. package/dist/handlers/types.js +5 -0
  52. package/dist/handlers/types.js.map +1 -0
  53. package/dist/index.d.ts +24 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +24 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/migrate.d.ts +19 -0
  58. package/dist/migrate.d.ts.map +1 -0
  59. package/dist/migrate.js +106 -0
  60. package/dist/migrate.js.map +1 -0
  61. package/dist/mutations.d.ts +138 -0
  62. package/dist/mutations.d.ts.map +1 -0
  63. package/dist/mutations.js +611 -0
  64. package/dist/mutations.js.map +1 -0
  65. package/dist/outbox.d.ts +112 -0
  66. package/dist/outbox.d.ts.map +1 -0
  67. package/dist/outbox.js +304 -0
  68. package/dist/outbox.js.map +1 -0
  69. package/dist/plugins/incrementing-version.d.ts +34 -0
  70. package/dist/plugins/incrementing-version.d.ts.map +1 -0
  71. package/dist/plugins/incrementing-version.js +83 -0
  72. package/dist/plugins/incrementing-version.js.map +1 -0
  73. package/dist/plugins/index.d.ts +3 -0
  74. package/dist/plugins/index.d.ts.map +1 -0
  75. package/dist/plugins/index.js +3 -0
  76. package/dist/plugins/index.js.map +1 -0
  77. package/dist/plugins/types.d.ts +49 -0
  78. package/dist/plugins/types.d.ts.map +1 -0
  79. package/dist/plugins/types.js +15 -0
  80. package/dist/plugins/types.js.map +1 -0
  81. package/dist/proxy/connection.d.ts +33 -0
  82. package/dist/proxy/connection.d.ts.map +1 -0
  83. package/dist/proxy/connection.js +153 -0
  84. package/dist/proxy/connection.js.map +1 -0
  85. package/dist/proxy/dialect.d.ts +46 -0
  86. package/dist/proxy/dialect.d.ts.map +1 -0
  87. package/dist/proxy/dialect.js +58 -0
  88. package/dist/proxy/dialect.js.map +1 -0
  89. package/dist/proxy/driver.d.ts +42 -0
  90. package/dist/proxy/driver.d.ts.map +1 -0
  91. package/dist/proxy/driver.js +78 -0
  92. package/dist/proxy/driver.js.map +1 -0
  93. package/dist/proxy/index.d.ts +10 -0
  94. package/dist/proxy/index.d.ts.map +1 -0
  95. package/dist/proxy/index.js +10 -0
  96. package/dist/proxy/index.js.map +1 -0
  97. package/dist/proxy/mutations.d.ts +9 -0
  98. package/dist/proxy/mutations.d.ts.map +1 -0
  99. package/dist/proxy/mutations.js +11 -0
  100. package/dist/proxy/mutations.js.map +1 -0
  101. package/dist/pull-engine.d.ts +45 -0
  102. package/dist/pull-engine.d.ts.map +1 -0
  103. package/dist/pull-engine.js +391 -0
  104. package/dist/pull-engine.js.map +1 -0
  105. package/dist/push-engine.d.ts +18 -0
  106. package/dist/push-engine.d.ts.map +1 -0
  107. package/dist/push-engine.js +155 -0
  108. package/dist/push-engine.js.map +1 -0
  109. package/dist/query/FingerprintCollector.d.ts +18 -0
  110. package/dist/query/FingerprintCollector.d.ts.map +1 -0
  111. package/dist/query/FingerprintCollector.js +28 -0
  112. package/dist/query/FingerprintCollector.js.map +1 -0
  113. package/dist/query/QueryContext.d.ts +33 -0
  114. package/dist/query/QueryContext.d.ts.map +1 -0
  115. package/dist/query/QueryContext.js +16 -0
  116. package/dist/query/QueryContext.js.map +1 -0
  117. package/dist/query/fingerprint.d.ts +61 -0
  118. package/dist/query/fingerprint.d.ts.map +1 -0
  119. package/dist/query/fingerprint.js +91 -0
  120. package/dist/query/fingerprint.js.map +1 -0
  121. package/dist/query/index.d.ts +7 -0
  122. package/dist/query/index.d.ts.map +1 -0
  123. package/dist/query/index.js +7 -0
  124. package/dist/query/index.js.map +1 -0
  125. package/dist/query/tracked-select.d.ts +18 -0
  126. package/dist/query/tracked-select.d.ts.map +1 -0
  127. package/dist/query/tracked-select.js +90 -0
  128. package/dist/query/tracked-select.js.map +1 -0
  129. package/dist/schema.d.ts +83 -0
  130. package/dist/schema.d.ts.map +1 -0
  131. package/dist/schema.js +7 -0
  132. package/dist/schema.js.map +1 -0
  133. package/dist/sync-loop.d.ts +32 -0
  134. package/dist/sync-loop.d.ts.map +1 -0
  135. package/dist/sync-loop.js +249 -0
  136. package/dist/sync-loop.js.map +1 -0
  137. package/dist/utils/id.d.ts +8 -0
  138. package/dist/utils/id.d.ts.map +1 -0
  139. package/dist/utils/id.js +19 -0
  140. package/dist/utils/id.js.map +1 -0
  141. package/package.json +58 -0
  142. package/src/blobs/index.ts +7 -0
  143. package/src/blobs/manager.ts +1027 -0
  144. package/src/blobs/migrate.ts +67 -0
  145. package/src/blobs/types.ts +84 -0
  146. package/src/client.ts +1222 -0
  147. package/src/conflicts.ts +180 -0
  148. package/src/create-client.ts +297 -0
  149. package/src/engine/SyncEngine.ts +1337 -0
  150. package/src/engine/index.ts +6 -0
  151. package/src/engine/types.ts +268 -0
  152. package/src/handlers/create-handler.ts +287 -0
  153. package/src/handlers/registry.ts +36 -0
  154. package/src/handlers/types.ts +102 -0
  155. package/src/index.ts +25 -0
  156. package/src/migrate.ts +122 -0
  157. package/src/mutations.ts +926 -0
  158. package/src/outbox.ts +397 -0
  159. package/src/plugins/incrementing-version.ts +133 -0
  160. package/src/plugins/index.ts +2 -0
  161. package/src/plugins/types.ts +63 -0
  162. package/src/proxy/connection.ts +191 -0
  163. package/src/proxy/dialect.ts +76 -0
  164. package/src/proxy/driver.ts +126 -0
  165. package/src/proxy/index.ts +10 -0
  166. package/src/proxy/mutations.ts +18 -0
  167. package/src/pull-engine.ts +518 -0
  168. package/src/push-engine.ts +201 -0
  169. package/src/query/FingerprintCollector.ts +29 -0
  170. package/src/query/QueryContext.ts +54 -0
  171. package/src/query/fingerprint.ts +109 -0
  172. package/src/query/index.ts +10 -0
  173. package/src/query/tracked-select.ts +139 -0
  174. package/src/schema.ts +94 -0
  175. package/src/sync-loop.ts +368 -0
  176. package/src/utils/id.ts +20 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @syncular/client - Proxy Connection
3
+ *
4
+ * DatabaseConnection implementation that proxies queries over WebSocket.
5
+ */
6
+ import type { CompiledQuery, DatabaseConnection, QueryResult } from 'kysely';
7
+ /**
8
+ * WebSocket wrapper that handles reconnection and message correlation.
9
+ */
10
+ export declare class ProxyConnection implements DatabaseConnection {
11
+ private actorId;
12
+ private clientId;
13
+ private ws;
14
+ private messageId;
15
+ private pendingRequests;
16
+ private handshakeComplete;
17
+ private handshakePromise;
18
+ private handshakeResolve;
19
+ private handshakeReject;
20
+ private closed;
21
+ constructor(ws: WebSocket, actorId: string, clientId: string);
22
+ private handleMessage;
23
+ private rejectAllPending;
24
+ private send;
25
+ private nextMessageId;
26
+ executeQuery<R>(query: CompiledQuery): Promise<QueryResult<R>>;
27
+ beginTransaction(): Promise<void>;
28
+ commitTransaction(): Promise<void>;
29
+ rollbackTransaction(): Promise<void>;
30
+ streamQuery<R>(): AsyncIterableIterator<QueryResult<R>>;
31
+ close(): void;
32
+ }
33
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/proxy/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE7E;;GAEG;AACH,qBAAa,eAAgB,YAAW,kBAAkB;IAkBtD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAlBlB,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAMnB;IACJ,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,MAAM,CAAS;IAEvB,YACE,EAAE,EAAE,SAAS,EACL,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAqCzB;IAED,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,gBAAgB;YAOV,IAAI;IAclB,OAAO,CAAC,aAAa;IAIf,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAiBnE;IAEK,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAStC;IAEK,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CASvC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CASzC;IAED,WAAW,CAAC,CAAC,KAAK,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAEtD;IAED,KAAK,IAAI,IAAI,CAKZ;CACF"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * @syncular/client - Proxy Connection
3
+ *
4
+ * DatabaseConnection implementation that proxies queries over WebSocket.
5
+ */
6
+ /**
7
+ * WebSocket wrapper that handles reconnection and message correlation.
8
+ */
9
+ export class ProxyConnection {
10
+ actorId;
11
+ clientId;
12
+ ws;
13
+ messageId = 0;
14
+ pendingRequests = new Map();
15
+ handshakeComplete = false;
16
+ handshakePromise;
17
+ handshakeResolve = null;
18
+ handshakeReject = null;
19
+ closed = false;
20
+ constructor(ws, actorId, clientId) {
21
+ this.actorId = actorId;
22
+ this.clientId = clientId;
23
+ this.ws = ws;
24
+ this.handshakePromise = new Promise((resolve, reject) => {
25
+ this.handshakeResolve = resolve;
26
+ this.handshakeReject = reject;
27
+ });
28
+ this.ws.onmessage = (event) => {
29
+ this.handleMessage(event.data);
30
+ };
31
+ this.ws.onerror = (_event) => {
32
+ const error = new Error('WebSocket error');
33
+ this.rejectAllPending(error);
34
+ if (!this.handshakeComplete) {
35
+ this.handshakeReject?.(error);
36
+ }
37
+ };
38
+ this.ws.onclose = () => {
39
+ this.closed = true;
40
+ const error = new Error('WebSocket closed');
41
+ this.rejectAllPending(error);
42
+ if (!this.handshakeComplete) {
43
+ this.handshakeReject?.(error);
44
+ }
45
+ };
46
+ // Send handshake
47
+ const handshake = {
48
+ type: 'handshake',
49
+ actorId: this.actorId,
50
+ clientId: this.clientId,
51
+ };
52
+ this.ws.send(JSON.stringify(handshake));
53
+ }
54
+ handleMessage(data) {
55
+ try {
56
+ const message = JSON.parse(data);
57
+ // Handle handshake acknowledgement
58
+ if (message.type === 'handshake_ack') {
59
+ const ack = message;
60
+ if (ack.ok) {
61
+ this.handshakeComplete = true;
62
+ this.handshakeResolve?.();
63
+ }
64
+ else {
65
+ this.handshakeReject?.(new Error(ack.error ?? 'Handshake failed'));
66
+ }
67
+ return;
68
+ }
69
+ // Handle query responses
70
+ const response = message;
71
+ const pending = this.pendingRequests.get(response.id);
72
+ if (pending) {
73
+ this.pendingRequests.delete(response.id);
74
+ pending.resolve(response);
75
+ }
76
+ }
77
+ catch {
78
+ // Ignore malformed messages
79
+ }
80
+ }
81
+ rejectAllPending(error) {
82
+ for (const pending of this.pendingRequests.values()) {
83
+ pending.reject(error);
84
+ }
85
+ this.pendingRequests.clear();
86
+ }
87
+ async send(message) {
88
+ // Wait for handshake to complete
89
+ await this.handshakePromise;
90
+ if (this.closed) {
91
+ throw new Error('Connection is closed');
92
+ }
93
+ return new Promise((resolve, reject) => {
94
+ this.pendingRequests.set(message.id, { resolve, reject });
95
+ this.ws.send(JSON.stringify(message));
96
+ });
97
+ }
98
+ nextMessageId() {
99
+ return `${++this.messageId}`;
100
+ }
101
+ async executeQuery(query) {
102
+ const response = await this.send({
103
+ id: this.nextMessageId(),
104
+ type: 'query',
105
+ sql: query.sql,
106
+ parameters: query.parameters,
107
+ });
108
+ if (response.type === 'error') {
109
+ throw new Error(response.error ?? 'Query failed');
110
+ }
111
+ return {
112
+ rows: (response.rows ?? []),
113
+ numAffectedRows: response.rowCount != null ? BigInt(response.rowCount) : undefined,
114
+ };
115
+ }
116
+ async beginTransaction() {
117
+ const response = await this.send({
118
+ id: this.nextMessageId(),
119
+ type: 'begin',
120
+ });
121
+ if (response.type === 'error') {
122
+ throw new Error(response.error ?? 'Failed to begin transaction');
123
+ }
124
+ }
125
+ async commitTransaction() {
126
+ const response = await this.send({
127
+ id: this.nextMessageId(),
128
+ type: 'commit',
129
+ });
130
+ if (response.type === 'error') {
131
+ throw new Error(response.error ?? 'Failed to commit transaction');
132
+ }
133
+ }
134
+ async rollbackTransaction() {
135
+ const response = await this.send({
136
+ id: this.nextMessageId(),
137
+ type: 'rollback',
138
+ });
139
+ if (response.type === 'error') {
140
+ throw new Error(response.error ?? 'Failed to rollback transaction');
141
+ }
142
+ }
143
+ streamQuery() {
144
+ throw new Error('Streaming queries are not supported over proxy');
145
+ }
146
+ close() {
147
+ if (!this.closed) {
148
+ this.closed = true;
149
+ this.ws.close();
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/proxy/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @syncular/client - Proxy Dialect
3
+ *
4
+ * Kysely Dialect that proxies queries over WebSocket to a sync server.
5
+ */
6
+ import type { Dialect } from 'kysely';
7
+ import { type ProxyDriverConfigWithFactory } from './driver';
8
+ interface ProxyDialectConfig extends ProxyDriverConfigWithFactory {
9
+ }
10
+ /**
11
+ * Creates a Kysely dialect that proxies queries over WebSocket.
12
+ *
13
+ * This dialect uses PostgreSQL query compilation and adapters since
14
+ * the proxy server typically runs against a PostgreSQL database.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { Kysely } from 'kysely';
19
+ * import { createProxyDialect } from '@syncular/client/proxy';
20
+ *
21
+ * const db = new Kysely<MySchema>({
22
+ * dialect: createProxyDialect({
23
+ * endpoint: 'wss://api.example.com/proxy',
24
+ * actorId: 'admin:worker',
25
+ * clientId: 'cf-worker-123',
26
+ * headers: { authorization: 'Bearer ...' },
27
+ * }),
28
+ * });
29
+ *
30
+ * // Full Kysely API works
31
+ * const tasks = await db.selectFrom('tasks').selectAll().execute();
32
+ *
33
+ * // Transactions work
34
+ * await db.transaction().execute(async (trx) => {
35
+ * const user = await trx.selectFrom('users')
36
+ * .where('id', '=', 'u1')
37
+ * .executeTakeFirst();
38
+ * await trx.insertInto('tasks')
39
+ * .values({ id: 'x', user_id: user.id, title: 'New' })
40
+ * .execute();
41
+ * });
42
+ * ```
43
+ */
44
+ export declare function createProxyDialect(config: ProxyDialectConfig): Dialect;
45
+ export {};
46
+ //# sourceMappingURL=dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/proxy/dialect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAEV,OAAO,EAKR,MAAM,QAAQ,CAAC;AAMhB,OAAO,EAAe,KAAK,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAE1E,UAAU,kBAAmB,SAAQ,4BAA4B;CAAG;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAkBtE"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @syncular/client - Proxy Dialect
3
+ *
4
+ * Kysely Dialect that proxies queries over WebSocket to a sync server.
5
+ */
6
+ import { PostgresAdapter, PostgresIntrospector, PostgresQueryCompiler, } from 'kysely';
7
+ import { ProxyDriver } from './driver';
8
+ /**
9
+ * Creates a Kysely dialect that proxies queries over WebSocket.
10
+ *
11
+ * This dialect uses PostgreSQL query compilation and adapters since
12
+ * the proxy server typically runs against a PostgreSQL database.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { Kysely } from 'kysely';
17
+ * import { createProxyDialect } from '@syncular/client/proxy';
18
+ *
19
+ * const db = new Kysely<MySchema>({
20
+ * dialect: createProxyDialect({
21
+ * endpoint: 'wss://api.example.com/proxy',
22
+ * actorId: 'admin:worker',
23
+ * clientId: 'cf-worker-123',
24
+ * headers: { authorization: 'Bearer ...' },
25
+ * }),
26
+ * });
27
+ *
28
+ * // Full Kysely API works
29
+ * const tasks = await db.selectFrom('tasks').selectAll().execute();
30
+ *
31
+ * // Transactions work
32
+ * await db.transaction().execute(async (trx) => {
33
+ * const user = await trx.selectFrom('users')
34
+ * .where('id', '=', 'u1')
35
+ * .executeTakeFirst();
36
+ * await trx.insertInto('tasks')
37
+ * .values({ id: 'x', user_id: user.id, title: 'New' })
38
+ * .execute();
39
+ * });
40
+ * ```
41
+ */
42
+ export function createProxyDialect(config) {
43
+ return {
44
+ createDriver() {
45
+ return new ProxyDriver(config);
46
+ },
47
+ createQueryCompiler() {
48
+ return new PostgresQueryCompiler();
49
+ },
50
+ createAdapter() {
51
+ return new PostgresAdapter();
52
+ },
53
+ createIntrospector(db) {
54
+ return new PostgresIntrospector(db);
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=dialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../../src/proxy/dialect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,WAAW,EAAqC,MAAM,UAAU,CAAC;AAI1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B,EAAW;IACtE,OAAO;QACL,YAAY,GAAW;YACrB,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QAAA,CAChC;QAED,mBAAmB,GAAkB;YACnC,OAAO,IAAI,qBAAqB,EAAE,CAAC;QAAA,CACpC;QAED,aAAa,GAAmB;YAC9B,OAAO,IAAI,eAAe,EAAE,CAAC;QAAA,CAC9B;QAED,kBAAkB,CAAC,EAAe,EAAwB;YACxD,OAAO,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAAA,CACrC;KACF,CAAC;AAAA,CACH"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @syncular/client - Proxy Driver
3
+ *
4
+ * Kysely Driver that creates WebSocket connections for query execution.
5
+ */
6
+ import type { DatabaseConnection, Driver } from 'kysely';
7
+ interface ProxyDriverConfig {
8
+ /** WebSocket endpoint URL (wss://...) */
9
+ endpoint: string;
10
+ /** Actor ID for oplog tracking */
11
+ actorId: string;
12
+ /** Client ID for oplog tracking */
13
+ clientId: string;
14
+ /** Optional headers for authentication */
15
+ headers?: Record<string, string>;
16
+ }
17
+ /**
18
+ * Custom WebSocket factory type for environments that need it.
19
+ */
20
+ export type WebSocketFactory = (url: string, protocols?: string | string[]) => WebSocket;
21
+ /**
22
+ * Extended config with optional WebSocket factory.
23
+ */
24
+ export interface ProxyDriverConfigWithFactory extends ProxyDriverConfig {
25
+ /** Optional WebSocket factory for custom environments */
26
+ createWebSocket?: WebSocketFactory;
27
+ }
28
+ export declare class ProxyDriver implements Driver {
29
+ private config;
30
+ private connection;
31
+ constructor(config: ProxyDriverConfigWithFactory);
32
+ init(): Promise<void>;
33
+ acquireConnection(): Promise<DatabaseConnection>;
34
+ private createWebSocket;
35
+ beginTransaction(connection: DatabaseConnection): Promise<void>;
36
+ commitTransaction(connection: DatabaseConnection): Promise<void>;
37
+ rollbackTransaction(connection: DatabaseConnection): Promise<void>;
38
+ releaseConnection(): Promise<void>;
39
+ destroy(): Promise<void>;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/proxy/driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGzD,UAAU,iBAAiB;IACzB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,KAC1B,SAAS,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,iBAAiB;IACrE,yDAAyD;IACzD,eAAe,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,qBAAa,WAAY,YAAW,MAAM;IAG5B,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,UAAU,CAAgC;IAElD,YAAoB,MAAM,EAAE,4BAA4B,EAAI;IAEtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAEK,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAarD;YAEa,eAAe;IA2CvB,gBAAgB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;IAEK,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;IAEK,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;IAEK,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;CACF"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @syncular/client - Proxy Driver
3
+ *
4
+ * Kysely Driver that creates WebSocket connections for query execution.
5
+ */
6
+ import { ProxyConnection } from './connection';
7
+ export class ProxyDriver {
8
+ config;
9
+ connection = null;
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+ async init() {
14
+ // No initialization needed
15
+ }
16
+ async acquireConnection() {
17
+ // Reuse existing connection if available
18
+ if (this.connection) {
19
+ return this.connection;
20
+ }
21
+ const ws = await this.createWebSocket();
22
+ this.connection = new ProxyConnection(ws, this.config.actorId, this.config.clientId);
23
+ return this.connection;
24
+ }
25
+ async createWebSocket() {
26
+ return new Promise((resolve, reject) => {
27
+ // Build URL with auth info if needed
28
+ const url = new URL(this.config.endpoint);
29
+ // Note: WebSocket doesn't support custom headers directly,
30
+ // so auth is typically done via query params or after connection
31
+ // The server should handle auth during the handshake
32
+ if (this.config.headers?.authorization) {
33
+ url.searchParams.set('authorization', this.config.headers.authorization);
34
+ }
35
+ let ws;
36
+ if (this.config.createWebSocket) {
37
+ ws = this.config.createWebSocket(url.toString());
38
+ }
39
+ else {
40
+ ws = new WebSocket(url.toString());
41
+ }
42
+ ws.onopen = () => {
43
+ resolve(ws);
44
+ };
45
+ ws.onerror = (_event) => {
46
+ reject(new Error('Failed to connect to proxy endpoint'));
47
+ };
48
+ // Set a connection timeout
49
+ const timeout = setTimeout(() => {
50
+ ws.close();
51
+ reject(new Error('Connection timeout'));
52
+ }, 30000);
53
+ ws.onopen = () => {
54
+ clearTimeout(timeout);
55
+ resolve(ws);
56
+ };
57
+ });
58
+ }
59
+ async beginTransaction(connection) {
60
+ await connection.beginTransaction();
61
+ }
62
+ async commitTransaction(connection) {
63
+ await connection.commitTransaction();
64
+ }
65
+ async rollbackTransaction(connection) {
66
+ await connection.rollbackTransaction();
67
+ }
68
+ async releaseConnection() {
69
+ // Keep the connection alive for reuse
70
+ }
71
+ async destroy() {
72
+ if (this.connection) {
73
+ this.connection.close();
74
+ this.connection = null;
75
+ }
76
+ }
77
+ }
78
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/proxy/driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA6B/C,MAAM,OAAO,WAAW;IAGF,MAAM;IAFlB,UAAU,GAA2B,IAAI,CAAC;IAElD,YAAoB,MAAoC,EAAE;sBAAtC,MAAM;IAAiC,CAAC;IAE5D,KAAK,CAAC,IAAI,GAAkB;QAC1B,2BAA2B;IADA,CAE5B;IAED,KAAK,CAAC,iBAAiB,GAAgC;QACrD,yCAAyC;QACzC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,UAAgC,CAAC;QAC/C,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,CACnC,EAAE,EACF,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CACrB,CAAC;QACF,OAAO,IAAI,CAAC,UAAgC,CAAC;IAAA,CAC9C;IAEO,KAAK,CAAC,eAAe,GAAuB;QAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YACtC,qCAAqC;YACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE1C,2DAA2D;YAC3D,iEAAiE;YACjE,qDAAqD;YACrD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;gBACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAClB,eAAe,EACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAClC,CAAC;YACJ,CAAC;YAED,IAAI,EAAa,CAAC;YAClB,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBAChC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrC,CAAC;YAED,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAChB,OAAO,CAAC,EAAE,CAAC,CAAC;YAAA,CACb,CAAC;YAEF,EAAE,CAAC,OAAO,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAAA,CAC1D,CAAC;YAEF,2BAA2B;YAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;gBAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAAA,CACzC,EAAE,KAAK,CAAC,CAAC;YAEV,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,CAAC,EAAE,CAAC,CAAC;YAAA,CACb,CAAC;QAAA,CACH,CAAC,CAAC;IAAA,CACJ;IAED,KAAK,CAAC,gBAAgB,CAAC,UAA8B,EAAiB;QACpE,MAAO,UAA8B,CAAC,gBAAgB,EAAE,CAAC;IAAA,CAC1D;IAED,KAAK,CAAC,iBAAiB,CAAC,UAA8B,EAAiB;QACrE,MAAO,UAA8B,CAAC,iBAAiB,EAAE,CAAC;IAAA,CAC3D;IAED,KAAK,CAAC,mBAAmB,CAAC,UAA8B,EAAiB;QACvE,MAAO,UAA8B,CAAC,mBAAmB,EAAE,CAAC;IAAA,CAC7D;IAED,KAAK,CAAC,iBAAiB,GAAkB;QACvC,sCAAsC;IADE,CAEzC;IAED,KAAK,CAAC,OAAO,GAAkB;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IAAA,CACF;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @syncular/client - Proxy Dialect Exports
3
+ *
4
+ * Kysely dialect for proxying queries over WebSocket to a sync server.
5
+ */
6
+ export * from './connection';
7
+ export * from './dialect';
8
+ export * from './driver';
9
+ export * from './mutations';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @syncular/client - Proxy Dialect Exports
3
+ *
4
+ * Kysely dialect for proxying queries over WebSocket to a sync server.
5
+ */
6
+ export * from './connection';
7
+ export * from './dialect';
8
+ export * from './driver';
9
+ export * from './mutations';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @syncular/client - Proxy mutations
3
+ *
4
+ * Exposes the same Proxy-based mutation interface as the offline client,
5
+ * but pushes commits to the server immediately (no local outbox/db writes).
6
+ */
7
+ import { type MutationsApi, type PushCommitConfig } from '../mutations';
8
+ export declare function createProxyMutations<DB extends Record<string, any>>(config: PushCommitConfig): MutationsApi<DB, undefined>;
9
+ //# sourceMappingURL=mutations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutations.d.ts","sourceRoot":"","sources":["../../src/proxy/mutations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAEtB,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjE,MAAM,EAAE,gBAAgB,GACvB,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,CAE7B"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @syncular/client - Proxy mutations
3
+ *
4
+ * Exposes the same Proxy-based mutation interface as the offline client,
5
+ * but pushes commits to the server immediately (no local outbox/db writes).
6
+ */
7
+ import { createPushMutations, } from '../mutations';
8
+ export function createProxyMutations(config) {
9
+ return createPushMutations(config);
10
+ }
11
+ //# sourceMappingURL=mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../src/proxy/mutations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,GAGpB,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,oBAAoB,CAClC,MAAwB,EACK;IAC7B,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAAA,CACpC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @syncular/client - Sync pull engine
3
+ */
4
+ import type { SyncPullRequest, SyncPullResponse, SyncSubscriptionRequest, SyncTransport } from '@syncular/core';
5
+ import { type Kysely } from 'kysely';
6
+ import type { ClientTableRegistry } from './handlers/registry';
7
+ import type { SyncClientPlugin } from './plugins/types';
8
+ import type { SyncClientDb, SyncSubscriptionStateTable } from './schema';
9
+ export interface SyncPullOnceOptions {
10
+ clientId: string;
11
+ actorId?: string;
12
+ plugins?: SyncClientPlugin[];
13
+ /**
14
+ * Desired subscriptions (client-chosen ids).
15
+ * Cursors are persisted in `sync_subscription_state`.
16
+ */
17
+ subscriptions: Array<Omit<SyncSubscriptionRequest, 'cursor'>>;
18
+ limitCommits?: number;
19
+ limitSnapshotRows?: number;
20
+ maxSnapshotPages?: number;
21
+ dedupeRows?: boolean;
22
+ stateId?: string;
23
+ }
24
+ /**
25
+ * Build a pull request from subscription state. Exported for use
26
+ * by the combined sync path in sync-loop.ts.
27
+ */
28
+ export declare function buildPullRequest<DB extends SyncClientDb>(db: Kysely<DB>, options: SyncPullOnceOptions): Promise<{
29
+ request: SyncPullRequest;
30
+ existing: SyncSubscriptionStateTable[];
31
+ existingById: Map<string, SyncSubscriptionStateTable>;
32
+ stateId: string;
33
+ }>;
34
+ /**
35
+ * Apply a pull response (run plugins + write to local DB).
36
+ * Exported for use by the combined sync path in sync-loop.ts.
37
+ */
38
+ export declare function applyPullResponse<DB extends SyncClientDb>(db: Kysely<DB>, transport: SyncTransport, shapes: ClientTableRegistry<DB>, options: SyncPullOnceOptions, pullState: {
39
+ request: SyncPullRequest;
40
+ existing: SyncSubscriptionStateTable[];
41
+ existingById: Map<string, SyncSubscriptionStateTable>;
42
+ stateId: string;
43
+ }, rawResponse: SyncPullResponse): Promise<SyncPullResponse>;
44
+ export declare function syncPullOnce<DB extends SyncClientDb>(db: Kysely<DB>, transport: SyncTransport, shapes: ClientTableRegistry<DB>, options: SyncPullOnceOptions): Promise<SyncPullResponse>;
45
+ //# sourceMappingURL=pull-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-engine.d.ts","sourceRoot":"","sources":["../src/pull-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAkOzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B;;;OAGG;IACH,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,SAAS,YAAY,EAC5D,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IACT,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAuCD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,SAAS,YAAY,EAC7D,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,EAC/B,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE;IACT,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB,EACD,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAuK3B;AAED,wBAAsB,YAAY,CAAC,EAAE,SAAS,YAAY,EACxD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,EAC/B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAe3B"}