@legendapp/state 3.0.0-alpha.34 → 3.0.0-alpha.36
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.d.mts +1 -1
- package/config.d.ts +1 -1
- package/config.js +18 -12
- package/config.mjs +18 -12
- package/index.d.mts +10 -3
- package/index.d.ts +10 -3
- package/index.js +79 -42
- package/index.mjs +76 -42
- package/{observableInterfaces-CZR3_8mM.d.mts → observableInterfaces-CgBddSU6.d.mts} +6 -2
- package/{observableInterfaces-CZR3_8mM.d.ts → observableInterfaces-CgBddSU6.d.ts} +6 -2
- package/package.json +1 -1
- package/persist-plugins/async-storage.d.mts +2 -2
- package/persist-plugins/async-storage.d.ts +2 -2
- package/persist-plugins/async-storage.js +3 -7
- package/persist-plugins/async-storage.mjs +3 -7
- package/persist-plugins/indexeddb.d.mts +2 -2
- package/persist-plugins/indexeddb.d.ts +2 -2
- package/persist-plugins/indexeddb.js +3 -7
- package/persist-plugins/indexeddb.mjs +3 -7
- package/persist-plugins/mmkv.d.mts +2 -2
- package/persist-plugins/mmkv.d.ts +2 -2
- package/persist-plugins/mmkv.js +3 -7
- package/persist-plugins/mmkv.mjs +3 -7
- package/sync-plugins/crud.js +6 -7
- package/sync-plugins/crud.mjs +7 -8
- package/sync-plugins/keel.d.mts +28 -28
- package/sync-plugins/keel.d.ts +28 -28
- package/sync-plugins/keel.js +106 -82
- package/sync-plugins/keel.mjs +108 -82
- package/sync-plugins/supabase.js +1 -1
- package/sync-plugins/supabase.mjs +1 -1
- package/sync.d.mts +11 -13
- package/sync.d.ts +11 -13
- package/sync.js +153 -132
- package/sync.mjs +154 -133
package/sync.js
CHANGED
|
@@ -178,7 +178,7 @@ function runWithRetry(state, retryOptions, fn, onError) {
|
|
|
178
178
|
clearTimeout(timeoutRetry);
|
|
179
179
|
}
|
|
180
180
|
if (onError) {
|
|
181
|
-
onError(error);
|
|
181
|
+
onError(error, state);
|
|
182
182
|
}
|
|
183
183
|
if (!state.cancelRetry) {
|
|
184
184
|
const timeout = createRetryTimeout(retryOptions, state.retryNum, () => {
|
|
@@ -253,7 +253,7 @@ async function updateMetadataImmediate(value$, localState, syncState2, syncOptio
|
|
|
253
253
|
await Promise.all(saves);
|
|
254
254
|
}
|
|
255
255
|
const { pluginPersist } = localState;
|
|
256
|
-
const { table, config } = parseLocalConfig(syncOptions
|
|
256
|
+
const { table, config } = parseLocalConfig(syncOptions.persist);
|
|
257
257
|
const oldMetadata = metadatas.get(value$);
|
|
258
258
|
const { lastSync } = newMetadata;
|
|
259
259
|
const metadata = Object.assign({}, oldMetadata, newMetadata);
|
|
@@ -583,96 +583,104 @@ async function doChangeRemote(changeInfo) {
|
|
|
583
583
|
}
|
|
584
584
|
state$.numPendingSets.set((v) => (v || 0) + 1);
|
|
585
585
|
state$.isSetting.set(true);
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
const onError = (error) => {
|
|
589
|
-
var _a2;
|
|
590
|
-
state$.error.set(error);
|
|
591
|
-
(_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error, {
|
|
592
|
-
setParams,
|
|
593
|
-
source: "set",
|
|
594
|
-
value$: obs$
|
|
595
|
-
});
|
|
586
|
+
const beforeSetParams = {
|
|
587
|
+
cancel: false
|
|
596
588
|
};
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
if (
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
value
|
|
609
|
-
|
|
610
|
-
};
|
|
611
|
-
} else {
|
|
612
|
-
updateResult = params;
|
|
589
|
+
onBeforeSet == null ? void 0 : onBeforeSet(beforeSetParams);
|
|
590
|
+
if (!beforeSetParams.cancel) {
|
|
591
|
+
let updateResult = void 0;
|
|
592
|
+
let errorHandled = false;
|
|
593
|
+
const onError = (error, retryParams) => {
|
|
594
|
+
var _a2;
|
|
595
|
+
state$.error.set(error);
|
|
596
|
+
if (!errorHandled) {
|
|
597
|
+
(_a2 = syncOptions.onError) == null ? void 0 : _a2.call(syncOptions, error, {
|
|
598
|
+
setParams,
|
|
599
|
+
source: "set",
|
|
600
|
+
value$: obs$,
|
|
601
|
+
retryParams
|
|
602
|
+
});
|
|
613
603
|
}
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
604
|
+
errorHandled = true;
|
|
605
|
+
};
|
|
606
|
+
const setParams = {
|
|
607
|
+
node,
|
|
608
|
+
value$: obs$,
|
|
609
|
+
changes: changesRemote,
|
|
610
|
+
value,
|
|
611
|
+
onError,
|
|
612
|
+
update: (params) => {
|
|
613
|
+
if (updateResult) {
|
|
614
|
+
const { value: value2, lastSync, mode } = params;
|
|
615
|
+
updateResult = {
|
|
616
|
+
lastSync: Math.max(updateResult.lastSync || 0, lastSync || 0),
|
|
617
|
+
value: deepMerge(updateResult.value, value2),
|
|
618
|
+
mode
|
|
619
|
+
};
|
|
620
|
+
} else {
|
|
621
|
+
updateResult = params;
|
|
622
|
+
}
|
|
623
|
+
},
|
|
624
|
+
refresh: syncState2.sync,
|
|
625
|
+
retryNum: 0,
|
|
626
|
+
cancelRetry: false
|
|
627
|
+
};
|
|
628
|
+
const savedPromise = runWithRetry(
|
|
629
|
+
setParams,
|
|
630
|
+
syncOptions.retry,
|
|
631
|
+
async () => {
|
|
632
|
+
return syncOptions.set(setParams);
|
|
633
|
+
},
|
|
634
|
+
onError
|
|
635
|
+
);
|
|
636
|
+
let didError = false;
|
|
637
|
+
if (state.isPromise(savedPromise)) {
|
|
638
|
+
await savedPromise.catch(() => {
|
|
639
|
+
didError = true;
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
if (!didError) {
|
|
643
|
+
const pathStrs = Array.from(new Set(changesRemote.map((change) => change.pathStr)));
|
|
644
|
+
const { value: changes, lastSync } = updateResult || {};
|
|
645
|
+
if (pathStrs.length > 0) {
|
|
646
|
+
let transformedChanges = void 0;
|
|
647
|
+
const metadata = {};
|
|
648
|
+
if (saveLocal) {
|
|
649
|
+
const pendingMetadata = (_b = pluginPersist.getMetadata(table, configLocal)) == null ? void 0 : _b.pending;
|
|
650
|
+
const pending = localState.pendingChanges;
|
|
651
|
+
for (let i = 0; i < pathStrs.length; i++) {
|
|
652
|
+
const pathStr = pathStrs[i];
|
|
653
|
+
if (pendingMetadata == null ? void 0 : pendingMetadata[pathStr]) {
|
|
654
|
+
delete pendingMetadata[pathStr];
|
|
655
|
+
metadata.pending = pendingMetadata;
|
|
656
|
+
}
|
|
657
|
+
if (pending == null ? void 0 : pending[pathStr]) {
|
|
658
|
+
delete pending[pathStr];
|
|
659
|
+
}
|
|
649
660
|
}
|
|
650
|
-
if (
|
|
651
|
-
|
|
661
|
+
if (lastSync) {
|
|
662
|
+
metadata.lastSync = lastSync;
|
|
652
663
|
}
|
|
653
664
|
}
|
|
654
|
-
if (
|
|
655
|
-
|
|
665
|
+
if (changes && !state.isEmpty(changes)) {
|
|
666
|
+
transformedChanges = transformLoadData(changes, syncOptions, false, "set");
|
|
656
667
|
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
if (state.isPromise(transformedChanges)) {
|
|
663
|
-
transformedChanges = await transformedChanges;
|
|
668
|
+
if (transformedChanges !== void 0) {
|
|
669
|
+
if (state.isPromise(transformedChanges)) {
|
|
670
|
+
transformedChanges = await transformedChanges;
|
|
671
|
+
}
|
|
672
|
+
onChangeRemote(() => state.mergeIntoObservable(obs$, transformedChanges));
|
|
664
673
|
}
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
updateMetadata(obs$, localState, syncState2, syncOptions, metadata);
|
|
674
|
+
if (saveLocal) {
|
|
675
|
+
if (shouldSaveMetadata && !state.isEmpty(metadata)) {
|
|
676
|
+
updateMetadata(obs$, localState, syncState2, syncOptions, metadata);
|
|
677
|
+
}
|
|
670
678
|
}
|
|
671
679
|
}
|
|
680
|
+
state$.numPendingSets.set((v) => v - 1);
|
|
681
|
+
state$.isSetting.set(state$.numPendingSets.peek() > 0);
|
|
682
|
+
onAfterSet == null ? void 0 : onAfterSet();
|
|
672
683
|
}
|
|
673
|
-
state$.numPendingSets.set((v) => v - 1);
|
|
674
|
-
state$.isSetting.set(state$.numPendingSets.peek() > 0);
|
|
675
|
-
onAfterSet == null ? void 0 : onAfterSet();
|
|
676
684
|
}
|
|
677
685
|
}
|
|
678
686
|
}
|
|
@@ -710,7 +718,7 @@ async function loadLocal(value$, syncOptions, syncState$, localState) {
|
|
|
710
718
|
throw new Error("Local persist is not configured");
|
|
711
719
|
}
|
|
712
720
|
if (!mapSyncPlugins.has(PersistPlugin)) {
|
|
713
|
-
const persistPlugin2 = new PersistPlugin();
|
|
721
|
+
const persistPlugin2 = state.isFunction(PersistPlugin) ? new PersistPlugin() : PersistPlugin;
|
|
714
722
|
const mapValue = { plugin: persistPlugin2, initialized: state.observable(false) };
|
|
715
723
|
mapSyncPlugins.set(PersistPlugin, mapValue);
|
|
716
724
|
if (persistPlugin2.initialize) {
|
|
@@ -792,10 +800,14 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
792
800
|
const syncStateValue = getNodeValue(getNode(syncState$));
|
|
793
801
|
allSyncStates.set(syncState$, node);
|
|
794
802
|
syncStateValue.getPendingChanges = () => localState.pendingChanges;
|
|
803
|
+
let errorHandled = false;
|
|
795
804
|
const onGetError = (error, params) => {
|
|
796
805
|
var _a;
|
|
797
806
|
syncState$.error.set(error);
|
|
798
|
-
(
|
|
807
|
+
if (!errorHandled) {
|
|
808
|
+
(_a = syncOptions.onError) == null ? void 0 : _a.call(syncOptions, error, { ...params, value$: obs$ });
|
|
809
|
+
}
|
|
810
|
+
errorHandled = true;
|
|
799
811
|
};
|
|
800
812
|
loadLocal(obs$, syncOptions, syncState$, localState);
|
|
801
813
|
let isWaitingForLoad = !!syncOptions.get;
|
|
@@ -903,6 +915,9 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
903
915
|
}
|
|
904
916
|
}
|
|
905
917
|
onChangeRemote(() => {
|
|
918
|
+
if (state.isPlainObject(value)) {
|
|
919
|
+
value = state.ObservableHint.plain(value);
|
|
920
|
+
}
|
|
906
921
|
if (mode === "assign") {
|
|
907
922
|
obs$.assign(value);
|
|
908
923
|
} else if (mode === "append") {
|
|
@@ -974,7 +989,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
974
989
|
cancelRetry: false
|
|
975
990
|
};
|
|
976
991
|
let modeBeforeReset = void 0;
|
|
977
|
-
|
|
992
|
+
const beforeGetParams = {
|
|
978
993
|
value: getParams.value,
|
|
979
994
|
lastSync,
|
|
980
995
|
pendingChanges: pending && !state.isEmpty(pending) ? pending : void 0,
|
|
@@ -989,52 +1004,56 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
989
1004
|
modeBeforeReset = getParams.mode;
|
|
990
1005
|
getParams.mode = "set";
|
|
991
1006
|
return (_a3 = syncStateValue.clearPersist) == null ? void 0 : _a3.call(syncStateValue);
|
|
992
|
-
}
|
|
993
|
-
});
|
|
994
|
-
syncState$.assign({
|
|
995
|
-
numPendingGets: (syncStateValue.numPendingGets || 0) + 1,
|
|
996
|
-
isGetting: true
|
|
997
|
-
});
|
|
998
|
-
const got = runWithRetry(
|
|
999
|
-
getParams,
|
|
1000
|
-
syncOptions.retry,
|
|
1001
|
-
(retryEvent) => {
|
|
1002
|
-
const params = getParams;
|
|
1003
|
-
params.cancelRetry = retryEvent.cancelRetry;
|
|
1004
|
-
params.retryNum = retryEvent.retryNum;
|
|
1005
|
-
return get(params);
|
|
1006
1007
|
},
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
syncState$.numPendingGets.set((v) => v - 1);
|
|
1012
|
-
if (isWaitingForLoad) {
|
|
1013
|
-
isWaitingForLoad = false;
|
|
1014
|
-
syncStateValue.numPendingRemoteLoads--;
|
|
1015
|
-
}
|
|
1016
|
-
if (numGets >= (node.getNumResolved || 0)) {
|
|
1017
|
-
node.getNumResolved = node.numGets;
|
|
1018
|
-
onChange({
|
|
1019
|
-
value,
|
|
1020
|
-
lastSync: getParams.lastSync,
|
|
1021
|
-
mode: getParams.mode
|
|
1022
|
-
});
|
|
1023
|
-
}
|
|
1024
|
-
if (modeBeforeReset) {
|
|
1025
|
-
getParams.mode = modeBeforeReset;
|
|
1026
|
-
modeBeforeReset = void 0;
|
|
1027
|
-
}
|
|
1008
|
+
cancel: false
|
|
1009
|
+
};
|
|
1010
|
+
(_a2 = syncOptions.onBeforeGet) == null ? void 0 : _a2.call(syncOptions, beforeGetParams);
|
|
1011
|
+
if (!beforeGetParams.cancel) {
|
|
1028
1012
|
syncState$.assign({
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
isGetting: syncStateValue.numPendingGets > 0
|
|
1013
|
+
numPendingGets: (syncStateValue.numPendingGets || 0) + 1,
|
|
1014
|
+
isGetting: true
|
|
1032
1015
|
});
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1016
|
+
const got = runWithRetry(
|
|
1017
|
+
getParams,
|
|
1018
|
+
syncOptions.retry,
|
|
1019
|
+
(retryEvent) => {
|
|
1020
|
+
const params = getParams;
|
|
1021
|
+
params.cancelRetry = retryEvent.cancelRetry;
|
|
1022
|
+
params.retryNum = retryEvent.retryNum;
|
|
1023
|
+
return get(params);
|
|
1024
|
+
},
|
|
1025
|
+
onError
|
|
1026
|
+
);
|
|
1027
|
+
const numGets = node.numGets = (node.numGets || 0) + 1;
|
|
1028
|
+
const handle = (value) => {
|
|
1029
|
+
syncState$.numPendingGets.set((v) => v - 1);
|
|
1030
|
+
if (isWaitingForLoad) {
|
|
1031
|
+
isWaitingForLoad = false;
|
|
1032
|
+
syncStateValue.numPendingRemoteLoads--;
|
|
1033
|
+
}
|
|
1034
|
+
if (numGets >= (node.getNumResolved || 0)) {
|
|
1035
|
+
node.getNumResolved = node.numGets;
|
|
1036
|
+
onChange({
|
|
1037
|
+
value,
|
|
1038
|
+
lastSync: getParams.lastSync,
|
|
1039
|
+
mode: getParams.mode
|
|
1040
|
+
});
|
|
1041
|
+
}
|
|
1042
|
+
if (modeBeforeReset) {
|
|
1043
|
+
getParams.mode = modeBeforeReset;
|
|
1044
|
+
modeBeforeReset = void 0;
|
|
1045
|
+
}
|
|
1046
|
+
syncState$.assign({
|
|
1047
|
+
isLoaded: syncStateValue.numPendingRemoteLoads < 1,
|
|
1048
|
+
error: void 0,
|
|
1049
|
+
isGetting: syncStateValue.numPendingGets > 0
|
|
1050
|
+
});
|
|
1051
|
+
};
|
|
1052
|
+
if (state.isPromise(got)) {
|
|
1053
|
+
got.then(handle);
|
|
1054
|
+
} else {
|
|
1055
|
+
handle(got);
|
|
1056
|
+
}
|
|
1038
1057
|
}
|
|
1039
1058
|
};
|
|
1040
1059
|
if (waitFor) {
|
|
@@ -1061,7 +1080,6 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1061
1080
|
}
|
|
1062
1081
|
}
|
|
1063
1082
|
syncStateValue.reset = async () => {
|
|
1064
|
-
var _a;
|
|
1065
1083
|
const wasPersistEnabled = syncStateValue.isPersistEnabled;
|
|
1066
1084
|
const wasSyncEnabled = syncStateValue.isSyncEnabled;
|
|
1067
1085
|
const metadata = metadatas.get(obs$);
|
|
@@ -1084,7 +1102,10 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1084
1102
|
unsubscribe == null ? void 0 : unsubscribe();
|
|
1085
1103
|
unsubscribe = void 0;
|
|
1086
1104
|
const promise = syncStateValue.clearPersist();
|
|
1087
|
-
|
|
1105
|
+
onChangeRemote(() => {
|
|
1106
|
+
var _a;
|
|
1107
|
+
obs$.set((_a = syncOptions.initial) != null ? _a : void 0);
|
|
1108
|
+
});
|
|
1088
1109
|
syncState$.isLoaded.set(false);
|
|
1089
1110
|
syncStateValue.isPersistEnabled = wasPersistEnabled;
|
|
1090
1111
|
syncStateValue.isSyncEnabled = wasSyncEnabled;
|
|
@@ -1177,11 +1198,11 @@ function installPersistActivateNode() {
|
|
|
1177
1198
|
}
|
|
1178
1199
|
var { deepMerge: deepMerge2 } = state.internal;
|
|
1179
1200
|
function configureSynced(fnOrOrigOptions, origOptions) {
|
|
1180
|
-
const fn = origOptions ? fnOrOrigOptions :
|
|
1201
|
+
const fn = origOptions ? fnOrOrigOptions : synced;
|
|
1181
1202
|
origOptions = origOptions != null ? origOptions : fnOrOrigOptions;
|
|
1182
1203
|
return (options) => {
|
|
1183
1204
|
const merged = deepMerge2(origOptions, options);
|
|
1184
|
-
return fn
|
|
1205
|
+
return fn(merged);
|
|
1185
1206
|
};
|
|
1186
1207
|
}
|
|
1187
1208
|
|