@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.
Files changed (81) hide show
  1. package/dist/src/checked-prune.d.ts +12 -0
  2. package/dist/src/checked-prune.d.ts.map +1 -1
  3. package/dist/src/checked-prune.js +33 -0
  4. package/dist/src/checked-prune.js.map +1 -1
  5. package/dist/src/coordinate-persistence.d.ts +211 -0
  6. package/dist/src/coordinate-persistence.d.ts.map +1 -0
  7. package/dist/src/coordinate-persistence.js +1133 -0
  8. package/dist/src/coordinate-persistence.js.map +1 -0
  9. package/dist/src/errors.d.ts +1 -0
  10. package/dist/src/errors.d.ts.map +1 -1
  11. package/dist/src/errors.js +19 -0
  12. package/dist/src/errors.js.map +1 -1
  13. package/dist/src/index.d.ts +127 -133
  14. package/dist/src/index.d.ts.map +1 -1
  15. package/dist/src/index.js +1400 -4269
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/instance-lifecycle.d.ts +117 -0
  18. package/dist/src/instance-lifecycle.d.ts.map +1 -0
  19. package/dist/src/instance-lifecycle.js +254 -0
  20. package/dist/src/instance-lifecycle.js.map +1 -0
  21. package/dist/src/join-warmup.d.ts +86 -0
  22. package/dist/src/join-warmup.d.ts.map +1 -0
  23. package/dist/src/join-warmup.js +351 -0
  24. package/dist/src/join-warmup.js.map +1 -0
  25. package/dist/src/native-write-through-block-store.d.ts +123 -0
  26. package/dist/src/native-write-through-block-store.d.ts.map +1 -0
  27. package/dist/src/native-write-through-block-store.js +989 -0
  28. package/dist/src/native-write-through-block-store.js.map +1 -0
  29. package/dist/src/peer-session.d.ts +117 -0
  30. package/dist/src/peer-session.d.ts.map +1 -0
  31. package/dist/src/peer-session.js +259 -0
  32. package/dist/src/peer-session.js.map +1 -0
  33. package/dist/src/replication-announcement.d.ts +116 -0
  34. package/dist/src/replication-announcement.d.ts.map +1 -0
  35. package/dist/src/replication-announcement.js +515 -0
  36. package/dist/src/replication-announcement.js.map +1 -0
  37. package/dist/src/replicator-liveness.d.ts +59 -0
  38. package/dist/src/replicator-liveness.d.ts.map +1 -0
  39. package/dist/src/replicator-liveness.js +304 -0
  40. package/dist/src/replicator-liveness.js.map +1 -0
  41. package/dist/src/sync/dispatch-lifecycle.d.ts +48 -0
  42. package/dist/src/sync/dispatch-lifecycle.d.ts.map +1 -0
  43. package/dist/src/sync/dispatch-lifecycle.js +141 -0
  44. package/dist/src/sync/dispatch-lifecycle.js.map +1 -0
  45. package/dist/src/sync/factory.d.ts +29 -0
  46. package/dist/src/sync/factory.d.ts.map +1 -0
  47. package/dist/src/sync/factory.js +87 -0
  48. package/dist/src/sync/factory.js.map +1 -0
  49. package/dist/src/sync/pending-sync-store.d.ts +105 -0
  50. package/dist/src/sync/pending-sync-store.d.ts.map +1 -0
  51. package/dist/src/sync/pending-sync-store.js +877 -0
  52. package/dist/src/sync/pending-sync-store.js.map +1 -0
  53. package/dist/src/sync/rateless-iblt.d.ts +4 -1
  54. package/dist/src/sync/rateless-iblt.d.ts.map +1 -1
  55. package/dist/src/sync/rateless-iblt.js +102 -106
  56. package/dist/src/sync/rateless-iblt.js.map +1 -1
  57. package/dist/src/sync/simple.d.ts +10 -41
  58. package/dist/src/sync/simple.d.ts.map +1 -1
  59. package/dist/src/sync/simple.js +259 -952
  60. package/dist/src/sync/simple.js.map +1 -1
  61. package/dist/src/sync/sync-peer-state.d.ts +16 -0
  62. package/dist/src/sync/sync-peer-state.d.ts.map +1 -0
  63. package/dist/src/sync/sync-peer-state.js +82 -0
  64. package/dist/src/sync/sync-peer-state.js.map +1 -0
  65. package/package.json +12 -12
  66. package/src/checked-prune.ts +35 -0
  67. package/src/coordinate-persistence.ts +1796 -0
  68. package/src/errors.ts +21 -0
  69. package/src/index.ts +4014 -7858
  70. package/src/instance-lifecycle.ts +351 -0
  71. package/src/join-warmup.ts +507 -0
  72. package/src/native-write-through-block-store.ts +1170 -0
  73. package/src/peer-session.ts +336 -0
  74. package/src/replication-announcement.ts +744 -0
  75. package/src/replicator-liveness.ts +439 -0
  76. package/src/sync/dispatch-lifecycle.ts +230 -0
  77. package/src/sync/factory.ts +154 -0
  78. package/src/sync/pending-sync-store.ts +1085 -0
  79. package/src/sync/rateless-iblt.ts +122 -132
  80. package/src/sync/simple.ts +334 -1144
  81. 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