@absolutejs/sync 0.10.0 → 0.12.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.
@@ -1093,6 +1093,7 @@ var createSyncEngine = (options = {}) => {
1093
1093
  for (const [table, schema] of Object.entries(options.schemas ?? {})) {
1094
1094
  schemas.set(table, schema);
1095
1095
  }
1096
+ const crdtFields = new Map;
1096
1097
  const validateWrite = (table, op, row) => {
1097
1098
  const schema = schemas.get(table);
1098
1099
  if (schema === undefined || typeof row !== "object" || row === null) {
@@ -1298,6 +1299,14 @@ var createSyncEngine = (options = {}) => {
1298
1299
  }
1299
1300
  return writer;
1300
1301
  };
1302
+ const readExisting = async (table, value, ctx) => {
1303
+ const reader = readers.get(table);
1304
+ if (reader?.get === undefined) {
1305
+ return;
1306
+ }
1307
+ const id = reader.key ? reader.key(value) : value.id;
1308
+ return id === undefined ? undefined : reader.get(id, ctx);
1309
+ };
1301
1310
  const authorizeWrite = async (table, op, value, ctx) => {
1302
1311
  const rule = writeRuleFor(table, op);
1303
1312
  if (rule === undefined) {
@@ -1305,21 +1314,32 @@ var createSyncEngine = (options = {}) => {
1305
1314
  }
1306
1315
  let subject = value;
1307
1316
  if (op !== "insert") {
1308
- const reader = readers.get(table);
1309
- if (reader?.get !== undefined) {
1310
- const id = reader.key ? reader.key(value) : value.id;
1311
- if (id !== undefined) {
1312
- const existing = await reader.get(id, ctx);
1313
- if (existing !== undefined) {
1314
- subject = existing;
1315
- }
1316
- }
1317
+ const existing = await readExisting(table, value, ctx);
1318
+ if (existing !== undefined) {
1319
+ subject = existing;
1317
1320
  }
1318
1321
  }
1319
1322
  if (!rule(ctx, subject)) {
1320
1323
  throw new UnauthorizedError(`${op} on table "${table}"`);
1321
1324
  }
1322
1325
  };
1326
+ const mergeCrdtFields = async (table, op, data, ctx) => {
1327
+ const fields = crdtFields.get(table);
1328
+ if (fields === undefined || data === null || typeof data !== "object") {
1329
+ return data;
1330
+ }
1331
+ const incoming = data;
1332
+ const existing = op === "update" ? await readExisting(table, data, ctx) : undefined;
1333
+ const base = existing !== null && typeof existing === "object" ? existing : undefined;
1334
+ const merged = { ...incoming };
1335
+ for (const [field, adapter] of Object.entries(fields)) {
1336
+ if (incoming[field] === undefined) {
1337
+ continue;
1338
+ }
1339
+ merged[field] = adapter.merge(base?.[field] ?? adapter.empty(), incoming[field]);
1340
+ }
1341
+ return merged;
1342
+ };
1323
1343
  const makeActions = (tx, ctx, enforce) => {
1324
1344
  const buffered = [];
1325
1345
  const actions = {
@@ -1335,7 +1355,8 @@ var createSyncEngine = (options = {}) => {
1335
1355
  if (enforce) {
1336
1356
  await authorizeWrite(table, "insert", data, ctx);
1337
1357
  }
1338
- const row = await writerFor(table).insert(data, ctx, tx);
1358
+ const merged = await mergeCrdtFields(table, "insert", data, ctx);
1359
+ const row = await writerFor(table).insert(merged, ctx, tx);
1339
1360
  buffered.push({ table, change: { op: "insert", row } });
1340
1361
  return row;
1341
1362
  },
@@ -1344,7 +1365,8 @@ var createSyncEngine = (options = {}) => {
1344
1365
  if (enforce) {
1345
1366
  await authorizeWrite(table, "update", data, ctx);
1346
1367
  }
1347
- const row = await writerFor(table).update(data, ctx, tx);
1368
+ const merged = await mergeCrdtFields(table, "update", data, ctx);
1369
+ const row = await writerFor(table).update(merged, ctx, tx);
1348
1370
  buffered.push({ table, change: { op: "update", row } });
1349
1371
  return row;
1350
1372
  },
@@ -1868,6 +1890,17 @@ var createSyncEngine = (options = {}) => {
1868
1890
  registerSchema: (table, schema) => {
1869
1891
  schemas.set(table, schema);
1870
1892
  },
1893
+ registerCrdt: (table, fields) => {
1894
+ crdtFields.set(table, fields);
1895
+ const name = `${table}:merge`;
1896
+ mutations.set(name, {
1897
+ handler: async (args, ctx, actions) => {
1898
+ const existing = await readExisting(table, args, ctx);
1899
+ return existing === undefined ? actions.insert(table, args) : actions.update(table, args);
1900
+ },
1901
+ name
1902
+ });
1903
+ },
1871
1904
  migrate: (table, row) => migrateRow(table, row),
1872
1905
  runMutation: async (name, args, ctx) => {
1873
1906
  const mutation = mutations.get(name);
@@ -2258,5 +2291,5 @@ export {
2258
2291
  SEARCH_SCORE_FIELD
2259
2292
  };
2260
2293
 
2261
- //# debugId=B040890280D3C67864756E2164756E21
2294
+ //# debugId=50FA0D17837EB63364756E2164756E21
2262
2295
  //# sourceMappingURL=index.js.map