@legendapp/state 3.0.0-alpha.29 → 3.0.0-alpha.30
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/config/enable$GetSet.js +2 -1
- package/config/enable$GetSet.mjs +2 -1
- package/config/enableReactTracking.js +2 -1
- package/config/enableReactTracking.mjs +2 -1
- package/config/enableReactUse.js +2 -1
- package/config/enableReactUse.mjs +2 -1
- package/config/enable_PeekAssign.js +2 -1
- package/config/enable_PeekAssign.mjs +2 -1
- package/config.d.mts +13 -0
- package/config.d.ts +13 -0
- package/config.js +2052 -0
- package/config.mjs +2050 -0
- package/index.d.mts +5 -302
- package/index.d.ts +5 -302
- package/index.js +27 -142
- package/index.mjs +28 -141
- package/observableInterfaces-Dilj6F92.d.mts +282 -0
- package/observableInterfaces-Dilj6F92.d.ts +282 -0
- package/package.json +6 -1
- package/persist-plugins/async-storage.d.mts +6 -3
- package/persist-plugins/async-storage.d.ts +6 -3
- package/persist-plugins/async-storage.js +12 -4
- package/persist-plugins/async-storage.mjs +12 -5
- package/persist-plugins/indexeddb.d.mts +6 -4
- package/persist-plugins/indexeddb.d.ts +6 -4
- package/persist-plugins/indexeddb.js +15 -5
- package/persist-plugins/indexeddb.mjs +15 -6
- package/persist-plugins/mmkv.d.mts +5 -1
- package/persist-plugins/mmkv.d.ts +5 -1
- package/persist-plugins/mmkv.js +14 -5
- package/persist-plugins/mmkv.mjs +14 -6
- package/react.d.mts +1 -0
- package/react.d.ts +1 -0
- package/react.js +2 -2
- package/react.mjs +2 -2
- package/sync-plugins/crud.d.mts +1 -1
- package/sync-plugins/crud.d.ts +1 -1
- package/sync-plugins/fetch.js +12 -8
- package/sync-plugins/fetch.mjs +13 -9
- package/sync-plugins/keel.d.mts +2 -2
- package/sync-plugins/keel.d.ts +2 -2
- package/sync-plugins/keel.js +6 -6
- package/sync-plugins/keel.mjs +6 -6
- package/sync.d.mts +37 -19
- package/sync.d.ts +37 -19
- package/sync.js +143 -41
- package/sync.mjs +151 -50
package/sync.js
CHANGED
|
@@ -137,17 +137,72 @@ function transformStringifyDates(...args) {
|
|
|
137
137
|
}
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
140
|
+
|
|
141
|
+
// src/is.ts
|
|
142
|
+
function isPromise(obj) {
|
|
143
|
+
return obj instanceof Promise;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/sync/retry.ts
|
|
147
|
+
function calculateRetryDelay(retryOptions, retryNum) {
|
|
148
|
+
const { backoff, delay = 1e3, infinite, times = 3, maxDelay = 3e4 } = retryOptions;
|
|
149
|
+
if (infinite || retryNum < times) {
|
|
150
|
+
const delayTime = Math.min(delay * (backoff === "constant" ? 1 : 2 ** retryNum), maxDelay);
|
|
151
|
+
return delayTime;
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
function createRetryTimeout(retryOptions, retryNum, fn) {
|
|
156
|
+
const delayTime = calculateRetryDelay(retryOptions, retryNum);
|
|
157
|
+
if (delayTime) {
|
|
158
|
+
return setTimeout(fn, delayTime);
|
|
159
|
+
} else {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
var mapRetryTimeouts = /* @__PURE__ */ new Map();
|
|
164
|
+
function runWithRetry(state, retryOptions, fn, onError) {
|
|
165
|
+
let value = fn(state);
|
|
166
|
+
if (isPromise(value) && retryOptions) {
|
|
167
|
+
let timeoutRetry;
|
|
168
|
+
if (mapRetryTimeouts.has(state.node)) {
|
|
169
|
+
clearTimeout(mapRetryTimeouts.get(state.node));
|
|
170
|
+
}
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const run = () => {
|
|
173
|
+
value.then((val) => {
|
|
174
|
+
resolve(val);
|
|
175
|
+
}).catch((error) => {
|
|
176
|
+
state.retryNum++;
|
|
177
|
+
if (timeoutRetry) {
|
|
178
|
+
clearTimeout(timeoutRetry);
|
|
179
|
+
}
|
|
180
|
+
if (onError) {
|
|
181
|
+
onError(error);
|
|
182
|
+
}
|
|
183
|
+
if (!state.cancelRetry) {
|
|
184
|
+
const timeout = createRetryTimeout(retryOptions, state.retryNum, () => {
|
|
185
|
+
value = fn(state);
|
|
186
|
+
run();
|
|
187
|
+
});
|
|
188
|
+
if (timeout === false) {
|
|
189
|
+
state.cancelRetry = true;
|
|
190
|
+
reject(error);
|
|
191
|
+
} else {
|
|
192
|
+
mapRetryTimeouts.set(state.node, timeout);
|
|
193
|
+
timeoutRetry = timeout;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
run();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// src/sync/syncObservable.ts
|
|
205
|
+
var { clone, deepMerge, getNode, getNodeValue, getValueAtPath, globalState, symbolLinked, createPreviousHandler } = state.internal;
|
|
151
206
|
var mapSyncPlugins = /* @__PURE__ */ new WeakMap();
|
|
152
207
|
var allSyncStates = /* @__PURE__ */ new Map();
|
|
153
208
|
var metadatas = /* @__PURE__ */ new WeakMap();
|
|
@@ -530,7 +585,11 @@ async function doChangeRemote(changeInfo) {
|
|
|
530
585
|
const onError = (error) => {
|
|
531
586
|
var _a2;
|
|
532
587
|
state$.error.set(error);
|
|
533
|
-
(_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error,
|
|
588
|
+
(_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error, {
|
|
589
|
+
setParams,
|
|
590
|
+
source: "set",
|
|
591
|
+
value$: obs$
|
|
592
|
+
});
|
|
534
593
|
};
|
|
535
594
|
const setParams = {
|
|
536
595
|
node,
|
|
@@ -550,19 +609,27 @@ async function doChangeRemote(changeInfo) {
|
|
|
550
609
|
updateResult = params;
|
|
551
610
|
}
|
|
552
611
|
},
|
|
553
|
-
refresh: syncState2.sync
|
|
612
|
+
refresh: syncState2.sync,
|
|
613
|
+
retryNum: 0,
|
|
614
|
+
cancelRetry: false
|
|
554
615
|
};
|
|
555
|
-
let savedPromise = runWithRetry(
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
616
|
+
let savedPromise = runWithRetry(
|
|
617
|
+
setParams,
|
|
618
|
+
syncOptions.retry,
|
|
619
|
+
async () => {
|
|
620
|
+
return syncOptions.set(setParams);
|
|
621
|
+
},
|
|
622
|
+
onError
|
|
623
|
+
);
|
|
624
|
+
let didError = false;
|
|
561
625
|
if (state.isPromise(savedPromise)) {
|
|
562
|
-
savedPromise = savedPromise.catch(
|
|
626
|
+
savedPromise = savedPromise.catch((error) => {
|
|
627
|
+
didError = true;
|
|
628
|
+
onError(error);
|
|
629
|
+
});
|
|
630
|
+
await savedPromise;
|
|
563
631
|
}
|
|
564
|
-
|
|
565
|
-
if (!state$.error.peek()) {
|
|
632
|
+
if (!didError) {
|
|
566
633
|
const pathStrs = Array.from(new Set(changesRemote.map((change) => change.pathStr)));
|
|
567
634
|
const { value: changes, lastSync } = updateResult || {};
|
|
568
635
|
if (pathStrs.length > 0) {
|
|
@@ -722,10 +789,10 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
722
789
|
const syncStateValue = getNodeValue(getNode(syncState$));
|
|
723
790
|
allSyncStates.set(syncState$, node);
|
|
724
791
|
syncStateValue.getPendingChanges = () => localState.pendingChanges;
|
|
725
|
-
const
|
|
792
|
+
const onGetError = (error, params) => {
|
|
726
793
|
var _a;
|
|
727
794
|
syncState$.error.set(error);
|
|
728
|
-
(_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error,
|
|
795
|
+
(_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error, { ...params, value$: obs$ });
|
|
729
796
|
};
|
|
730
797
|
loadLocal(obs$, syncOptions, syncState$, localState);
|
|
731
798
|
let isWaitingForLoad = !!syncOptions.get;
|
|
@@ -734,6 +801,8 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
734
801
|
}
|
|
735
802
|
syncState$.isLoaded.set(!syncState$.numPendingRemoteLoads.peek());
|
|
736
803
|
let isSynced = false;
|
|
804
|
+
let isSubscribed = false;
|
|
805
|
+
let unsubscribe = void 0;
|
|
737
806
|
const applyPending = (pending) => {
|
|
738
807
|
if (pending && !state.isEmpty(pending)) {
|
|
739
808
|
localState.isApplyingPending = true;
|
|
@@ -757,8 +826,6 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
757
826
|
}
|
|
758
827
|
};
|
|
759
828
|
if (syncOptions.get) {
|
|
760
|
-
let isSubscribed = false;
|
|
761
|
-
let unsubscribe = void 0;
|
|
762
829
|
sync = async () => {
|
|
763
830
|
var _a;
|
|
764
831
|
if (isSynced && (!getNodeValue(getNode(syncState$)).isSyncEnabled || state.shouldIgnoreUnobserved(node, sync))) {
|
|
@@ -865,7 +932,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
865
932
|
const subscribe = syncOptions.subscribe;
|
|
866
933
|
isSubscribed = true;
|
|
867
934
|
const doSubscribe = () => {
|
|
868
|
-
|
|
935
|
+
const subscribeParams = {
|
|
869
936
|
node,
|
|
870
937
|
value$: obs$,
|
|
871
938
|
lastSync,
|
|
@@ -878,8 +945,9 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
878
945
|
});
|
|
879
946
|
},
|
|
880
947
|
refresh: () => state.when(syncState$.isLoaded, sync),
|
|
881
|
-
onError: (error) =>
|
|
882
|
-
}
|
|
948
|
+
onError: (error) => onGetError(error, { source: "subscribe", subscribeParams })
|
|
949
|
+
};
|
|
950
|
+
unsubscribe = subscribe(subscribeParams);
|
|
883
951
|
};
|
|
884
952
|
if (waitFor) {
|
|
885
953
|
state.whenReady(waitFor, doSubscribe);
|
|
@@ -888,6 +956,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
888
956
|
}
|
|
889
957
|
}
|
|
890
958
|
const existingValue = getNodeValue(node);
|
|
959
|
+
const onError = (error) => onGetError(error, { getParams, source: "get" });
|
|
891
960
|
const getParams = {
|
|
892
961
|
node,
|
|
893
962
|
value$: obs$,
|
|
@@ -897,7 +966,9 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
897
966
|
options: syncOptions,
|
|
898
967
|
lastSync,
|
|
899
968
|
updateLastSync: (lastSync2) => getParams.lastSync = lastSync2,
|
|
900
|
-
onError
|
|
969
|
+
onError,
|
|
970
|
+
retryNum: 0,
|
|
971
|
+
cancelRetry: false
|
|
901
972
|
};
|
|
902
973
|
let modeBeforeReset = void 0;
|
|
903
974
|
(_a2 = syncOptions.onBeforeGet) == null ? void 0 : _a2.call(syncOptions, {
|
|
@@ -921,12 +992,17 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
921
992
|
numPendingGets: (syncStateValue.numPendingGets || 0) + 1,
|
|
922
993
|
isGetting: true
|
|
923
994
|
});
|
|
924
|
-
const got = runWithRetry(
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
995
|
+
const got = runWithRetry(
|
|
996
|
+
getParams,
|
|
997
|
+
syncOptions.retry,
|
|
998
|
+
(retryEvent) => {
|
|
999
|
+
const params = getParams;
|
|
1000
|
+
params.cancelRetry = retryEvent.cancelRetry;
|
|
1001
|
+
params.retryNum = retryEvent.retryNum;
|
|
1002
|
+
return get(params);
|
|
1003
|
+
},
|
|
1004
|
+
onError
|
|
1005
|
+
);
|
|
930
1006
|
const numGets = node.numGets = (node.numGets || 0) + 1;
|
|
931
1007
|
const handle = (value) => {
|
|
932
1008
|
syncState$.numPendingGets.set((v) => v - 1);
|
|
@@ -959,9 +1035,6 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
959
1035
|
}
|
|
960
1036
|
};
|
|
961
1037
|
if (waitFor) {
|
|
962
|
-
if (node.activationState) {
|
|
963
|
-
node.activationState.waitFor = void 0;
|
|
964
|
-
}
|
|
965
1038
|
state.whenReady(waitFor, () => state.trackSelector(runGet, sync));
|
|
966
1039
|
} else {
|
|
967
1040
|
state.trackSelector(runGet, sync);
|
|
@@ -984,6 +1057,25 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
984
1057
|
applyPending(localState.pendingChanges);
|
|
985
1058
|
}
|
|
986
1059
|
}
|
|
1060
|
+
syncStateValue.reset = async () => {
|
|
1061
|
+
var _a;
|
|
1062
|
+
const wasPersistEnabled = syncStateValue.isPersistEnabled;
|
|
1063
|
+
const wasSyncEnabled = syncStateValue.isSyncEnabled;
|
|
1064
|
+
syncStateValue.isPersistEnabled = false;
|
|
1065
|
+
syncStateValue.isSyncEnabled = false;
|
|
1066
|
+
syncStateValue.syncCount = 0;
|
|
1067
|
+
isSynced = false;
|
|
1068
|
+
isSubscribed = false;
|
|
1069
|
+
unsubscribe == null ? void 0 : unsubscribe();
|
|
1070
|
+
unsubscribe = void 0;
|
|
1071
|
+
const promise = syncStateValue.clearPersist();
|
|
1072
|
+
obs$.set((_a = syncOptions.initial) != null ? _a : void 0);
|
|
1073
|
+
syncState$.isLoaded.set(false);
|
|
1074
|
+
syncStateValue.isPersistEnabled = wasPersistEnabled;
|
|
1075
|
+
syncStateValue.isSyncEnabled = wasSyncEnabled;
|
|
1076
|
+
node.dirtyFn = sync;
|
|
1077
|
+
await promise;
|
|
1078
|
+
};
|
|
987
1079
|
const onAllPersistLoaded = () => {
|
|
988
1080
|
var _a, _b;
|
|
989
1081
|
let parentNode = node;
|
|
@@ -1068,17 +1160,27 @@ function installPersistActivateNode() {
|
|
|
1068
1160
|
didInstall = true;
|
|
1069
1161
|
}
|
|
1070
1162
|
}
|
|
1163
|
+
var { deepMerge: deepMerge2 } = state.internal;
|
|
1164
|
+
function configureSynced(fnOrOrigOptions, origOptions) {
|
|
1165
|
+
const fn = origOptions ? fnOrOrigOptions : void 0;
|
|
1166
|
+
origOptions = origOptions != null ? origOptions : fnOrOrigOptions;
|
|
1167
|
+
return (options) => {
|
|
1168
|
+
const merged = deepMerge2(origOptions, options);
|
|
1169
|
+
return fn ? fn(merged) : merged;
|
|
1170
|
+
};
|
|
1171
|
+
}
|
|
1071
1172
|
|
|
1072
1173
|
// sync.ts
|
|
1073
|
-
var
|
|
1174
|
+
var internal4 = {
|
|
1074
1175
|
observableSyncConfiguration
|
|
1075
1176
|
};
|
|
1076
1177
|
|
|
1077
1178
|
exports.combineTransforms = combineTransforms;
|
|
1078
1179
|
exports.configureObservableSync = configureObservableSync;
|
|
1180
|
+
exports.configureSynced = configureSynced;
|
|
1079
1181
|
exports.deepEqual = deepEqual;
|
|
1080
1182
|
exports.diffObjects = diffObjects;
|
|
1081
|
-
exports.internal =
|
|
1183
|
+
exports.internal = internal4;
|
|
1082
1184
|
exports.mapSyncPlugins = mapSyncPlugins;
|
|
1083
1185
|
exports.onChangeRemote = onChangeRemote;
|
|
1084
1186
|
exports.removeNullUndefined = removeNullUndefined;
|
package/sync.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isObject, isDate, isNullOrUndefined, isString, endBatch, beginBatch, isFunction, syncState, when, linked, internal, observable, isPromise, mergeIntoObservable, isEmpty, whenReady, trackSelector,
|
|
1
|
+
import { isObject, isDate, isNullOrUndefined, isString, endBatch, beginBatch, isFunction, syncState, when, linked, internal, observable, isPromise as isPromise$1, mergeIntoObservable, isEmpty, shouldIgnoreUnobserved, whenReady, trackSelector, constructObjectWithPath, setAtPath, isArray } from '@legendapp/state';
|
|
2
2
|
|
|
3
3
|
// src/sync/configureObservableSync.ts
|
|
4
4
|
var observableSyncConfiguration = {};
|
|
@@ -135,17 +135,72 @@ function transformStringifyDates(...args) {
|
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
137
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
138
|
+
|
|
139
|
+
// src/is.ts
|
|
140
|
+
function isPromise(obj) {
|
|
141
|
+
return obj instanceof Promise;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// src/sync/retry.ts
|
|
145
|
+
function calculateRetryDelay(retryOptions, retryNum) {
|
|
146
|
+
const { backoff, delay = 1e3, infinite, times = 3, maxDelay = 3e4 } = retryOptions;
|
|
147
|
+
if (infinite || retryNum < times) {
|
|
148
|
+
const delayTime = Math.min(delay * (backoff === "constant" ? 1 : 2 ** retryNum), maxDelay);
|
|
149
|
+
return delayTime;
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
function createRetryTimeout(retryOptions, retryNum, fn) {
|
|
154
|
+
const delayTime = calculateRetryDelay(retryOptions, retryNum);
|
|
155
|
+
if (delayTime) {
|
|
156
|
+
return setTimeout(fn, delayTime);
|
|
157
|
+
} else {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
var mapRetryTimeouts = /* @__PURE__ */ new Map();
|
|
162
|
+
function runWithRetry(state, retryOptions, fn, onError) {
|
|
163
|
+
let value = fn(state);
|
|
164
|
+
if (isPromise(value) && retryOptions) {
|
|
165
|
+
let timeoutRetry;
|
|
166
|
+
if (mapRetryTimeouts.has(state.node)) {
|
|
167
|
+
clearTimeout(mapRetryTimeouts.get(state.node));
|
|
168
|
+
}
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
const run = () => {
|
|
171
|
+
value.then((val) => {
|
|
172
|
+
resolve(val);
|
|
173
|
+
}).catch((error) => {
|
|
174
|
+
state.retryNum++;
|
|
175
|
+
if (timeoutRetry) {
|
|
176
|
+
clearTimeout(timeoutRetry);
|
|
177
|
+
}
|
|
178
|
+
if (onError) {
|
|
179
|
+
onError(error);
|
|
180
|
+
}
|
|
181
|
+
if (!state.cancelRetry) {
|
|
182
|
+
const timeout = createRetryTimeout(retryOptions, state.retryNum, () => {
|
|
183
|
+
value = fn(state);
|
|
184
|
+
run();
|
|
185
|
+
});
|
|
186
|
+
if (timeout === false) {
|
|
187
|
+
state.cancelRetry = true;
|
|
188
|
+
reject(error);
|
|
189
|
+
} else {
|
|
190
|
+
mapRetryTimeouts.set(state.node, timeout);
|
|
191
|
+
timeoutRetry = timeout;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
run();
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// src/sync/syncObservable.ts
|
|
203
|
+
var { clone, deepMerge, getNode, getNodeValue, getValueAtPath, globalState, symbolLinked, createPreviousHandler } = internal;
|
|
149
204
|
var mapSyncPlugins = /* @__PURE__ */ new WeakMap();
|
|
150
205
|
var allSyncStates = /* @__PURE__ */ new Map();
|
|
151
206
|
var metadatas = /* @__PURE__ */ new WeakMap();
|
|
@@ -154,7 +209,7 @@ function parseLocalConfig(config) {
|
|
|
154
209
|
return config ? isString(config) ? { table: config, config: { name: config } } : { table: config.name, config } : {};
|
|
155
210
|
}
|
|
156
211
|
function doInOrder(arg1, arg2) {
|
|
157
|
-
return isPromise(arg1) ? arg1.then(arg2) : arg2(arg1);
|
|
212
|
+
return isPromise$1(arg1) ? arg1.then(arg2) : arg2(arg1);
|
|
158
213
|
}
|
|
159
214
|
function onChangeRemote(cb) {
|
|
160
215
|
endBatch(true);
|
|
@@ -528,7 +583,11 @@ async function doChangeRemote(changeInfo) {
|
|
|
528
583
|
const onError = (error) => {
|
|
529
584
|
var _a2;
|
|
530
585
|
state$.error.set(error);
|
|
531
|
-
(_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error,
|
|
586
|
+
(_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error, {
|
|
587
|
+
setParams,
|
|
588
|
+
source: "set",
|
|
589
|
+
value$: obs$
|
|
590
|
+
});
|
|
532
591
|
};
|
|
533
592
|
const setParams = {
|
|
534
593
|
node,
|
|
@@ -548,19 +607,27 @@ async function doChangeRemote(changeInfo) {
|
|
|
548
607
|
updateResult = params;
|
|
549
608
|
}
|
|
550
609
|
},
|
|
551
|
-
refresh: syncState2.sync
|
|
610
|
+
refresh: syncState2.sync,
|
|
611
|
+
retryNum: 0,
|
|
612
|
+
cancelRetry: false
|
|
552
613
|
};
|
|
553
|
-
let savedPromise = runWithRetry(
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
614
|
+
let savedPromise = runWithRetry(
|
|
615
|
+
setParams,
|
|
616
|
+
syncOptions.retry,
|
|
617
|
+
async () => {
|
|
618
|
+
return syncOptions.set(setParams);
|
|
619
|
+
},
|
|
620
|
+
onError
|
|
621
|
+
);
|
|
622
|
+
let didError = false;
|
|
623
|
+
if (isPromise$1(savedPromise)) {
|
|
624
|
+
savedPromise = savedPromise.catch((error) => {
|
|
625
|
+
didError = true;
|
|
626
|
+
onError(error);
|
|
627
|
+
});
|
|
628
|
+
await savedPromise;
|
|
561
629
|
}
|
|
562
|
-
|
|
563
|
-
if (!state$.error.peek()) {
|
|
630
|
+
if (!didError) {
|
|
564
631
|
const pathStrs = Array.from(new Set(changesRemote.map((change) => change.pathStr)));
|
|
565
632
|
const { value: changes, lastSync } = updateResult || {};
|
|
566
633
|
if (pathStrs.length > 0) {
|
|
@@ -587,7 +654,7 @@ async function doChangeRemote(changeInfo) {
|
|
|
587
654
|
transformedChanges = transformLoadData(changes, syncOptions, false, "set");
|
|
588
655
|
}
|
|
589
656
|
if (transformedChanges !== void 0) {
|
|
590
|
-
if (isPromise(transformedChanges)) {
|
|
657
|
+
if (isPromise$1(transformedChanges)) {
|
|
591
658
|
transformedChanges = await transformedChanges;
|
|
592
659
|
}
|
|
593
660
|
onChangeRemote(() => mergeIntoObservable(obs$, transformedChanges));
|
|
@@ -643,7 +710,7 @@ async function loadLocal(value$, syncOptions, syncState$, localState) {
|
|
|
643
710
|
mapSyncPlugins.set(PersistPlugin, mapValue);
|
|
644
711
|
if (persistPlugin2.initialize) {
|
|
645
712
|
const initializePromise = (_c = persistPlugin2.initialize) == null ? void 0 : _c.call(persistPlugin2, ((_b = observableSyncConfiguration) == null ? void 0 : _b.persist) || {});
|
|
646
|
-
if (isPromise(initializePromise)) {
|
|
713
|
+
if (isPromise$1(initializePromise)) {
|
|
647
714
|
await initializePromise;
|
|
648
715
|
}
|
|
649
716
|
}
|
|
@@ -674,7 +741,7 @@ async function loadLocal(value$, syncOptions, syncState$, localState) {
|
|
|
674
741
|
if (value !== void 0) {
|
|
675
742
|
const { transform } = config;
|
|
676
743
|
value = transformLoadData(value, { transform }, true, "get");
|
|
677
|
-
if (isPromise(value)) {
|
|
744
|
+
if (isPromise$1(value)) {
|
|
678
745
|
value = await value;
|
|
679
746
|
}
|
|
680
747
|
internal.globalState.isLoadingLocal = true;
|
|
@@ -720,10 +787,10 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
720
787
|
const syncStateValue = getNodeValue(getNode(syncState$));
|
|
721
788
|
allSyncStates.set(syncState$, node);
|
|
722
789
|
syncStateValue.getPendingChanges = () => localState.pendingChanges;
|
|
723
|
-
const
|
|
790
|
+
const onGetError = (error, params) => {
|
|
724
791
|
var _a;
|
|
725
792
|
syncState$.error.set(error);
|
|
726
|
-
(_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error,
|
|
793
|
+
(_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error, { ...params, value$: obs$ });
|
|
727
794
|
};
|
|
728
795
|
loadLocal(obs$, syncOptions, syncState$, localState);
|
|
729
796
|
let isWaitingForLoad = !!syncOptions.get;
|
|
@@ -732,6 +799,8 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
732
799
|
}
|
|
733
800
|
syncState$.isLoaded.set(!syncState$.numPendingRemoteLoads.peek());
|
|
734
801
|
let isSynced = false;
|
|
802
|
+
let isSubscribed = false;
|
|
803
|
+
let unsubscribe = void 0;
|
|
735
804
|
const applyPending = (pending) => {
|
|
736
805
|
if (pending && !isEmpty(pending)) {
|
|
737
806
|
localState.isApplyingPending = true;
|
|
@@ -755,8 +824,6 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
755
824
|
}
|
|
756
825
|
};
|
|
757
826
|
if (syncOptions.get) {
|
|
758
|
-
let isSubscribed = false;
|
|
759
|
-
let unsubscribe = void 0;
|
|
760
827
|
sync = async () => {
|
|
761
828
|
var _a;
|
|
762
829
|
if (isSynced && (!getNodeValue(getNode(syncState$)).isSyncEnabled || shouldIgnoreUnobserved(node, sync))) {
|
|
@@ -778,7 +845,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
778
845
|
mode = mode || syncOptions.mode || "set";
|
|
779
846
|
if (value !== void 0) {
|
|
780
847
|
value = transformLoadData(value, syncOptions, true, "get");
|
|
781
|
-
if (isPromise(value)) {
|
|
848
|
+
if (isPromise$1(value)) {
|
|
782
849
|
value = await value;
|
|
783
850
|
}
|
|
784
851
|
const pending2 = localState.pendingChanges;
|
|
@@ -863,7 +930,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
863
930
|
const subscribe = syncOptions.subscribe;
|
|
864
931
|
isSubscribed = true;
|
|
865
932
|
const doSubscribe = () => {
|
|
866
|
-
|
|
933
|
+
const subscribeParams = {
|
|
867
934
|
node,
|
|
868
935
|
value$: obs$,
|
|
869
936
|
lastSync,
|
|
@@ -876,8 +943,9 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
876
943
|
});
|
|
877
944
|
},
|
|
878
945
|
refresh: () => when(syncState$.isLoaded, sync),
|
|
879
|
-
onError: (error) =>
|
|
880
|
-
}
|
|
946
|
+
onError: (error) => onGetError(error, { source: "subscribe", subscribeParams })
|
|
947
|
+
};
|
|
948
|
+
unsubscribe = subscribe(subscribeParams);
|
|
881
949
|
};
|
|
882
950
|
if (waitFor) {
|
|
883
951
|
whenReady(waitFor, doSubscribe);
|
|
@@ -886,6 +954,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
886
954
|
}
|
|
887
955
|
}
|
|
888
956
|
const existingValue = getNodeValue(node);
|
|
957
|
+
const onError = (error) => onGetError(error, { getParams, source: "get" });
|
|
889
958
|
const getParams = {
|
|
890
959
|
node,
|
|
891
960
|
value$: obs$,
|
|
@@ -895,7 +964,9 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
895
964
|
options: syncOptions,
|
|
896
965
|
lastSync,
|
|
897
966
|
updateLastSync: (lastSync2) => getParams.lastSync = lastSync2,
|
|
898
|
-
onError
|
|
967
|
+
onError,
|
|
968
|
+
retryNum: 0,
|
|
969
|
+
cancelRetry: false
|
|
899
970
|
};
|
|
900
971
|
let modeBeforeReset = void 0;
|
|
901
972
|
(_a2 = syncOptions.onBeforeGet) == null ? void 0 : _a2.call(syncOptions, {
|
|
@@ -919,12 +990,17 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
919
990
|
numPendingGets: (syncStateValue.numPendingGets || 0) + 1,
|
|
920
991
|
isGetting: true
|
|
921
992
|
});
|
|
922
|
-
const got = runWithRetry(
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
993
|
+
const got = runWithRetry(
|
|
994
|
+
getParams,
|
|
995
|
+
syncOptions.retry,
|
|
996
|
+
(retryEvent) => {
|
|
997
|
+
const params = getParams;
|
|
998
|
+
params.cancelRetry = retryEvent.cancelRetry;
|
|
999
|
+
params.retryNum = retryEvent.retryNum;
|
|
1000
|
+
return get(params);
|
|
1001
|
+
},
|
|
1002
|
+
onError
|
|
1003
|
+
);
|
|
928
1004
|
const numGets = node.numGets = (node.numGets || 0) + 1;
|
|
929
1005
|
const handle = (value) => {
|
|
930
1006
|
syncState$.numPendingGets.set((v) => v - 1);
|
|
@@ -950,16 +1026,13 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
950
1026
|
isGetting: syncStateValue.numPendingGets > 0
|
|
951
1027
|
});
|
|
952
1028
|
};
|
|
953
|
-
if (isPromise(got)) {
|
|
1029
|
+
if (isPromise$1(got)) {
|
|
954
1030
|
got.then(handle);
|
|
955
1031
|
} else {
|
|
956
1032
|
handle(got);
|
|
957
1033
|
}
|
|
958
1034
|
};
|
|
959
1035
|
if (waitFor) {
|
|
960
|
-
if (node.activationState) {
|
|
961
|
-
node.activationState.waitFor = void 0;
|
|
962
|
-
}
|
|
963
1036
|
whenReady(waitFor, () => trackSelector(runGet, sync));
|
|
964
1037
|
} else {
|
|
965
1038
|
trackSelector(runGet, sync);
|
|
@@ -982,6 +1055,25 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
982
1055
|
applyPending(localState.pendingChanges);
|
|
983
1056
|
}
|
|
984
1057
|
}
|
|
1058
|
+
syncStateValue.reset = async () => {
|
|
1059
|
+
var _a;
|
|
1060
|
+
const wasPersistEnabled = syncStateValue.isPersistEnabled;
|
|
1061
|
+
const wasSyncEnabled = syncStateValue.isSyncEnabled;
|
|
1062
|
+
syncStateValue.isPersistEnabled = false;
|
|
1063
|
+
syncStateValue.isSyncEnabled = false;
|
|
1064
|
+
syncStateValue.syncCount = 0;
|
|
1065
|
+
isSynced = false;
|
|
1066
|
+
isSubscribed = false;
|
|
1067
|
+
unsubscribe == null ? void 0 : unsubscribe();
|
|
1068
|
+
unsubscribe = void 0;
|
|
1069
|
+
const promise = syncStateValue.clearPersist();
|
|
1070
|
+
obs$.set((_a = syncOptions.initial) != null ? _a : void 0);
|
|
1071
|
+
syncState$.isLoaded.set(false);
|
|
1072
|
+
syncStateValue.isPersistEnabled = wasPersistEnabled;
|
|
1073
|
+
syncStateValue.isSyncEnabled = wasSyncEnabled;
|
|
1074
|
+
node.dirtyFn = sync;
|
|
1075
|
+
await promise;
|
|
1076
|
+
};
|
|
985
1077
|
const onAllPersistLoaded = () => {
|
|
986
1078
|
var _a, _b;
|
|
987
1079
|
let parentNode = node;
|
|
@@ -1035,7 +1127,7 @@ function enableActivateSyncedNode() {
|
|
|
1035
1127
|
let update = void 0;
|
|
1036
1128
|
const get = async (params) => {
|
|
1037
1129
|
update = params.refresh;
|
|
1038
|
-
if (isPromise(newValue)) {
|
|
1130
|
+
if (isPromise$1(newValue)) {
|
|
1039
1131
|
try {
|
|
1040
1132
|
newValue = await newValue;
|
|
1041
1133
|
} catch (e) {
|
|
@@ -1066,10 +1158,19 @@ function installPersistActivateNode() {
|
|
|
1066
1158
|
didInstall = true;
|
|
1067
1159
|
}
|
|
1068
1160
|
}
|
|
1161
|
+
var { deepMerge: deepMerge2 } = internal;
|
|
1162
|
+
function configureSynced(fnOrOrigOptions, origOptions) {
|
|
1163
|
+
const fn = origOptions ? fnOrOrigOptions : void 0;
|
|
1164
|
+
origOptions = origOptions != null ? origOptions : fnOrOrigOptions;
|
|
1165
|
+
return (options) => {
|
|
1166
|
+
const merged = deepMerge2(origOptions, options);
|
|
1167
|
+
return fn ? fn(merged) : merged;
|
|
1168
|
+
};
|
|
1169
|
+
}
|
|
1069
1170
|
|
|
1070
1171
|
// sync.ts
|
|
1071
|
-
var
|
|
1172
|
+
var internal4 = {
|
|
1072
1173
|
observableSyncConfiguration
|
|
1073
1174
|
};
|
|
1074
1175
|
|
|
1075
|
-
export { combineTransforms, configureObservableSync, deepEqual, diffObjects,
|
|
1176
|
+
export { combineTransforms, configureObservableSync, configureSynced, deepEqual, diffObjects, internal4 as internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
|