supastash 0.1.21 → 0.1.22
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mainQueryHelpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/helpers/mainQueryHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAOpC,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAUN;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GACtB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,CAc5B;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC,EAC3E,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAChD,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAC7C,CAAC,KAAK,GAAG;IAAE,aAAa,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC,GAAG,IAAI,CAwBrD;
|
|
1
|
+
{"version":3,"file":"mainQueryHelpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/helpers/mainQueryHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAOpC,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAUN;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GACtB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,CAc5B;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC,EAC3E,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAChD,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAC7C,CAAC,KAAK,GAAG;IAAE,aAAa,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC,GAAG,IAAI,CAwBrD;AAkBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,QAO1E;AA2DD,wBAAsB,eAAe,CACnC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC,EAED,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7B,OAAO,CAAC;IACT,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjD,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;CAChD,CAAC,CA2CD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isOnline } from "../../../utils/connection";
|
|
2
|
-
import { log, logError } from "../../../utils/logs";
|
|
2
|
+
import { log, logError, logWarn } from "../../../utils/logs";
|
|
3
3
|
import { generateUUIDv4 } from "../../genUUID";
|
|
4
4
|
import { queryLocalDb } from "../localDbQuery";
|
|
5
5
|
import { querySupabase } from "../remoteQuery/supabaseQuery";
|
|
@@ -47,9 +47,10 @@ export function getCommonError(table, method, localResult, remoteResult) {
|
|
|
47
47
|
return null;
|
|
48
48
|
}
|
|
49
49
|
const stateCache = new Map();
|
|
50
|
-
const runningStates = new Set();
|
|
51
|
-
const calledOfflineRetries = new Map();
|
|
52
50
|
const retryCount = new Map();
|
|
51
|
+
const calledOfflineRetries = new Map();
|
|
52
|
+
const opQueue = [];
|
|
53
|
+
let isProcessing = false;
|
|
53
54
|
const MAX_RETRIES = 2;
|
|
54
55
|
const MAX_OFFLINE_RETRIES = 10;
|
|
55
56
|
const getOpKey = (state) => `${state.method}:${state.table}:${state.id}`;
|
|
@@ -58,50 +59,56 @@ function delay(ms) {
|
|
|
58
59
|
}
|
|
59
60
|
export function addToCache(state) {
|
|
60
61
|
const opKey = getOpKey(state);
|
|
61
|
-
if (
|
|
62
|
+
if (stateCache.has(opKey))
|
|
62
63
|
return;
|
|
63
|
-
runningStates.add(opKey);
|
|
64
64
|
stateCache.set(opKey, state);
|
|
65
|
-
|
|
65
|
+
opQueue.push(opKey);
|
|
66
|
+
processQueue();
|
|
66
67
|
}
|
|
67
|
-
async function
|
|
68
|
-
|
|
69
|
-
if (!state)
|
|
68
|
+
async function processQueue() {
|
|
69
|
+
if (isProcessing)
|
|
70
70
|
return;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
71
|
+
isProcessing = true;
|
|
72
|
+
while (opQueue.length > 0) {
|
|
73
|
+
const opKey = opQueue.shift();
|
|
74
|
+
const state = stateCache.get(opKey);
|
|
75
|
+
if (!state)
|
|
76
|
+
continue;
|
|
77
|
+
retryCount.set(opKey, retryCount.get(opKey) ?? 0);
|
|
78
|
+
try {
|
|
79
|
+
while ((retryCount.get(opKey) ?? 0) <= MAX_RETRIES) {
|
|
80
|
+
const isConnected = await isOnline();
|
|
81
|
+
if (!isConnected) {
|
|
82
|
+
const offlineRetries = (calledOfflineRetries.get(opKey) || 0) + 1;
|
|
83
|
+
if (offlineRetries > MAX_OFFLINE_RETRIES) {
|
|
84
|
+
logError(`[Supastash] Gave up on ${opKey} after ${MAX_OFFLINE_RETRIES} offline retries`);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
calledOfflineRetries.set(opKey, offlineRetries);
|
|
88
|
+
await delay(1000);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
calledOfflineRetries.delete(opKey);
|
|
92
|
+
const { error } = await querySupabase({ ...state }, true);
|
|
93
|
+
if (!error) {
|
|
94
|
+
log(`[Supastash] Synced item on ${state.table} with ${state.method} to supabase`);
|
|
79
95
|
break;
|
|
80
96
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
calledOfflineRetries.delete(opKey);
|
|
86
|
-
const { error } = await querySupabase({ ...state }, true);
|
|
87
|
-
if (!error) {
|
|
88
|
-
log(`[Supastash] Synced item on ${state.table} with ${state.method} to supabase`);
|
|
89
|
-
break;
|
|
97
|
+
const currentRetry = (retryCount.get(opKey) ?? 0) + 1;
|
|
98
|
+
logError(`[Supastash] Remote sync failed: ${opKey} (${currentRetry}/${MAX_RETRIES}) → ${error.message}`);
|
|
99
|
+
retryCount.set(opKey, currentRetry);
|
|
100
|
+
await delay(100 * currentRetry);
|
|
90
101
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
logWarn(`[Supastash] Error running remote query: ${opKey} → ${error}`);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
retryCount.delete(opKey);
|
|
108
|
+
stateCache.delete(opKey);
|
|
95
109
|
}
|
|
96
110
|
}
|
|
97
|
-
|
|
98
|
-
logError(`[Supastash] Error running remote query: ${opKey} → ${error}`);
|
|
99
|
-
}
|
|
100
|
-
finally {
|
|
101
|
-
retryCount.delete(opKey);
|
|
102
|
-
stateCache.delete(opKey);
|
|
103
|
-
runningStates.delete(opKey);
|
|
104
|
-
}
|
|
111
|
+
isProcessing = false;
|
|
105
112
|
}
|
|
106
113
|
export async function runSyncStrategy(state) {
|
|
107
114
|
const { type } = state;
|