@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.
- package/package.json +1 -1
- package/src/client.mts +22 -1
package/package.json
CHANGED
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 (!
|
|
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
|
|