@peerbit/shared-log 13.2.24 → 13.2.26
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/dist/src/checked-prune.d.ts +12 -0
- package/dist/src/checked-prune.d.ts.map +1 -1
- package/dist/src/checked-prune.js +33 -0
- package/dist/src/checked-prune.js.map +1 -1
- package/dist/src/coordinate-persistence.d.ts +211 -0
- package/dist/src/coordinate-persistence.d.ts.map +1 -0
- package/dist/src/coordinate-persistence.js +1133 -0
- package/dist/src/coordinate-persistence.js.map +1 -0
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +19 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +127 -133
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1400 -4269
- package/dist/src/index.js.map +1 -1
- package/dist/src/instance-lifecycle.d.ts +117 -0
- package/dist/src/instance-lifecycle.d.ts.map +1 -0
- package/dist/src/instance-lifecycle.js +254 -0
- package/dist/src/instance-lifecycle.js.map +1 -0
- package/dist/src/join-warmup.d.ts +86 -0
- package/dist/src/join-warmup.d.ts.map +1 -0
- package/dist/src/join-warmup.js +351 -0
- package/dist/src/join-warmup.js.map +1 -0
- package/dist/src/native-write-through-block-store.d.ts +123 -0
- package/dist/src/native-write-through-block-store.d.ts.map +1 -0
- package/dist/src/native-write-through-block-store.js +989 -0
- package/dist/src/native-write-through-block-store.js.map +1 -0
- package/dist/src/peer-session.d.ts +117 -0
- package/dist/src/peer-session.d.ts.map +1 -0
- package/dist/src/peer-session.js +259 -0
- package/dist/src/peer-session.js.map +1 -0
- package/dist/src/replication-announcement.d.ts +116 -0
- package/dist/src/replication-announcement.d.ts.map +1 -0
- package/dist/src/replication-announcement.js +515 -0
- package/dist/src/replication-announcement.js.map +1 -0
- package/dist/src/replicator-liveness.d.ts +59 -0
- package/dist/src/replicator-liveness.d.ts.map +1 -0
- package/dist/src/replicator-liveness.js +304 -0
- package/dist/src/replicator-liveness.js.map +1 -0
- package/dist/src/sync/dispatch-lifecycle.d.ts +48 -0
- package/dist/src/sync/dispatch-lifecycle.d.ts.map +1 -0
- package/dist/src/sync/dispatch-lifecycle.js +141 -0
- package/dist/src/sync/dispatch-lifecycle.js.map +1 -0
- package/dist/src/sync/factory.d.ts +29 -0
- package/dist/src/sync/factory.d.ts.map +1 -0
- package/dist/src/sync/factory.js +87 -0
- package/dist/src/sync/factory.js.map +1 -0
- package/dist/src/sync/pending-sync-store.d.ts +105 -0
- package/dist/src/sync/pending-sync-store.d.ts.map +1 -0
- package/dist/src/sync/pending-sync-store.js +877 -0
- package/dist/src/sync/pending-sync-store.js.map +1 -0
- package/dist/src/sync/rateless-iblt.d.ts +4 -1
- package/dist/src/sync/rateless-iblt.d.ts.map +1 -1
- package/dist/src/sync/rateless-iblt.js +102 -106
- package/dist/src/sync/rateless-iblt.js.map +1 -1
- package/dist/src/sync/simple.d.ts +10 -41
- package/dist/src/sync/simple.d.ts.map +1 -1
- package/dist/src/sync/simple.js +259 -952
- package/dist/src/sync/simple.js.map +1 -1
- package/dist/src/sync/sync-peer-state.d.ts +16 -0
- package/dist/src/sync/sync-peer-state.d.ts.map +1 -0
- package/dist/src/sync/sync-peer-state.js +82 -0
- package/dist/src/sync/sync-peer-state.js.map +1 -0
- package/package.json +12 -12
- package/src/checked-prune.ts +35 -0
- package/src/coordinate-persistence.ts +1796 -0
- package/src/errors.ts +21 -0
- package/src/index.ts +4014 -7858
- package/src/instance-lifecycle.ts +351 -0
- package/src/join-warmup.ts +507 -0
- package/src/native-write-through-block-store.ts +1170 -0
- package/src/peer-session.ts +336 -0
- package/src/replication-announcement.ts +744 -0
- package/src/replicator-liveness.ts +439 -0
- package/src/sync/dispatch-lifecycle.ts +230 -0
- package/src/sync/factory.ts +154 -0
- package/src/sync/pending-sync-store.ts +1085 -0
- package/src/sync/rateless-iblt.ts +122 -132
- package/src/sync/simple.ts +334 -1144
- package/src/sync/sync-peer-state.ts +107 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { logger as loggerFn } from "@peerbit/logger";
|
|
2
|
+
import { waitForSubscribers } from "@peerbit/pubsub";
|
|
3
|
+
import { ACK_CONTROL_PRIORITY, AcknowledgeDelivery, } from "@peerbit/stream-interface";
|
|
4
|
+
import { isNotStartedError } from "./errors.js";
|
|
5
|
+
import { ReplicationPingMessage } from "./replication.js";
|
|
6
|
+
const logger = loggerFn("peerbit:shared-log");
|
|
7
|
+
// In sparse topologies (browser/relay), peers can learn about replicators via broadcast
|
|
8
|
+
// replication announcements without having a direct connection that emits unsubscribe
|
|
9
|
+
// on abrupt churn. Probe conservatively so a single missed ACK does not evict a
|
|
10
|
+
// healthy replicator, and rely on replication-info refresh to recover membership.
|
|
11
|
+
const REPLICATOR_LIVENESS_SWEEP_INTERVAL_MS = 2_000;
|
|
12
|
+
const REPLICATOR_LIVENESS_IDLE_THRESHOLD_MS = 8_000;
|
|
13
|
+
const REPLICATOR_LIVENESS_PROBE_FAILURES_TO_EVICT = 2;
|
|
14
|
+
export class ReplicatorLivenessMonitor {
|
|
15
|
+
deps;
|
|
16
|
+
_replicatorLivenessSweepRunning;
|
|
17
|
+
_replicatorLivenessTimer;
|
|
18
|
+
_replicatorLivenessTargets;
|
|
19
|
+
_replicatorLivenessTargetsSize;
|
|
20
|
+
_replicatorLivenessCursor;
|
|
21
|
+
_replicatorLivenessFailures;
|
|
22
|
+
_replicatorLastActivityAt;
|
|
23
|
+
constructor(deps) {
|
|
24
|
+
this.deps = deps;
|
|
25
|
+
this._replicatorLivenessSweepRunning = false;
|
|
26
|
+
this._replicatorLivenessTargets = [];
|
|
27
|
+
this._replicatorLivenessTargetsSize = 0;
|
|
28
|
+
this._replicatorLivenessCursor = 0;
|
|
29
|
+
this._replicatorLivenessFailures = new Map();
|
|
30
|
+
this._replicatorLastActivityAt = new Map();
|
|
31
|
+
}
|
|
32
|
+
resetForOpen() {
|
|
33
|
+
this._replicatorLivenessSweepRunning = false;
|
|
34
|
+
this._replicatorLivenessTimer = undefined;
|
|
35
|
+
this._replicatorLivenessTargets = [];
|
|
36
|
+
this._replicatorLivenessTargetsSize = 0;
|
|
37
|
+
this._replicatorLivenessCursor = 0;
|
|
38
|
+
this._replicatorLivenessFailures = new Map();
|
|
39
|
+
this._replicatorLastActivityAt = new Map();
|
|
40
|
+
}
|
|
41
|
+
startReplicatorLivenessSweep() {
|
|
42
|
+
if (this._replicatorLivenessTimer) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this._replicatorLivenessTimer = setInterval(() => {
|
|
46
|
+
void this.runReplicatorLivenessSweep();
|
|
47
|
+
}, REPLICATOR_LIVENESS_SWEEP_INTERVAL_MS);
|
|
48
|
+
this._replicatorLivenessTimer.unref?.();
|
|
49
|
+
}
|
|
50
|
+
stopReplicatorLivenessSweep() {
|
|
51
|
+
if (this._replicatorLivenessTimer) {
|
|
52
|
+
clearInterval(this._replicatorLivenessTimer);
|
|
53
|
+
this._replicatorLivenessTimer = undefined;
|
|
54
|
+
}
|
|
55
|
+
this._replicatorLivenessSweepRunning = false;
|
|
56
|
+
this._replicatorLivenessTargets = [];
|
|
57
|
+
this._replicatorLivenessTargetsSize = 0;
|
|
58
|
+
this._replicatorLivenessCursor = 0;
|
|
59
|
+
this._replicatorLivenessFailures.clear();
|
|
60
|
+
this._replicatorLastActivityAt.clear();
|
|
61
|
+
}
|
|
62
|
+
rebuildReplicatorLivenessTargets() {
|
|
63
|
+
const selfHash = this.deps.getSelfHash();
|
|
64
|
+
this._replicatorLivenessTargets = [
|
|
65
|
+
...this.deps.getUniqueReplicators(),
|
|
66
|
+
].filter((hash) => hash !== selfHash);
|
|
67
|
+
this._replicatorLivenessTargetsSize = this.deps.getUniqueReplicators().size;
|
|
68
|
+
if (this._replicatorLivenessCursor >= this._replicatorLivenessTargets.length) {
|
|
69
|
+
this._replicatorLivenessCursor = 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
getReplicatorLivenessTargets() {
|
|
73
|
+
const selfHash = this.deps.getSelfHash();
|
|
74
|
+
const uniqueReplicators = this.deps.getUniqueReplicators();
|
|
75
|
+
const expected = uniqueReplicators.size - (uniqueReplicators.has(selfHash) ? 1 : 0);
|
|
76
|
+
if (this._replicatorLivenessTargets.length > 0) {
|
|
77
|
+
// Keep the cursor stable, but purge stale hashes (membership can change while
|
|
78
|
+
// the total size stays constant).
|
|
79
|
+
this._replicatorLivenessTargets = this._replicatorLivenessTargets.filter((hash) => hash !== selfHash && uniqueReplicators.has(hash));
|
|
80
|
+
}
|
|
81
|
+
if (this._replicatorLivenessTargetsSize !== uniqueReplicators.size ||
|
|
82
|
+
this._replicatorLivenessTargets.length !== expected) {
|
|
83
|
+
this.rebuildReplicatorLivenessTargets();
|
|
84
|
+
}
|
|
85
|
+
return this._replicatorLivenessTargets;
|
|
86
|
+
}
|
|
87
|
+
markReplicatorActivity(peerHash, now = Date.now()) {
|
|
88
|
+
this._replicatorLastActivityAt.set(peerHash, now);
|
|
89
|
+
// Any recent authenticated activity is positive liveness evidence. Reset the
|
|
90
|
+
// consecutive miss streak immediately, including while an eviction is
|
|
91
|
+
// waiting in the per-peer mutation lane.
|
|
92
|
+
if (Date.now() - now < REPLICATOR_LIVENESS_IDLE_THRESHOLD_MS) {
|
|
93
|
+
this._replicatorLivenessFailures.delete(peerHash);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
hasRecentReplicatorActivity(peerHash, now = Date.now()) {
|
|
97
|
+
const lastActivityAt = this._replicatorLastActivityAt.get(peerHash);
|
|
98
|
+
if (lastActivityAt != null &&
|
|
99
|
+
now - lastActivityAt < REPLICATOR_LIVENESS_IDLE_THRESHOLD_MS) {
|
|
100
|
+
this._replicatorLivenessFailures.delete(peerHash);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
async evictReplicatorFromLiveness(peerHash, publicKey, replicationLifecycleController, subscriptionEpoch, observedActivityAt) {
|
|
106
|
+
try {
|
|
107
|
+
await this.deps.removeReplicator(publicKey, {
|
|
108
|
+
noEvent: true,
|
|
109
|
+
replicationLifecycleController,
|
|
110
|
+
shouldRemove: () => this._replicatorLastActivityAt.get(peerHash) === observedActivityAt,
|
|
111
|
+
subscriptionEpoch,
|
|
112
|
+
onRemoved: ({ wasReplicator }) => {
|
|
113
|
+
if (wasReplicator) {
|
|
114
|
+
this.deps.getPendingReplicatorLeaveByPeer().add(peerHash);
|
|
115
|
+
}
|
|
116
|
+
// A newer subscription/lifecycle may have started while the admitted
|
|
117
|
+
// removal was completing. Its reconnect barrier owns all later effects.
|
|
118
|
+
if (!this.deps.isReplicationLifecycleActive(replicationLifecycleController) ||
|
|
119
|
+
!this.deps.isPeerSessionCurrent(peerHash, subscriptionEpoch)) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (this.deps.getPendingReplicatorLeaveByPeer().delete(peerHash)) {
|
|
123
|
+
this.deps.dispatchReplicatorLeave(publicKey);
|
|
124
|
+
}
|
|
125
|
+
if (!this.deps.isBlockedPeer(peerHash)) {
|
|
126
|
+
this.deps.scheduleReplicationInfoRequests(publicKey, replicationLifecycleController);
|
|
127
|
+
}
|
|
128
|
+
this._replicatorLivenessTargetsSize = -1;
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (!isNotStartedError(error)) {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async runReplicatorLivenessSweep() {
|
|
139
|
+
const replicationLifecycleController = this.deps.getReplicationLifecycleController();
|
|
140
|
+
if (this.deps.isClosed() ||
|
|
141
|
+
this.deps.getCloseSignal().aborted ||
|
|
142
|
+
!this.deps.isReplicationLifecycleActive(replicationLifecycleController)) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (this._replicatorLivenessSweepRunning) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const targets = this.getReplicatorLivenessTargets();
|
|
149
|
+
if (targets.length === 0) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this._replicatorLivenessSweepRunning = true;
|
|
153
|
+
try {
|
|
154
|
+
if (this._replicatorLivenessCursor >= targets.length) {
|
|
155
|
+
this._replicatorLivenessCursor = 0;
|
|
156
|
+
}
|
|
157
|
+
const peerHash = targets[this._replicatorLivenessCursor];
|
|
158
|
+
this._replicatorLivenessCursor =
|
|
159
|
+
(this._replicatorLivenessCursor + 1) % targets.length;
|
|
160
|
+
await this.deps.probeReplicatorLiveness(peerHash);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (!isNotStartedError(error)) {
|
|
164
|
+
logger.error(error?.toString?.() ?? String(error));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
if (this.deps.getReplicationLifecycleController() ===
|
|
169
|
+
replicationLifecycleController) {
|
|
170
|
+
this._replicatorLivenessSweepRunning = false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async probeReplicatorLiveness(peerHash) {
|
|
175
|
+
const replicationLifecycleController = this.deps.getReplicationLifecycleController();
|
|
176
|
+
if (this.deps.isClosed() ||
|
|
177
|
+
this.deps.getCloseSignal().aborted ||
|
|
178
|
+
!replicationLifecycleController ||
|
|
179
|
+
!this.deps.isReplicationLifecycleActive(replicationLifecycleController)) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const subscriptionEpoch = this.deps.getPeerSession(peerHash);
|
|
183
|
+
const ownsProbe = () => this.deps.isReplicationLifecycleActive(replicationLifecycleController) &&
|
|
184
|
+
this.deps.isPeerSessionCurrent(peerHash, subscriptionEpoch);
|
|
185
|
+
if (!this.deps.getUniqueReplicators().has(peerHash)) {
|
|
186
|
+
this._replicatorLivenessFailures.delete(peerHash);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (this.hasRecentReplicatorActivity(peerHash)) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const observedActivityAt = this._replicatorLastActivityAt.get(peerHash);
|
|
193
|
+
const publicKey = await this.deps.resolvePublicKeyFromHash(peerHash);
|
|
194
|
+
if (!ownsProbe()) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (this.hasRecentReplicatorActivity(peerHash)) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (!publicKey) {
|
|
201
|
+
try {
|
|
202
|
+
await this.deps.removeReplicator(peerHash, {
|
|
203
|
+
noEvent: true,
|
|
204
|
+
replicationLifecycleController,
|
|
205
|
+
shouldRemove: () => this._replicatorLastActivityAt.get(peerHash) === observedActivityAt,
|
|
206
|
+
subscriptionEpoch,
|
|
207
|
+
onRemoved: () => {
|
|
208
|
+
if (!ownsProbe()) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
this._replicatorLivenessTargetsSize = -1;
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (!isNotStartedError(error)) {
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
// Explicit ping (ACKed) instead of RequestReplicationInfoMessage to avoid
|
|
224
|
+
// triggering large segment snapshots just to prove liveness.
|
|
225
|
+
await this.deps.getRpc().send(new ReplicationPingMessage(), {
|
|
226
|
+
mode: new AcknowledgeDelivery({ redundancy: 1, to: [publicKey] }),
|
|
227
|
+
priority: ACK_CONTROL_PRIORITY,
|
|
228
|
+
responsePriority: ACK_CONTROL_PRIORITY,
|
|
229
|
+
});
|
|
230
|
+
if (!ownsProbe()) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
this.deps.markReplicatorActivity(peerHash);
|
|
234
|
+
this._replicatorLivenessFailures.delete(peerHash);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
if (isNotStartedError(error)) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (!ownsProbe()) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (this.hasRecentReplicatorActivity(peerHash)) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
// Relay-backed prod paths can keep a peer subscribed/reachable even if an
|
|
249
|
+
// ACKed liveness ping gets delayed or dropped under load. Treat observed
|
|
250
|
+
// topic presence as a positive liveness signal before evicting the peer.
|
|
251
|
+
if (await this.deps.confirmReplicatorSubscriberPresence(peerHash)) {
|
|
252
|
+
if (!ownsProbe()) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
this.deps.markReplicatorActivity(peerHash);
|
|
256
|
+
this._replicatorLivenessFailures.delete(peerHash);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (!ownsProbe()) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (this.hasRecentReplicatorActivity(peerHash)) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const failures = (this._replicatorLivenessFailures.get(peerHash) ?? 0) + 1;
|
|
266
|
+
this._replicatorLivenessFailures.set(peerHash, failures);
|
|
267
|
+
this.deps.scheduleReplicationInfoRequests(publicKey, replicationLifecycleController);
|
|
268
|
+
if (failures < REPLICATOR_LIVENESS_PROBE_FAILURES_TO_EVICT) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (!ownsProbe() || !this.deps.getUniqueReplicators().has(peerHash)) {
|
|
272
|
+
this._replicatorLivenessFailures.delete(peerHash);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
await this.evictReplicatorFromLiveness(peerHash, publicKey, replicationLifecycleController, subscriptionEpoch, observedActivityAt);
|
|
276
|
+
}
|
|
277
|
+
async confirmReplicatorSubscriberPresence(peerHash) {
|
|
278
|
+
try {
|
|
279
|
+
const subscribers = await this.deps.getTopicSubscribers(this.deps.getRpc().topic);
|
|
280
|
+
if (subscribers?.some((subscriber) => subscriber.hashcode() === peerHash)) {
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
if (isNotStartedError(error)) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
await waitForSubscribers(this.deps.getNode(), peerHash, this.deps.getRpc().topic, {
|
|
291
|
+
signal: this.deps.getCloseSignal(),
|
|
292
|
+
timeout: Math.max(1_000, Math.min(5_000, Math.floor(this.deps.getWaitForReplicatorTimeout() / 4))),
|
|
293
|
+
});
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
if (isNotStartedError(error)) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=replicator-liveness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replicator-liveness.js","sourceRoot":"","sources":["../../src/replicator-liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface DispatchTargetLifecycleBase<LC> {
|
|
2
|
+
lifecycle: LC;
|
|
3
|
+
target: string;
|
|
4
|
+
controller: AbortController;
|
|
5
|
+
}
|
|
6
|
+
export interface DispatchLifecycleBase<TL> {
|
|
7
|
+
ownershipLifecycleController: AbortController;
|
|
8
|
+
callerSignal?: AbortSignal;
|
|
9
|
+
controller: AbortController;
|
|
10
|
+
targets: Map<string, TL>;
|
|
11
|
+
onOwnerOrCallerAbort: () => void;
|
|
12
|
+
dispatchFinished: boolean;
|
|
13
|
+
disposed: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type DispatchLifecycleRegistryDeps<LC extends DispatchLifecycleBase<TL>, TL extends DispatchTargetLifecycleBase<LC>> = {
|
|
16
|
+
isClosed: () => boolean;
|
|
17
|
+
currentOwnershipLifecycleController: () => AbortController;
|
|
18
|
+
hasRetainedWork: (lifecycle: LC) => boolean;
|
|
19
|
+
isTargetCurrent: (targetLifecycle: TL) => boolean;
|
|
20
|
+
onTargetAborted?: (targetLifecycle: TL) => void;
|
|
21
|
+
};
|
|
22
|
+
export declare class DispatchLifecycleRegistry<LC extends DispatchLifecycleBase<TL>, TL extends DispatchTargetLifecycleBase<LC>> {
|
|
23
|
+
private readonly deps;
|
|
24
|
+
readonly activeTargets: Map<string, Set<TL>>;
|
|
25
|
+
constructor(deps: DispatchLifecycleRegistryDeps<LC, TL>);
|
|
26
|
+
register(lifecycle: LC, targets: string[], createTargetLifecycle: (lifecycle: LC, target: string) => TL | undefined, onTargetRegistered?: (targetLifecycle: TL) => void): void;
|
|
27
|
+
abortTarget(targetLifecycle: TL, reason?: unknown): void;
|
|
28
|
+
abortLifecycle(lifecycle: LC, reason?: unknown): void;
|
|
29
|
+
finish(lifecycle: LC): void;
|
|
30
|
+
maybeDispose(lifecycle: LC): void;
|
|
31
|
+
isLifecycleActive(lifecycle: LC, target?: string): boolean;
|
|
32
|
+
getSignal(lifecycle: LC, target: string): AbortSignal;
|
|
33
|
+
}
|
|
34
|
+
export declare const isOwnershipGenerationActive: (properties: {
|
|
35
|
+
closed: boolean;
|
|
36
|
+
ownershipLifecycleController: AbortController;
|
|
37
|
+
currentOwnershipLifecycleController: AbortController;
|
|
38
|
+
}) => boolean;
|
|
39
|
+
export declare const isTrackedSessionActive: <TSession>(properties: {
|
|
40
|
+
closed: boolean;
|
|
41
|
+
cancelled: boolean;
|
|
42
|
+
sessionController: AbortController;
|
|
43
|
+
ownershipLifecycleController: AbortController;
|
|
44
|
+
currentOwnershipLifecycleController: AbortController;
|
|
45
|
+
session: TSession;
|
|
46
|
+
registered: TSession | undefined;
|
|
47
|
+
}) => boolean;
|
|
48
|
+
//# sourceMappingURL=dispatch-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/sync/dispatch-lifecycle.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,2BAA2B,CAAC,EAAE;IAC9C,SAAS,EAAE,EAAE,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB,CAAC,EAAE;IACxC,4BAA4B,EAAE,eAAe,CAAC;IAC9C,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzB,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,6BAA6B,CACxC,EAAE,SAAS,qBAAqB,CAAC,EAAE,CAAC,EACpC,EAAE,SAAS,2BAA2B,CAAC,EAAE,CAAC,IACvC;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,mCAAmC,EAAE,MAAM,eAAe,CAAC;IAE3D,eAAe,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,OAAO,CAAC;IAE5C,eAAe,EAAE,CAAC,eAAe,EAAE,EAAE,KAAK,OAAO,CAAC;IAGlD,eAAe,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,KAAK,IAAI,CAAC;CAChD,CAAC;AAEF,qBAAa,yBAAyB,CACrC,EAAE,SAAS,qBAAqB,CAAC,EAAE,CAAC,EACpC,EAAE,SAAS,2BAA2B,CAAC,EAAE,CAAC;IAI9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAa;gBAE5B,IAAI,EAAE,6BAA6B,CAAC,EAAE,EAAE,EAAE,CAAC;IAOxE,QAAQ,CACP,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,qBAAqB,EAAE,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE,GAAG,SAAS,EACxE,kBAAkB,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,KAAK,IAAI,GAChD,IAAI;IA0CP,WAAW,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAQxD,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAUrD,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI;IAK3B,YAAY,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI;IA+BjC,iBAAiB,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAuB1D,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW;CAMrD;AAMD,eAAO,MAAM,2BAA2B,GAAI,YAAY;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,4BAA4B,EAAE,eAAe,CAAC;IAC9C,mCAAmC,EAAE,eAAe,CAAC;CACrD,KAAG,OAIoD,CAAC;AAOzD,eAAO,MAAM,sBAAsB,GAAI,QAAQ,EAAE,YAAY;IAC5D,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,eAAe,CAAC;IACnC,4BAA4B,EAAE,eAAe,CAAC;IAC9C,mCAAmC,EAAE,eAAe,CAAC;IACrD,OAAO,EAAE,QAAQ,CAAC;IAClB,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;CACjC,KAAG,OAOyC,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Shared dispatch-lifecycle registry for the sync module (stage-4 sync
|
|
2
|
+
// unification). The simple and rateless synchronizers used to carry
|
|
3
|
+
// near-verbatim copies of the capture/abort/finish/dispose/isActive
|
|
4
|
+
// lifecycle machinery; this registry hosts the shared mechanics and keeps
|
|
5
|
+
// the two deliberate behavioral deltas as injected strategies:
|
|
6
|
+
//
|
|
7
|
+
// - target activity: the simple synchronizer compares the target's dispatch
|
|
8
|
+
// EPOCH identity, the rateless synchronizer checks SET MEMBERSHIP of the
|
|
9
|
+
// target lifecycle in the active-target registry. The strategy is always
|
|
10
|
+
// injected (`isTargetCurrent`), never defaulted.
|
|
11
|
+
// - retention: disposal is deferred while `hasRetainedWork` is true — a
|
|
12
|
+
// retained-work counter for the simple synchronizer, a per-target
|
|
13
|
+
// retainedByProcess/responseLeases scan for the rateless one.
|
|
14
|
+
//
|
|
15
|
+
// Lifecycle objects are constructed by the callers (they carry
|
|
16
|
+
// caller-specific fields such as epochs, batches and retained-work
|
|
17
|
+
// counters); the registry owns the per-target active sets, the listener
|
|
18
|
+
// add/remove pairing and the dispose gating.
|
|
19
|
+
export class DispatchLifecycleRegistry {
|
|
20
|
+
deps;
|
|
21
|
+
activeTargets = new Map();
|
|
22
|
+
constructor(deps) {
|
|
23
|
+
this.deps = deps;
|
|
24
|
+
}
|
|
25
|
+
// Registers the caller-constructed lifecycle: creates the per-target
|
|
26
|
+
// lifecycles (the factory may skip a target or abort it right after
|
|
27
|
+
// registration via `onTargetRegistered`), pairs the owner/caller abort
|
|
28
|
+
// listeners and performs the initial staleness abort exactly like both
|
|
29
|
+
// former capture implementations.
|
|
30
|
+
register(lifecycle, targets, createTargetLifecycle, onTargetRegistered) {
|
|
31
|
+
for (const target of [...new Set(targets)]) {
|
|
32
|
+
const targetLifecycle = createTargetLifecycle(lifecycle, target);
|
|
33
|
+
if (!targetLifecycle) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
lifecycle.targets.set(target, targetLifecycle);
|
|
37
|
+
let activeForTarget = this.activeTargets.get(target);
|
|
38
|
+
if (!activeForTarget) {
|
|
39
|
+
activeForTarget = new Set();
|
|
40
|
+
this.activeTargets.set(target, activeForTarget);
|
|
41
|
+
}
|
|
42
|
+
activeForTarget.add(targetLifecycle);
|
|
43
|
+
onTargetRegistered?.(targetLifecycle);
|
|
44
|
+
}
|
|
45
|
+
lifecycle.ownershipLifecycleController.signal.addEventListener("abort", lifecycle.onOwnerOrCallerAbort, { once: true });
|
|
46
|
+
if (lifecycle.callerSignal &&
|
|
47
|
+
lifecycle.callerSignal !== lifecycle.ownershipLifecycleController.signal) {
|
|
48
|
+
lifecycle.callerSignal.addEventListener("abort", lifecycle.onOwnerOrCallerAbort, { once: true });
|
|
49
|
+
}
|
|
50
|
+
if (this.deps.isClosed() ||
|
|
51
|
+
lifecycle.ownershipLifecycleController !==
|
|
52
|
+
this.deps.currentOwnershipLifecycleController() ||
|
|
53
|
+
lifecycle.ownershipLifecycleController.signal.aborted ||
|
|
54
|
+
lifecycle.callerSignal?.aborted) {
|
|
55
|
+
lifecycle.onOwnerOrCallerAbort();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
abortTarget(targetLifecycle, reason) {
|
|
59
|
+
if (!targetLifecycle.controller.signal.aborted) {
|
|
60
|
+
targetLifecycle.controller.abort(reason);
|
|
61
|
+
}
|
|
62
|
+
this.deps.onTargetAborted?.(targetLifecycle);
|
|
63
|
+
this.maybeDispose(targetLifecycle.lifecycle);
|
|
64
|
+
}
|
|
65
|
+
abortLifecycle(lifecycle, reason) {
|
|
66
|
+
if (!lifecycle.controller.signal.aborted) {
|
|
67
|
+
lifecycle.controller.abort(reason);
|
|
68
|
+
}
|
|
69
|
+
for (const targetLifecycle of lifecycle.targets.values()) {
|
|
70
|
+
this.abortTarget(targetLifecycle, reason);
|
|
71
|
+
}
|
|
72
|
+
this.maybeDispose(lifecycle);
|
|
73
|
+
}
|
|
74
|
+
finish(lifecycle) {
|
|
75
|
+
lifecycle.dispatchFinished = true;
|
|
76
|
+
this.maybeDispose(lifecycle);
|
|
77
|
+
}
|
|
78
|
+
maybeDispose(lifecycle) {
|
|
79
|
+
if (lifecycle.disposed ||
|
|
80
|
+
!lifecycle.dispatchFinished ||
|
|
81
|
+
this.deps.hasRetainedWork(lifecycle)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
lifecycle.disposed = true;
|
|
85
|
+
lifecycle.ownershipLifecycleController.signal.removeEventListener("abort", lifecycle.onOwnerOrCallerAbort);
|
|
86
|
+
if (lifecycle.callerSignal &&
|
|
87
|
+
lifecycle.callerSignal !== lifecycle.ownershipLifecycleController.signal) {
|
|
88
|
+
lifecycle.callerSignal.removeEventListener("abort", lifecycle.onOwnerOrCallerAbort);
|
|
89
|
+
}
|
|
90
|
+
for (const targetLifecycle of lifecycle.targets.values()) {
|
|
91
|
+
const activeForTarget = this.activeTargets.get(targetLifecycle.target);
|
|
92
|
+
activeForTarget?.delete(targetLifecycle);
|
|
93
|
+
if (activeForTarget?.size === 0) {
|
|
94
|
+
this.activeTargets.delete(targetLifecycle.target);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
isLifecycleActive(lifecycle, target) {
|
|
99
|
+
if (this.deps.isClosed() ||
|
|
100
|
+
lifecycle.disposed ||
|
|
101
|
+
lifecycle.ownershipLifecycleController !==
|
|
102
|
+
this.deps.currentOwnershipLifecycleController() ||
|
|
103
|
+
lifecycle.ownershipLifecycleController.signal.aborted ||
|
|
104
|
+
lifecycle.callerSignal?.aborted ||
|
|
105
|
+
lifecycle.controller.signal.aborted) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
if (target === undefined) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
const targetLifecycle = lifecycle.targets.get(target);
|
|
112
|
+
return (targetLifecycle !== undefined &&
|
|
113
|
+
!targetLifecycle.controller.signal.aborted &&
|
|
114
|
+
this.deps.isTargetCurrent(targetLifecycle));
|
|
115
|
+
}
|
|
116
|
+
getSignal(lifecycle, target) {
|
|
117
|
+
return (lifecycle.targets.get(target)?.controller.signal ??
|
|
118
|
+
lifecycle.controller.signal);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// The shared ownership-generation identity check: a captured ownership
|
|
122
|
+
// controller is current while the synchronizer is open, the controller is
|
|
123
|
+
// still THE controller (identity, not just non-aborted) and it has not been
|
|
124
|
+
// aborted.
|
|
125
|
+
export const isOwnershipGenerationActive = (properties) => !properties.closed &&
|
|
126
|
+
properties.ownershipLifecycleController ===
|
|
127
|
+
properties.currentOwnershipLifecycleController &&
|
|
128
|
+
!properties.ownershipLifecycleController.signal.aborted;
|
|
129
|
+
// The shared tracked-session identity check (the pattern the host-side
|
|
130
|
+
// instance lifecycle drained the index.ts fences into): a session is active
|
|
131
|
+
// while nothing cancelled or aborted it, its ownership generation is still
|
|
132
|
+
// current, and the session registry still maps its id to THIS session
|
|
133
|
+
// object.
|
|
134
|
+
export const isTrackedSessionActive = (properties) => !properties.closed &&
|
|
135
|
+
!properties.cancelled &&
|
|
136
|
+
!properties.sessionController.signal.aborted &&
|
|
137
|
+
!properties.ownershipLifecycleController.signal.aborted &&
|
|
138
|
+
properties.ownershipLifecycleController ===
|
|
139
|
+
properties.currentOwnershipLifecycleController &&
|
|
140
|
+
properties.registered === properties.session;
|
|
141
|
+
//# sourceMappingURL=dispatch-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-lifecycle.js","sourceRoot":"","sources":["../../../src/sync/dispatch-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Cache } from "@peerbit/cache";
|
|
2
|
+
import type { Index } from "@peerbit/indexer-interface";
|
|
3
|
+
import type { Log } from "@peerbit/log";
|
|
4
|
+
import type { NativePeerbitBackbone } from "@peerbit/native-backbone";
|
|
5
|
+
import type { RPC } from "@peerbit/rpc";
|
|
6
|
+
import type { SharedLogNativeState } from "@peerbit/shared-log-rust";
|
|
7
|
+
import type { Numbers } from "../integers.js";
|
|
8
|
+
import type { TransportMessage } from "../message.js";
|
|
9
|
+
import type { EntryReplicated, ReplicationRangeIndexable } from "../ranges.js";
|
|
10
|
+
import type { RawExchangeHeadsSender, SyncOptions, SynchronizerConstructor, Syncronizer } from "./index.js";
|
|
11
|
+
export type CreateSyncronizerProps<R extends "u32" | "u64"> = {
|
|
12
|
+
numbers: Numbers<R>;
|
|
13
|
+
entryIndex: Index<EntryReplicated<R>, any>;
|
|
14
|
+
rangeIndex: Index<ReplicationRangeIndexable<R>, any>;
|
|
15
|
+
log: Log<any>;
|
|
16
|
+
rpc: RPC<TransportMessage, TransportMessage>;
|
|
17
|
+
coordinateToHash: Cache<string>;
|
|
18
|
+
getNativeState: () => NativePeerbitBackbone | SharedLogNativeState | undefined;
|
|
19
|
+
isEntryRecentlyKnownByPeer: (hash: string, peer: string, maxAgeMs: number) => boolean;
|
|
20
|
+
peerSupportsRawExchangeHeads: (peer: string) => boolean;
|
|
21
|
+
sendRawExchangeHeads: RawExchangeHeadsSender;
|
|
22
|
+
warn: (message: string) => void;
|
|
23
|
+
compatibility?: number;
|
|
24
|
+
resolution: R;
|
|
25
|
+
sync?: SyncOptions<R>;
|
|
26
|
+
syncronizer?: SynchronizerConstructor<R>;
|
|
27
|
+
};
|
|
28
|
+
export declare function createSyncronizer<R extends "u32" | "u64">(props: CreateSyncronizerProps<R>): Syncronizer<R>;
|
|
29
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/sync/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EACX,sBAAsB,EACtB,WAAW,EACX,uBAAuB,EACvB,WAAW,EACX,MAAM,YAAY,CAAC;AAIpB,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI;IAE7D,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,UAAU,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,GAAG,EAAE,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAC7C,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAGhC,cAAc,EAAE,MACb,qBAAqB,GACrB,oBAAoB,GACpB,SAAS,CAAC;IACb,0BAA0B,EAAE,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,KACZ,OAAO,CAAC;IACb,4BAA4B,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACxD,oBAAoB,EAAE,sBAAsB,CAAC;IAC7C,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,CAAC,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EACxD,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAC9B,WAAW,CAAC,CAAC,CAAC,CAwGhB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { RatelessIBLTSynchronizer } from "./rateless-iblt.js";
|
|
2
|
+
import { SimpleSyncronizer } from "./simple.js";
|
|
3
|
+
export function createSyncronizer(props) {
|
|
4
|
+
const resolveHashesForSymbols = (symbols) => {
|
|
5
|
+
const nativeState = props.getNativeState();
|
|
6
|
+
if (!nativeState) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
if (typeof BigUint64Array !== "undefined" &&
|
|
10
|
+
typeof nativeState.getEntryHashesForHashNumbersU64 === "function") {
|
|
11
|
+
return nativeState.getEntryHashesForHashNumbersU64(symbols instanceof BigUint64Array
|
|
12
|
+
? symbols
|
|
13
|
+
: BigUint64Array.from(symbols));
|
|
14
|
+
}
|
|
15
|
+
return nativeState.getEntryHashesForHashNumbers(symbols);
|
|
16
|
+
};
|
|
17
|
+
const resolveHashListForSymbols = (symbols) => {
|
|
18
|
+
const nativeState = props.getNativeState();
|
|
19
|
+
if (!nativeState ||
|
|
20
|
+
typeof BigUint64Array === "undefined" ||
|
|
21
|
+
typeof nativeState.getEntryHashListForHashNumbersU64 !== "function") {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return nativeState.getEntryHashListForHashNumbersU64(symbols instanceof BigUint64Array
|
|
25
|
+
? symbols
|
|
26
|
+
: BigUint64Array.from(symbols));
|
|
27
|
+
};
|
|
28
|
+
const resolveHashNumbersInRange = (range) => {
|
|
29
|
+
const nativeState = props.getNativeState();
|
|
30
|
+
return (nativeState?.getEntryHashNumbersInRangeU64?.(range) ??
|
|
31
|
+
nativeState?.getEntryHashNumbersInRange(range));
|
|
32
|
+
};
|
|
33
|
+
if (props.syncronizer) {
|
|
34
|
+
return new props.syncronizer({
|
|
35
|
+
numbers: props.numbers,
|
|
36
|
+
entryIndex: props.entryIndex,
|
|
37
|
+
log: props.log,
|
|
38
|
+
rangeIndex: props.rangeIndex,
|
|
39
|
+
rpc: props.rpc,
|
|
40
|
+
coordinateToHash: props.coordinateToHash,
|
|
41
|
+
resolveHashesForSymbols,
|
|
42
|
+
resolveHashListForSymbols,
|
|
43
|
+
resolveHashNumbersInRange,
|
|
44
|
+
sync: props.sync,
|
|
45
|
+
isEntryRecentlyKnownByPeer: props.isEntryRecentlyKnownByPeer,
|
|
46
|
+
peerSupportsRawExchangeHeads: props.peerSupportsRawExchangeHeads,
|
|
47
|
+
sendRawExchangeHeads: props.sendRawExchangeHeads,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
if (props.compatibility && props.compatibility < 10) {
|
|
52
|
+
return new SimpleSyncronizer({
|
|
53
|
+
log: props.log,
|
|
54
|
+
rpc: props.rpc,
|
|
55
|
+
entryIndex: props.entryIndex,
|
|
56
|
+
coordinateToHash: props.coordinateToHash,
|
|
57
|
+
resolveHashesForSymbols,
|
|
58
|
+
resolveHashListForSymbols,
|
|
59
|
+
sync: props.sync,
|
|
60
|
+
isEntryRecentlyKnownByPeer: props.isEntryRecentlyKnownByPeer,
|
|
61
|
+
peerSupportsRawExchangeHeads: props.peerSupportsRawExchangeHeads,
|
|
62
|
+
sendRawExchangeHeads: props.sendRawExchangeHeads,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
if (props.resolution === "u32") {
|
|
67
|
+
props.warn("u32 resolution is not recommended for RatelessIBLTSynchronizer");
|
|
68
|
+
}
|
|
69
|
+
return new RatelessIBLTSynchronizer({
|
|
70
|
+
numbers: props.numbers,
|
|
71
|
+
entryIndex: props.entryIndex,
|
|
72
|
+
log: props.log,
|
|
73
|
+
rangeIndex: props.rangeIndex,
|
|
74
|
+
rpc: props.rpc,
|
|
75
|
+
coordinateToHash: props.coordinateToHash,
|
|
76
|
+
resolveHashesForSymbols,
|
|
77
|
+
resolveHashListForSymbols,
|
|
78
|
+
resolveHashNumbersInRange,
|
|
79
|
+
sync: props.sync,
|
|
80
|
+
isEntryRecentlyKnownByPeer: props.isEntryRecentlyKnownByPeer,
|
|
81
|
+
peerSupportsRawExchangeHeads: props.peerSupportsRawExchangeHeads,
|
|
82
|
+
sendRawExchangeHeads: props.sendRawExchangeHeads,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=factory.js.map
|