@jcbuisson/express-x-client 3.1.17 → 3.1.19

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/client.mts +22 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jcbuisson/express-x-client",
3
- "version": "3.1.17",
3
+ "version": "3.1.19",
4
4
  "type": "module",
5
5
  "description": "Client library for ExpressX framework",
6
6
  "main": "src/client.mts",
package/src/client.mts CHANGED
@@ -251,6 +251,8 @@ export function offlinePlugin(app) {
251
251
  .then(result => applyCreateAcknowledgement(uid, now, result))
252
252
  .catch(async err => {
253
253
  console.log(`*** err sync ${modelName} create`, err)
254
+ const currentMetadata = await db.metadata.get(uid)
255
+ if (!isCreateRequestStillCurrent(currentMetadata, now)) return
254
256
  // rollback
255
257
  await db.values.delete(uid)
256
258
  await db.metadata.delete(uid)
@@ -261,7 +263,7 @@ export function offlinePlugin(app) {
261
263
 
262
264
  async function applyCreateAcknowledgement(uid, requestCreatedAt, result) {
263
265
  const currentMetadata = await db.metadata.get(uid)
264
- if (!currentMetadata || !sameTimestamp(currentMetadata.created_at, requestCreatedAt)) return
266
+ if (!isCreateRequestStillCurrent(currentMetadata, requestCreatedAt)) return
265
267
  const [value, meta] = Array.isArray(result) ? result : []
266
268
  if (value?.uid) await db.values.put(value)
267
269
  if (meta?.uid)
@@ -270,6 +272,13 @@ export function offlinePlugin(app) {
270
272
  await db.metadata.update(uid, { __dirty__: false })
271
273
  }
272
274
 
275
+ function isCreateRequestStillCurrent(currentMetadata, requestCreatedAt) {
276
+ return currentMetadata
277
+ && sameTimestamp(currentMetadata.created_at, requestCreatedAt)
278
+ && !currentMetadata.updated_at
279
+ && !currentMetadata.deleted_at
280
+ }
281
+
273
282
  async function applyUpdateAcknowledgement(uid, requestUpdatedAt, result) {
274
283
  const currentMetadata = await db.metadata.get(uid)
275
284
  if (!currentMetadata || !sameTimestamp(currentMetadata.updated_at, requestUpdatedAt)) return
@@ -525,6 +534,8 @@ export function offlinePlugin(app) {
525
534
  if (deleteClient.length > 0) {
526
535
  await idbValues.db.transaction('rw', [idbValues, idbMetadata], async () => {
527
536
  for (const [uid] of deleteClient) {
537
+ const currentMetadata = await idbMetadata.get(uid)
538
+ if (!metadataUnchangedSinceRequest(currentMetadata, clientMetadataDict[uid])) continue
528
539
  await idbValues.delete(uid)
529
540
  await idbMetadata.delete(uid)
530
541
  }
@@ -532,6 +543,8 @@ export function offlinePlugin(app) {
532
543
  }
533
544
  // 3- update elements of cache with server's newer version
534
545
  for (const [elt, serverMeta] of updateClient) {
546
+ const currentMetadata = await idbMetadata.get(elt.uid)
547
+ if (!metadataUnchangedSinceRequest(currentMetadata, clientMetadataDict[elt.uid])) continue
535
548
  const value = { ...elt }
536
549
  delete value.__deleted__
537
550
  await idbValues.put(value)
@@ -587,6 +600,14 @@ export function offlinePlugin(app) {
587
600
  }
588
601
  }
589
602
 
603
+ function metadataUnchangedSinceRequest(currentMetadata, requestMetadata) {
604
+ return currentMetadata
605
+ && requestMetadata
606
+ && sameTimestamp(currentMetadata.created_at, requestMetadata.created_at)
607
+ && sameTimestamp(currentMetadata.updated_at, requestMetadata.updated_at)
608
+ && sameTimestamp(currentMetadata.deleted_at, requestMetadata.deleted_at)
609
+ }
610
+
590
611
  // Singleton map to reuse Dexie instances per database name
591
612
  const dbInstances = new Map();
592
613