@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.
Files changed (47) hide show
  1. package/config/enable$GetSet.js +2 -1
  2. package/config/enable$GetSet.mjs +2 -1
  3. package/config/enableReactTracking.js +2 -1
  4. package/config/enableReactTracking.mjs +2 -1
  5. package/config/enableReactUse.js +2 -1
  6. package/config/enableReactUse.mjs +2 -1
  7. package/config/enable_PeekAssign.js +2 -1
  8. package/config/enable_PeekAssign.mjs +2 -1
  9. package/config.d.mts +13 -0
  10. package/config.d.ts +13 -0
  11. package/config.js +2052 -0
  12. package/config.mjs +2050 -0
  13. package/index.d.mts +5 -302
  14. package/index.d.ts +5 -302
  15. package/index.js +27 -142
  16. package/index.mjs +28 -141
  17. package/observableInterfaces-Dilj6F92.d.mts +282 -0
  18. package/observableInterfaces-Dilj6F92.d.ts +282 -0
  19. package/package.json +6 -1
  20. package/persist-plugins/async-storage.d.mts +6 -3
  21. package/persist-plugins/async-storage.d.ts +6 -3
  22. package/persist-plugins/async-storage.js +12 -4
  23. package/persist-plugins/async-storage.mjs +12 -5
  24. package/persist-plugins/indexeddb.d.mts +6 -4
  25. package/persist-plugins/indexeddb.d.ts +6 -4
  26. package/persist-plugins/indexeddb.js +15 -5
  27. package/persist-plugins/indexeddb.mjs +15 -6
  28. package/persist-plugins/mmkv.d.mts +5 -1
  29. package/persist-plugins/mmkv.d.ts +5 -1
  30. package/persist-plugins/mmkv.js +14 -5
  31. package/persist-plugins/mmkv.mjs +14 -6
  32. package/react.d.mts +1 -0
  33. package/react.d.ts +1 -0
  34. package/react.js +2 -2
  35. package/react.mjs +2 -2
  36. package/sync-plugins/crud.d.mts +1 -1
  37. package/sync-plugins/crud.d.ts +1 -1
  38. package/sync-plugins/fetch.js +12 -8
  39. package/sync-plugins/fetch.mjs +13 -9
  40. package/sync-plugins/keel.d.mts +2 -2
  41. package/sync-plugins/keel.d.ts +2 -2
  42. package/sync-plugins/keel.js +6 -6
  43. package/sync-plugins/keel.mjs +6 -6
  44. package/sync.d.mts +37 -19
  45. package/sync.d.ts +37 -19
  46. package/sync.js +143 -41
  47. package/sync.mjs +151 -50
package/sync.js CHANGED
@@ -137,17 +137,72 @@ function transformStringifyDates(...args) {
137
137
  }
138
138
  };
139
139
  }
140
- var {
141
- clone,
142
- deepMerge,
143
- getNode,
144
- getNodeValue,
145
- getValueAtPath,
146
- globalState,
147
- runWithRetry,
148
- symbolLinked,
149
- createPreviousHandler
150
- } = state.internal;
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, setParams);
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({ retryNum: 0, retry: syncOptions.retry }, async (retryEvent) => {
556
- const params = setParams;
557
- params.cancelRetry = retryEvent.cancelRetry;
558
- params.retryNum = retryEvent.retryNum;
559
- return syncOptions.set(params);
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(onError);
626
+ savedPromise = savedPromise.catch((error) => {
627
+ didError = true;
628
+ onError(error);
629
+ });
630
+ await savedPromise;
563
631
  }
564
- await savedPromise;
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 onError = (error, getParams, source) => {
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, getParams, source);
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
- unsubscribe = subscribe({
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) => onError(error, void 0, "subscribe")
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: (error) => onError(error, getParams, "get")
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({ retryNum: 0, retry: syncOptions.retry }, (retryEvent) => {
925
- const params = getParams;
926
- params.cancelRetry = retryEvent.cancelRetry;
927
- params.retryNum = retryEvent.retryNum;
928
- return get(params);
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 internal3 = {
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 = internal3;
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, shouldIgnoreUnobserved, constructObjectWithPath, setAtPath, isArray } from '@legendapp/state';
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
- var {
139
- clone,
140
- deepMerge,
141
- getNode,
142
- getNodeValue,
143
- getValueAtPath,
144
- globalState,
145
- runWithRetry,
146
- symbolLinked,
147
- createPreviousHandler
148
- } = internal;
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, setParams);
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({ retryNum: 0, retry: syncOptions.retry }, async (retryEvent) => {
554
- const params = setParams;
555
- params.cancelRetry = retryEvent.cancelRetry;
556
- params.retryNum = retryEvent.retryNum;
557
- return syncOptions.set(params);
558
- });
559
- if (isPromise(savedPromise)) {
560
- savedPromise = savedPromise.catch(onError);
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
- await savedPromise;
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 onError = (error, getParams, source) => {
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, getParams, source);
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
- unsubscribe = subscribe({
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) => onError(error, void 0, "subscribe")
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: (error) => onError(error, getParams, "get")
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({ retryNum: 0, retry: syncOptions.retry }, (retryEvent) => {
923
- const params = getParams;
924
- params.cancelRetry = retryEvent.cancelRetry;
925
- params.retryNum = retryEvent.retryNum;
926
- return get(params);
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 internal3 = {
1172
+ var internal4 = {
1072
1173
  observableSyncConfiguration
1073
1174
  };
1074
1175
 
1075
- export { combineTransforms, configureObservableSync, deepEqual, diffObjects, internal3 as internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
1176
+ export { combineTransforms, configureObservableSync, configureSynced, deepEqual, diffObjects, internal4 as internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };