@laboverwire/stitch 0.4.1
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/CHANGELOG.md +90 -0
- package/LICENSE +201 -0
- package/README.md +39 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/internal-list-apply.d.ts +5 -0
- package/dist/internal-list-apply.d.ts.map +1 -0
- package/dist/internal-list-apply.js +30 -0
- package/dist/internal-list-apply.js.map +1 -0
- package/dist/internal-utils.d.ts +3 -0
- package/dist/internal-utils.d.ts.map +1 -0
- package/dist/internal-utils.js +15 -0
- package/dist/internal-utils.js.map +1 -0
- package/dist/internal-wasm-error.d.ts +9 -0
- package/dist/internal-wasm-error.d.ts.map +1 -0
- package/dist/internal-wasm-error.js +48 -0
- package/dist/internal-wasm-error.js.map +1 -0
- package/dist/memory-store.d.ts +3 -0
- package/dist/memory-store.d.ts.map +1 -0
- package/dist/memory-store.js +572 -0
- package/dist/memory-store.js.map +1 -0
- package/dist/offline-queue.d.ts +6 -0
- package/dist/offline-queue.d.ts.map +1 -0
- package/dist/offline-queue.js +361 -0
- package/dist/offline-queue.js.map +1 -0
- package/dist/persistence-layer.d.ts +7 -0
- package/dist/persistence-layer.d.ts.map +1 -0
- package/dist/persistence-layer.js +409 -0
- package/dist/persistence-layer.js.map +1 -0
- package/dist/react/context.d.ts +10 -0
- package/dist/react/context.d.ts.map +1 -0
- package/dist/react/context.js +9 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/hooks/useChildCounts.d.ts +3 -0
- package/dist/react/hooks/useChildCounts.d.ts.map +1 -0
- package/dist/react/hooks/useChildCounts.js +85 -0
- package/dist/react/hooks/useChildCounts.js.map +1 -0
- package/dist/react/hooks/useConnectionStatus.d.ts +3 -0
- package/dist/react/hooks/useConnectionStatus.d.ts.map +1 -0
- package/dist/react/hooks/useConnectionStatus.js +9 -0
- package/dist/react/hooks/useConnectionStatus.js.map +1 -0
- package/dist/react/hooks/useEntitySnapshot.d.ts +4 -0
- package/dist/react/hooks/useEntitySnapshot.d.ts.map +1 -0
- package/dist/react/hooks/useEntitySnapshot.js +33 -0
- package/dist/react/hooks/useEntitySnapshot.js.map +1 -0
- package/dist/react/hooks/useRootEntityList.d.ts +9 -0
- package/dist/react/hooks/useRootEntityList.d.ts.map +1 -0
- package/dist/react/hooks/useRootEntityList.js +69 -0
- package/dist/react/hooks/useRootEntityList.js.map +1 -0
- package/dist/react/hooks/useScopedEntities.d.ts +9 -0
- package/dist/react/hooks/useScopedEntities.d.ts.map +1 -0
- package/dist/react/hooks/useScopedEntities.js +82 -0
- package/dist/react/hooks/useScopedEntities.js.map +1 -0
- package/dist/react/hooks/useSyncScope.d.ts +8 -0
- package/dist/react/hooks/useSyncScope.d.ts.map +1 -0
- package/dist/react/hooks/useSyncScope.js +49 -0
- package/dist/react/hooks/useSyncScope.js.map +1 -0
- package/dist/react/hooks/useTopLevelEntities.d.ts +7 -0
- package/dist/react/hooks/useTopLevelEntities.d.ts.map +1 -0
- package/dist/react/hooks/useTopLevelEntities.js +52 -0
- package/dist/react/hooks/useTopLevelEntities.js.map +1 -0
- package/dist/react/index.d.ts +11 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +10 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/provider.d.ts +32 -0
- package/dist/react/provider.d.ts.map +1 -0
- package/dist/react/provider.js +94 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/remote-sync-layer.d.ts +8 -0
- package/dist/remote-sync-layer.d.ts.map +1 -0
- package/dist/remote-sync-layer.js +439 -0
- package/dist/remote-sync-layer.js.map +1 -0
- package/dist/store.d.ts +3 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +779 -0
- package/dist/store.js.map +1 -0
- package/dist/sync-engine.d.ts +3 -0
- package/dist/sync-engine.d.ts.map +1 -0
- package/dist/sync-engine.js +643 -0
- package/dist/sync-engine.js.map +1 -0
- package/dist/types.d.ts +263 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/vue/StitchAuth.d.ts +58 -0
- package/dist/vue/StitchAuth.d.ts.map +1 -0
- package/dist/vue/StitchAuth.js +39 -0
- package/dist/vue/StitchAuth.js.map +1 -0
- package/dist/vue/StoreRoot.d.ts +41 -0
- package/dist/vue/StoreRoot.d.ts.map +1 -0
- package/dist/vue/StoreRoot.js +94 -0
- package/dist/vue/StoreRoot.js.map +1 -0
- package/dist/vue/composables/useChildCounts.d.ts +4 -0
- package/dist/vue/composables/useChildCounts.d.ts.map +1 -0
- package/dist/vue/composables/useChildCounts.js +85 -0
- package/dist/vue/composables/useChildCounts.js.map +1 -0
- package/dist/vue/composables/useConnectionStatus.d.ts +4 -0
- package/dist/vue/composables/useConnectionStatus.d.ts.map +1 -0
- package/dist/vue/composables/useConnectionStatus.js +12 -0
- package/dist/vue/composables/useConnectionStatus.js.map +1 -0
- package/dist/vue/composables/useEntitySnapshot.d.ts +5 -0
- package/dist/vue/composables/useEntitySnapshot.d.ts.map +1 -0
- package/dist/vue/composables/useEntitySnapshot.js +41 -0
- package/dist/vue/composables/useEntitySnapshot.js.map +1 -0
- package/dist/vue/composables/useRootEntityList.d.ts +10 -0
- package/dist/vue/composables/useRootEntityList.d.ts.map +1 -0
- package/dist/vue/composables/useRootEntityList.js +76 -0
- package/dist/vue/composables/useRootEntityList.js.map +1 -0
- package/dist/vue/composables/useScopedEntities.d.ts +10 -0
- package/dist/vue/composables/useScopedEntities.d.ts.map +1 -0
- package/dist/vue/composables/useScopedEntities.js +91 -0
- package/dist/vue/composables/useScopedEntities.js.map +1 -0
- package/dist/vue/composables/useStore.d.ts +3 -0
- package/dist/vue/composables/useStore.d.ts.map +1 -0
- package/dist/vue/composables/useStore.js +9 -0
- package/dist/vue/composables/useStore.js.map +1 -0
- package/dist/vue/composables/useSyncScope.d.ts +9 -0
- package/dist/vue/composables/useSyncScope.d.ts.map +1 -0
- package/dist/vue/composables/useSyncScope.js +50 -0
- package/dist/vue/composables/useSyncScope.js.map +1 -0
- package/dist/vue/composables/useTopLevelEntities.d.ts +8 -0
- package/dist/vue/composables/useTopLevelEntities.d.ts.map +1 -0
- package/dist/vue/composables/useTopLevelEntities.js +58 -0
- package/dist/vue/composables/useTopLevelEntities.js.map +1 -0
- package/dist/vue/index.d.ts +13 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +12 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/injection-key.d.ts +10 -0
- package/dist/vue/injection-key.d.ts.map +1 -0
- package/dist/vue/injection-key.js +2 -0
- package/dist/vue/injection-key.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback } from 'react';
|
|
2
|
+
import { applyEvent } from "../../internal-list-apply.js";
|
|
3
|
+
export function useRootEntityList(store) {
|
|
4
|
+
const rootEntity = store.config.scope.rootEntity;
|
|
5
|
+
const [items, setItems] = useState([]);
|
|
6
|
+
const [loading, setLoading] = useState(true);
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
const refetch = useCallback(async () => {
|
|
9
|
+
setLoading(true);
|
|
10
|
+
setError(null);
|
|
11
|
+
try {
|
|
12
|
+
const entities = await store.listRootEntities();
|
|
13
|
+
setItems(entities);
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
setError(err instanceof Error ? err : new Error('Failed to fetch root entities'));
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
setLoading(false);
|
|
20
|
+
}
|
|
21
|
+
}, [store]);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
let fetched = false;
|
|
24
|
+
let cancelled = false;
|
|
25
|
+
const buffer = [];
|
|
26
|
+
const fetchAll = () => {
|
|
27
|
+
store
|
|
28
|
+
.listRootEntities()
|
|
29
|
+
.then((entities) => {
|
|
30
|
+
if (cancelled)
|
|
31
|
+
return;
|
|
32
|
+
let result = entities;
|
|
33
|
+
for (const { entity, op } of buffer) {
|
|
34
|
+
result = applyEvent(result, entity, op);
|
|
35
|
+
}
|
|
36
|
+
buffer.length = 0;
|
|
37
|
+
fetched = true;
|
|
38
|
+
setItems(result);
|
|
39
|
+
setLoading(false);
|
|
40
|
+
})
|
|
41
|
+
.catch((err) => {
|
|
42
|
+
if (cancelled)
|
|
43
|
+
return;
|
|
44
|
+
fetched = true;
|
|
45
|
+
buffer.length = 0;
|
|
46
|
+
setError(err instanceof Error ? err : new Error('Failed to fetch root entities'));
|
|
47
|
+
setLoading(false);
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const unsubscribe = store.subscribeToEntity(rootEntity, (entity, op) => {
|
|
51
|
+
if (entity === null) {
|
|
52
|
+
fetchAll();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!fetched) {
|
|
56
|
+
buffer.push({ entity, op });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
setItems((prev) => applyEvent(prev, entity, op));
|
|
60
|
+
});
|
|
61
|
+
fetchAll();
|
|
62
|
+
return () => {
|
|
63
|
+
cancelled = true;
|
|
64
|
+
unsubscribe();
|
|
65
|
+
};
|
|
66
|
+
}, [store, rootEntity]);
|
|
67
|
+
return { items, loading, error, refetch };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=useRootEntityList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRootEntityList.js","sourceRoot":"","sources":["../../../src/react/hooks/useRootEntityList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAiB,MAAM,8BAA8B,CAAC;AAEzE,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAM5C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IAEjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAChD,QAAQ,CAAC,QAAsB,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACpF,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,MAAM,GAAmE,EAAE,CAAC;QAElF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,KAAK;iBACF,gBAAgB,EAAE;iBAClB,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjB,IAAI,SAAS;oBAAE,OAAO;gBACtB,IAAI,MAAM,GAAG,QAAsB,CAAC;gBACpC,KAAK,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,MAAM,EAAE,CAAC;oBACpC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC1C,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,OAAO,GAAG,IAAI,CAAC;gBACf,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjB,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,IAAI,SAAS;oBAAE,OAAO;gBACtB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;gBAClF,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CACzC,UAAU,EACV,CAAC,MAAe,EAAE,EAAkC,EAAE,EAAE;YACtD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,QAAQ,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CACF,CAAC;QAEF,QAAQ,EAAE,CAAC;QAEX,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAExB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Store } from '../../types.ts';
|
|
2
|
+
import { type ListItem } from '../../internal-list-apply.ts';
|
|
3
|
+
export declare function useScopedEntities(store: Store, scopeId: string | null, entity: string): {
|
|
4
|
+
data: ListItem[];
|
|
5
|
+
loading: boolean;
|
|
6
|
+
error: Error | null;
|
|
7
|
+
refetch: () => Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=useScopedEntities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScopedEntities.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useScopedEntities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GACb;IACD,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAyFA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback } from 'react';
|
|
2
|
+
import { applyEvent } from "../../internal-list-apply.js";
|
|
3
|
+
export function useScopedEntities(store, scopeId, entity) {
|
|
4
|
+
const effectiveScopeField = store.config.scope.scopeField;
|
|
5
|
+
const [data, setData] = useState([]);
|
|
6
|
+
const [loading, setLoading] = useState(true);
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
const refetch = useCallback(async () => {
|
|
9
|
+
if (!scopeId) {
|
|
10
|
+
setData([]);
|
|
11
|
+
setLoading(false);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
setLoading(true);
|
|
15
|
+
setError(null);
|
|
16
|
+
try {
|
|
17
|
+
const entities = await store.list(entity, { scopeId });
|
|
18
|
+
setData(entities);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
setError(err instanceof Error ? err : new Error('Failed to fetch entities'));
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
setLoading(false);
|
|
25
|
+
}
|
|
26
|
+
}, [store, scopeId, entity]);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!scopeId) {
|
|
29
|
+
Promise.resolve().then(() => setData([]));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let fetched = false;
|
|
33
|
+
let cancelled = false;
|
|
34
|
+
const buffer = [];
|
|
35
|
+
const fetchAll = () => {
|
|
36
|
+
store
|
|
37
|
+
.list(entity, { scopeId })
|
|
38
|
+
.then((entities) => {
|
|
39
|
+
if (cancelled)
|
|
40
|
+
return;
|
|
41
|
+
let result = entities;
|
|
42
|
+
for (const { entity: e, op } of buffer) {
|
|
43
|
+
result = applyEvent(result, e, op);
|
|
44
|
+
}
|
|
45
|
+
buffer.length = 0;
|
|
46
|
+
fetched = true;
|
|
47
|
+
setData(result);
|
|
48
|
+
setLoading(false);
|
|
49
|
+
})
|
|
50
|
+
.catch((err) => {
|
|
51
|
+
if (cancelled)
|
|
52
|
+
return;
|
|
53
|
+
fetched = true;
|
|
54
|
+
buffer.length = 0;
|
|
55
|
+
setError(err instanceof Error ? err : new Error('Failed to fetch entities'));
|
|
56
|
+
setLoading(false);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
const unsubscribe = store.subscribeToEntity(entity, (entityData, op) => {
|
|
60
|
+
if (entityData === null) {
|
|
61
|
+
fetchAll();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const rec = entityData;
|
|
65
|
+
if (rec[effectiveScopeField] !== scopeId) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (!fetched) {
|
|
69
|
+
buffer.push({ entity: entityData, op });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
setData((prev) => applyEvent(prev, entityData, op));
|
|
73
|
+
});
|
|
74
|
+
fetchAll();
|
|
75
|
+
return () => {
|
|
76
|
+
cancelled = true;
|
|
77
|
+
unsubscribe();
|
|
78
|
+
};
|
|
79
|
+
}, [store, scopeId, entity, effectiveScopeField]);
|
|
80
|
+
return { data, loading, error, refetch };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=useScopedEntities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScopedEntities.js","sourceRoot":"","sources":["../../../src/react/hooks/useScopedEntities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Store } from '../../types.ts';
|
|
2
|
+
export declare function useSyncScope(store: Store, scopeId: string | null): {
|
|
3
|
+
syncing: boolean;
|
|
4
|
+
syncError: Error | null;
|
|
5
|
+
openScope: () => Promise<void>;
|
|
6
|
+
closeScope: () => Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=useSyncScope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSyncScope.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useSyncScope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAiDA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback, useRef } from 'react';
|
|
2
|
+
export function useSyncScope(store, scopeId) {
|
|
3
|
+
const [syncing, setSyncing] = useState(false);
|
|
4
|
+
const [syncError, setSyncError] = useState(null);
|
|
5
|
+
const openedRef = useRef(null);
|
|
6
|
+
const currentScopeIdRef = useRef(scopeId);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
currentScopeIdRef.current = scopeId;
|
|
9
|
+
}, [scopeId]);
|
|
10
|
+
const openScope = useCallback(async () => {
|
|
11
|
+
if (!scopeId || openedRef.current === scopeId)
|
|
12
|
+
return;
|
|
13
|
+
setSyncing(true);
|
|
14
|
+
setSyncError(null);
|
|
15
|
+
try {
|
|
16
|
+
await store.replaceScope(scopeId);
|
|
17
|
+
if (currentScopeIdRef.current === scopeId) {
|
|
18
|
+
openedRef.current = scopeId;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
setSyncError(err instanceof Error ? err : new Error('Failed to open scope'));
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
setSyncing(false);
|
|
26
|
+
}
|
|
27
|
+
}, [store, scopeId]);
|
|
28
|
+
const closeScope = useCallback(async () => {
|
|
29
|
+
if (!openedRef.current)
|
|
30
|
+
return;
|
|
31
|
+
try {
|
|
32
|
+
await store.closeScope(openedRef.current);
|
|
33
|
+
openedRef.current = null;
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.error('[useSyncScope] Failed to close scope:', err);
|
|
37
|
+
}
|
|
38
|
+
}, [store]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
return () => {
|
|
41
|
+
if (openedRef.current) {
|
|
42
|
+
store.closeScope(openedRef.current).catch(() => { });
|
|
43
|
+
openedRef.current = null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}, [store, scopeId]);
|
|
47
|
+
return { syncing, syncError, openScope, closeScope };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=useSyncScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSyncScope.js","sourceRoot":"","sources":["../../../src/react/hooks/useSyncScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,UAAU,YAAY,CAC1B,KAAY,EACZ,OAAsB;IAOtB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC9C,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,iBAAiB,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO;QAEtD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,iBAAiB,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC1C,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC/E,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QAE/B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACpD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Store } from '../../types.ts';
|
|
2
|
+
import { type ListItem } from '../../internal-list-apply.ts';
|
|
3
|
+
export declare function useTopLevelEntities(store: Store, entity: string): {
|
|
4
|
+
items: ListItem[];
|
|
5
|
+
loading: boolean;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=useTopLevelEntities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTopLevelEntities.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useTopLevelEntities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzE,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb;IACD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAuDA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { applyEvent } from "../../internal-list-apply.js";
|
|
3
|
+
export function useTopLevelEntities(store, entity) {
|
|
4
|
+
const [items, setItems] = useState([]);
|
|
5
|
+
const [loading, setLoading] = useState(true);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
let fetched = false;
|
|
8
|
+
let cancelled = false;
|
|
9
|
+
const buffer = [];
|
|
10
|
+
const fetchAll = () => {
|
|
11
|
+
store
|
|
12
|
+
.list(entity)
|
|
13
|
+
.then((entities) => {
|
|
14
|
+
if (cancelled)
|
|
15
|
+
return;
|
|
16
|
+
let result = entities;
|
|
17
|
+
for (const { entity: e, op } of buffer) {
|
|
18
|
+
result = applyEvent(result, e, op);
|
|
19
|
+
}
|
|
20
|
+
buffer.length = 0;
|
|
21
|
+
fetched = true;
|
|
22
|
+
setItems(result);
|
|
23
|
+
setLoading(false);
|
|
24
|
+
})
|
|
25
|
+
.catch(() => {
|
|
26
|
+
if (cancelled)
|
|
27
|
+
return;
|
|
28
|
+
fetched = true;
|
|
29
|
+
buffer.length = 0;
|
|
30
|
+
setLoading(false);
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
const unsubscribe = store.subscribeToEntity(entity, (entityData, op) => {
|
|
34
|
+
if (entityData === null) {
|
|
35
|
+
fetchAll();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!fetched) {
|
|
39
|
+
buffer.push({ entity: entityData, op });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setItems((prev) => applyEvent(prev, entityData, op));
|
|
43
|
+
});
|
|
44
|
+
fetchAll();
|
|
45
|
+
return () => {
|
|
46
|
+
cancelled = true;
|
|
47
|
+
unsubscribe();
|
|
48
|
+
};
|
|
49
|
+
}, [store, entity]);
|
|
50
|
+
return { items, loading };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=useTopLevelEntities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTopLevelEntities.js","sourceRoot":"","sources":["../../../src/react/hooks/useTopLevelEntities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAiB,MAAM,8BAA8B,CAAC;AAEzE,MAAM,UAAU,mBAAmB,CACjC,KAAY,EACZ,MAAc;IAKd,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,MAAM,GAAmE,EAAE,CAAC;QAElF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,KAAK;iBACF,IAAI,CAAC,MAAM,CAAC;iBACZ,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjB,IAAI,SAAS;oBAAE,OAAO;gBACtB,IAAI,MAAM,GAAG,QAAsB,CAAC;gBACpC,KAAK,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,MAAM,EAAE,CAAC;oBACvC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,OAAO,GAAG,IAAI,CAAC;gBACf,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjB,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,IAAI,SAAS;oBAAE,OAAO;gBACtB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CACzC,MAAM,EACN,CAAC,UAAmB,EAAE,EAAkC,EAAE,EAAE;YAC1D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,QAAQ,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CACF,CAAC;QAEF,QAAQ,EAAE,CAAC;QAEX,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { StoreContext, useStore } from './context.ts';
|
|
2
|
+
export type { StoreContextValue } from './context.ts';
|
|
3
|
+
export { StoreProvider, AuthProvider } from './provider.tsx';
|
|
4
|
+
export { useEntitySnapshot, useEntitySnapshotAsMap } from './hooks/useEntitySnapshot.ts';
|
|
5
|
+
export { useConnectionStatus } from './hooks/useConnectionStatus.ts';
|
|
6
|
+
export { useScopedEntities } from './hooks/useScopedEntities.ts';
|
|
7
|
+
export { useRootEntityList } from './hooks/useRootEntityList.ts';
|
|
8
|
+
export { useTopLevelEntities } from './hooks/useTopLevelEntities.ts';
|
|
9
|
+
export { useChildCounts } from './hooks/useChildCounts.ts';
|
|
10
|
+
export { useSyncScope } from './hooks/useSyncScope.ts';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { StoreContext, useStore } from "./context.js";
|
|
2
|
+
export { StoreProvider, AuthProvider } from "./provider.js";
|
|
3
|
+
export { useEntitySnapshot, useEntitySnapshotAsMap } from "./hooks/useEntitySnapshot.js";
|
|
4
|
+
export { useConnectionStatus } from "./hooks/useConnectionStatus.js";
|
|
5
|
+
export { useScopedEntities } from "./hooks/useScopedEntities.js";
|
|
6
|
+
export { useRootEntityList } from "./hooks/useRootEntityList.js";
|
|
7
|
+
export { useTopLevelEntities } from "./hooks/useTopLevelEntities.js";
|
|
8
|
+
export { useChildCounts } from "./hooks/useChildCounts.js";
|
|
9
|
+
export { useSyncScope } from "./hooks/useSyncScope.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { Store } from '../types.ts';
|
|
3
|
+
interface StoreProviderProps {
|
|
4
|
+
store: Store;
|
|
5
|
+
serverUrl?: string;
|
|
6
|
+
getTicket?: () => Promise<string>;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Store lifecycle only — initializes the store, tracks connection status, and
|
|
11
|
+
* handles visibility-change reconnection. Authentication concerns (userId, session
|
|
12
|
+
* handlers, logout gating) live in {@link AuthProvider}; compose both if you need
|
|
13
|
+
* an auth-aware app.
|
|
14
|
+
*/
|
|
15
|
+
export declare function StoreProvider({ store, serverUrl, getTicket, children }: StoreProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
interface AuthProviderProps {
|
|
17
|
+
store: Store;
|
|
18
|
+
userId?: string;
|
|
19
|
+
/** When false, the store is torn down via `resetForLogout()` and remote sync disconnects. Defaults to `true`. */
|
|
20
|
+
authenticated?: boolean;
|
|
21
|
+
onSessionInvalid?: () => void;
|
|
22
|
+
onReconnectValidate?: () => Promise<void>;
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Binds authentication-related state to the store. Nest inside a {@link StoreProvider}.
|
|
27
|
+
* Controls `setAuthenticatedUser`, session-invalid + reconnect-validator handlers, and
|
|
28
|
+
* tears down the store via `resetForLogout()` when `authenticated` transitions to false.
|
|
29
|
+
*/
|
|
30
|
+
export declare function AuthProvider({ store, userId, authenticated, onSessionInvalid, onReconnectValidate, children, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/react/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,KAAK,EAAoB,KAAK,EAAE,MAAM,aAAa,CAAC;AAG3D,UAAU,kBAAkB;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CA8E1F;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iHAAiH;IACjH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,aAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,GACT,EAAE,iBAAiB,2CAanB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState, useMemo } from 'react';
|
|
3
|
+
import { StoreContext } from "./context.js";
|
|
4
|
+
/**
|
|
5
|
+
* Store lifecycle only — initializes the store, tracks connection status, and
|
|
6
|
+
* handles visibility-change reconnection. Authentication concerns (userId, session
|
|
7
|
+
* handlers, logout gating) live in {@link AuthProvider}; compose both if you need
|
|
8
|
+
* an auth-aware app.
|
|
9
|
+
*/
|
|
10
|
+
export function StoreProvider({ store, serverUrl, getTicket, children }) {
|
|
11
|
+
const [initialized, setInitialized] = useState(false);
|
|
12
|
+
const [connectionStatus, setConnectionStatus] = useState('offline');
|
|
13
|
+
const [error, setError] = useState(null);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
let mounted = true;
|
|
16
|
+
async function init() {
|
|
17
|
+
try {
|
|
18
|
+
if (!store.ready) {
|
|
19
|
+
await store.initialize();
|
|
20
|
+
}
|
|
21
|
+
if (mounted)
|
|
22
|
+
setInitialized(true);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
console.error('[StoreProvider] Initialization failed:', err);
|
|
26
|
+
if (mounted) {
|
|
27
|
+
setError(err instanceof Error ? err : new Error('Store initialization failed'));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
init();
|
|
32
|
+
return () => {
|
|
33
|
+
mounted = false;
|
|
34
|
+
};
|
|
35
|
+
}, [store]);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const unsubscribe = store.subscribeToConnectionStatus((status) => {
|
|
38
|
+
setConnectionStatus(status);
|
|
39
|
+
});
|
|
40
|
+
function handleBeforeUnload() {
|
|
41
|
+
store.disconnect();
|
|
42
|
+
}
|
|
43
|
+
window.addEventListener('beforeunload', handleBeforeUnload);
|
|
44
|
+
return () => {
|
|
45
|
+
unsubscribe();
|
|
46
|
+
window.removeEventListener('beforeunload', handleBeforeUnload);
|
|
47
|
+
};
|
|
48
|
+
}, [store]);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (!initialized || !store.hasRemote)
|
|
51
|
+
return;
|
|
52
|
+
let lastHidden = 0;
|
|
53
|
+
const STALE_THRESHOLD_MS = 30_000;
|
|
54
|
+
function handleVisibilityChange() {
|
|
55
|
+
if (document.hidden) {
|
|
56
|
+
lastHidden = Date.now();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (lastHidden > 0 && Date.now() - lastHidden > STALE_THRESHOLD_MS && serverUrl) {
|
|
60
|
+
if (store.connectionStatus !== 'connected' && !store.isReconnecting) {
|
|
61
|
+
store
|
|
62
|
+
.reconnect(serverUrl, getTicket)
|
|
63
|
+
.catch((err) => console.error('[StoreProvider] Reconnect on wake failed:', err));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
document.addEventListener('visibilitychange', handleVisibilityChange);
|
|
68
|
+
return () => document.removeEventListener('visibilitychange', handleVisibilityChange);
|
|
69
|
+
}, [initialized, store, serverUrl, getTicket]);
|
|
70
|
+
const contextValue = useMemo(() => ({ store, initialized, connectionStatus, error }), [store, initialized, connectionStatus, error]);
|
|
71
|
+
return _jsx(StoreContext.Provider, { value: contextValue, children: children });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Binds authentication-related state to the store. Nest inside a {@link StoreProvider}.
|
|
75
|
+
* Controls `setAuthenticatedUser`, session-invalid + reconnect-validator handlers, and
|
|
76
|
+
* tears down the store via `resetForLogout()` when `authenticated` transitions to false.
|
|
77
|
+
*/
|
|
78
|
+
export function AuthProvider({ store, userId, authenticated = true, onSessionInvalid, onReconnectValidate, children, }) {
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!authenticated) {
|
|
81
|
+
store.disconnect();
|
|
82
|
+
store.resetForLogout();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (userId)
|
|
86
|
+
store.setAuthenticatedUser(userId);
|
|
87
|
+
if (onSessionInvalid)
|
|
88
|
+
store.setSessionInvalidHandler(onSessionInvalid);
|
|
89
|
+
if (onReconnectValidate)
|
|
90
|
+
store.setReconnectValidator(onReconnectValidate);
|
|
91
|
+
}, [store, userId, authenticated, onSessionInvalid, onReconnectValidate]);
|
|
92
|
+
return _jsx(_Fragment, { children: children });
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/react/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAS5C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAsB;IACzF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAmB,SAAS,CAAC,CAAC;IACtF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,KAAK,UAAU,IAAI;YACjB,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;gBAC3B,CAAC;gBACD,IAAI,OAAO;oBAAE,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;gBAC7D,IAAI,OAAO,EAAE,CAAC;oBACZ,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC;QAEP,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,KAAK,CAAC,2BAA2B,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/D,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,SAAS,kBAAkB;YACzB,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAE5D,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACjE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO;QAE7C,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,kBAAkB,GAAG,MAAM,CAAC;QAElC,SAAS,sBAAsB;YAC7B,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,kBAAkB,IAAI,SAAS,EAAE,CAAC;gBAChF,IAAI,KAAK,CAAC,gBAAgB,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBACpE,KAAK;yBACF,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;yBAC/B,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAChE,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;QACtE,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IACxF,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/C,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,EACvD,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAC9C,CAAC;IAEF,OAAO,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YAAG,QAAQ,GAAyB,CAAC;AACxF,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,aAAa,GAAG,IAAI,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,GACU;IAClB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,MAAM;YAAE,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,gBAAgB;YAAE,KAAK,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACvE,IAAI,mBAAmB;YAAE,KAAK,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IAC5E,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE1E,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { StoreConfig, SyncMutation, ConnectionStatus, RemoteSyncLayer } from './types.ts';
|
|
2
|
+
export declare function createRemoteSyncLayer(config: StoreConfig): RemoteSyncLayer & {
|
|
3
|
+
setMutationCallback(cb: (mutation: SyncMutation) => void): void;
|
|
4
|
+
setConnectionChangeCallback(cb: (status: ConnectionStatus) => void): void;
|
|
5
|
+
setOnConnectedCallback(cb: () => void): void;
|
|
6
|
+
readonly isInitialSyncDone: boolean;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=remote-sync-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-sync-layer.d.ts","sourceRoot":"","sources":["../src/remote-sync-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,gBAAgB,EAGhB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAuepB,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG;IAC5E,mBAAmB,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,2BAA2B,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,sBAAsB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC,CAEA"}
|