@stratasync/server 0.2.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 (90) hide show
  1. package/README.md +188 -0
  2. package/dist/bootstrap/bootstrap-service.d.ts +41 -0
  3. package/dist/bootstrap/bootstrap-service.d.ts.map +1 -0
  4. package/dist/bootstrap/bootstrap-service.js +411 -0
  5. package/dist/bootstrap/bootstrap-service.js.map +1 -0
  6. package/dist/config.d.ts +124 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +10 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/create-sync-server.d.ts +5 -0
  11. package/dist/create-sync-server.d.ts.map +1 -0
  12. package/dist/create-sync-server.js +96 -0
  13. package/dist/create-sync-server.js.map +1 -0
  14. package/dist/dao/sync-dao.d.ts +64 -0
  15. package/dist/dao/sync-dao.d.ts.map +1 -0
  16. package/dist/dao/sync-dao.js +137 -0
  17. package/dist/dao/sync-dao.js.map +1 -0
  18. package/dist/db.d.ts +37 -0
  19. package/dist/db.d.ts.map +1 -0
  20. package/dist/db.js +2 -0
  21. package/dist/db.js.map +1 -0
  22. package/dist/delta/delta-publisher.d.ts +52 -0
  23. package/dist/delta/delta-publisher.d.ts.map +1 -0
  24. package/dist/delta/delta-publisher.js +217 -0
  25. package/dist/delta/delta-publisher.js.map +1 -0
  26. package/dist/delta/delta-service.d.ts +13 -0
  27. package/dist/delta/delta-service.d.ts.map +1 -0
  28. package/dist/delta/delta-service.js +36 -0
  29. package/dist/delta/delta-service.js.map +1 -0
  30. package/dist/fastify/index.d.ts +7 -0
  31. package/dist/fastify/index.d.ts.map +1 -0
  32. package/dist/fastify/index.js +5 -0
  33. package/dist/fastify/index.js.map +1 -0
  34. package/dist/fastify/middleware.d.ts +16 -0
  35. package/dist/fastify/middleware.d.ts.map +1 -0
  36. package/dist/fastify/middleware.js +101 -0
  37. package/dist/fastify/middleware.js.map +1 -0
  38. package/dist/fastify/routes.d.ts +17 -0
  39. package/dist/fastify/routes.d.ts.map +1 -0
  40. package/dist/fastify/routes.js +150 -0
  41. package/dist/fastify/routes.js.map +1 -0
  42. package/dist/fastify/validation.d.ts +59 -0
  43. package/dist/fastify/validation.d.ts.map +1 -0
  44. package/dist/fastify/validation.js +79 -0
  45. package/dist/fastify/validation.js.map +1 -0
  46. package/dist/index.d.ts +22 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +22 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/mutate/archive-mutation.d.ts +10 -0
  51. package/dist/mutate/archive-mutation.d.ts.map +1 -0
  52. package/dist/mutate/archive-mutation.js +14 -0
  53. package/dist/mutate/archive-mutation.js.map +1 -0
  54. package/dist/mutate/field-codecs.d.ts +15 -0
  55. package/dist/mutate/field-codecs.d.ts.map +1 -0
  56. package/dist/mutate/field-codecs.js +103 -0
  57. package/dist/mutate/field-codecs.js.map +1 -0
  58. package/dist/mutate/model-handlers.d.ts +32 -0
  59. package/dist/mutate/model-handlers.d.ts.map +1 -0
  60. package/dist/mutate/model-handlers.js +131 -0
  61. package/dist/mutate/model-handlers.js.map +1 -0
  62. package/dist/mutate/mutate-service.d.ts +30 -0
  63. package/dist/mutate/mutate-service.d.ts.map +1 -0
  64. package/dist/mutate/mutate-service.js +326 -0
  65. package/dist/mutate/mutate-service.js.map +1 -0
  66. package/dist/types.d.ts +101 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +29 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/utils/composite-ids.d.ts +14 -0
  71. package/dist/utils/composite-ids.d.ts.map +1 -0
  72. package/dist/utils/composite-ids.js +15 -0
  73. package/dist/utils/composite-ids.js.map +1 -0
  74. package/dist/utils/dates.d.ts +8 -0
  75. package/dist/utils/dates.d.ts.map +1 -0
  76. package/dist/utils/dates.js +101 -0
  77. package/dist/utils/dates.js.map +1 -0
  78. package/dist/utils/sync-scope.d.ts +4 -0
  79. package/dist/utils/sync-scope.d.ts.map +1 -0
  80. package/dist/utils/sync-scope.js +17 -0
  81. package/dist/utils/sync-scope.js.map +1 -0
  82. package/dist/utils/sync-utils.d.ts +27 -0
  83. package/dist/utils/sync-utils.d.ts.map +1 -0
  84. package/dist/utils/sync-utils.js +94 -0
  85. package/dist/utils/sync-utils.js.map +1 -0
  86. package/dist/websocket/sync-websocket.d.ts +14 -0
  87. package/dist/websocket/sync-websocket.d.ts.map +1 -0
  88. package/dist/websocket/sync-websocket.js +326 -0
  89. package/dist/websocket/sync-websocket.js.map +1 -0
  90. package/package.json +70 -0
