@legendapp/state 3.0.0-alpha.33 → 3.0.0-alpha.35

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/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 == null ? void 0 : syncOptions.persist);
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
- onBeforeSet == null ? void 0 : onBeforeSet();
587
- let updateResult = void 0;
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
- const setParams = {
598
- node,
599
- value$: obs$,
600
- changes: changesRemote,
601
- value,
602
- onError,
603
- update: (params) => {
604
- if (updateResult) {
605
- const { value: value2, lastSync, mode } = params;
606
- updateResult = {
607
- lastSync: Math.max(updateResult.lastSync || 0, lastSync || 0),
608
- value: deepMerge(updateResult.value, value2),
609
- mode
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
- refresh: syncState2.sync,
616
- retryNum: 0,
617
- cancelRetry: false
618
- };
619
- let savedPromise = runWithRetry(
620
- setParams,
621
- syncOptions.retry,
622
- async () => {
623
- return syncOptions.set(setParams);
624
- },
625
- onError
626
- );
627
- let didError = false;
628
- if (state.isPromise(savedPromise)) {
629
- savedPromise = savedPromise.catch((error) => {
630
- didError = true;
631
- onError(error);
632
- });
633
- await savedPromise;
634
- }
635
- if (!didError) {
636
- const pathStrs = Array.from(new Set(changesRemote.map((change) => change.pathStr)));
637
- const { value: changes, lastSync } = updateResult || {};
638
- if (pathStrs.length > 0) {
639
- let transformedChanges = void 0;
640
- const metadata = {};
641
- if (saveLocal) {
642
- const pendingMetadata = (_b = pluginPersist.getMetadata(table, configLocal)) == null ? void 0 : _b.pending;
643
- const pending = localState.pendingChanges;
644
- for (let i = 0; i < pathStrs.length; i++) {
645
- const pathStr = pathStrs[i];
646
- if (pendingMetadata == null ? void 0 : pendingMetadata[pathStr]) {
647
- delete pendingMetadata[pathStr];
648
- metadata.pending = pendingMetadata;
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 (pending == null ? void 0 : pending[pathStr]) {
651
- delete pending[pathStr];
661
+ if (lastSync) {
662
+ metadata.lastSync = lastSync;
652
663
  }
653
664
  }
654
- if (lastSync) {
655
- metadata.lastSync = lastSync;
665
+ if (changes && !state.isEmpty(changes)) {
666
+ transformedChanges = transformLoadData(changes, syncOptions, false, "set");
656
667
  }
657
- }
658
- if (changes && !state.isEmpty(changes)) {
659
- transformedChanges = transformLoadData(changes, syncOptions, false, "set");
660
- }
661
- if (transformedChanges !== void 0) {
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
- onChangeRemote(() => state.mergeIntoObservable(obs$, transformedChanges));
666
- }
667
- if (saveLocal) {
668
- if (shouldSaveMetadata && !state.isEmpty(metadata)) {
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
- (_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error, { ...params, value$: obs$ });
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
- (_a2 = syncOptions.onBeforeGet) == null ? void 0 : _a2.call(syncOptions, {
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
- onError
1008
- );
1009
- const numGets = node.numGets = (node.numGets || 0) + 1;
1010
- const handle = (value) => {
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
- isLoaded: syncStateValue.numPendingRemoteLoads < 1,
1030
- error: void 0,
1031
- isGetting: syncStateValue.numPendingGets > 0
1013
+ numPendingGets: (syncStateValue.numPendingGets || 0) + 1,
1014
+ isGetting: true
1032
1015
  });
1033
- };
1034
- if (state.isPromise(got)) {
1035
- got.then(handle);
1036
- } else {
1037
- handle(got);
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) {
@@ -1177,11 +1196,11 @@ function installPersistActivateNode() {
1177
1196
  }
1178
1197
  var { deepMerge: deepMerge2 } = state.internal;
1179
1198
  function configureSynced(fnOrOrigOptions, origOptions) {
1180
- const fn = origOptions ? fnOrOrigOptions : void 0;
1199
+ const fn = origOptions ? fnOrOrigOptions : synced;
1181
1200
  origOptions = origOptions != null ? origOptions : fnOrOrigOptions;
1182
1201
  return (options) => {
1183
1202
  const merged = deepMerge2(origOptions, options);
1184
- return fn ? fn(merged) : merged;
1203
+ return fn(merged);
1185
1204
  };
1186
1205
  }
1187
1206