@peerbit/react 0.0.25 → 0.0.27
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/lib/esm/usePeer.d.ts +1 -1
- package/lib/esm/usePeer.js.map +1 -1
- package/lib/esm/useProgram.d.ts +1 -1
- package/lib/esm/useProgram.js +5 -5
- package/lib/esm/useProgram.js.map +1 -1
- package/lib/esm/useQuery.d.ts +34 -16
- package/lib/esm/useQuery.js +142 -189
- package/lib/esm/useQuery.js.map +1 -1
- package/package.json +8 -8
- package/src/usePeer.tsx +1 -4
- package/src/useProgram.tsx +6 -5
- package/src/useQuery.tsx +240 -294
package/lib/esm/usePeer.d.ts
CHANGED
package/lib/esm/usePeer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePeer.js","sourceRoot":"","sources":["../../src/usePeer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"usePeer.js","sourceRoot":"","sources":["../../src/usePeer.tsx"],"names":[],"mappings":"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"}
|
package/lib/esm/useProgram.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare const useProgram: <P extends Program<ExtractArgs<P>, ExtractEvent
|
|
|
7
7
|
keepOpenOnUnmount?: boolean;
|
|
8
8
|
}) => {
|
|
9
9
|
program: P | undefined;
|
|
10
|
-
session:
|
|
10
|
+
session: number;
|
|
11
11
|
loading: boolean;
|
|
12
12
|
promise: Promise<P> | undefined;
|
|
13
13
|
peers: PublicSignKey[];
|
package/lib/esm/useProgram.js
CHANGED
|
@@ -14,7 +14,7 @@ export const useProgram = (addressOrOpen, options) => {
|
|
|
14
14
|
const [id, setId] = useState(options?.id);
|
|
15
15
|
let [loading, setLoading] = useState(true);
|
|
16
16
|
const [session, forceUpdate] = useReducer((x) => x + 1, 0);
|
|
17
|
-
let programLoadingRef = useRef();
|
|
17
|
+
let programLoadingRef = useRef(undefined);
|
|
18
18
|
const [peers, setPeers] = useState([]);
|
|
19
19
|
let closingRef = useRef(Promise.resolve());
|
|
20
20
|
/* if (options?.debug) {
|
|
@@ -80,13 +80,13 @@ export const useProgram = (addressOrOpen, options) => {
|
|
|
80
80
|
changeListener &&
|
|
81
81
|
p.events.removeEventListener("leave", changeListener);
|
|
82
82
|
};
|
|
83
|
-
if (options?.keepOpenOnUnmount) {
|
|
84
|
-
unsubscribe();
|
|
85
|
-
}
|
|
86
83
|
if (programLoadingRef.current === startRef) {
|
|
87
84
|
setProgram(undefined);
|
|
88
85
|
programLoadingRef.current = undefined;
|
|
89
|
-
|
|
86
|
+
}
|
|
87
|
+
if (options?.keepOpenOnUnmount) {
|
|
88
|
+
unsubscribe();
|
|
89
|
+
return; // nothing to close
|
|
90
90
|
}
|
|
91
91
|
return p.close().then(unsubscribe);
|
|
92
92
|
}) || Promise.resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProgram.js","sourceRoot":"","sources":["../../src/useProgram.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChE,MAAM,gBAAgB,GAAG,CACrB,CAAK,EACP,EAAE;IACA,IAAI,CAAC;QACD,OAAO,CAAC,EAAE,OAAO,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;AACL,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,UAAU,GAAG,CAItB,aAA0B,EAC1B,OAAuE,EACzE,EAAE;IACA,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAiB,CAAC;IACtD,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAqB,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"useProgram.js","sourceRoot":"","sources":["../../src/useProgram.tsx"],"names":[],"mappings":"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"}
|
package/lib/esm/useQuery.d.ts
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import { Documents, DocumentsChange, WithContext } from "@peerbit/document";
|
|
2
2
|
import * as indexerTypes from "@peerbit/indexer-interface";
|
|
3
|
-
import { WithIndexedContext } from "@peerbit/document
|
|
4
|
-
type QueryLike = {
|
|
5
|
-
query?: indexerTypes.Query[] | indexerTypes.QueryLike;
|
|
6
|
-
sort?: indexerTypes.Sort[] | indexerTypes.Sort | indexerTypes.SortLike;
|
|
7
|
-
};
|
|
3
|
+
import { WithIndexedContext } from "@peerbit/document";
|
|
8
4
|
type QueryOptions = {
|
|
9
5
|
query: QueryLike;
|
|
10
6
|
id?: string;
|
|
11
7
|
};
|
|
12
|
-
type
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
eager?: boolean;
|
|
8
|
+
export type QueryLike = {
|
|
9
|
+
/** Mongo-style selector or array of selectors */
|
|
10
|
+
query?: indexerTypes.QueryLike | indexerTypes.Query[];
|
|
11
|
+
/** Sort definition compatible with `@peerbit/indexer-interface` */
|
|
12
|
+
sort?: indexerTypes.SortLike | indexerTypes.Sort | indexerTypes.Sort[];
|
|
18
13
|
};
|
|
19
|
-
|
|
14
|
+
/**
|
|
15
|
+
* All the non-DB-specific options supported by the original single-DB hook.
|
|
16
|
+
* They stay fully backward-compatible.
|
|
17
|
+
*/
|
|
18
|
+
export type UseQuerySharedOptions<T, I, R extends boolean | undefined, RT> = {
|
|
20
19
|
resolve?: R;
|
|
21
20
|
transform?: (r: RT) => Promise<RT>;
|
|
22
21
|
debounce?: number;
|
|
@@ -26,15 +25,34 @@ export declare const useQuery: <T extends Record<string, any>, I extends Record<
|
|
|
26
25
|
reverse?: boolean;
|
|
27
26
|
batchSize?: number;
|
|
28
27
|
prefetch?: boolean;
|
|
28
|
+
ignoreUpdates?: boolean;
|
|
29
29
|
onChange?: {
|
|
30
30
|
merge?: boolean | ((c: DocumentsChange<T, I>) => DocumentsChange<T, I> | Promise<DocumentsChange<T, I>> | undefined);
|
|
31
|
-
update?: (prev: RT[], change: DocumentsChange<T, I>) => RT[]
|
|
31
|
+
update?: (prev: RT[], change: DocumentsChange<T, I>) => RT[] | Promise<RT[]>;
|
|
32
32
|
};
|
|
33
33
|
local?: boolean;
|
|
34
|
-
remote?: boolean |
|
|
35
|
-
|
|
34
|
+
remote?: boolean | {
|
|
35
|
+
warmup?: number;
|
|
36
|
+
joining?: {
|
|
37
|
+
waitFor?: number;
|
|
38
|
+
};
|
|
39
|
+
eager?: boolean;
|
|
40
|
+
};
|
|
41
|
+
} & QueryOptions;
|
|
42
|
+
/**
|
|
43
|
+
* `useQuery` – unified hook that accepts **either**
|
|
44
|
+
* 1. a single `Documents` instance
|
|
45
|
+
* 2. an array of `Documents` instances
|
|
46
|
+
* 3. *or* omits the first argument and provides `dbs` inside the `options` object.
|
|
47
|
+
*
|
|
48
|
+
* It supersedes the original single-DB version as well as the experimental
|
|
49
|
+
* `useMultiQuery` so callers never have to choose between two APIs.
|
|
50
|
+
*/
|
|
51
|
+
export declare const useQuery: <T extends Record<string, any>, I extends Record<string, any>, R extends boolean | undefined = true, RT = R extends false ? WithContext<I> : WithIndexedContext<T, I>>(
|
|
52
|
+
/** Single DB or list of DBs. 100 % backward-compatible with the old single param. */
|
|
53
|
+
dbOrDbs: Documents<T, I> | Documents<T, I>[] | undefined, options: UseQuerySharedOptions<T, I, R, RT>) => {
|
|
36
54
|
items: RT[];
|
|
37
|
-
loadMore: (n?: number
|
|
55
|
+
loadMore: (n?: number) => Promise<boolean>;
|
|
38
56
|
isLoading: boolean;
|
|
39
57
|
empty: () => boolean;
|
|
40
58
|
id: string | undefined;
|
package/lib/esm/useQuery.js
CHANGED
|
@@ -1,27 +1,46 @@
|
|
|
1
|
-
import { useState, useEffect, useRef } from "react";
|
|
1
|
+
import { useState, useEffect, useRef, useMemo } from "react";
|
|
2
2
|
import { ClosedError, } from "@peerbit/document";
|
|
3
3
|
import { AbortError } from "@peerbit/time";
|
|
4
4
|
import { NoPeersError } from "@peerbit/shared-log";
|
|
5
5
|
import { v4 as uuid } from "uuid";
|
|
6
|
-
/*
|
|
7
|
-
|
|
6
|
+
/* ────────────────────────── Main Hook ────────────────────────── */
|
|
7
|
+
/**
|
|
8
|
+
* `useQuery` – unified hook that accepts **either**
|
|
9
|
+
* 1. a single `Documents` instance
|
|
10
|
+
* 2. an array of `Documents` instances
|
|
11
|
+
* 3. *or* omits the first argument and provides `dbs` inside the `options` object.
|
|
12
|
+
*
|
|
13
|
+
* It supersedes the original single-DB version as well as the experimental
|
|
14
|
+
* `useMultiQuery` so callers never have to choose between two APIs.
|
|
15
|
+
*/
|
|
16
|
+
export const useQuery = (
|
|
17
|
+
/** Single DB or list of DBs. 100 % backward-compatible with the old single param. */
|
|
18
|
+
dbOrDbs, options) => {
|
|
19
|
+
/* ────────────── normalise DBs input ────────────── */
|
|
20
|
+
const dbs = useMemo(() => {
|
|
21
|
+
if (Array.isArray(dbOrDbs))
|
|
22
|
+
return dbOrDbs;
|
|
23
|
+
if (dbOrDbs)
|
|
24
|
+
return [dbOrDbs];
|
|
25
|
+
return [];
|
|
26
|
+
}, [dbOrDbs]);
|
|
8
27
|
/* ────────────── state & refs ────────────── */
|
|
9
28
|
const [all, setAll] = useState([]);
|
|
10
29
|
const allRef = useRef([]);
|
|
11
30
|
const [isLoading, setIsLoading] = useState(false);
|
|
12
|
-
const
|
|
13
|
-
const iteratorRef = useRef(null);
|
|
31
|
+
const iteratorRefs = useRef([]);
|
|
14
32
|
const emptyResultsRef = useRef(false);
|
|
15
33
|
const closeControllerRef = useRef(null);
|
|
16
34
|
const waitedOnceRef = useRef(false);
|
|
17
|
-
|
|
18
|
-
const
|
|
35
|
+
/* keep an id mostly for debugging – mirrors original behaviour */
|
|
36
|
+
const [id, setId] = useState(options.id);
|
|
37
|
+
const reverseRef = useRef(options.reverse);
|
|
19
38
|
useEffect(() => {
|
|
20
|
-
reverseRef.current = options
|
|
21
|
-
}, [options
|
|
22
|
-
/* ──────────────
|
|
39
|
+
reverseRef.current = options.reverse;
|
|
40
|
+
}, [options.reverse]);
|
|
41
|
+
/* ────────────── utilities ────────────── */
|
|
23
42
|
const log = (...a) => {
|
|
24
|
-
if (!options
|
|
43
|
+
if (!options.debug)
|
|
25
44
|
return;
|
|
26
45
|
if (typeof options.debug === "boolean")
|
|
27
46
|
console.log(...a);
|
|
@@ -32,225 +51,159 @@ export const useQuery = (db, options) => {
|
|
|
32
51
|
allRef.current = combined;
|
|
33
52
|
setAll(combined);
|
|
34
53
|
};
|
|
35
|
-
const reset = (
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
iteratorRef.current = null;
|
|
54
|
+
const reset = () => {
|
|
55
|
+
iteratorRefs.current.forEach(({ iterator }) => iterator.close());
|
|
56
|
+
iteratorRefs.current = [];
|
|
41
57
|
closeControllerRef.current?.abort();
|
|
42
58
|
closeControllerRef.current = new AbortController();
|
|
43
59
|
emptyResultsRef.current = false;
|
|
44
|
-
|
|
60
|
+
waitedOnceRef.current = false;
|
|
45
61
|
allRef.current = [];
|
|
46
62
|
setAll([]);
|
|
47
63
|
setIsLoading(false);
|
|
48
|
-
|
|
49
|
-
log("Iterator reset", toClose?.id, fromRef?.id);
|
|
50
|
-
setId(undefined);
|
|
64
|
+
log("Iterators reset");
|
|
51
65
|
};
|
|
66
|
+
/* ────────── rebuild iterators when db list / query etc. change ────────── */
|
|
52
67
|
useEffect(() => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
reset(null);
|
|
68
|
+
/* derive canonical list of open DBs */
|
|
69
|
+
const openDbs = dbs.filter((d) => Boolean(d && !d.closed));
|
|
70
|
+
const { query, resolve } = options;
|
|
71
|
+
if (!openDbs.length || query == null) {
|
|
72
|
+
reset();
|
|
59
73
|
return;
|
|
60
74
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
waitFor: options.remote.joining?.waitFor ??
|
|
73
|
-
5e3,
|
|
74
|
-
onMissedResults: ({ amount }) => {
|
|
75
|
-
loadMore(amount, true);
|
|
76
|
-
},
|
|
77
|
-
}
|
|
78
|
-
: undefined,
|
|
79
|
-
};
|
|
80
|
-
const ref = {
|
|
81
|
-
id,
|
|
82
|
-
iterator: db.index.iterate(options.query ?? {}, {
|
|
83
|
-
local: options?.local ?? true,
|
|
84
|
-
remote: remoteQueryOptions,
|
|
85
|
-
resolve: options?.resolve,
|
|
86
|
-
signal: closeControllerRef.current?.signal,
|
|
87
|
-
}),
|
|
88
|
-
itemsConsumed: 0,
|
|
89
|
-
};
|
|
90
|
-
iteratorRef.current = ref;
|
|
91
|
-
if (options?.prefetch) {
|
|
92
|
-
loadMore();
|
|
93
|
-
}
|
|
94
|
-
setId(id);
|
|
95
|
-
log("Iterator initialised", ref.id);
|
|
75
|
+
reset();
|
|
76
|
+
const abortSignal = closeControllerRef.current?.signal;
|
|
77
|
+
iteratorRefs.current = openDbs.map((db) => {
|
|
78
|
+
const iterator = db.index.iterate(query ?? {}, {
|
|
79
|
+
local: options.local ?? true,
|
|
80
|
+
remote: options.remote ?? undefined,
|
|
81
|
+
resolve,
|
|
82
|
+
signal: abortSignal,
|
|
83
|
+
});
|
|
84
|
+
const ref = { id: uuid(), db, iterator, itemsConsumed: 0 };
|
|
85
|
+
log("Iterator init", ref.id, "db", db.address);
|
|
96
86
|
return ref;
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
log("Merge change", e.detail, "iterator", newIteratorRef.id);
|
|
108
|
-
const filtered = await mergeFn(e.detail);
|
|
109
|
-
if (!filtered ||
|
|
110
|
-
(filtered.added.length === 0 &&
|
|
111
|
-
filtered.removed.length === 0))
|
|
112
|
-
return;
|
|
113
|
-
let merged;
|
|
114
|
-
if (options.onChange?.update) {
|
|
115
|
-
merged = [
|
|
116
|
-
...options.onChange?.update(allRef.current, filtered),
|
|
117
|
-
];
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
merged = await db.index.updateResults(allRef.current, filtered, options.query || {}, options.resolve ?? true);
|
|
121
|
-
log("After update", allRef.current, merged);
|
|
122
|
-
const expectedDiff = filtered.added.length - filtered.removed.length;
|
|
123
|
-
if (merged === allRef.current ||
|
|
124
|
-
(expectedDiff !== 0 &&
|
|
125
|
-
merged.length === allRef.current.length)) {
|
|
126
|
-
// no change
|
|
127
|
-
log("no change after merge");
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
updateAll(options?.reverse ? merged.reverse() : merged);
|
|
132
|
-
};
|
|
133
|
-
db.events.addEventListener("change", handleChange);
|
|
134
|
-
}
|
|
135
|
-
return () => {
|
|
136
|
-
handleChange &&
|
|
137
|
-
db.events.removeEventListener("change", handleChange);
|
|
138
|
-
reset(newIteratorRef);
|
|
139
|
-
};
|
|
140
|
-
}, [
|
|
141
|
-
db?.closed ? undefined : db?.address,
|
|
142
|
-
options?.id ?? options?.query,
|
|
143
|
-
options?.resolve,
|
|
144
|
-
options?.reverse,
|
|
145
|
-
]);
|
|
146
|
-
/* ────────────── loadMore (once-wait aware) ────────────── */
|
|
147
|
-
const batchSize = options?.batchSize ?? 10;
|
|
87
|
+
});
|
|
88
|
+
/* prefetch if requested */
|
|
89
|
+
if (options.prefetch)
|
|
90
|
+
void loadMore();
|
|
91
|
+
/* store a deterministic id (useful for external keys) */
|
|
92
|
+
setId(uuid());
|
|
93
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
94
|
+
}, [dbs.map((d) => d?.address).join("|"), options.query, options.resolve, options.reverse]);
|
|
95
|
+
/* ────────────── loadMore implementation ────────────── */
|
|
96
|
+
const batchSize = options.batchSize ?? 10;
|
|
148
97
|
const shouldWait = () => {
|
|
149
|
-
if (waitedOnceRef.current)
|
|
98
|
+
if (waitedOnceRef.current)
|
|
150
99
|
return false;
|
|
151
|
-
|
|
152
|
-
if (options?.remote === false)
|
|
100
|
+
if (options.remote === false)
|
|
153
101
|
return false;
|
|
154
|
-
if
|
|
155
|
-
return true;
|
|
156
|
-
if (options?.remote == null)
|
|
157
|
-
return true;
|
|
158
|
-
if (typeof options?.remote === "object") {
|
|
159
|
-
return true;
|
|
160
|
-
}
|
|
161
|
-
return true;
|
|
102
|
+
return true; // mimic original behaviour – wait once if remote allowed
|
|
162
103
|
};
|
|
163
104
|
const markWaited = () => {
|
|
164
105
|
waitedOnceRef.current = true;
|
|
165
106
|
};
|
|
166
|
-
const loadMore = async (n = batchSize
|
|
167
|
-
const
|
|
168
|
-
if (!
|
|
169
|
-
(emptyResultsRef.current && !pollEvenIfWasEmpty) ||
|
|
170
|
-
iterator.iterator.done() ||
|
|
171
|
-
loadingMoreRef.current) {
|
|
107
|
+
const loadMore = async (n = batchSize) => {
|
|
108
|
+
const iterators = iteratorRefs.current;
|
|
109
|
+
if (!iterators.length || emptyResultsRef.current)
|
|
172
110
|
return false;
|
|
173
|
-
}
|
|
174
111
|
setIsLoading(true);
|
|
175
|
-
loadingMoreRef.current = true;
|
|
176
112
|
try {
|
|
177
|
-
/*
|
|
113
|
+
/* one-time replicator warm-up across all DBs */
|
|
178
114
|
if (shouldWait()) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
e instanceof NoPeersError)
|
|
194
|
-
return;
|
|
195
|
-
console.warn("Remote replicators not ready", e);
|
|
196
|
-
})
|
|
197
|
-
.finally(() => {
|
|
198
|
-
log("Wait for replicators done", iterator.id, "time", Date.now() - t0);
|
|
199
|
-
markWaited();
|
|
200
|
-
});
|
|
115
|
+
if (typeof options.remote === "object" && options.remote.warmup) {
|
|
116
|
+
await Promise.all(iterators.map(async ({ db }) => {
|
|
117
|
+
try {
|
|
118
|
+
await db.log.waitForReplicators({
|
|
119
|
+
timeout: options.remote.warmup,
|
|
120
|
+
signal: closeControllerRef.current?.signal,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
if (e instanceof AbortError || e instanceof NoPeersError)
|
|
125
|
+
return;
|
|
126
|
+
console.warn("Remote replicators not ready", e);
|
|
127
|
+
}
|
|
128
|
+
}));
|
|
201
129
|
}
|
|
130
|
+
markWaited();
|
|
202
131
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
/* iterator might have been reset while we were async… */
|
|
215
|
-
if (iteratorRef.current !== iterator) {
|
|
216
|
-
log("Iterator reset while loading more");
|
|
217
|
-
return false;
|
|
132
|
+
/* pull items round-robin */
|
|
133
|
+
const newlyFetched = [];
|
|
134
|
+
for (const ref of iterators) {
|
|
135
|
+
if (ref.iterator.done())
|
|
136
|
+
continue;
|
|
137
|
+
const batch = await ref.iterator.next(n); // pull up to <n> at once
|
|
138
|
+
if (batch.length) {
|
|
139
|
+
ref.itemsConsumed += batch.length;
|
|
140
|
+
newlyFetched.push(...batch);
|
|
141
|
+
}
|
|
218
142
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
log("Loaded more items for iterator", iterator.id, "current id", iteratorRef.current?.id, "new items", newItems.length, "previous results", allRef.current.length, "batchSize", batchSize, "items consumed", iterator.itemsConsumed);
|
|
223
|
-
const prev = allRef.current;
|
|
224
|
-
const dedup = new Set(prev.map((x) => x.__context.head));
|
|
225
|
-
const unique = newItems.filter((x) => !dedup.has(x.__context.head));
|
|
226
|
-
if (!unique.length)
|
|
227
|
-
return;
|
|
228
|
-
const combined = reverseRef.current
|
|
229
|
-
? [...unique.reverse(), ...prev]
|
|
230
|
-
: [...prev, ...unique];
|
|
231
|
-
updateAll(combined);
|
|
143
|
+
if (!newlyFetched.length) {
|
|
144
|
+
emptyResultsRef.current = iterators.every((i) => i.iterator.done());
|
|
145
|
+
return !emptyResultsRef.current;
|
|
232
146
|
}
|
|
233
|
-
|
|
234
|
-
|
|
147
|
+
/* optional transform */
|
|
148
|
+
let processed = newlyFetched;
|
|
149
|
+
if (options.transform) {
|
|
150
|
+
processed = await Promise.all(processed.map(options.transform));
|
|
235
151
|
}
|
|
236
|
-
|
|
152
|
+
/* deduplicate & merge */
|
|
153
|
+
const prev = allRef.current;
|
|
154
|
+
const dedupHeads = new Set(prev.map((x) => x.__context.head));
|
|
155
|
+
const unique = processed.filter((x) => !dedupHeads.has(x.__context.head));
|
|
156
|
+
if (!unique.length)
|
|
157
|
+
return !iterators.every((i) => i.iterator.done());
|
|
158
|
+
const combined = reverseRef.current ? [...unique.reverse(), ...prev] : [...prev, ...unique];
|
|
159
|
+
updateAll(combined);
|
|
160
|
+
emptyResultsRef.current = iterators.every((i) => i.iterator.done());
|
|
161
|
+
return !emptyResultsRef.current;
|
|
237
162
|
}
|
|
238
163
|
catch (e) {
|
|
239
164
|
if (!(e instanceof ClosedError))
|
|
240
165
|
throw e;
|
|
166
|
+
return false;
|
|
241
167
|
}
|
|
242
168
|
finally {
|
|
243
169
|
setIsLoading(false);
|
|
244
|
-
loadingMoreRef.current = false;
|
|
245
170
|
}
|
|
246
171
|
};
|
|
247
|
-
/* ──────────────
|
|
172
|
+
/* ────────────── live-merge listeners ────────────── */
|
|
173
|
+
useEffect(() => {
|
|
174
|
+
if (!options.onChange || options.onChange.merge === false)
|
|
175
|
+
return;
|
|
176
|
+
const listeners = iteratorRefs.current.map(({ db, id: itId }) => {
|
|
177
|
+
const mergeFn = typeof options.onChange?.merge === "function" ? options.onChange.merge : (c) => c;
|
|
178
|
+
const handler = async (e) => {
|
|
179
|
+
log("Merge change", e.detail, "it", itId);
|
|
180
|
+
const filtered = await mergeFn(e.detail);
|
|
181
|
+
if (!filtered || (!filtered.added.length && !filtered.removed.length))
|
|
182
|
+
return;
|
|
183
|
+
let merged;
|
|
184
|
+
if (options.onChange?.update) {
|
|
185
|
+
merged = await options.onChange.update(allRef.current, filtered);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
merged = await db.index.updateResults(allRef.current, filtered, options.query || {}, options.resolve ?? true);
|
|
189
|
+
}
|
|
190
|
+
updateAll(options.reverse ? merged.reverse() : merged);
|
|
191
|
+
};
|
|
192
|
+
db.events.addEventListener("change", handler);
|
|
193
|
+
return { db, handler };
|
|
194
|
+
});
|
|
195
|
+
return () => {
|
|
196
|
+
listeners.forEach(({ db, handler }) => db.events.removeEventListener("change", handler));
|
|
197
|
+
};
|
|
198
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
199
|
+
}, [iteratorRefs.current.map((r) => r.db.address).join("|"), options.onChange]);
|
|
200
|
+
/* ────────────── public API – unchanged from the caller's perspective ────────────── */
|
|
248
201
|
return {
|
|
249
202
|
items: all,
|
|
250
203
|
loadMore,
|
|
251
204
|
isLoading,
|
|
252
205
|
empty: () => emptyResultsRef.current,
|
|
253
|
-
id
|
|
206
|
+
id,
|
|
254
207
|
};
|
|
255
208
|
};
|
|
256
209
|
//# sourceMappingURL=useQuery.js.map
|