@@ -0,0 +1,326 @@
1
+ import { eq, getTableColumns } from "drizzle-orm";
2
+ import { noopLogger } from "../config.js";
3
+ import { mapGraphQLAction } from "../types.js";
4
+ import { serializeSyncId, toSyncActionOutput } from "../utils/sync-utils.js";
5
+ import { createModelHandler, createStandardDelegate, createCompositeDelegate, } from "./model-handlers.js";
6
+ const MODEL_ID_GROUP_KEY = "__modelId__";
7
+ const SYNC_ACTION_DEDUP_CONSTRAINT = "sync_actions_client_id_client_tx_id_unique";
8
+ const isSyncDedupUniqueConstraintError = (error) => {
9
+ if (typeof error !== "object" || error === null) {
10
+ return false;
11
+ }
12
+ const maybeError = error;
13
+ return (maybeError.code === "23505" &&
14
+ maybeError.constraint === SYNC_ACTION_DEDUP_CONSTRAINT);
15
+ };
16
+ // ---------------------------------------------------------------------------
17
+ // Service
18
+ // ---------------------------------------------------------------------------
19
+ export class MutateService {
20
+ dao;
21
+ db;
22
+ logger;
23
+ modelHandlers;
24
+ modelGroupKeys;
25
+ modelDelegates;
26
+ modelConfigs;
27
+ constructor(db, dao, models, logger = noopLogger) {
28
+ this.db = db;
29
+ this.dao = dao;
30
+ this.logger = logger;
31
+ this.modelConfigs = models;
32
+ // Build handlers, group keys, and delegates from config
33
+ this.modelHandlers = new Map();
34
+ this.modelGroupKeys = {};
35
+ this.modelDelegates = {};
36
+ for (const [name, model] of Object.entries(models)) {
37
+ // Group key
38
+ if (model.groupKey !== null) {
39
+ this.modelGroupKeys[name] = model.groupKey;
40
+ }
41
+ // Delegate for lookups
42
+ if (model.mutate.kind === "standard") {
43
+ const idField = model.mutate.idField ?? "id";
44
+ let idColumn;
45
+ try {
46
+ const cols = getTableColumns(model.table);
47
+ idColumn = cols[idField];
48
+ }
49
+ catch {
50
+ // Table columns unavailable — skip delegate registration
51
+ }
52
+ if (idColumn) {
53
+ this.modelDelegates[name] = async (lookupDb, id) => {
54
+ const typedDb = lookupDb;
55
+ const rows = await typedDb
56
+ .select()
57
+ .from(model.table)
58
+ .where(eq(idColumn, id))
59
+ .limit(1);
60
+ return rows[0] ?? null;
61
+ };
62
+ }
63
+ }
64
+ // Model handler
65
+ const mutateConfig = model.mutate;
66
+ const delegate = mutateConfig.kind === "standard"
67
+ ? createStandardDelegate(model.table, mutateConfig.idField ?? "id")
68
+ : createCompositeDelegate(model.table, mutateConfig.buildDeleteWhere);
69
+ const def = mutateConfig.kind === "standard"
70
+ ? {
71
+ actions: mutateConfig.actions,
72
+ delegate,
73
+ insertFields: mutateConfig.insertFields,
74
+ kind: "standard",
75
+ onBeforeInsert: mutateConfig.onBeforeInsert,
76
+ onBeforeUpdate: mutateConfig.onBeforeUpdate,
77
+ updateFields: mutateConfig.updateFields,
78
+ }
79
+ : {
80
+ actions: mutateConfig.actions,
81
+ delegate,
82
+ insertFields: mutateConfig.insertFields,
83
+ kind: "composite",
84
+ };
85
+ this.modelHandlers.set(name, createModelHandler(def));
86
+ }
87
+ }
88
+ /**
89
+ * Resolve the groupId for a sync action.
90
+ */
91
+ async resolveGroupId(modelName, modelId, action, payload) {
92
+ const groupKey = this.modelGroupKeys[modelName];
93
+ if (!groupKey) {
94
+ return null;
95
+ }
96
+ if (groupKey === MODEL_ID_GROUP_KEY) {
97
+ return modelId;
98
+ }
99
+ // Try payload first
100
+ const payloadValue = payload[groupKey];
101
+ if (typeof payloadValue === "string" && payloadValue.length > 0) {
102
+ return payloadValue;
103
+ }
104
+ // For insert, the group key is required in payload
105
+ if (action === "I") {
106
+ this.logger.warn({ groupKey, modelName }, "Missing group key in insert payload");
107
+ throw new Error("Invalid mutation: missing required group identifier");
108
+ }
109
+ // For update/delete/archive/unarchive, look up from DB
110
+ const record = await this.lookupGroupId(modelName, modelId, groupKey);
111
+ if (!record) {
112
+ this.logger.warn({ groupKey, modelId, modelName }, "Cannot resolve group for mutation");
113
+ throw new Error("Invalid mutation: record not found");
114
+ }
115
+ return record;
116
+ }
117
+ async lookupGroupId(modelName, modelId, groupKey) {
118
+ const lookup = this.modelDelegates[modelName];
119
+ if (!lookup) {
120
+ return null;
121
+ }
122
+ const row = await lookup(this.db, modelId);
123
+ return row?.[groupKey];
124
+ }
125
+ static validateGroupAccess(context, groupId, modelName, logger) {
126
+ if (groupId !== null && !context.groups.includes(groupId)) {
127
+ logger.warn({ groupId, modelName, userId: context.userId }, "Access denied for mutation");
128
+ throw new Error("Access denied");
129
+ }
130
+ }
131
+ static createDuplicateTransactionResult(tx, syncId, logger) {
132
+ logger.debug({
133
+ clientTxId: tx.clientTxId,
134
+ syncId: serializeSyncId(syncId),
135
+ }, "Duplicate transaction skipped");
136
+ return {
137
+ result: MutateService.createSuccessResult(tx, syncId),
138
+ success: true,
139
+ syncId,
140
+ };
141
+ }
142
+ prepareTransaction(tx) {
143
+ const action = mapGraphQLAction(tx.action);
144
+ // Resolve canonical model ID for composite models
145
+ const modelConfig = this.modelConfigs[tx.modelName];
146
+ let canonicalModelId = tx.modelId;
147
+ if (modelConfig?.mutate.kind === "composite" &&
148
+ modelConfig.mutate.compositeId) {
149
+ canonicalModelId = modelConfig.mutate.compositeId.computeId(tx.modelName, tx.modelId, tx.payload);
150
+ }
151
+ return {
152
+ action,
153
+ canonicalModelId,
154
+ };
155
+ }
156
+ async applyModelMutation(tx, prepared) {
157
+ const handler = this.modelHandlers.get(tx.modelName);
158
+ if (!handler) {
159
+ return tx.payload;
160
+ }
161
+ return await handler(this.db, prepared.canonicalModelId, tx.payload, prepared.action);
162
+ }
163
+ async resolveAuthorizedGroupId(context, tx, prepared) {
164
+ const groupId = await this.resolveGroupId(tx.modelName, prepared.canonicalModelId, prepared.action, tx.payload);
165
+ MutateService.validateGroupAccess(context, groupId, tx.modelName, this.logger);
166
+ return groupId;
167
+ }
168
+ static publishSyncAction(syncAction, onAction) {
169
+ if (!onAction) {
170
+ return;
171
+ }
172
+ onAction(toSyncActionOutput(syncAction));
173
+ }
174
+ static validateTransaction(tx) {
175
+ const errors = [];
176
+ if (!tx.clientTxId) {
177
+ errors.push("clientTxId is required");
178
+ }
179
+ if (!tx.clientId) {
180
+ errors.push("clientId is required");
181
+ }
182
+ if (!tx.modelName) {
183
+ errors.push("modelName is required");
184
+ }
185
+ if (!tx.modelId) {
186
+ errors.push("modelId is required");
187
+ }
188
+ if (!tx.action) {
189
+ errors.push("action is required");
190
+ }
191
+ if (!["INSERT", "UPDATE", "DELETE", "ARCHIVE", "UNARCHIVE"].includes(tx.action)) {
192
+ errors.push(`Invalid action: ${tx.action}`);
193
+ }
194
+ return errors;
195
+ }
196
+ static createSuccessResult(tx, syncId) {
197
+ return {
198
+ clientTxId: tx.clientTxId,
199
+ success: true,
200
+ syncId: serializeSyncId(syncId),
201
+ };
202
+ }
203
+ async createSyncActionWithDeduplication(tx, action, canonicalModelId, data, groupId) {
204
+ try {
205
+ const syncAction = await this.dao.createSyncAction({
206
+ action,
207
+ clientId: tx.clientId,
208
+ clientTxId: tx.clientTxId,
209
+ data,
210
+ groupId,
211
+ model: tx.modelName,
212
+ modelId: canonicalModelId,
213
+ });
214
+ return {
215
+ duplicateId: null,
216
+ syncAction: syncAction,
217
+ };
218
+ }
219
+ catch (error) {
220
+ if (!isSyncDedupUniqueConstraintError(error)) {
221
+ throw error;
222
+ }
223
+ const duplicate = await this.dao.findSyncActionByClientTx(tx.clientId, tx.clientTxId);
224
+ if (!duplicate) {
225
+ throw error;
226
+ }
227
+ return { duplicateId: duplicate.id, syncAction: null };
228
+ }
229
+ }
230
+ async processTransaction(context, tx, onAction) {
231
+ try {
232
+ const existing = await this.dao.findSyncActionByClientTx(tx.clientId, tx.clientTxId);
233
+ if (existing) {
234
+ return MutateService.createDuplicateTransactionResult(tx, existing.id, this.logger);
235
+ }
236
+ const prepared = this.prepareTransaction(tx);
237
+ const data = await this.applyModelMutation(tx, prepared);
238
+ const groupId = await this.resolveAuthorizedGroupId(context, tx, prepared);
239
+ const createResult = await this.createSyncActionWithDeduplication(tx, prepared.action, prepared.canonicalModelId, data, groupId);
240
+ if (createResult.duplicateId !== null) {
241
+ return MutateService.createDuplicateTransactionResult(tx, createResult.duplicateId, this.logger);
242
+ }
243
+ const { syncAction } = createResult;
244
+ if (!syncAction) {
245
+ throw new Error("Expected syncAction after transaction creation");
246
+ }
247
+ this.logger.debug({
248
+ action: prepared.action,
249
+ modelId: prepared.canonicalModelId,
250
+ modelName: tx.modelName,
251
+ syncId: serializeSyncId(syncAction.id),
252
+ }, "Transaction processed");
253
+ MutateService.publishSyncAction(syncAction, onAction);
254
+ // Fire onAfterMutation hook
255
+ const modelConfig = this.modelConfigs[tx.modelName];
256
+ if (modelConfig?.mutate.onAfterMutation) {
257
+ try {
258
+ await modelConfig.mutate.onAfterMutation({
259
+ action: prepared.action,
260
+ data,
261
+ modelId: prepared.canonicalModelId,
262
+ modelName: tx.modelName,
263
+ payload: tx.payload,
264
+ syncAction: { id: syncAction.id },
265
+ });
266
+ }
267
+ catch (hookError) {
268
+ this.logger.warn({ error: hookError, modelName: tx.modelName }, "onAfterMutation hook failed");
269
+ }
270
+ }
271
+ return {
272
+ result: MutateService.createSuccessResult(tx, syncAction.id),
273
+ success: true,
274
+ syncId: syncAction.id,
275
+ };
276
+ }
277
+ catch (error) {
278
+ this.logger.error({
279
+ clientTxId: tx.clientTxId,
280
+ error,
281
+ modelId: tx.modelId,
282
+ modelName: tx.modelName,
283
+ }, "Transaction failed");
284
+ return {
285
+ result: {
286
+ clientTxId: tx.clientTxId,
287
+ error: error instanceof Error ? error.message : "Unknown error",
288
+ success: false,
289
+ },
290
+ success: false,
291
+ };
292
+ }
293
+ }
294
+ async mutate(context, input, onAction) {
295
+ this.logger.info({
296
+ transactionCount: input.transactions.length,
297
+ userId: context.userId,
298
+ }, "Mutate started");
299
+ const results = [];
300
+ let lastSyncId = 0n;
301
+ let success = true;
302
+ for (const tx of input.transactions) {
303
+ const processed = await this.processTransaction(context, tx, onAction);
304
+ results.push(processed.result);
305
+ if (!processed.success) {
306
+ success = false;
307
+ continue;
308
+ }
309
+ if (processed.syncId > lastSyncId) {
310
+ lastSyncId = processed.syncId;
311
+ }
312
+ }
313
+ this.logger.info({
314
+ lastSyncId: serializeSyncId(lastSyncId),
315
+ processedCount: results.length,
316
+ success,
317
+ userId: context.userId,
318
+ }, "Mutate completed");
319
+ return {
320
+ lastSyncId: serializeSyncId(lastSyncId),
321
+ results,
322
+ success,
323
+ };
324
+ }
325
+ }
326
+ //# sourceMappingURL=mutate-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate-service.js","sourceRoot":"","sources":["../../src/mutate/mutate-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Sync action types
3
+ */
4
+ type TransactionAction = "I" | "U" | "D" | "A" | "V";
5
+ export type GraphQLTransactionAction = "INSERT" | "UPDATE" | "DELETE" | "ARCHIVE" | "UNARCHIVE";
6
+ /**
7
+ * Maps GraphQL action names to internal codes
8
+ */
9
+ export declare const mapGraphQLAction: (action: GraphQLTransactionAction) => TransactionAction;
10
+ /**
11
+ * Transaction input for mutations
12
+ */
13
+ export interface TransactionInput {
14
+ clientTxId: string;
15
+ clientId: string;
16
+ modelName: string;
17
+ modelId: string;
18
+ action: GraphQLTransactionAction;
19
+ payload: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Mutation batch input
23
+ */
24
+ export interface MutateInput {
25
+ batchId: string;
26
+ transactions: TransactionInput[];
27
+ }
28
+ /**
29
+ * Transaction result
30
+ */
31
+ export interface TransactionResult {
32
+ clientTxId: string;
33
+ success: boolean;
34
+ syncId?: string;
35
+ error?: string;
36
+ }
37
+ /**
38
+ * Mutation result
39
+ */
40
+ export interface MutateResult {
41
+ success: boolean;
42
+ lastSyncId: string;
43
+ results: TransactionResult[];
44
+ }
45
+ export type SyncIdString = string;
46
+ /**
47
+ * Delta packet for sync
48
+ */
49
+ export interface DeltaPacket {
50
+ lastSyncId: SyncIdString;
51
+ hasMore: boolean;
52
+ actions: SyncActionOutput[];
53
+ }
54
+ /**
55
+ * Sync action output
56
+ */
57
+ export interface SyncActionOutput {
58
+ syncId: SyncIdString;
59
+ modelName: string;
60
+ modelId: string;
61
+ action: string;
62
+ data: Record<string, unknown>;
63
+ groupId?: string;
64
+ clientTxId?: string;
65
+ clientId?: string;
66
+ createdAt: Date;
67
+ }
68
+ export interface SerializedSyncActionOutput {
69
+ syncId: SyncIdString;
70
+ modelName: string;
71
+ modelId: string;
72
+ action: string;
73
+ data: Record<string, unknown>;
74
+ groupId?: string;
75
+ clientTxId?: string;
76
+ clientId?: string;
77
+ createdAt: string;
78
+ }
79
+ /**
80
+ * Bootstrap request
81
+ */
82
+ export interface BootstrapRequest {
83
+ schemaHash: string;
84
+ groups?: string[];
85
+ models?: string[];
86
+ }
87
+ /**
88
+ * Sync user context
89
+ */
90
+ export interface SyncUserContext {
91
+ userId: string;
92
+ groups: string[];
93
+ email?: string;
94
+ name?: string | null;
95
+ }
96
+ /**
97
+ * Model action type
98
+ */
99
+ export type ModelAction = "I" | "U" | "D" | "A" | "V";
100
+ export {};
101
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,KAAK,iBAAiB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACrD,MAAM,MAAM,wBAAwB,GAChC,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,CAAC;AAMhB;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,wBAAwB,KAC/B,iBAqBF,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,YAAY,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,29 @@
1
+ const assertNever = (_value, message) => {
2
+ throw new Error(message);
3
+ };
4
+ /**
5
+ * Maps GraphQL action names to internal codes
6
+ */
7
+ export const mapGraphQLAction = (action) => {
8
+ switch (action) {
9
+ case "INSERT": {
10
+ return "I";
11
+ }
12
+ case "UPDATE": {
13
+ return "U";
14
+ }
15
+ case "DELETE": {
16
+ return "D";
17
+ }
18
+ case "ARCHIVE": {
19
+ return "A";
20
+ }
21
+ case "UNARCHIVE": {
22
+ return "V";
23
+ }
24
+ default: {
25
+ return assertNever(action, `Unsupported action: ${action}`);
26
+ }
27
+ }
28
+ };
29
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,GAAG,CAAC,MAAa,EAAE,OAAe,EAAS,EAAE;IAC5D,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAAgC,EACb,EAAE;IACrB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,WAAW,CAAC,MAAM,EAAE,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Default namespace for composite sync IDs.
3
+ * Keep this stable. Changing it will regenerate all composite IDs.
4
+ */
5
+ export declare const DEFAULT_COMPOSITE_ID_NAMESPACE = "92a73695-d772-4b43-9fb4-d79f5fbef300";
6
+ /**
7
+ * Creates a deterministic composite sync ID using UUIDv5.
8
+ *
9
+ * @param model - The model name (e.g., "TaskLabel")
10
+ * @param parts - The composite key parts in stable order
11
+ * @param namespace - UUID namespace (defaults to the built-in sync namespace)
12
+ */
13
+ export declare const createCompositeSyncId: (model: string, parts: readonly string[], namespace?: string) => string;
14
+ //# sourceMappingURL=composite-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-ids.d.ts","sourceRoot":"","sources":["../../src/utils/composite-ids.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,8BAA8B,yCACH,CAAC;AAEzC;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,MAAM,EACb,OAAO,SAAS,MAAM,EAAE,EACxB,YAAW,MAAuC,KACjD,MAAgE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { v5 as uuidv5 } from "uuid";
2
+ /**
3
+ * Default namespace for composite sync IDs.
4
+ * Keep this stable. Changing it will regenerate all composite IDs.
5
+ */
6
+ export const DEFAULT_COMPOSITE_ID_NAMESPACE = "92a73695-d772-4b43-9fb4-d79f5fbef300";
7
+ /**
8
+ * Creates a deterministic composite sync ID using UUIDv5.
9
+ *
10
+ * @param model - The model name (e.g., "TaskLabel")
11
+ * @param parts - The composite key parts in stable order
12
+ * @param namespace - UUID namespace (defaults to the built-in sync namespace)
13
+ */
14
+ export const createCompositeSyncId = (model, parts, namespace = DEFAULT_COMPOSITE_ID_NAMESPACE) => uuidv5(`${model}:${JSON.stringify(parts)}`, namespace);
15
+ //# sourceMappingURL=composite-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-ids.js","sourceRoot":"","sources":["../../src/utils/composite-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,sCAAsC,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAa,EACb,KAAwB,EACxB,YAAoB,8BAA8B,EAC1C,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const dateOnlyStringToEpoch: (value: string | null) => number | null;
2
+ export declare const toDateOnlyEpoch: (value: unknown) => number | null;
3
+ export declare const epochToDateOnlyString: (value: number | null) => string | null;
4
+ export declare const toDateOnlyStringOrNull: (value: unknown) => string | null;
5
+ export declare const toDateOnlyDateOrNull: (value: unknown) => Date | null;
6
+ export declare const toInstantEpoch: (value: unknown) => number | null;
7
+ export declare const toInstantDateOrNull: (value: unknown) => Date | null;
8
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../src/utils/dates.ts"],"names":[],"mappings":"AA6DA,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAYrE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,IA8BzD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAWrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,IAClB,CAAC;AAEhD,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,IAAI,GAAG,IAG5D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,IAmBxD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,IAAI,GAAG,IAG3D,CAAC"}
@@ -0,0 +1,101 @@
1
+ const DATE_ONLY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
2
+ const INSTANT_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/;
3
+ const DATE_ONLY_DAY_MS = 24 * 60 * 60 * 1000;
4
+ const pad = (value) => String(value).padStart(2, "0");
5
+ const parseDateOnlyParts = (value) => {
6
+ if (!DATE_ONLY_PATTERN.test(value)) {
7
+ return null;
8
+ }
9
+ const [yearRaw, monthRaw, dayRaw] = value.split("-");
10
+ const year = Number(yearRaw);
11
+ const month = Number(monthRaw);
12
+ const day = Number(dayRaw);
13
+ if (!(Number.isInteger(year) &&
14
+ Number.isInteger(month) &&
15
+ Number.isInteger(day))) {
16
+ return null;
17
+ }
18
+ const epoch = Date.UTC(year, month - 1, day);
19
+ const candidate = new Date(epoch);
20
+ if (candidate.getUTCFullYear() !== year ||
21
+ candidate.getUTCMonth() + 1 !== month ||
22
+ candidate.getUTCDate() !== day) {
23
+ return null;
24
+ }
25
+ return { day, month, year };
26
+ };
27
+ const isCanonicalDateOnlyEpoch = (value) => Number.isFinite(value) && value % DATE_ONLY_DAY_MS === 0;
28
+ const parseInstantString = (value) => {
29
+ const trimmed = value.trim();
30
+ if (trimmed.length === 0 ||
31
+ DATE_ONLY_PATTERN.test(trimmed) ||
32
+ !INSTANT_PATTERN.test(trimmed)) {
33
+ return null;
34
+ }
35
+ const parsed = Date.parse(trimmed);
36
+ return Number.isNaN(parsed) ? null : parsed;
37
+ };
38
+ export const dateOnlyStringToEpoch = (value) => {
39
+ if (typeof value !== "string") {
40
+ return null;
41
+ }
42
+ const parts = parseDateOnlyParts(value.trim());
43
+ if (!parts) {
44
+ return null;
45
+ }
46
+ return Date.UTC(parts.year, parts.month - 1, parts.day);
47
+ };
48
+ export const toDateOnlyEpoch = (value) => {
49
+ if (value === null || value === undefined) {
50
+ return null;
51
+ }
52
+ if (value instanceof Date) {
53
+ const epoch = value.getTime();
54
+ if (Number.isNaN(epoch)) {
55
+ return null;
56
+ }
57
+ const canonicalEpoch = Date.UTC(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate());
58
+ return epoch === canonicalEpoch ? canonicalEpoch : null;
59
+ }
60
+ if (typeof value === "number") {
61
+ return isCanonicalDateOnlyEpoch(value) ? value : null;
62
+ }
63
+ if (typeof value === "string") {
64
+ return dateOnlyStringToEpoch(value);
65
+ }
66
+ return null;
67
+ };
68
+ export const epochToDateOnlyString = (value) => {
69
+ const epoch = toDateOnlyEpoch(value);
70
+ if (epoch === null) {
71
+ return null;
72
+ }
73
+ const date = new Date(epoch);
74
+ return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;
75
+ };
76
+ export const toDateOnlyStringOrNull = (value) => epochToDateOnlyString(toDateOnlyEpoch(value));
77
+ export const toDateOnlyDateOrNull = (value) => {
78
+ const epoch = toDateOnlyEpoch(value);
79
+ return epoch === null ? null : new Date(epoch);
80
+ };
81
+ export const toInstantEpoch = (value) => {
82
+ if (value === null || value === undefined) {
83
+ return null;
84
+ }
85
+ if (value instanceof Date) {
86
+ const epoch = value.getTime();
87
+ return Number.isNaN(epoch) ? null : epoch;
88
+ }
89
+ if (typeof value === "number") {
90
+ return Number.isFinite(value) ? value : null;
91
+ }
92
+ if (typeof value === "string") {
93
+ return parseInstantString(value);
94
+ }
95
+ return null;
96
+ };
97
+ export const toInstantDateOrNull = (value) => {
98
+ const epoch = toInstantEpoch(value);
99
+ return epoch === null ? null : new Date(epoch);
100
+ };
101
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../../src/utils/dates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const resolveRequestedSyncGroups: (authorizedGroups: string[], requestedGroups?: string[]) => string[];
2
+ export declare const resolvePublishedDeltaGroups: (groupId: string | null | undefined, fallbackGroups: string[]) => string[];
3
+ export declare const dedupeSyncGroups: (groups: string[]) => string[];
4
+ //# sourceMappingURL=sync-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-scope.d.ts","sourceRoot":"","sources":["../../src/utils/sync-scope.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,GACrC,kBAAkB,MAAM,EAAE,EAC1B,kBAAkB,MAAM,EAAE,KACzB,MAAM,EAOR,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,gBAAgB,MAAM,EAAE,KACvB,MAAM,EAMR,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,KAAG,MAAM,EAEzD,CAAC"}