@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.
- package/README.md +188 -0
- package/dist/bootstrap/bootstrap-service.d.ts +41 -0
- package/dist/bootstrap/bootstrap-service.d.ts.map +1 -0
- package/dist/bootstrap/bootstrap-service.js +411 -0
- package/dist/bootstrap/bootstrap-service.js.map +1 -0
- package/dist/config.d.ts +124 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/create-sync-server.d.ts +5 -0
- package/dist/create-sync-server.d.ts.map +1 -0
- package/dist/create-sync-server.js +96 -0
- package/dist/create-sync-server.js.map +1 -0
- package/dist/dao/sync-dao.d.ts +64 -0
- package/dist/dao/sync-dao.d.ts.map +1 -0
- package/dist/dao/sync-dao.js +137 -0
- package/dist/dao/sync-dao.js.map +1 -0
- package/dist/db.d.ts +37 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +2 -0
- package/dist/db.js.map +1 -0
- package/dist/delta/delta-publisher.d.ts +52 -0
- package/dist/delta/delta-publisher.d.ts.map +1 -0
- package/dist/delta/delta-publisher.js +217 -0
- package/dist/delta/delta-publisher.js.map +1 -0
- package/dist/delta/delta-service.d.ts +13 -0
- package/dist/delta/delta-service.d.ts.map +1 -0
- package/dist/delta/delta-service.js +36 -0
- package/dist/delta/delta-service.js.map +1 -0
- package/dist/fastify/index.d.ts +7 -0
- package/dist/fastify/index.d.ts.map +1 -0
- package/dist/fastify/index.js +5 -0
- package/dist/fastify/index.js.map +1 -0
- package/dist/fastify/middleware.d.ts +16 -0
- package/dist/fastify/middleware.d.ts.map +1 -0
- package/dist/fastify/middleware.js +101 -0
- package/dist/fastify/middleware.js.map +1 -0
- package/dist/fastify/routes.d.ts +17 -0
- package/dist/fastify/routes.d.ts.map +1 -0
- package/dist/fastify/routes.js +150 -0
- package/dist/fastify/routes.js.map +1 -0
- package/dist/fastify/validation.d.ts +59 -0
- package/dist/fastify/validation.d.ts.map +1 -0
- package/dist/fastify/validation.js +79 -0
- package/dist/fastify/validation.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mutate/archive-mutation.d.ts +10 -0
- package/dist/mutate/archive-mutation.d.ts.map +1 -0
- package/dist/mutate/archive-mutation.js +14 -0
- package/dist/mutate/archive-mutation.js.map +1 -0
- package/dist/mutate/field-codecs.d.ts +15 -0
- package/dist/mutate/field-codecs.d.ts.map +1 -0
- package/dist/mutate/field-codecs.js +103 -0
- package/dist/mutate/field-codecs.js.map +1 -0
- package/dist/mutate/model-handlers.d.ts +32 -0
- package/dist/mutate/model-handlers.d.ts.map +1 -0
- package/dist/mutate/model-handlers.js +131 -0
- package/dist/mutate/model-handlers.js.map +1 -0
- package/dist/mutate/mutate-service.d.ts +30 -0
- package/dist/mutate/mutate-service.d.ts.map +1 -0
- package/dist/mutate/mutate-service.js +326 -0
- package/dist/mutate/mutate-service.js.map +1 -0
- package/dist/types.d.ts +101 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/composite-ids.d.ts +14 -0
- package/dist/utils/composite-ids.d.ts.map +1 -0
- package/dist/utils/composite-ids.js +15 -0
- package/dist/utils/composite-ids.js.map +1 -0
- package/dist/utils/dates.d.ts +8 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +101 -0
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/sync-scope.d.ts +4 -0
- package/dist/utils/sync-scope.d.ts.map +1 -0
- package/dist/utils/sync-scope.js +17 -0
- package/dist/utils/sync-scope.js.map +1 -0
- package/dist/utils/sync-utils.d.ts +27 -0
- package/dist/utils/sync-utils.d.ts.map +1 -0
- package/dist/utils/sync-utils.js +94 -0
- package/dist/utils/sync-utils.js.map +1 -0
- package/dist/websocket/sync-websocket.d.ts +14 -0
- package/dist/websocket/sync-websocket.d.ts.map +1 -0
- package/dist/websocket/sync-websocket.js +326 -0
- package/dist/websocket/sync-websocket.js.map +1 -0
- 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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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"}
|