@legendapp/state 3.0.0-alpha.1 → 3.0.0-alpha.3
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/.DS_Store +0 -0
- package/CHANGELOG.md +1 -831
- package/LICENSE +1 -21
- package/README.md +1 -141
- package/as/arrayAsRecord.d.mts +5 -0
- package/as/arrayAsRecord.d.ts +5 -0
- package/as/arrayAsRecord.js +28 -0
- package/as/arrayAsRecord.mjs +26 -0
- package/as/arrayAsSet.d.mts +5 -0
- package/as/arrayAsSet.d.ts +5 -0
- package/as/arrayAsSet.js +13 -0
- package/as/arrayAsSet.mjs +11 -0
- package/as/arrayAsString.d.mts +5 -0
- package/as/arrayAsString.d.ts +5 -0
- package/as/arrayAsString.js +13 -0
- package/as/arrayAsString.mjs +11 -0
- package/as/numberAsString.d.mts +5 -0
- package/as/numberAsString.d.ts +5 -0
- package/as/numberAsString.js +13 -0
- package/as/numberAsString.mjs +11 -0
- package/as/recordAsArray.d.mts +5 -0
- package/as/recordAsArray.d.ts +5 -0
- package/as/recordAsArray.js +25 -0
- package/as/recordAsArray.mjs +23 -0
- package/as/recordAsString.d.mts +5 -0
- package/as/recordAsString.d.ts +5 -0
- package/as/recordAsString.js +13 -0
- package/as/recordAsString.mjs +11 -0
- package/as/setAsArray.d.mts +5 -0
- package/as/setAsArray.d.ts +5 -0
- package/as/setAsArray.js +13 -0
- package/as/setAsArray.mjs +11 -0
- package/as/setAsString.d.mts +5 -0
- package/as/setAsString.d.ts +5 -0
- package/as/setAsString.js +13 -0
- package/as/setAsString.mjs +11 -0
- package/as/stringAsArray.d.mts +5 -0
- package/as/stringAsArray.d.ts +5 -0
- package/as/stringAsArray.js +13 -0
- package/as/stringAsArray.mjs +11 -0
- package/as/stringAsNumber.d.mts +5 -0
- package/as/stringAsNumber.d.ts +5 -0
- package/as/stringAsNumber.js +16 -0
- package/as/stringAsNumber.mjs +14 -0
- package/as/stringAsRecord.d.mts +5 -0
- package/as/stringAsRecord.d.ts +5 -0
- package/as/stringAsRecord.js +15 -0
- package/as/stringAsRecord.mjs +13 -0
- package/as/stringAsSet.d.mts +5 -0
- package/as/stringAsSet.d.ts +5 -0
- package/as/stringAsSet.js +13 -0
- package/as/stringAsSet.mjs +11 -0
- package/babel.d.mts +21 -0
- package/babel.d.ts +21 -2
- package/babel.js +57 -53
- package/babel.mjs +65 -0
- package/config/enable$GetSet.js +13 -14
- package/config/enable$GetSet.mjs +13 -14
- package/config/enableReactComponents.d.mts +9 -0
- package/config/enableReactComponents.d.ts +4 -2
- package/config/enableReactComponents.js +13 -10
- package/config/enableReactComponents.mjs +13 -10
- package/config/enableReactNativeComponents.d.mts +22 -0
- package/config/enableReactNativeComponents.d.ts +6 -4
- package/config/enableReactNativeComponents.js +43 -47
- package/config/enableReactNativeComponents.mjs +43 -47
- package/config/enableReactTracking.d.mts +7 -0
- package/config/enableReactTracking.d.ts +3 -2
- package/config/enableReactTracking.js +33 -38
- package/config/enableReactTracking.mjs +33 -38
- package/config/enableReactUse.d.mts +10 -0
- package/config/enableReactUse.d.ts +4 -1
- package/config/enableReactUse.js +15 -14
- package/config/enableReactUse.mjs +15 -14
- package/config/{enable$GetSet.d.ts → enable_GetSet.d.mts} +4 -2
- package/config/enable_GetSet.d.ts +10 -0
- package/config/enable_PeekAssign.d.mts +10 -0
- package/config/enable_PeekAssign.d.ts +4 -2
- package/config/enable_PeekAssign.js +13 -14
- package/config/enable_PeekAssign.mjs +13 -14
- package/helpers/pageHash.d.mts +9 -0
- package/helpers/pageHash.d.ts +2 -0
- package/helpers/pageHash.js +25 -30
- package/helpers/pageHash.mjs +25 -30
- package/helpers/pageHashParams.d.mts +9 -0
- package/helpers/pageHashParams.d.ts +2 -0
- package/helpers/pageHashParams.js +34 -37
- package/helpers/pageHashParams.mjs +34 -37
- package/helpers/time.d.mts +6 -0
- package/helpers/time.d.ts +6 -3
- package/helpers/time.js +17 -17
- package/helpers/time.mjs +17 -17
- package/helpers/trackHistory.d.mts +6 -0
- package/helpers/trackHistory.d.ts +4 -2
- package/helpers/trackHistory.js +13 -16
- package/helpers/trackHistory.mjs +13 -16
- package/helpers/undoRedo.d.mts +37 -0
- package/helpers/undoRedo.d.ts +5 -3
- package/helpers/undoRedo.js +59 -94
- package/helpers/undoRedo.mjs +59 -94
- package/index.d.mts +404 -0
- package/index.d.ts +371 -28
- package/index.js +2015 -2166
- package/index.mjs +2015 -2166
- package/package.json +254 -195
- package/persist-plugins/async-storage.d.mts +18 -0
- package/persist-plugins/async-storage.d.ts +6 -3
- package/persist-plugins/async-storage.js +79 -86
- package/persist-plugins/async-storage.mjs +79 -86
- package/persist-plugins/indexeddb.d.mts +29 -0
- package/persist-plugins/indexeddb.d.ts +6 -3
- package/persist-plugins/indexeddb.js +331 -352
- package/persist-plugins/indexeddb.mjs +331 -352
- package/persist-plugins/local-storage.d.mts +23 -0
- package/persist-plugins/local-storage.d.ts +8 -5
- package/persist-plugins/local-storage.js +74 -76
- package/persist-plugins/local-storage.mjs +74 -76
- package/persist-plugins/mmkv.d.mts +18 -0
- package/persist-plugins/mmkv.d.ts +6 -3
- package/persist-plugins/mmkv.js +82 -86
- package/persist-plugins/mmkv.mjs +82 -86
- package/react-hooks/createObservableHook.d.mts +5 -0
- package/react-hooks/createObservableHook.d.ts +4 -1
- package/react-hooks/createObservableHook.js +29 -30
- package/react-hooks/createObservableHook.mjs +25 -30
- package/react-hooks/useHover.d.mts +5 -0
- package/react-hooks/useHover.d.ts +5 -3
- package/react-hooks/useHover.js +29 -29
- package/react-hooks/useHover.mjs +29 -29
- package/react-hooks/useMeasure.d.mts +9 -0
- package/react-hooks/useMeasure.d.ts +5 -2
- package/react-hooks/useMeasure.js +30 -32
- package/react-hooks/useMeasure.mjs +30 -32
- package/react-hooks/useObservableNextRouter.d.mts +35 -0
- package/react-hooks/useObservableNextRouter.d.ts +9 -7
- package/react-hooks/useObservableNextRouter.js +64 -77
- package/react-hooks/useObservableNextRouter.mjs +60 -77
- package/react.d.mts +157 -0
- package/react.d.ts +157 -21
- package/react.js +458 -749
- package/react.mjs +457 -752
- package/sync-plugins/crud.d.mts +54 -0
- package/sync-plugins/crud.d.ts +12 -10
- package/sync-plugins/crud.js +253 -270
- package/sync-plugins/crud.mjs +253 -270
- package/sync-plugins/fetch.d.mts +21 -0
- package/sync-plugins/fetch.d.ts +7 -4
- package/sync-plugins/fetch.js +50 -37
- package/sync-plugins/fetch.mjs +50 -37
- package/sync-plugins/keel.d.mts +108 -0
- package/sync-plugins/keel.d.ts +17 -15
- package/sync-plugins/keel.js +229 -462
- package/sync-plugins/keel.mjs +227 -464
- package/sync-plugins/supabase.d.mts +39 -0
- package/sync-plugins/supabase.d.ts +16 -14
- package/sync-plugins/supabase.js +128 -128
- package/sync-plugins/supabase.mjs +128 -128
- package/sync-plugins/tanstack-query.d.mts +14 -0
- package/sync-plugins/tanstack-query.d.ts +7 -4
- package/sync-plugins/tanstack-query.js +51 -57
- package/sync-plugins/tanstack-query.mjs +51 -57
- package/sync-plugins/tanstack-react-query.d.mts +8 -0
- package/sync-plugins/tanstack-react-query.d.ts +6 -1
- package/sync-plugins/tanstack-react-query.js +2 -2
- package/sync-plugins/tanstack-react-query.mjs +2 -2
- package/sync.d.mts +351 -0
- package/sync.d.ts +349 -9
- package/sync.js +910 -964
- package/sync.mjs +920 -974
- package/trace.d.mts +9 -0
- package/trace.d.ts +9 -4
- package/trace.js +72 -62
- package/trace.mjs +72 -62
- package/types/babel.d.ts +1 -12
- package/babel.js.map +0 -1
- package/config/enable$GetSet.js.map +0 -1
- package/config/enable$GetSet.mjs.map +0 -1
- package/config/enableReactComponents.js.map +0 -1
- package/config/enableReactComponents.mjs.map +0 -1
- package/config/enableReactNativeComponents.js.map +0 -1
- package/config/enableReactNativeComponents.mjs.map +0 -1
- package/config/enableReactTracking.js.map +0 -1
- package/config/enableReactTracking.mjs.map +0 -1
- package/config/enableReactUse.js.map +0 -1
- package/config/enableReactUse.mjs.map +0 -1
- package/config/enable_PeekAssign.js.map +0 -1
- package/config/enable_PeekAssign.mjs.map +0 -1
- package/helpers/pageHash.js.map +0 -1
- package/helpers/pageHash.mjs.map +0 -1
- package/helpers/pageHashParams.js.map +0 -1
- package/helpers/pageHashParams.mjs.map +0 -1
- package/helpers/time.js.map +0 -1
- package/helpers/time.mjs.map +0 -1
- package/helpers/trackHistory.js.map +0 -1
- package/helpers/trackHistory.mjs.map +0 -1
- package/helpers/undoRedo.js.map +0 -1
- package/helpers/undoRedo.mjs.map +0 -1
- package/history.d.ts +0 -1
- package/history.js +0 -24
- package/history.js.map +0 -1
- package/history.mjs +0 -22
- package/history.mjs.map +0 -1
- package/index.js.map +0 -1
- package/index.mjs.map +0 -1
- package/persist-plugins/async-storage.js.map +0 -1
- package/persist-plugins/async-storage.mjs.map +0 -1
- package/persist-plugins/indexeddb.js.map +0 -1
- package/persist-plugins/indexeddb.mjs.map +0 -1
- package/persist-plugins/local-storage.js.map +0 -1
- package/persist-plugins/local-storage.mjs.map +0 -1
- package/persist-plugins/mmkv.js.map +0 -1
- package/persist-plugins/mmkv.mjs.map +0 -1
- package/react-hooks/createObservableHook.js.map +0 -1
- package/react-hooks/createObservableHook.mjs.map +0 -1
- package/react-hooks/useHover.js.map +0 -1
- package/react-hooks/useHover.mjs.map +0 -1
- package/react-hooks/useMeasure.js.map +0 -1
- package/react-hooks/useMeasure.mjs.map +0 -1
- package/react-hooks/useObservableNextRouter.js.map +0 -1
- package/react-hooks/useObservableNextRouter.mjs.map +0 -1
- package/react.js.map +0 -1
- package/react.mjs.map +0 -1
- package/src/ObservableObject.ts +0 -1350
- package/src/ObservablePrimitive.ts +0 -62
- package/src/babel/index.ts +0 -83
- package/src/batching.ts +0 -357
- package/src/computed.ts +0 -18
- package/src/config/enable$GetSet.ts +0 -30
- package/src/config/enableReactComponents.ts +0 -26
- package/src/config/enableReactNativeComponents.ts +0 -102
- package/src/config/enableReactTracking.ts +0 -62
- package/src/config/enableReactUse.ts +0 -32
- package/src/config/enable_PeekAssign.ts +0 -31
- package/src/config.ts +0 -47
- package/src/createObservable.ts +0 -47
- package/src/event.ts +0 -26
- package/src/globals.ts +0 -235
- package/src/helpers/pageHash.ts +0 -41
- package/src/helpers/pageHashParams.ts +0 -55
- package/src/helpers/time.ts +0 -30
- package/src/helpers/trackHistory.ts +0 -29
- package/src/helpers/undoRedo.ts +0 -111
- package/src/helpers.ts +0 -231
- package/src/is.ts +0 -63
- package/src/linked.ts +0 -17
- package/src/observable.ts +0 -32
- package/src/observableInterfaces.ts +0 -151
- package/src/observableTypes.ts +0 -232
- package/src/observe.ts +0 -89
- package/src/old-plugins/firebase.ts +0 -1053
- package/src/onChange.ts +0 -146
- package/src/persist/configureObservablePersistence.ts +0 -7
- package/src/persist/fieldTransformer.ts +0 -149
- package/src/persist/observablePersistRemoteFunctionsAdapter.ts +0 -39
- package/src/persist/persistObservable.ts +0 -1034
- package/src/persist-plugins/async-storage.ts +0 -99
- package/src/persist-plugins/indexeddb.ts +0 -439
- package/src/persist-plugins/local-storage.ts +0 -86
- package/src/persist-plugins/mmkv.ts +0 -91
- package/src/proxy.ts +0 -28
- package/src/react/Computed.tsx +0 -8
- package/src/react/For.tsx +0 -116
- package/src/react/Memo.tsx +0 -4
- package/src/react/Reactive.tsx +0 -53
- package/src/react/Show.tsx +0 -33
- package/src/react/Switch.tsx +0 -43
- package/src/react/react-globals.ts +0 -3
- package/src/react/reactInterfaces.ts +0 -32
- package/src/react/reactive-observer.tsx +0 -210
- package/src/react/useComputed.ts +0 -36
- package/src/react/useEffectOnce.ts +0 -41
- package/src/react/useIsMounted.ts +0 -16
- package/src/react/useMount.ts +0 -15
- package/src/react/useObservable.ts +0 -24
- package/src/react/useObservableReducer.ts +0 -52
- package/src/react/useObservableState.ts +0 -30
- package/src/react/useObserve.ts +0 -54
- package/src/react/useObserveEffect.ts +0 -40
- package/src/react/usePauseProvider.tsx +0 -16
- package/src/react/useSelector.ts +0 -167
- package/src/react/useUnmount.ts +0 -8
- package/src/react/useWhen.ts +0 -9
- package/src/react-hooks/createObservableHook.ts +0 -53
- package/src/react-hooks/useHover.ts +0 -40
- package/src/react-hooks/useMeasure.ts +0 -48
- package/src/react-hooks/useObservableNextRouter.ts +0 -137
- package/src/retry.ts +0 -71
- package/src/setupTracking.ts +0 -26
- package/src/sync/activateSyncedNode.ts +0 -128
- package/src/sync/configureObservableSync.ts +0 -7
- package/src/sync/persistTypes.ts +0 -216
- package/src/sync/syncHelpers.ts +0 -180
- package/src/sync/syncObservable.ts +0 -1056
- package/src/sync/syncObservableAdapter.ts +0 -31
- package/src/sync/syncTypes.ts +0 -189
- package/src/sync/synced.ts +0 -21
- package/src/sync-plugins/crud.ts +0 -412
- package/src/sync-plugins/fetch.ts +0 -80
- package/src/sync-plugins/keel.ts +0 -495
- package/src/sync-plugins/supabase.ts +0 -249
- package/src/sync-plugins/tanstack-query.ts +0 -113
- package/src/sync-plugins/tanstack-react-query.ts +0 -12
- package/src/trace/traceHelpers.ts +0 -11
- package/src/trace/useTraceListeners.ts +0 -34
- package/src/trace/useTraceUpdates.ts +0 -24
- package/src/trace/useVerifyNotTracking.ts +0 -33
- package/src/trace/useVerifyOneRender.ts +0 -10
- package/src/trackSelector.ts +0 -52
- package/src/tracking.ts +0 -43
- package/src/types/babel.d.ts +0 -12
- package/src/when.ts +0 -75
- package/sync-plugins/crud.js.map +0 -1
- package/sync-plugins/crud.mjs.map +0 -1
- package/sync-plugins/fetch.js.map +0 -1
- package/sync-plugins/fetch.mjs.map +0 -1
- package/sync-plugins/keel.js.map +0 -1
- package/sync-plugins/keel.mjs.map +0 -1
- package/sync-plugins/supabase.js.map +0 -1
- package/sync-plugins/supabase.mjs.map +0 -1
- package/sync-plugins/tanstack-query.js.map +0 -1
- package/sync-plugins/tanstack-query.mjs.map +0 -1
- package/sync-plugins/tanstack-react-query.js.map +0 -1
- package/sync-plugins/tanstack-react-query.mjs.map +0 -1
- package/sync.js.map +0 -1
- package/sync.mjs.map +0 -1
- package/trace.js.map +0 -1
- package/trace.mjs.map +0 -1
package/sync.mjs
CHANGED
|
@@ -1,1065 +1,1011 @@
|
|
|
1
|
-
import { isObject, isDate, isNullOrUndefined, isString,
|
|
1
|
+
import { isObject, isDate, isNullOrUndefined, isString, endBatch, beginBatch, isFunction, mergeIntoObservable, observable, when, linked, internal, isPromise, isEmpty, shouldIgnoreUnobserved, whenReady, constructObjectWithPath, deconstructObjectWithPath, setAtPath, isArray } from '@legendapp/state';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// sync.ts
|
|
4
|
+
|
|
5
|
+
// src/sync/configureObservableSync.ts
|
|
6
|
+
var observableSyncConfiguration = {};
|
|
4
7
|
function configureObservableSync(options) {
|
|
5
|
-
|
|
8
|
+
Object.assign(observableSyncConfiguration, options);
|
|
6
9
|
}
|
|
7
|
-
|
|
8
10
|
function removeNullUndefined(a, recursive) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
const out = {};
|
|
12
|
+
Object.keys(a).forEach((key) => {
|
|
13
|
+
if (a[key] !== null && a[key] !== void 0) {
|
|
14
|
+
out[key] = recursive && isObject(a[key]) ? removeNullUndefined(a[key]) : a[key];
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return out;
|
|
16
18
|
}
|
|
17
19
|
function diffObjects(obj1, obj2, deep = false) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
20
|
+
const diff = {};
|
|
21
|
+
if (!obj1)
|
|
22
|
+
return obj2 || diff;
|
|
23
|
+
if (!obj2)
|
|
24
|
+
return obj1 || diff;
|
|
25
|
+
const keys = /* @__PURE__ */ new Set([...Object.keys(obj1), ...Object.keys(obj2)]);
|
|
26
|
+
keys.forEach((key) => {
|
|
27
|
+
const o1 = obj1[key];
|
|
28
|
+
const o2 = obj2[key];
|
|
29
|
+
if (deep ? !deepEqual(o1, o2) : o1 !== o2) {
|
|
30
|
+
if (!isDate(o1) || !isDate(o2) || o1.getTime() !== o2.getTime()) {
|
|
31
|
+
diff[key] = o2;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return diff;
|
|
34
36
|
}
|
|
35
37
|
function deepEqual(a, b, ignoreFields, nullVsUndefined) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
38
|
+
if (a === b) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
if (isNullOrUndefined(a) !== isNullOrUndefined(b)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (nullVsUndefined) {
|
|
45
|
+
a = removeNullUndefined(
|
|
46
|
+
a,
|
|
47
|
+
/*recursive*/
|
|
48
|
+
true
|
|
49
|
+
);
|
|
50
|
+
b = removeNullUndefined(
|
|
51
|
+
b,
|
|
52
|
+
/*recursive*/
|
|
53
|
+
true
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
const replacer = ignoreFields ? (key, value) => ignoreFields.includes(key) ? void 0 : value : void 0;
|
|
57
|
+
return JSON.stringify(a, replacer) === JSON.stringify(b, replacer);
|
|
50
58
|
}
|
|
51
59
|
function combineTransforms(...transforms) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
60
|
+
return {
|
|
61
|
+
load: (value, method) => {
|
|
62
|
+
let inValue = value;
|
|
63
|
+
transforms.forEach((transform) => {
|
|
64
|
+
if (transform.load) {
|
|
65
|
+
inValue = transform.load(inValue, method);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return inValue;
|
|
69
|
+
},
|
|
70
|
+
save: (value) => {
|
|
71
|
+
let outValue = value;
|
|
72
|
+
transforms.forEach((transform) => {
|
|
73
|
+
if (transform.save) {
|
|
74
|
+
outValue = transform.save(outValue);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return outValue;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
72
80
|
}
|
|
73
|
-
|
|
81
|
+
var ISO8601 = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/;
|
|
74
82
|
function transformStringifyKeys(...keys) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
83
|
+
return {
|
|
84
|
+
load: (value) => {
|
|
85
|
+
keys.forEach((key) => {
|
|
86
|
+
const keyRemote = isObject(key) ? key.from : key;
|
|
87
|
+
const keyLocal = isObject(key) ? key.to : key;
|
|
88
|
+
const v = value[keyRemote];
|
|
89
|
+
if (!isNullOrUndefined(v)) {
|
|
90
|
+
value[keyLocal] = isString(v) ? JSON.parse(v) : v;
|
|
91
|
+
}
|
|
92
|
+
if (keyLocal !== keyRemote) {
|
|
93
|
+
delete value[keyRemote];
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return value;
|
|
97
|
+
},
|
|
98
|
+
save: (value) => {
|
|
99
|
+
keys.forEach((key) => {
|
|
100
|
+
const keyRemote = isObject(key) ? key.from : key;
|
|
101
|
+
const keyLocal = isObject(key) ? key.to : key;
|
|
102
|
+
const v = value[keyLocal];
|
|
103
|
+
if (!isNullOrUndefined(v) && !isString(v)) {
|
|
104
|
+
value[keyRemote] = JSON.stringify(v);
|
|
105
|
+
}
|
|
106
|
+
if (keyLocal !== keyRemote) {
|
|
107
|
+
delete value[keyLocal];
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
105
113
|
}
|
|
106
114
|
function transformStringifyDates(...args) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
115
|
+
return {
|
|
116
|
+
load: (value) => {
|
|
117
|
+
const keys = args.length > 0 ? args : Object.keys(value);
|
|
118
|
+
for (let i = 0; i < keys.length; i++) {
|
|
119
|
+
const key = keys[i];
|
|
120
|
+
const keyValue = value[key];
|
|
121
|
+
if (isString(keyValue) && keyValue.match(ISO8601)) {
|
|
122
|
+
value[key] = new Date(keyValue);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
},
|
|
127
|
+
save: (value) => {
|
|
128
|
+
const keys = args.length > 0 ? args : Object.keys(value);
|
|
129
|
+
for (let i = 0; i < keys.length; i++) {
|
|
130
|
+
const key = keys[i];
|
|
131
|
+
const keyValue = value[key];
|
|
132
|
+
if (isDate(keyValue)) {
|
|
133
|
+
value[key] = keyValue.toISOString();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
131
139
|
}
|
|
132
|
-
|
|
133
140
|
function syncObservableAdapter({ get, set }) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
});
|
|
147
|
-
params.onGet();
|
|
148
|
-
// eslint-disable-next-line no-empty
|
|
149
|
-
}
|
|
150
|
-
catch (_a) { }
|
|
141
|
+
const ret = {};
|
|
142
|
+
if (get) {
|
|
143
|
+
ret.get = async (params) => {
|
|
144
|
+
try {
|
|
145
|
+
let value = get(params);
|
|
146
|
+
if (isPromise(value)) {
|
|
147
|
+
value = await value;
|
|
148
|
+
}
|
|
149
|
+
params.onChange({
|
|
150
|
+
value,
|
|
151
|
+
lastSync: params.lastSync,
|
|
152
|
+
mode: params.mode
|
|
151
153
|
});
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
154
|
+
params.onGet();
|
|
155
|
+
} catch (e) {
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (set) {
|
|
160
|
+
ret.set = set;
|
|
161
|
+
}
|
|
162
|
+
return ret;
|
|
157
163
|
}
|
|
158
164
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
165
|
+
// src/sync/syncObservable.ts
|
|
166
|
+
var { createPreviousHandler, clone, getValueAtPath, globalState, symbolLinked, getNode, getNodeValue } = internal;
|
|
167
|
+
var mapSyncPlugins = /* @__PURE__ */ new WeakMap();
|
|
168
|
+
var metadatas = /* @__PURE__ */ new WeakMap();
|
|
169
|
+
var promisesLocalSaves = /* @__PURE__ */ new Set();
|
|
163
170
|
function parseLocalConfig(config) {
|
|
164
|
-
|
|
165
|
-
? isString(config)
|
|
166
|
-
? { table: config, config: { name: config } }
|
|
167
|
-
: { table: config.name, config }
|
|
168
|
-
: {};
|
|
171
|
+
return config ? isString(config) ? { table: config, config: { name: config } } : { table: config.name, config } : {};
|
|
169
172
|
}
|
|
170
173
|
function doInOrder(arg1, arg2) {
|
|
171
|
-
|
|
174
|
+
return isPromise(arg1) ? arg1.then(arg2) : arg2(arg1);
|
|
172
175
|
}
|
|
173
176
|
function onChangeRemote(cb) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
// apply to any side effects
|
|
181
|
-
globalState$1.isLoadingRemote = false;
|
|
182
|
-
endBatch(true);
|
|
177
|
+
endBatch(true);
|
|
178
|
+
globalState.isLoadingRemote = true;
|
|
179
|
+
beginBatch();
|
|
180
|
+
cb();
|
|
181
|
+
globalState.isLoadingRemote = false;
|
|
182
|
+
endBatch(true);
|
|
183
183
|
}
|
|
184
184
|
function transformSaveData(value, path, pathTypes, { transform }) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
185
|
+
if (transform == null ? void 0 : transform.save) {
|
|
186
|
+
const constructed = constructObjectWithPath(path, pathTypes, value);
|
|
187
|
+
const saved = transform.save(constructed);
|
|
188
|
+
value = deconstructObjectWithPath(path, pathTypes, saved);
|
|
189
|
+
}
|
|
190
|
+
return value;
|
|
191
191
|
}
|
|
192
192
|
function transformLoadData(value, { transform }, doUserTransform, method) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
193
|
+
if (doUserTransform && (transform == null ? void 0 : transform.load)) {
|
|
194
|
+
value = transform.load(value, method);
|
|
195
|
+
}
|
|
196
|
+
return value;
|
|
197
197
|
}
|
|
198
198
|
async function updateMetadataImmediate(value$, localState, syncState, syncOptions, newMetadata) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
lastSync: lastSync,
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
199
|
+
const saves = Array.from(promisesLocalSaves);
|
|
200
|
+
if (saves.length > 0) {
|
|
201
|
+
await Promise.all(saves);
|
|
202
|
+
}
|
|
203
|
+
const { pluginPersist } = localState;
|
|
204
|
+
const { table, config } = parseLocalConfig(syncOptions == null ? void 0 : syncOptions.persist);
|
|
205
|
+
const oldMetadata = metadatas.get(value$);
|
|
206
|
+
const { lastSync } = newMetadata;
|
|
207
|
+
const metadata = Object.assign({}, oldMetadata, newMetadata);
|
|
208
|
+
metadatas.set(value$, metadata);
|
|
209
|
+
if (pluginPersist) {
|
|
210
|
+
await pluginPersist.setMetadata(table, metadata, config);
|
|
211
|
+
}
|
|
212
|
+
if (lastSync) {
|
|
213
|
+
syncState.assign({
|
|
214
|
+
lastSync
|
|
215
|
+
});
|
|
216
|
+
}
|
|
221
217
|
}
|
|
222
218
|
function updateMetadata(value$, localState, syncState, syncOptions, newMetadata) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
219
|
+
if (localState.timeoutSaveMetadata) {
|
|
220
|
+
clearTimeout(localState.timeoutSaveMetadata);
|
|
221
|
+
}
|
|
222
|
+
localState.timeoutSaveMetadata = setTimeout(
|
|
223
|
+
() => updateMetadataImmediate(value$, localState, syncState, syncOptions, newMetadata),
|
|
224
|
+
0
|
|
225
|
+
);
|
|
227
226
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
227
|
+
var _queuedChanges = [];
|
|
228
|
+
var _queuedRemoteChanges = /* @__PURE__ */ new Map();
|
|
229
|
+
var _queuedRemoteChangesTimeouts = /* @__PURE__ */ new Map();
|
|
231
230
|
function mergeChanges(changes) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
changesByPath.set(pathStr, change);
|
|
250
|
-
changesOut.push(change);
|
|
251
|
-
}
|
|
231
|
+
const changesByPath = /* @__PURE__ */ new Map();
|
|
232
|
+
const changesOut = [];
|
|
233
|
+
for (let i = 0; i < changes.length; i++) {
|
|
234
|
+
const change = changes[i];
|
|
235
|
+
const pathStr = change.path.join("/");
|
|
236
|
+
const existing = changesByPath.get(pathStr);
|
|
237
|
+
if (existing) {
|
|
238
|
+
if (change.valueAtPath === existing.prevAtPath) {
|
|
239
|
+
changesOut.splice(changesOut.indexOf(change), 1);
|
|
240
|
+
} else {
|
|
241
|
+
existing.valueAtPath = change.valueAtPath;
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
changesByPath.set(pathStr, change);
|
|
245
|
+
changesOut.push(change);
|
|
252
246
|
}
|
|
253
|
-
|
|
247
|
+
}
|
|
248
|
+
return changesOut;
|
|
254
249
|
}
|
|
255
250
|
function mergeQueuedChanges(allChanges) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}
|
|
274
|
-
value.valuePrevious = previousByObs.get(obs);
|
|
275
|
-
targetMap.set(obs, value);
|
|
251
|
+
const changesByObsRemote = /* @__PURE__ */ new Map();
|
|
252
|
+
const changesByObsLocal = /* @__PURE__ */ new Map();
|
|
253
|
+
const previousByObs = /* @__PURE__ */ new Map();
|
|
254
|
+
const outRemote = /* @__PURE__ */ new Map();
|
|
255
|
+
const outLocal = /* @__PURE__ */ new Map();
|
|
256
|
+
for (let i = 0; i < allChanges.length; i++) {
|
|
257
|
+
const value = allChanges[i];
|
|
258
|
+
const { value$: obs, changes, inRemoteChange, getPrevious } = value;
|
|
259
|
+
const targetMap = inRemoteChange ? outRemote : outLocal;
|
|
260
|
+
const changesMap = inRemoteChange ? changesByObsRemote : changesByObsLocal;
|
|
261
|
+
const existing = changesMap.get(obs);
|
|
262
|
+
const newChanges = existing ? [...existing, ...changes] : changes;
|
|
263
|
+
const merged = mergeChanges(newChanges);
|
|
264
|
+
changesMap.set(obs, merged);
|
|
265
|
+
value.changes = merged;
|
|
266
|
+
if (!previousByObs.has(obs)) {
|
|
267
|
+
previousByObs.set(obs, getPrevious());
|
|
276
268
|
}
|
|
277
|
-
|
|
269
|
+
value.valuePrevious = previousByObs.get(obs);
|
|
270
|
+
targetMap.set(obs, value);
|
|
271
|
+
}
|
|
272
|
+
return Array.from(outRemote.values()).concat(Array.from(outLocal.values()));
|
|
278
273
|
}
|
|
279
274
|
async function processQueuedChanges() {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
_queuedRemoteChanges.get(change.syncOptions).push(change);
|
|
293
|
-
}
|
|
275
|
+
var _a, _b;
|
|
276
|
+
const queuedChanges = mergeQueuedChanges(_queuedChanges);
|
|
277
|
+
_queuedChanges = [];
|
|
278
|
+
const pendingSyncOptions = /* @__PURE__ */ new Set();
|
|
279
|
+
for (let i = 0; i < queuedChanges.length; i++) {
|
|
280
|
+
const change = queuedChanges[i];
|
|
281
|
+
if (!change.inRemoteChange) {
|
|
282
|
+
if (!_queuedRemoteChanges.has(change.syncOptions)) {
|
|
283
|
+
_queuedRemoteChanges.set(change.syncOptions, []);
|
|
284
|
+
}
|
|
285
|
+
pendingSyncOptions.add(change.syncOptions);
|
|
286
|
+
_queuedRemoteChanges.get(change.syncOptions).push(change);
|
|
294
287
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
await Promise.all(queuedChanges.map(prepChangeRemote));
|
|
311
|
-
await Promise.all(preppedChangesLocal.map(doChangeLocal));
|
|
312
|
-
for (const options of pendingSyncOptions) {
|
|
313
|
-
const timeout = (_a = options.debounceSet) !== null && _a !== void 0 ? _a : observableSyncConfiguration === null || observableSyncConfiguration === void 0 ? void 0 : observableSyncConfiguration.debounceSet;
|
|
314
|
-
const timeoutSaveRemote = _queuedRemoteChangesTimeouts.get(options);
|
|
315
|
-
const run = () => processQueuedRemoteChanges(options);
|
|
316
|
-
if (timeout) {
|
|
317
|
-
if (timeoutSaveRemote) {
|
|
318
|
-
clearTimeout(timeoutSaveRemote);
|
|
319
|
-
}
|
|
320
|
-
_queuedRemoteChangesTimeouts.set(options, setTimeout(run, timeout));
|
|
321
|
-
}
|
|
322
|
-
else {
|
|
323
|
-
run();
|
|
324
|
-
}
|
|
288
|
+
}
|
|
289
|
+
const preppedChangesLocal = await Promise.all(queuedChanges.map(prepChangeLocal));
|
|
290
|
+
await Promise.all(queuedChanges.map(prepChangeRemote));
|
|
291
|
+
await Promise.all(preppedChangesLocal.map(doChangeLocal));
|
|
292
|
+
for (const options of pendingSyncOptions) {
|
|
293
|
+
const timeout = (_b = options.debounceSet) != null ? _b : (_a = observableSyncConfiguration) == null ? void 0 : _a.debounceSet;
|
|
294
|
+
const timeoutSaveRemote = _queuedRemoteChangesTimeouts.get(options);
|
|
295
|
+
const run = () => processQueuedRemoteChanges(options);
|
|
296
|
+
if (timeout) {
|
|
297
|
+
if (timeoutSaveRemote) {
|
|
298
|
+
clearTimeout(timeoutSaveRemote);
|
|
299
|
+
}
|
|
300
|
+
_queuedRemoteChangesTimeouts.set(options, setTimeout(run, timeout));
|
|
301
|
+
} else {
|
|
302
|
+
run();
|
|
325
303
|
}
|
|
304
|
+
}
|
|
326
305
|
}
|
|
327
306
|
async function processQueuedRemoteChanges(syncOptions) {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
307
|
+
const arr = _queuedRemoteChanges.get(syncOptions);
|
|
308
|
+
if (arr == null ? void 0 : arr.length) {
|
|
309
|
+
const queuedRemoteChanges = mergeQueuedChanges(arr);
|
|
310
|
+
_queuedRemoteChanges.set(syncOptions, []);
|
|
311
|
+
const preppedChangesRemote = await Promise.all(queuedRemoteChanges.map(prepChangeRemote));
|
|
312
|
+
preppedChangesRemote.forEach(doChangeRemote);
|
|
313
|
+
}
|
|
335
314
|
}
|
|
336
315
|
async function prepChangeLocal(queuedChange) {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
// If there's any transform promises, wait for them before saving
|
|
391
|
-
promisesTransform = promisesTransform.filter(Boolean);
|
|
392
|
-
if (promisesTransform.length > 0) {
|
|
393
|
-
await Promise.all(promisesTransform);
|
|
394
|
-
}
|
|
395
|
-
return { queuedChange, changesLocal, saveRemote };
|
|
316
|
+
const { syncState, changes, localState, syncOptions, inRemoteChange, isApplyingPending } = queuedChange;
|
|
317
|
+
const persist = syncOptions.persist;
|
|
318
|
+
const { pluginSync } = localState;
|
|
319
|
+
const { config: configLocal } = parseLocalConfig(persist);
|
|
320
|
+
const configRemote = syncOptions;
|
|
321
|
+
const saveLocal = (persist == null ? void 0 : persist.name) && !configLocal.readonly && !isApplyingPending && syncState.isPersistEnabled.peek();
|
|
322
|
+
const saveRemote = !!(!inRemoteChange && (pluginSync == null ? void 0 : pluginSync.set) && (configRemote == null ? void 0 : configRemote.enableSync) !== false && syncState.isSyncEnabled.peek());
|
|
323
|
+
if (saveLocal || saveRemote) {
|
|
324
|
+
if (saveLocal && !syncState.isPersistLoaded.peek()) {
|
|
325
|
+
console.error(
|
|
326
|
+
"[legend-state] WARNING: An observable was changed before being loaded from persist",
|
|
327
|
+
persist
|
|
328
|
+
);
|
|
329
|
+
return void 0;
|
|
330
|
+
}
|
|
331
|
+
const changesLocal = [];
|
|
332
|
+
const changesPaths = /* @__PURE__ */ new Set();
|
|
333
|
+
let promisesTransform = [];
|
|
334
|
+
for (let i = changes.length - 1; i >= 0; i--) {
|
|
335
|
+
const { path } = changes[i];
|
|
336
|
+
let found = false;
|
|
337
|
+
if (changesPaths.size > 0) {
|
|
338
|
+
for (let u = 0; u < path.length; u++) {
|
|
339
|
+
if (changesPaths.has((u === path.length - 1 ? path : path.slice(0, u + 1)).join("/"))) {
|
|
340
|
+
found = true;
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (!found) {
|
|
346
|
+
const pathStr = path.join("/");
|
|
347
|
+
changesPaths.add(pathStr);
|
|
348
|
+
const { prevAtPath, valueAtPath, pathTypes } = changes[i];
|
|
349
|
+
if (saveLocal) {
|
|
350
|
+
const promiseTransformLocal = transformSaveData(
|
|
351
|
+
valueAtPath,
|
|
352
|
+
path,
|
|
353
|
+
pathTypes,
|
|
354
|
+
configLocal
|
|
355
|
+
);
|
|
356
|
+
promisesTransform.push(
|
|
357
|
+
doInOrder(promiseTransformLocal, (valueTransformed) => {
|
|
358
|
+
changesLocal.push({
|
|
359
|
+
path,
|
|
360
|
+
pathTypes,
|
|
361
|
+
prevAtPath,
|
|
362
|
+
valueAtPath: valueTransformed,
|
|
363
|
+
pathStr
|
|
364
|
+
});
|
|
365
|
+
})
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
396
369
|
}
|
|
370
|
+
promisesTransform = promisesTransform.filter(Boolean);
|
|
371
|
+
if (promisesTransform.length > 0) {
|
|
372
|
+
await Promise.all(promisesTransform);
|
|
373
|
+
}
|
|
374
|
+
return { queuedChange, changesLocal, saveRemote };
|
|
375
|
+
}
|
|
397
376
|
}
|
|
398
377
|
async function prepChangeRemote(queuedChange) {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
378
|
+
const {
|
|
379
|
+
syncState,
|
|
380
|
+
changes,
|
|
381
|
+
localState,
|
|
382
|
+
syncOptions,
|
|
383
|
+
inRemoteChange,
|
|
384
|
+
isApplyingPending,
|
|
385
|
+
valuePrevious
|
|
386
|
+
} = queuedChange;
|
|
387
|
+
const persist = syncOptions.persist;
|
|
388
|
+
const { pluginSync } = localState;
|
|
389
|
+
const { config: configLocal } = parseLocalConfig(persist);
|
|
390
|
+
const configRemote = syncOptions;
|
|
391
|
+
const saveLocal = persist && !configLocal.readonly && !isApplyingPending && syncState.isPersistEnabled.peek();
|
|
392
|
+
const saveRemote = !inRemoteChange && (pluginSync == null ? void 0 : pluginSync.set) && (configRemote == null ? void 0 : configRemote.enableSync) !== false && syncState.isSyncEnabled.peek();
|
|
393
|
+
if (saveLocal || saveRemote) {
|
|
394
|
+
if (saveLocal && !syncState.isPersistLoaded.peek()) {
|
|
395
|
+
console.error(
|
|
396
|
+
"[legend-state] WARNING: An observable was changed before being loaded from persist",
|
|
397
|
+
persist
|
|
398
|
+
);
|
|
399
|
+
return void 0;
|
|
400
|
+
}
|
|
401
|
+
const changesRemote = [];
|
|
402
|
+
const changesPaths = /* @__PURE__ */ new Set();
|
|
403
|
+
let promisesTransform = [];
|
|
404
|
+
for (let i = changes.length - 1; i >= 0; i--) {
|
|
405
|
+
const { path } = changes[i];
|
|
406
|
+
let found = false;
|
|
407
|
+
if (changesPaths.size > 0) {
|
|
408
|
+
for (let u = 0; u < path.length; u++) {
|
|
409
|
+
if (changesPaths.has((u === path.length - 1 ? path : path.slice(0, u + 1)).join("/"))) {
|
|
410
|
+
found = true;
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
if (!found) {
|
|
416
|
+
const pathStr = path.join("/");
|
|
417
|
+
changesPaths.add(pathStr);
|
|
418
|
+
const { prevAtPath, valueAtPath, pathTypes } = changes[i];
|
|
419
|
+
if (saveRemote) {
|
|
420
|
+
const promiseTransformRemote = transformSaveData(
|
|
421
|
+
valueAtPath,
|
|
422
|
+
path,
|
|
423
|
+
pathTypes,
|
|
424
|
+
configRemote || {}
|
|
425
|
+
);
|
|
426
|
+
promisesTransform.push(
|
|
427
|
+
doInOrder(promiseTransformRemote, (valueTransformed) => {
|
|
428
|
+
var _a;
|
|
429
|
+
if (!localState.pendingChanges) {
|
|
430
|
+
localState.pendingChanges = {};
|
|
431
|
+
}
|
|
432
|
+
let found2 = false;
|
|
433
|
+
for (let i2 = 0; !found2 && i2 < path.length - 1; i2++) {
|
|
434
|
+
const pathParent = path.slice(0, i2 + 1).join("/");
|
|
435
|
+
if ((_a = localState.pendingChanges[pathParent]) == null ? void 0 : _a.v) {
|
|
436
|
+
found2 = true;
|
|
437
|
+
const pathChild = path.slice(i2 + 1);
|
|
438
|
+
const pathTypesChild = pathTypes.slice(i2 + 1);
|
|
439
|
+
setAtPath(
|
|
440
|
+
localState.pendingChanges[pathParent].v,
|
|
441
|
+
pathChild,
|
|
442
|
+
pathTypesChild,
|
|
443
|
+
valueAtPath
|
|
444
|
+
);
|
|
428
445
|
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
const
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
const promiseTransformRemote = transformSaveData(valueAtPath, path, pathTypes, configRemote || {});
|
|
436
|
-
promisesTransform.push(doInOrder(promiseTransformRemote, (valueTransformed) => {
|
|
437
|
-
var _a;
|
|
438
|
-
// Prepare pending changes
|
|
439
|
-
if (!localState.pendingChanges) {
|
|
440
|
-
localState.pendingChanges = {};
|
|
441
|
-
}
|
|
442
|
-
// First look for existing pending changes at a higher level than this change
|
|
443
|
-
// If they exist then merge this change into it
|
|
444
|
-
let found = false;
|
|
445
|
-
for (let i = 0; !found && i < path.length - 1; i++) {
|
|
446
|
-
const pathParent = path.slice(0, i + 1).join('/');
|
|
447
|
-
if ((_a = localState.pendingChanges[pathParent]) === null || _a === void 0 ? void 0 : _a.v) {
|
|
448
|
-
found = true;
|
|
449
|
-
const pathChild = path.slice(i + 1);
|
|
450
|
-
const pathTypesChild = pathTypes.slice(i + 1);
|
|
451
|
-
setAtPath(localState.pendingChanges[pathParent].v, pathChild, pathTypesChild, valueAtPath);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
if (!found) {
|
|
455
|
-
// If an existing pending change is deeper than this change, just delete it
|
|
456
|
-
// in favor of this wider change
|
|
457
|
-
for (const key in localState.pendingChanges) {
|
|
458
|
-
if (key !== pathStr && key.startsWith(pathStr)) {
|
|
459
|
-
delete localState.pendingChanges[key];
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
// The "p" saved in pending should be the previous state before changes,
|
|
463
|
-
// so don't overwrite it if it already exists
|
|
464
|
-
if (!localState.pendingChanges[pathStr]) {
|
|
465
|
-
localState.pendingChanges[pathStr] = { p: prevAtPath !== null && prevAtPath !== void 0 ? prevAtPath : null, t: pathTypes };
|
|
466
|
-
}
|
|
467
|
-
// Pending value is the untransformed value because it gets loaded without transformment
|
|
468
|
-
// and forwarded through to onObsChange where it gets transformed before save
|
|
469
|
-
localState.pendingChanges[pathStr].v = valueAtPath;
|
|
470
|
-
}
|
|
471
|
-
// Prepare the remote change with the transformed path/value
|
|
472
|
-
changesRemote.push({
|
|
473
|
-
path,
|
|
474
|
-
pathTypes,
|
|
475
|
-
prevAtPath,
|
|
476
|
-
valueAtPath: valueTransformed,
|
|
477
|
-
pathStr,
|
|
478
|
-
valuePrevious,
|
|
479
|
-
});
|
|
480
|
-
}));
|
|
446
|
+
}
|
|
447
|
+
if (!found2) {
|
|
448
|
+
for (const key in localState.pendingChanges) {
|
|
449
|
+
if (key !== pathStr && key.startsWith(pathStr)) {
|
|
450
|
+
delete localState.pendingChanges[key];
|
|
451
|
+
}
|
|
481
452
|
}
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
453
|
+
if (!localState.pendingChanges[pathStr]) {
|
|
454
|
+
localState.pendingChanges[pathStr] = { p: prevAtPath != null ? prevAtPath : null, t: pathTypes };
|
|
455
|
+
}
|
|
456
|
+
localState.pendingChanges[pathStr].v = valueAtPath;
|
|
457
|
+
}
|
|
458
|
+
changesRemote.push({
|
|
459
|
+
path,
|
|
460
|
+
pathTypes,
|
|
461
|
+
prevAtPath,
|
|
462
|
+
valueAtPath: valueTransformed,
|
|
463
|
+
pathStr,
|
|
464
|
+
valuePrevious
|
|
465
|
+
});
|
|
466
|
+
})
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
490
470
|
}
|
|
471
|
+
promisesTransform = promisesTransform.filter(Boolean);
|
|
472
|
+
if (promisesTransform.length > 0) {
|
|
473
|
+
await Promise.all(promisesTransform);
|
|
474
|
+
}
|
|
475
|
+
return { queuedChange, changesRemote };
|
|
476
|
+
}
|
|
491
477
|
}
|
|
492
478
|
async function doChangeLocal(changeInfo) {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
});
|
|
515
|
-
// Keep track of local save promises so that updateMetadata runs only after everything is saved
|
|
516
|
-
promisesLocalSaves.add(promiseSet);
|
|
517
|
-
// await the local save before proceeding to save remotely
|
|
518
|
-
await promiseSet;
|
|
519
|
-
}
|
|
479
|
+
if (!changeInfo)
|
|
480
|
+
return;
|
|
481
|
+
const { queuedChange, changesLocal, saveRemote } = changeInfo;
|
|
482
|
+
const { value$: obs, syncState, localState, syncOptions } = queuedChange;
|
|
483
|
+
const { pluginPersist } = localState;
|
|
484
|
+
const persist = syncOptions.persist;
|
|
485
|
+
const { table, config: configLocal } = parseLocalConfig(persist);
|
|
486
|
+
const shouldSaveMetadata = persist == null ? void 0 : persist.retrySync;
|
|
487
|
+
if (saveRemote && shouldSaveMetadata) {
|
|
488
|
+
await updateMetadataImmediate(obs, localState, syncState, syncOptions, {
|
|
489
|
+
pending: localState.pendingChanges
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
if (changesLocal.length > 0) {
|
|
493
|
+
let promiseSet = pluginPersist.set(table, changesLocal, configLocal);
|
|
494
|
+
if (promiseSet) {
|
|
495
|
+
promiseSet = promiseSet.then(() => {
|
|
496
|
+
promisesLocalSaves.delete(promiseSet);
|
|
497
|
+
});
|
|
498
|
+
promisesLocalSaves.add(promiseSet);
|
|
499
|
+
await promiseSet;
|
|
520
500
|
}
|
|
501
|
+
}
|
|
521
502
|
}
|
|
522
503
|
async function doChangeRemote(changeInfo) {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
504
|
+
var _a, _b;
|
|
505
|
+
if (!changeInfo)
|
|
506
|
+
return;
|
|
507
|
+
const { queuedChange, changesRemote } = changeInfo;
|
|
508
|
+
const { value$: obs, syncState, localState, syncOptions, valuePrevious: previous } = queuedChange;
|
|
509
|
+
const { pluginPersist, pluginSync } = localState;
|
|
510
|
+
const persist = syncOptions.persist;
|
|
511
|
+
const { table, config: configLocal } = parseLocalConfig(persist);
|
|
512
|
+
const { allowSetIfGetError, onBeforeSet, onSetError, waitForSet, onAfterSet } = syncOptions || {};
|
|
513
|
+
const shouldSaveMetadata = persist == null ? void 0 : persist.retrySync;
|
|
514
|
+
if (changesRemote.length > 0) {
|
|
515
|
+
await when(() => syncState.isLoaded.get() || allowSetIfGetError && syncState.error.get());
|
|
516
|
+
if (waitForSet) {
|
|
517
|
+
const waitFor = isFunction(waitForSet) ? waitForSet({ changes: changesRemote, value: obs.peek() }) : waitForSet;
|
|
518
|
+
if (waitFor) {
|
|
519
|
+
await when(waitFor);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
let value = obs.peek();
|
|
523
|
+
const transformSave = (_a = syncOptions == null ? void 0 : syncOptions.transform) == null ? void 0 : _a.save;
|
|
524
|
+
if (transformSave) {
|
|
525
|
+
value = transformSave(clone(value));
|
|
526
|
+
}
|
|
527
|
+
onBeforeSet == null ? void 0 : onBeforeSet();
|
|
528
|
+
localState.numSavesOutstanding = (localState.numSavesOutstanding || 0) + 1;
|
|
529
|
+
let savedPromise = pluginSync.set({
|
|
530
|
+
value$: obs,
|
|
531
|
+
syncState,
|
|
532
|
+
options: syncOptions,
|
|
533
|
+
changes: changesRemote,
|
|
534
|
+
value,
|
|
535
|
+
valuePrevious: previous
|
|
536
|
+
});
|
|
537
|
+
if (isPromise(savedPromise)) {
|
|
538
|
+
savedPromise = savedPromise.catch((err) => onSetError == null ? void 0 : onSetError(err));
|
|
539
|
+
}
|
|
540
|
+
const saved = await savedPromise;
|
|
541
|
+
localState.numSavesOutstanding--;
|
|
542
|
+
if (saved !== void 0) {
|
|
543
|
+
const pathStrs = Array.from(new Set(changesRemote.map((change) => change.pathStr)));
|
|
544
|
+
const { changes, lastSync } = saved;
|
|
545
|
+
if (pathStrs.length > 0) {
|
|
546
|
+
let transformedChanges = void 0;
|
|
547
|
+
const metadata = {};
|
|
548
|
+
if (persist) {
|
|
549
|
+
const pendingMetadata = (_b = pluginPersist.getMetadata(table, configLocal)) == null ? void 0 : _b.pending;
|
|
550
|
+
const pending = localState.pendingChanges;
|
|
551
|
+
for (let i = 0; i < pathStrs.length; i++) {
|
|
552
|
+
const pathStr = pathStrs[i];
|
|
553
|
+
if (pendingMetadata == null ? void 0 : pendingMetadata[pathStr]) {
|
|
554
|
+
delete pendingMetadata[pathStr];
|
|
555
|
+
metadata.pending = pendingMetadata;
|
|
542
556
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
const transformSave = (_a = syncOptions === null || syncOptions === void 0 ? void 0 : syncOptions.transform) === null || _a === void 0 ? void 0 : _a.save;
|
|
546
|
-
if (transformSave) {
|
|
547
|
-
// Clone value before transforming to ensure it doesn't change observable value
|
|
548
|
-
value = transformSave(clone(value));
|
|
549
|
-
}
|
|
550
|
-
onBeforeSet === null || onBeforeSet === void 0 ? void 0 : onBeforeSet();
|
|
551
|
-
localState.numSavesOutstanding = (localState.numSavesOutstanding || 0) + 1;
|
|
552
|
-
let savedPromise = pluginSync.set({
|
|
553
|
-
value$: obs,
|
|
554
|
-
syncState: syncState,
|
|
555
|
-
options: syncOptions,
|
|
556
|
-
changes: changesRemote,
|
|
557
|
-
value,
|
|
558
|
-
valuePrevious: previous,
|
|
559
|
-
});
|
|
560
|
-
if (isPromise(savedPromise)) {
|
|
561
|
-
savedPromise = savedPromise.catch((err) => onSetError === null || onSetError === void 0 ? void 0 : onSetError(err));
|
|
562
|
-
}
|
|
563
|
-
const saved = await savedPromise;
|
|
564
|
-
localState.numSavesOutstanding--;
|
|
565
|
-
// If this remote save changed anything then update cache and metadata
|
|
566
|
-
// Because save happens after a timeout and they're batched together, some calls to save will
|
|
567
|
-
// return saved data and others won't, so those can be ignored.
|
|
568
|
-
if (saved !== undefined) {
|
|
569
|
-
const pathStrs = Array.from(new Set(changesRemote.map((change) => change.pathStr)));
|
|
570
|
-
const { changes, lastSync } = saved;
|
|
571
|
-
if (pathStrs.length > 0) {
|
|
572
|
-
let transformedChanges = undefined;
|
|
573
|
-
const metadata = {};
|
|
574
|
-
if (persist) {
|
|
575
|
-
const pendingMetadata = (_b = pluginPersist.getMetadata(table, configLocal)) === null || _b === void 0 ? void 0 : _b.pending;
|
|
576
|
-
const pending = localState.pendingChanges;
|
|
577
|
-
for (let i = 0; i < pathStrs.length; i++) {
|
|
578
|
-
const pathStr = pathStrs[i];
|
|
579
|
-
// Clear pending for this path
|
|
580
|
-
if (pendingMetadata === null || pendingMetadata === void 0 ? void 0 : pendingMetadata[pathStr]) {
|
|
581
|
-
// Remove pending from persisted medata state
|
|
582
|
-
delete pendingMetadata[pathStr];
|
|
583
|
-
metadata.pending = pendingMetadata;
|
|
584
|
-
}
|
|
585
|
-
// Clear pending for this path if not already removed by above
|
|
586
|
-
// pendingMetadata === pending sometimes
|
|
587
|
-
if (pending === null || pending === void 0 ? void 0 : pending[pathStr]) {
|
|
588
|
-
// Remove pending from local state
|
|
589
|
-
delete pending[pathStr];
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
if (lastSync) {
|
|
593
|
-
metadata.lastSync = lastSync;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
// Remote can optionally have data that needs to be merged back into the observable,
|
|
597
|
-
// for example Firebase may update dateModified with the server timestamp
|
|
598
|
-
if (changes && !isEmpty(changes)) {
|
|
599
|
-
transformedChanges = transformLoadData(changes, syncOptions, false, 'set');
|
|
600
|
-
}
|
|
601
|
-
if (localState.numSavesOutstanding > 0) {
|
|
602
|
-
if (transformedChanges) {
|
|
603
|
-
if (!localState.pendingSaveResults) {
|
|
604
|
-
localState.pendingSaveResults = [];
|
|
605
|
-
}
|
|
606
|
-
localState.pendingSaveResults.push(transformedChanges);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
else {
|
|
610
|
-
let allChanges = [...(localState.pendingSaveResults || []), transformedChanges].filter((v) => v !== undefined);
|
|
611
|
-
if (allChanges.length > 0) {
|
|
612
|
-
if (allChanges.some((change) => isPromise(change))) {
|
|
613
|
-
allChanges = await Promise.all(allChanges);
|
|
614
|
-
}
|
|
615
|
-
onChangeRemote(() => mergeIntoObservable(obs, ...allChanges));
|
|
616
|
-
}
|
|
617
|
-
if (persist) {
|
|
618
|
-
if (shouldSaveMetadata && !isEmpty(metadata)) {
|
|
619
|
-
updateMetadata(obs, localState, syncState, syncOptions, metadata);
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
localState.pendingSaveResults = [];
|
|
623
|
-
}
|
|
624
|
-
onAfterSet === null || onAfterSet === void 0 ? void 0 : onAfterSet();
|
|
557
|
+
if (pending == null ? void 0 : pending[pathStr]) {
|
|
558
|
+
delete pending[pathStr];
|
|
625
559
|
}
|
|
560
|
+
}
|
|
561
|
+
if (lastSync) {
|
|
562
|
+
metadata.lastSync = lastSync;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
if (changes && !isEmpty(changes)) {
|
|
566
|
+
transformedChanges = transformLoadData(changes, syncOptions, false, "set");
|
|
567
|
+
}
|
|
568
|
+
if (localState.numSavesOutstanding > 0) {
|
|
569
|
+
if (transformedChanges) {
|
|
570
|
+
if (!localState.pendingSaveResults) {
|
|
571
|
+
localState.pendingSaveResults = [];
|
|
572
|
+
}
|
|
573
|
+
localState.pendingSaveResults.push(transformedChanges);
|
|
574
|
+
}
|
|
575
|
+
} else {
|
|
576
|
+
let allChanges = [...localState.pendingSaveResults || [], transformedChanges].filter(
|
|
577
|
+
(v) => v !== void 0
|
|
578
|
+
);
|
|
579
|
+
if (allChanges.length > 0) {
|
|
580
|
+
if (allChanges.some((change) => isPromise(change))) {
|
|
581
|
+
allChanges = await Promise.all(allChanges);
|
|
582
|
+
}
|
|
583
|
+
onChangeRemote(() => mergeIntoObservable(obs, ...allChanges));
|
|
584
|
+
}
|
|
585
|
+
if (persist) {
|
|
586
|
+
if (shouldSaveMetadata && !isEmpty(metadata)) {
|
|
587
|
+
updateMetadata(obs, localState, syncState, syncOptions, metadata);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
localState.pendingSaveResults = [];
|
|
626
591
|
}
|
|
592
|
+
onAfterSet == null ? void 0 : onAfterSet();
|
|
593
|
+
}
|
|
627
594
|
}
|
|
595
|
+
}
|
|
628
596
|
}
|
|
629
597
|
function onObsChange(value$, syncState, localState, syncOptions, { changes, loading, remote, getPrevious }) {
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
queueMicrotask(processQueuedChanges);
|
|
646
|
-
}
|
|
598
|
+
if (!loading) {
|
|
599
|
+
const inRemoteChange = remote;
|
|
600
|
+
const isApplyingPending = localState.isApplyingPending;
|
|
601
|
+
_queuedChanges.push({
|
|
602
|
+
value$,
|
|
603
|
+
syncState,
|
|
604
|
+
localState,
|
|
605
|
+
syncOptions,
|
|
606
|
+
changes,
|
|
607
|
+
inRemoteChange,
|
|
608
|
+
isApplyingPending,
|
|
609
|
+
getPrevious
|
|
610
|
+
});
|
|
611
|
+
if (_queuedChanges.length === 1) {
|
|
612
|
+
queueMicrotask(processQueuedChanges);
|
|
647
613
|
}
|
|
614
|
+
}
|
|
648
615
|
}
|
|
649
616
|
async function loadLocal(value$, syncOptions, syncState, localState) {
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
await promise;
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
// Get current value for init
|
|
686
|
-
const prevValue = getNodeValue$1(node);
|
|
687
|
-
// Get the value from state
|
|
688
|
-
let value = persistPlugin.getTable(table, prevValue, config);
|
|
689
|
-
const metadata = persistPlugin.getMetadata(table, config);
|
|
690
|
-
if (metadata) {
|
|
691
|
-
metadatas.set(value$, metadata);
|
|
692
|
-
localState.pendingChanges = metadata.pending;
|
|
693
|
-
syncState.assign({
|
|
694
|
-
lastSync: metadata.lastSync,
|
|
695
|
-
});
|
|
696
|
-
}
|
|
697
|
-
// Merge the data from local cache into the default state
|
|
698
|
-
if (value !== undefined) {
|
|
699
|
-
const { transform } = config;
|
|
700
|
-
value = transformLoadData(value, { transform }, true, 'get');
|
|
701
|
-
if (isPromise(value)) {
|
|
702
|
-
value = await value;
|
|
703
|
-
}
|
|
704
|
-
// isLoadingLocal prevents saving remotely when two different caches
|
|
705
|
-
// are set on the same observable
|
|
706
|
-
internal$1.globalState.isLoadingLocal = true;
|
|
707
|
-
// We want to merge the local data on top of any initial state the object is created with
|
|
708
|
-
if (value === null && (!prevValue || prevValue[symbolLinked$1])) {
|
|
709
|
-
value$.set(value);
|
|
710
|
-
}
|
|
711
|
-
else {
|
|
712
|
-
mergeIntoObservable(value$, value);
|
|
713
|
-
}
|
|
714
|
-
internal$1.globalState.isLoadingLocal = false;
|
|
715
|
-
}
|
|
716
|
-
getNodeValue$1(getNode(node.state)).clearPersist = () => Promise.all([
|
|
717
|
-
persistPlugin.deleteTable(table, config),
|
|
718
|
-
persistPlugin.deleteMetadata(table, config),
|
|
719
|
-
]);
|
|
617
|
+
var _a, _b, _c;
|
|
618
|
+
const { persist } = syncOptions;
|
|
619
|
+
if (persist) {
|
|
620
|
+
const PersistPlugin = persist.plugin || ((_a = observableSyncConfiguration.persist) == null ? void 0 : _a.plugin);
|
|
621
|
+
const { table, config } = parseLocalConfig(persist);
|
|
622
|
+
const node = getNode(value$);
|
|
623
|
+
if (!PersistPlugin) {
|
|
624
|
+
throw new Error("Local persist is not configured");
|
|
625
|
+
}
|
|
626
|
+
if (!mapSyncPlugins.has(PersistPlugin)) {
|
|
627
|
+
const persistPlugin2 = new PersistPlugin();
|
|
628
|
+
const mapValue = { plugin: persistPlugin2, initialized: observable(false) };
|
|
629
|
+
mapSyncPlugins.set(PersistPlugin, mapValue);
|
|
630
|
+
if (persistPlugin2.initialize) {
|
|
631
|
+
const initializePromise = (_c = persistPlugin2.initialize) == null ? void 0 : _c.call(persistPlugin2, ((_b = observableSyncConfiguration) == null ? void 0 : _b.persist) || {});
|
|
632
|
+
if (isPromise(initializePromise)) {
|
|
633
|
+
await initializePromise;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
mapValue.initialized.set(true);
|
|
637
|
+
}
|
|
638
|
+
const { plugin, initialized: initialized$ } = mapSyncPlugins.get(PersistPlugin);
|
|
639
|
+
const persistPlugin = plugin;
|
|
640
|
+
localState.pluginPersist = persistPlugin;
|
|
641
|
+
if (!initialized$.peek()) {
|
|
642
|
+
await when(initialized$);
|
|
643
|
+
}
|
|
644
|
+
if (persistPlugin.loadTable) {
|
|
645
|
+
const promise = persistPlugin.loadTable(table, config);
|
|
646
|
+
if (promise) {
|
|
647
|
+
await promise;
|
|
648
|
+
}
|
|
720
649
|
}
|
|
721
|
-
|
|
650
|
+
const prevValue = getNodeValue(node);
|
|
651
|
+
let value = persistPlugin.getTable(table, prevValue, config);
|
|
652
|
+
const metadata = persistPlugin.getMetadata(table, config);
|
|
653
|
+
if (metadata) {
|
|
654
|
+
metadatas.set(value$, metadata);
|
|
655
|
+
localState.pendingChanges = metadata.pending;
|
|
656
|
+
syncState.assign({
|
|
657
|
+
lastSync: metadata.lastSync
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
if (value !== void 0) {
|
|
661
|
+
const { transform } = config;
|
|
662
|
+
value = transformLoadData(value, { transform }, true, "get");
|
|
663
|
+
if (isPromise(value)) {
|
|
664
|
+
value = await value;
|
|
665
|
+
}
|
|
666
|
+
internal.globalState.isLoadingLocal = true;
|
|
667
|
+
if (value === null && (!prevValue || prevValue[symbolLinked])) {
|
|
668
|
+
value$.set(value);
|
|
669
|
+
} else {
|
|
670
|
+
mergeIntoObservable(value$, value);
|
|
671
|
+
}
|
|
672
|
+
internal.globalState.isLoadingLocal = false;
|
|
673
|
+
}
|
|
674
|
+
getNodeValue(getNode(node.state)).clearPersist = () => Promise.all([
|
|
675
|
+
persistPlugin.deleteTable(table, config),
|
|
676
|
+
persistPlugin.deleteMetadata(table, config)
|
|
677
|
+
]);
|
|
678
|
+
}
|
|
679
|
+
syncState.isPersistLoaded.set(true);
|
|
722
680
|
}
|
|
723
681
|
function syncObservable(obs$, syncOptionsOrSynced) {
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
});
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
onChangeRemote(() => {
|
|
816
|
-
if (mode === 'assign' && isObject(value)) {
|
|
817
|
-
obs$.assign(value);
|
|
818
|
-
}
|
|
819
|
-
else if (mode === 'append' && isArray(value)) {
|
|
820
|
-
obs$.push(...value);
|
|
821
|
-
}
|
|
822
|
-
else if (mode === 'prepend' && isArray(value)) {
|
|
823
|
-
obs$.splice(0, 0, ...value);
|
|
824
|
-
}
|
|
825
|
-
else if (mode === 'merge') {
|
|
826
|
-
mergeIntoObservable(obs$, value);
|
|
827
|
-
}
|
|
828
|
-
else {
|
|
829
|
-
obs$.set(value);
|
|
830
|
-
}
|
|
831
|
-
});
|
|
832
|
-
}
|
|
833
|
-
if (lastSync && syncOptions.persist) {
|
|
834
|
-
updateMetadata(obs$, localState, syncState, syncOptions, {
|
|
835
|
-
lastSync,
|
|
836
|
-
});
|
|
682
|
+
let syncOptions = syncOptionsOrSynced;
|
|
683
|
+
if (isFunction(syncOptions)) {
|
|
684
|
+
syncOptions = syncOptions()[symbolLinked];
|
|
685
|
+
}
|
|
686
|
+
const node = getNode(obs$);
|
|
687
|
+
if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && (!obs$ || !node)) {
|
|
688
|
+
throw new Error("[legend-state] syncObservable called with undefined observable");
|
|
689
|
+
}
|
|
690
|
+
syncOptions = mergeIntoObservable(
|
|
691
|
+
{
|
|
692
|
+
syncMode: "auto"
|
|
693
|
+
},
|
|
694
|
+
observableSyncConfiguration,
|
|
695
|
+
removeNullUndefined(syncOptions || {})
|
|
696
|
+
);
|
|
697
|
+
const localState = {};
|
|
698
|
+
let sync;
|
|
699
|
+
const syncState = node.state = observable({
|
|
700
|
+
isPersistLoaded: false,
|
|
701
|
+
isLoaded: !syncOptions.get,
|
|
702
|
+
isPersistEnabled: true,
|
|
703
|
+
isSyncEnabled: true,
|
|
704
|
+
clearPersist: void 0,
|
|
705
|
+
sync: () => Promise.resolve(),
|
|
706
|
+
getPendingChanges: () => localState.pendingChanges
|
|
707
|
+
});
|
|
708
|
+
loadLocal(obs$, syncOptions, syncState, localState);
|
|
709
|
+
localState.pluginSync = syncObservableAdapter(syncOptions);
|
|
710
|
+
if (syncOptions.get) {
|
|
711
|
+
let isSynced = false;
|
|
712
|
+
let isSubscribed = false;
|
|
713
|
+
let unsubscribe = void 0;
|
|
714
|
+
sync = async () => {
|
|
715
|
+
var _a, _b;
|
|
716
|
+
if (isSynced && shouldIgnoreUnobserved(node, sync)) {
|
|
717
|
+
if (unsubscribe) {
|
|
718
|
+
isSubscribed = false;
|
|
719
|
+
unsubscribe();
|
|
720
|
+
unsubscribe = void 0;
|
|
721
|
+
}
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
724
|
+
const lastSync = (_a = metadatas.get(obs$)) == null ? void 0 : _a.lastSync;
|
|
725
|
+
const pending = localState.pendingChanges;
|
|
726
|
+
const get = (_b = localState.pluginSync.get) == null ? void 0 : _b.bind(localState.pluginSync);
|
|
727
|
+
if (get) {
|
|
728
|
+
const runGet = () => {
|
|
729
|
+
const onChange = async ({ value, mode, lastSync: lastSync2 }) => {
|
|
730
|
+
mode = mode || syncOptions.mode || "set";
|
|
731
|
+
if (value !== void 0) {
|
|
732
|
+
value = transformLoadData(value, syncOptions, true, "get");
|
|
733
|
+
if (isPromise(value)) {
|
|
734
|
+
value = await value;
|
|
735
|
+
}
|
|
736
|
+
const pending2 = localState.pendingChanges;
|
|
737
|
+
const currentValue = obs$.peek();
|
|
738
|
+
if (pending2) {
|
|
739
|
+
let didChangeMetadata = false;
|
|
740
|
+
Object.keys(pending2).forEach((key) => {
|
|
741
|
+
const p = key.split("/").filter((p2) => p2 !== "");
|
|
742
|
+
const { v, t } = pending2[key];
|
|
743
|
+
if (t.length === 0 || !value) {
|
|
744
|
+
if (isObject(value) && isObject(v)) {
|
|
745
|
+
Object.assign(value, v);
|
|
746
|
+
} else {
|
|
747
|
+
value = v;
|
|
748
|
+
}
|
|
749
|
+
} else if (value[p[0]] !== void 0) {
|
|
750
|
+
const curValue = getValueAtPath(currentValue, p);
|
|
751
|
+
const newValue = getValueAtPath(value, p);
|
|
752
|
+
if (JSON.stringify(curValue) === JSON.stringify(newValue)) {
|
|
753
|
+
delete pending2[key];
|
|
754
|
+
didChangeMetadata = true;
|
|
755
|
+
} else {
|
|
756
|
+
value = setAtPath(
|
|
757
|
+
value,
|
|
758
|
+
p,
|
|
759
|
+
t,
|
|
760
|
+
v,
|
|
761
|
+
"merge",
|
|
762
|
+
obs$.peek(),
|
|
763
|
+
(path, value2) => {
|
|
764
|
+
delete pending2[key];
|
|
765
|
+
pending2[path.join("/")] = {
|
|
766
|
+
p: null,
|
|
767
|
+
v: value2,
|
|
768
|
+
t: t.slice(0, path.length)
|
|
769
|
+
};
|
|
837
770
|
}
|
|
838
|
-
|
|
839
|
-
get({
|
|
840
|
-
state: syncState,
|
|
841
|
-
value$: obs$,
|
|
842
|
-
options: syncOptions,
|
|
843
|
-
lastSync,
|
|
844
|
-
dateModified: lastSync,
|
|
845
|
-
onError: (error) => {
|
|
846
|
-
var _a;
|
|
847
|
-
(_a = syncOptions.onGetError) === null || _a === void 0 ? void 0 : _a.call(syncOptions, error);
|
|
848
|
-
},
|
|
849
|
-
onGet: () => {
|
|
850
|
-
node.state.assign({
|
|
851
|
-
isLoaded: true,
|
|
852
|
-
error: undefined,
|
|
853
|
-
});
|
|
854
|
-
},
|
|
855
|
-
onChange,
|
|
856
|
-
});
|
|
857
|
-
if (!isSubscribed && syncOptions.subscribe) {
|
|
858
|
-
isSubscribed = true;
|
|
859
|
-
unsubscribe = syncOptions.subscribe({
|
|
860
|
-
node,
|
|
861
|
-
value$: obs$,
|
|
862
|
-
update: (params) => {
|
|
863
|
-
when(node.state.isLoaded, () => {
|
|
864
|
-
params.mode || (params.mode = syncOptions.mode || 'merge');
|
|
865
|
-
onChange(params);
|
|
866
|
-
});
|
|
867
|
-
},
|
|
868
|
-
refresh: () => when(node.state.isLoaded, sync),
|
|
869
|
-
});
|
|
771
|
+
);
|
|
870
772
|
}
|
|
871
|
-
|
|
872
|
-
runGet();
|
|
873
|
-
}
|
|
874
|
-
else {
|
|
875
|
-
node.state.assign({
|
|
876
|
-
isLoaded: true,
|
|
877
|
-
error: undefined,
|
|
773
|
+
}
|
|
878
774
|
});
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
const value = getNodeValue$1(node);
|
|
897
|
-
onObsChange(obs$, syncState, localState, syncOptions, {
|
|
898
|
-
value,
|
|
899
|
-
loading: false,
|
|
900
|
-
remote: false,
|
|
901
|
-
getPrevious: createPreviousHandler(value, changes),
|
|
902
|
-
changes,
|
|
903
|
-
});
|
|
904
|
-
localState.isApplyingPending = false;
|
|
775
|
+
if (didChangeMetadata) {
|
|
776
|
+
updateMetadata(obs$, localState, syncState, syncOptions, {
|
|
777
|
+
pending: pending2
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
onChangeRemote(() => {
|
|
782
|
+
if (mode === "assign" && isObject(value)) {
|
|
783
|
+
obs$.assign(value);
|
|
784
|
+
} else if (mode === "append" && isArray(value)) {
|
|
785
|
+
obs$.push(...value);
|
|
786
|
+
} else if (mode === "prepend" && isArray(value)) {
|
|
787
|
+
obs$.splice(0, 0, ...value);
|
|
788
|
+
} else if (mode === "merge") {
|
|
789
|
+
mergeIntoObservable(obs$, value);
|
|
790
|
+
} else {
|
|
791
|
+
obs$.set(value);
|
|
905
792
|
}
|
|
793
|
+
});
|
|
906
794
|
}
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
const onAllPersistLoaded = () => {
|
|
912
|
-
var _a, _b;
|
|
913
|
-
let parentNode = node;
|
|
914
|
-
while (parentNode) {
|
|
915
|
-
if (((_b = (_a = parentNode.state) === null || _a === void 0 ? void 0 : _a.isPersistLoaded) === null || _b === void 0 ? void 0 : _b.get()) === false) {
|
|
916
|
-
return false;
|
|
795
|
+
if (lastSync2 && syncOptions.persist) {
|
|
796
|
+
updateMetadata(obs$, localState, syncState, syncOptions, {
|
|
797
|
+
lastSync: lastSync2
|
|
798
|
+
});
|
|
917
799
|
}
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
800
|
+
};
|
|
801
|
+
get({
|
|
802
|
+
state: syncState,
|
|
803
|
+
value$: obs$,
|
|
804
|
+
options: syncOptions,
|
|
805
|
+
lastSync,
|
|
806
|
+
dateModified: lastSync,
|
|
807
|
+
onError: (error) => {
|
|
808
|
+
var _a2;
|
|
809
|
+
(_a2 = syncOptions.onGetError) == null ? void 0 : _a2.call(syncOptions, error);
|
|
810
|
+
},
|
|
811
|
+
onGet: () => {
|
|
812
|
+
node.state.assign({
|
|
813
|
+
isLoaded: true,
|
|
814
|
+
error: void 0
|
|
815
|
+
});
|
|
816
|
+
},
|
|
817
|
+
onChange
|
|
818
|
+
});
|
|
819
|
+
if (!isSubscribed && syncOptions.subscribe) {
|
|
820
|
+
isSubscribed = true;
|
|
821
|
+
unsubscribe = syncOptions.subscribe({
|
|
822
|
+
node,
|
|
823
|
+
value$: obs$,
|
|
824
|
+
update: (params) => {
|
|
825
|
+
when(node.state.isLoaded, () => {
|
|
826
|
+
params.mode || (params.mode = syncOptions.mode || "merge");
|
|
827
|
+
onChange(params);
|
|
828
|
+
});
|
|
829
|
+
},
|
|
830
|
+
refresh: () => when(node.state.isLoaded, sync)
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
};
|
|
834
|
+
runGet();
|
|
835
|
+
} else {
|
|
836
|
+
node.state.assign({
|
|
837
|
+
isLoaded: true,
|
|
838
|
+
error: void 0
|
|
839
|
+
});
|
|
840
|
+
}
|
|
841
|
+
if (!isSynced) {
|
|
842
|
+
isSynced = true;
|
|
843
|
+
await when(() => syncState.isLoaded.get() || syncOptions.allowSetIfGetError && syncState.error.get());
|
|
844
|
+
if (pending && !isEmpty(pending)) {
|
|
845
|
+
localState.isApplyingPending = true;
|
|
846
|
+
const keys = Object.keys(pending);
|
|
847
|
+
const changes = [];
|
|
848
|
+
for (let i = 0; i < keys.length; i++) {
|
|
849
|
+
const key = keys[i];
|
|
850
|
+
const path = key.split("/").filter((p2) => p2 !== "");
|
|
851
|
+
const { p, v, t } = pending[key];
|
|
852
|
+
changes.push({ path, valueAtPath: v, prevAtPath: p, pathTypes: t });
|
|
853
|
+
}
|
|
854
|
+
const value = getNodeValue(node);
|
|
855
|
+
onObsChange(obs$, syncState, localState, syncOptions, {
|
|
856
|
+
value,
|
|
857
|
+
loading: false,
|
|
858
|
+
remote: false,
|
|
859
|
+
getPrevious: createPreviousHandler(value, changes),
|
|
860
|
+
changes
|
|
861
|
+
});
|
|
862
|
+
localState.isApplyingPending = false;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
921
865
|
};
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
866
|
+
syncState.assign({ sync });
|
|
867
|
+
}
|
|
868
|
+
const onAllPersistLoaded = () => {
|
|
869
|
+
var _a, _b;
|
|
870
|
+
let parentNode = node;
|
|
871
|
+
while (parentNode) {
|
|
872
|
+
if (((_b = (_a = parentNode.state) == null ? void 0 : _a.isPersistLoaded) == null ? void 0 : _b.get()) === false) {
|
|
873
|
+
return false;
|
|
874
|
+
}
|
|
875
|
+
parentNode = parentNode.parent;
|
|
876
|
+
}
|
|
877
|
+
return true;
|
|
878
|
+
};
|
|
879
|
+
when(onAllPersistLoaded, function() {
|
|
880
|
+
if (syncOptions.get && syncOptions.syncMode === "auto") {
|
|
881
|
+
sync();
|
|
882
|
+
}
|
|
883
|
+
if ((syncOptions == null ? void 0 : syncOptions.set) || (syncOptions == null ? void 0 : syncOptions.persist)) {
|
|
884
|
+
obs$.onChange(
|
|
885
|
+
onObsChange.bind(this, obs$, syncState, localState, syncOptions)
|
|
886
|
+
);
|
|
887
|
+
}
|
|
888
|
+
});
|
|
889
|
+
return syncState;
|
|
933
890
|
}
|
|
934
|
-
|
|
935
|
-
const { getProxy, globalState, runWithRetry, symbolLinked, setNodeValue, getNodeValue } = internal$1;
|
|
891
|
+
var { getProxy, globalState: globalState2, runWithRetry, symbolLinked: symbolLinked2, setNodeValue, getNodeValue: getNodeValue2 } = internal;
|
|
936
892
|
function enableActivateSyncedNode() {
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
updateLastSync,
|
|
960
|
-
mode: params.mode,
|
|
961
|
-
refresh,
|
|
962
|
-
};
|
|
963
|
-
const ret = get(paramsToGet);
|
|
964
|
-
params.mode = paramsToGet.mode;
|
|
965
|
-
return ret;
|
|
966
|
-
});
|
|
967
|
-
promiseReturn = value;
|
|
968
|
-
return value;
|
|
969
|
-
};
|
|
970
|
-
}
|
|
971
|
-
if (set) {
|
|
972
|
-
// TODO: Work out these types better
|
|
973
|
-
pluginRemote.set = async (params) => {
|
|
974
|
-
var _a, _b;
|
|
975
|
-
if ((_a = node.state) === null || _a === void 0 ? void 0 : _a.isLoaded.get()) {
|
|
976
|
-
const retryAttempts = { attemptNum: 0, retry: retry || ((_b = params.options) === null || _b === void 0 ? void 0 : _b.retry) };
|
|
977
|
-
return runWithRetry(node, retryAttempts, async (retryEvent) => {
|
|
978
|
-
let changes = {};
|
|
979
|
-
let maxModified = 0;
|
|
980
|
-
if (!node.state.isLoaded.peek()) {
|
|
981
|
-
await whenReady(node.state.isLoaded);
|
|
982
|
-
}
|
|
983
|
-
const cancelRetry = () => {
|
|
984
|
-
retryEvent.cancel = true;
|
|
985
|
-
};
|
|
986
|
-
await set({
|
|
987
|
-
...params,
|
|
988
|
-
node,
|
|
989
|
-
update: (params) => {
|
|
990
|
-
const { value, lastSync } = params;
|
|
991
|
-
maxModified = Math.max(lastSync || 0, maxModified);
|
|
992
|
-
changes = mergeIntoObservable(changes, value);
|
|
993
|
-
},
|
|
994
|
-
retryNum: retryAttempts.attemptNum,
|
|
995
|
-
cancelRetry,
|
|
996
|
-
refresh,
|
|
997
|
-
fromSubscribe: false,
|
|
998
|
-
});
|
|
999
|
-
return { changes, lastSync: maxModified || undefined };
|
|
1000
|
-
});
|
|
1001
|
-
}
|
|
1002
|
-
};
|
|
1003
|
-
}
|
|
1004
|
-
const nodeVal = getNodeValue(node);
|
|
1005
|
-
if (promiseReturn !== undefined) {
|
|
1006
|
-
newValue = promiseReturn;
|
|
1007
|
-
}
|
|
1008
|
-
else if (nodeVal !== undefined && !isFunction(nodeVal)) {
|
|
1009
|
-
newValue = nodeVal;
|
|
1010
|
-
}
|
|
1011
|
-
else {
|
|
1012
|
-
newValue = initial;
|
|
1013
|
-
}
|
|
1014
|
-
setNodeValue(node, promiseReturn ? undefined : newValue);
|
|
1015
|
-
// @ts-expect-error TODO fix these types
|
|
1016
|
-
syncState = syncObservable(obs$, { ...node.activationState, ...pluginRemote });
|
|
1017
|
-
return { update: onChange, value: newValue };
|
|
1018
|
-
}
|
|
1019
|
-
else {
|
|
1020
|
-
// If it is not a Synced
|
|
1021
|
-
let update = undefined;
|
|
1022
|
-
const get = async (params) => {
|
|
1023
|
-
update = params.refresh;
|
|
1024
|
-
if (isPromise(newValue)) {
|
|
1025
|
-
try {
|
|
1026
|
-
newValue = await newValue;
|
|
1027
|
-
}
|
|
1028
|
-
catch (_a) {
|
|
1029
|
-
// TODO Once we have global retry settings this should retry
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
return newValue;
|
|
893
|
+
globalState2.activateSyncedNode = function activateSyncedNode(node, newValue) {
|
|
894
|
+
const obs$ = getProxy(node);
|
|
895
|
+
if (node.activationState) {
|
|
896
|
+
const { get, initial, set, retry } = node.activationState;
|
|
897
|
+
let onChange = void 0;
|
|
898
|
+
const pluginRemote = {};
|
|
899
|
+
let promiseReturn = void 0;
|
|
900
|
+
let syncState;
|
|
901
|
+
const refresh = () => syncState == null ? void 0 : syncState.sync();
|
|
902
|
+
if (get) {
|
|
903
|
+
pluginRemote.get = (params) => {
|
|
904
|
+
var _a;
|
|
905
|
+
onChange = params.onChange;
|
|
906
|
+
const updateLastSync = (lastSync) => params.lastSync = lastSync;
|
|
907
|
+
const existingValue = getNodeValue2(node);
|
|
908
|
+
const value = runWithRetry(node, { attemptNum: 0, retry: retry || ((_a = params.options) == null ? void 0 : _a.retry) }, () => {
|
|
909
|
+
const paramsToGet = {
|
|
910
|
+
value: isFunction(existingValue) || (existingValue == null ? void 0 : existingValue[symbolLinked2]) ? void 0 : existingValue,
|
|
911
|
+
lastSync: params.lastSync,
|
|
912
|
+
updateLastSync,
|
|
913
|
+
mode: params.mode,
|
|
914
|
+
refresh
|
|
1033
915
|
};
|
|
1034
|
-
|
|
1035
|
-
|
|
916
|
+
const ret = get(paramsToGet);
|
|
917
|
+
params.mode = paramsToGet.mode;
|
|
918
|
+
return ret;
|
|
919
|
+
});
|
|
920
|
+
promiseReturn = value;
|
|
921
|
+
return value;
|
|
922
|
+
};
|
|
923
|
+
}
|
|
924
|
+
if (set) {
|
|
925
|
+
pluginRemote.set = async (params) => {
|
|
926
|
+
var _a, _b;
|
|
927
|
+
if ((_a = node.state) == null ? void 0 : _a.isLoaded.get()) {
|
|
928
|
+
const retryAttempts = { attemptNum: 0, retry: retry || ((_b = params.options) == null ? void 0 : _b.retry) };
|
|
929
|
+
return runWithRetry(node, retryAttempts, async (retryEvent) => {
|
|
930
|
+
let changes = {};
|
|
931
|
+
let maxModified = 0;
|
|
932
|
+
if (!node.state.isLoaded.peek()) {
|
|
933
|
+
await whenReady(node.state.isLoaded);
|
|
934
|
+
}
|
|
935
|
+
const cancelRetry = () => {
|
|
936
|
+
retryEvent.cancel = true;
|
|
937
|
+
};
|
|
938
|
+
await set({
|
|
939
|
+
...params,
|
|
940
|
+
node,
|
|
941
|
+
update: (params2) => {
|
|
942
|
+
const { value, lastSync } = params2;
|
|
943
|
+
maxModified = Math.max(lastSync || 0, maxModified);
|
|
944
|
+
changes = mergeIntoObservable(changes, value);
|
|
945
|
+
},
|
|
946
|
+
retryNum: retryAttempts.attemptNum,
|
|
947
|
+
cancelRetry,
|
|
948
|
+
refresh,
|
|
949
|
+
fromSubscribe: false
|
|
950
|
+
});
|
|
951
|
+
return { changes, lastSync: maxModified || void 0 };
|
|
1036
952
|
});
|
|
1037
|
-
|
|
1038
|
-
}
|
|
1039
|
-
|
|
953
|
+
}
|
|
954
|
+
};
|
|
955
|
+
}
|
|
956
|
+
const nodeVal = getNodeValue2(node);
|
|
957
|
+
if (promiseReturn !== void 0) {
|
|
958
|
+
newValue = promiseReturn;
|
|
959
|
+
} else if (nodeVal !== void 0 && !isFunction(nodeVal)) {
|
|
960
|
+
newValue = nodeVal;
|
|
961
|
+
} else {
|
|
962
|
+
newValue = initial;
|
|
963
|
+
}
|
|
964
|
+
setNodeValue(node, promiseReturn ? void 0 : newValue);
|
|
965
|
+
syncState = syncObservable(obs$, { ...node.activationState, ...pluginRemote });
|
|
966
|
+
return { update: onChange, value: newValue };
|
|
967
|
+
} else {
|
|
968
|
+
let update = void 0;
|
|
969
|
+
const get = async (params) => {
|
|
970
|
+
update = params.refresh;
|
|
971
|
+
if (isPromise(newValue)) {
|
|
972
|
+
try {
|
|
973
|
+
newValue = await newValue;
|
|
974
|
+
} catch (e) {
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
return newValue;
|
|
978
|
+
};
|
|
979
|
+
syncObservable(obs$, {
|
|
980
|
+
get
|
|
981
|
+
});
|
|
982
|
+
return { update, value: newValue };
|
|
983
|
+
}
|
|
984
|
+
};
|
|
1040
985
|
}
|
|
1041
986
|
|
|
987
|
+
// src/sync/synced.ts
|
|
1042
988
|
function synced(params) {
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
989
|
+
installPersistActivateNode();
|
|
990
|
+
if (isFunction(params)) {
|
|
991
|
+
params = { get: params };
|
|
992
|
+
}
|
|
993
|
+
return linked({ ...params, synced: true });
|
|
1048
994
|
}
|
|
1049
|
-
|
|
995
|
+
var didInstall = false;
|
|
1050
996
|
function installPersistActivateNode() {
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
997
|
+
if (!didInstall) {
|
|
998
|
+
enableActivateSyncedNode();
|
|
999
|
+
didInstall = true;
|
|
1000
|
+
}
|
|
1055
1001
|
}
|
|
1056
1002
|
|
|
1003
|
+
// sync.ts
|
|
1057
1004
|
function isInRemoteChange() {
|
|
1058
|
-
|
|
1005
|
+
return internal.globalState.isLoadingRemote;
|
|
1059
1006
|
}
|
|
1060
|
-
|
|
1061
|
-
|
|
1007
|
+
var internal3 = {
|
|
1008
|
+
observableSyncConfiguration
|
|
1062
1009
|
};
|
|
1063
1010
|
|
|
1064
|
-
export { combineTransforms, configureObservableSync, deepEqual, diffObjects, internal, isInRemoteChange, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
|
|
1065
|
-
//# sourceMappingURL=sync.mjs.map
|
|
1011
|
+
export { combineTransforms, configureObservableSync, deepEqual, diffObjects, internal3 as internal, isInRemoteChange, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
|