@optimystic/db-p2p 0.16.3 → 0.18.0

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 (90) hide show
  1. package/dist/src/cluster/block-transfer-service.d.ts +14 -1
  2. package/dist/src/cluster/block-transfer-service.d.ts.map +1 -1
  3. package/dist/src/cluster/block-transfer-service.js +12 -3
  4. package/dist/src/cluster/block-transfer-service.js.map +1 -1
  5. package/dist/src/cluster/cluster-policy.d.ts +112 -0
  6. package/dist/src/cluster/cluster-policy.d.ts.map +1 -0
  7. package/dist/src/cluster/cluster-policy.js +88 -0
  8. package/dist/src/cluster/cluster-policy.js.map +1 -0
  9. package/dist/src/cluster/cluster-repo.d.ts +41 -13
  10. package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
  11. package/dist/src/cluster/cluster-repo.js +116 -23
  12. package/dist/src/cluster/cluster-repo.js.map +1 -1
  13. package/dist/src/cluster/quorum-restore.d.ts +64 -14
  14. package/dist/src/cluster/quorum-restore.d.ts.map +1 -1
  15. package/dist/src/cluster/quorum-restore.js +0 -0
  16. package/dist/src/cluster/quorum-restore.js.map +1 -1
  17. package/dist/src/cluster/reconcile-block.d.ts +60 -0
  18. package/dist/src/cluster/reconcile-block.d.ts.map +1 -0
  19. package/dist/src/cluster/reconcile-block.js +133 -0
  20. package/dist/src/cluster/reconcile-block.js.map +1 -0
  21. package/dist/src/cluster/service.d.ts +4 -1
  22. package/dist/src/cluster/service.d.ts.map +1 -1
  23. package/dist/src/cluster/service.js +9 -1
  24. package/dist/src/cluster/service.js.map +1 -1
  25. package/dist/src/cluster/spread-on-churn.d.ts.map +1 -1
  26. package/dist/src/cluster/spread-on-churn.js +8 -0
  27. package/dist/src/cluster/spread-on-churn.js.map +1 -1
  28. package/dist/src/inbound-authorization.d.ts +117 -0
  29. package/dist/src/inbound-authorization.d.ts.map +1 -0
  30. package/dist/src/inbound-authorization.js +149 -0
  31. package/dist/src/inbound-authorization.js.map +1 -0
  32. package/dist/src/index.d.ts +1 -0
  33. package/dist/src/index.d.ts.map +1 -1
  34. package/dist/src/index.js +1 -0
  35. package/dist/src/index.js.map +1 -1
  36. package/dist/src/libp2p-key-network.d.ts +14 -0
  37. package/dist/src/libp2p-key-network.d.ts.map +1 -1
  38. package/dist/src/libp2p-key-network.js +54 -4
  39. package/dist/src/libp2p-key-network.js.map +1 -1
  40. package/dist/src/libp2p-node-base.d.ts +48 -7
  41. package/dist/src/libp2p-node-base.d.ts.map +1 -1
  42. package/dist/src/libp2p-node-base.js +61 -83
  43. package/dist/src/libp2p-node-base.js.map +1 -1
  44. package/dist/src/repo/cluster-coordinator.d.ts +21 -3
  45. package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
  46. package/dist/src/repo/cluster-coordinator.js +27 -5
  47. package/dist/src/repo/cluster-coordinator.js.map +1 -1
  48. package/dist/src/repo/coordinator-repo.d.ts +123 -16
  49. package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
  50. package/dist/src/repo/coordinator-repo.js +354 -49
  51. package/dist/src/repo/coordinator-repo.js.map +1 -1
  52. package/dist/src/repo/service.d.ts +4 -1
  53. package/dist/src/repo/service.d.ts.map +1 -1
  54. package/dist/src/repo/service.js +9 -1
  55. package/dist/src/repo/service.js.map +1 -1
  56. package/dist/src/storage/block-storage.d.ts.map +1 -1
  57. package/dist/src/storage/block-storage.js +11 -0
  58. package/dist/src/storage/block-storage.js.map +1 -1
  59. package/dist/src/storage/storage-repo.d.ts +56 -0
  60. package/dist/src/storage/storage-repo.d.ts.map +1 -1
  61. package/dist/src/storage/storage-repo.js +155 -13
  62. package/dist/src/storage/storage-repo.js.map +1 -1
  63. package/dist/src/sync/service.d.ts +4 -7
  64. package/dist/src/sync/service.d.ts.map +1 -1
  65. package/dist/src/sync/service.js +13 -10
  66. package/dist/src/sync/service.js.map +1 -1
  67. package/dist/src/testing/mesh-harness.d.ts +10 -0
  68. package/dist/src/testing/mesh-harness.d.ts.map +1 -1
  69. package/dist/src/testing/mesh-harness.js +55 -49
  70. package/dist/src/testing/mesh-harness.js.map +1 -1
  71. package/package.json +2 -2
  72. package/{README.md → readme.md} +37 -0
  73. package/src/cluster/block-transfer-service.ts +20 -5
  74. package/src/cluster/cluster-policy.ts +152 -0
  75. package/src/cluster/cluster-repo.ts +121 -26
  76. package/src/cluster/quorum-restore.ts +0 -0
  77. package/src/cluster/reconcile-block.ts +191 -0
  78. package/src/cluster/service.ts +10 -3
  79. package/src/cluster/spread-on-churn.ts +8 -0
  80. package/src/inbound-authorization.ts +190 -0
  81. package/src/index.ts +1 -0
  82. package/src/libp2p-key-network.ts +54 -4
  83. package/src/libp2p-node-base.ts +111 -94
  84. package/src/repo/cluster-coordinator.ts +30 -6
  85. package/src/repo/coordinator-repo.ts +419 -58
  86. package/src/repo/service.ts +10 -3
  87. package/src/storage/block-storage.ts +11 -0
  88. package/src/storage/storage-repo.ts +172 -15
  89. package/src/sync/service.ts +14 -12
  90. package/src/testing/mesh-harness.ts +55 -49
@@ -0,0 +1,60 @@
1
+ import type { ActionRev, BlockId, IBlock } from "@optimystic/db-core";
2
+ import type { BlockArchive } from "../storage/struct.js";
3
+ import type { ReconcileBlockCallback } from "./cluster-repo.js";
4
+ import type { IPeerReputation } from "../reputation/types.js";
5
+ /**
6
+ * Wall-clock bound on one whole reconcile pass (all cohort peers, both quorums, the persist).
7
+ * Shared by both callers so a slow or unreachable cohort peer stalls neither the commit path
8
+ * (`ClusterMember.withReconcileTimeout` — a stall there holds up consensus execution) nor the read
9
+ * path (`CoordinatorRepo.restoreCorroborated` — a stall there holds up a caller's `get`).
10
+ */
11
+ export declare const RECONCILE_TIMEOUT_MS = 5000;
12
+ /** Collaborators {@link createReconcileBlock} needs, injected so the logic stays transport-agnostic. */
13
+ export interface ReconcileBlockDeps {
14
+ /** This node's own peer id; excluded from the cohort targets. */
15
+ selfPeerId: string;
16
+ /** Fetch one cohort peer's archive for `blockId` — `undefined` when it is unreachable or holds nothing. */
17
+ fetchArchive: (peerId: string, blockId: BlockId) => Promise<BlockArchive | undefined>;
18
+ /** Persist the agreed content through the churn-replication funnel. */
19
+ saveReplicatedBlock: (blockId: BlockId, block: IBlock, source: ActionRev) => Promise<void>;
20
+ /** Proportional corroboration threshold; the cohort's `simpleMajorityThreshold`. */
21
+ simpleMajorityThreshold: number;
22
+ /**
23
+ * Yardstick the corroboration floor is measured against — the floor for
24
+ * {@link corroboratorCapacity}. Required, not optional: unlike the membership admission gate there
25
+ * is no "unknown" handling here, so a caller that cannot state an asserted cohort size should pass
26
+ * its configured `clusterSize` (the strict direction) rather than a small placeholder. The failure
27
+ * mode of overstating it is a block that stays unrepaired — degraded, not dead; of understating it,
28
+ * a shrunken cohort view that can relax the floor to a single voter. `resolveClusterPolicy`
29
+ * (`cluster/cluster-policy.ts`) resolves it for a real node and defaults it to `clusterSize`.
30
+ */
31
+ repairCorroborationClusterSize: number;
32
+ /** Best-effort misbehavior reporting; a throwing implementation is swallowed. */
33
+ reputation?: Pick<IPeerReputation, 'reportPeer'>;
34
+ }
35
+ /**
36
+ * Active reconciliation for a block this member committed without a materializable base
37
+ * (cohort drift between the independent pend and commit cluster-transactions, or a refused
38
+ * `missing-base-revision` commit). Queries the commit cohort — self already excluded by
39
+ * `ClusterMember.reconcileDivergentCommit` — for the block, picks the target revision by quorum
40
+ * corroboration rather than raw `Math.max` (a lone peer inflating its rev cannot steer
41
+ * reconciliation), verifies the cohort agrees on the *content* at that revision, and persists it.
42
+ *
43
+ * Both quorums are capped by {@link corroboratorCapacity}: demanding two corroborators from a
44
+ * cohort that contains exactly one other peer is a permanent deadlock, not a safety property —
45
+ * the node can never heal and stays unreadable forever.
46
+ *
47
+ * **Exposure at capacity 1 (documented, not accidental).** Block ids are random 256-bit strings
48
+ * (`db-core` `structs.ts`), NOT content-addressed, so nothing on the receive path can re-derive
49
+ * the id from the bytes: `canonicalBlockHash` is a cross-peer *agreement* hash, never a check
50
+ * against `blockId`. A sole cohort peer's content is therefore believed on its word. That adds no
51
+ * trust the cohort had not already extended — the same peer's `(rev, actionId)` claim is likewise
52
+ * uncorroborable at that size (see `selectQuorumRev`'s capacity note), and a two-member cohort has
53
+ * no honest majority to appeal to in the first place. Closing it needs commit-cert verification,
54
+ * tracked by backlog `debt-read-repair-commit-cert-verification`.
55
+ *
56
+ * Declines are cheap and retryable: nothing is persisted, nothing is marked, and the next commit
57
+ * or churn/rebalance pass tries again.
58
+ */
59
+ export declare function createReconcileBlock(deps: ReconcileBlockDeps): ReconcileBlockCallback;
60
+ //# sourceMappingURL=reconcile-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-block.d.ts","sourceRoot":"","sources":["../../../src/cluster/reconcile-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAU9D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAWzC,wGAAwG;AACxG,MAAM,WAAW,kBAAkB;IAClC,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;IACtF,uEAAuE;IACvE,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,oFAAoF;IACpF,uBAAuB,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,8BAA8B,EAAE,MAAM,CAAC;IACvC,iFAAiF;IACjF,UAAU,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;CACjD;AAmFD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,sBAAsB,CA+BrF"}
@@ -0,0 +1,133 @@
1
+ import { PenaltyReason } from "../reputation/types.js";
2
+ import { selectQuorumRev, selectQuorumBlock, canonicalBlockHash, corroboratorCapacity } from "./quorum-restore.js";
3
+ import { createLogger } from '../logger.js';
4
+ const log = createLogger('reconcile-block');
5
+ /**
6
+ * Wall-clock bound on one whole reconcile pass (all cohort peers, both quorums, the persist).
7
+ * Shared by both callers so a slow or unreachable cohort peer stalls neither the commit path
8
+ * (`ClusterMember.withReconcileTimeout` — a stall there holds up consensus execution) nor the read
9
+ * path (`CoordinatorRepo.restoreCorroborated` — a stall there holds up a caller's `get`).
10
+ */
11
+ export const RECONCILE_TIMEOUT_MS = 5000;
12
+ /**
13
+ * Highest revision an archive covers. Keys arrive as strings off the wire from an untrusted peer,
14
+ * so a non-numeric one is skipped rather than poisoning the maximum with `NaN`; folding instead of
15
+ * `Math.max(...keys)` also keeps a wide archive off the argument-count limit.
16
+ */
17
+ function maxRevision(revisions) {
18
+ let max;
19
+ for (const key of Object.keys(revisions)) {
20
+ const rev = Number(key);
21
+ if (Number.isFinite(rev) && (max === undefined || rev > max))
22
+ max = rev;
23
+ }
24
+ return max;
25
+ }
26
+ /**
27
+ * The claim a peer's archive makes: its highest revision, provided that revision is at least the
28
+ * one we committed. `undefined` when the peer served nothing usable (unreachable, empty archive,
29
+ * or only revisions older than the commit we are healing).
30
+ */
31
+ function toCandidate(peerId, archive, committedRev) {
32
+ if (!archive)
33
+ return undefined;
34
+ const maxRev = maxRevision(archive.revisions);
35
+ if (maxRev === undefined || maxRev < committedRev)
36
+ return undefined;
37
+ const data = archive.revisions[maxRev];
38
+ if (!data?.action)
39
+ return undefined;
40
+ return { peerId, rev: maxRev, actionId: data.action.actionId, block: data.block };
41
+ }
42
+ /**
43
+ * One peer's answer, isolated. `fetchArchive` is contracted to answer `undefined` for an
44
+ * unreachable peer, but a raw `Promise.all` over the cohort would let a single rejecting fetch
45
+ * discard the answers every other peer already gave — turning a heal the cohort could complete
46
+ * into a decline. One peer's failure costs only that peer's vote.
47
+ */
48
+ async function fetchCandidate(deps, peerId, blockId, committedRev) {
49
+ try {
50
+ return toCandidate(peerId, await deps.fetchArchive(peerId, blockId), committedRev);
51
+ }
52
+ catch (err) {
53
+ log('reconcile:fetch-error', { blockId, peerId, error: err.message });
54
+ return undefined;
55
+ }
56
+ }
57
+ /**
58
+ * Hash the block bytes of every candidate that both corroborates `selected` and actually carried content.
59
+ *
60
+ * NOTE: this canonical-JSON-serializes and sha256s every carrier's whole block on every reconcile.
61
+ * Negligible at today's cohort widths and block sizes; if blocks grow large or cohorts wide enough
62
+ * for this to show up on a commit-path profile, hash incrementally at receive time instead.
63
+ */
64
+ async function hashCarriers(candidates, selected) {
65
+ const carriers = candidates.filter(c => c.rev === selected.rev && c.actionId === selected.actionId && c.block);
66
+ return await Promise.all(carriers.map(async (c) => ({ peerId: c.peerId, hash: await canonicalBlockHash(c.block), block: c.block })));
67
+ }
68
+ /** Report cohort members that served content contradicting the agreed hash. Best-effort; never throws. */
69
+ function penalizeContradictingContent(reputation, candidates, agreedHash, blockId) {
70
+ if (!reputation)
71
+ return;
72
+ try {
73
+ for (const c of candidates) {
74
+ if (c.hash !== agreedHash) {
75
+ reputation.reportPeer(c.peerId, PenaltyReason.InvalidRestoration, `reconcile:${blockId}`);
76
+ }
77
+ }
78
+ }
79
+ catch (err) {
80
+ log('reconcile:penalize-error', { blockId, error: err.message });
81
+ }
82
+ }
83
+ /**
84
+ * Active reconciliation for a block this member committed without a materializable base
85
+ * (cohort drift between the independent pend and commit cluster-transactions, or a refused
86
+ * `missing-base-revision` commit). Queries the commit cohort — self already excluded by
87
+ * `ClusterMember.reconcileDivergentCommit` — for the block, picks the target revision by quorum
88
+ * corroboration rather than raw `Math.max` (a lone peer inflating its rev cannot steer
89
+ * reconciliation), verifies the cohort agrees on the *content* at that revision, and persists it.
90
+ *
91
+ * Both quorums are capped by {@link corroboratorCapacity}: demanding two corroborators from a
92
+ * cohort that contains exactly one other peer is a permanent deadlock, not a safety property —
93
+ * the node can never heal and stays unreadable forever.
94
+ *
95
+ * **Exposure at capacity 1 (documented, not accidental).** Block ids are random 256-bit strings
96
+ * (`db-core` `structs.ts`), NOT content-addressed, so nothing on the receive path can re-derive
97
+ * the id from the bytes: `canonicalBlockHash` is a cross-peer *agreement* hash, never a check
98
+ * against `blockId`. A sole cohort peer's content is therefore believed on its word. That adds no
99
+ * trust the cohort had not already extended — the same peer's `(rev, actionId)` claim is likewise
100
+ * uncorroborable at that size (see `selectQuorumRev`'s capacity note), and a two-member cohort has
101
+ * no honest majority to appeal to in the first place. Closing it needs commit-cert verification,
102
+ * tracked by backlog `debt-read-repair-commit-cert-verification`.
103
+ *
104
+ * Declines are cheap and retryable: nothing is persisted, nothing is marked, and the next commit
105
+ * or churn/rebalance pass tries again.
106
+ */
107
+ export function createReconcileBlock(deps) {
108
+ return async (blockId, committed, cohortPeerIds) => {
109
+ const targets = cohortPeerIds.filter(id => id !== deps.selfPeerId);
110
+ if (targets.length === 0)
111
+ return;
112
+ const fetched = await Promise.all(targets.map(peerId => fetchCandidate(deps, peerId, blockId, committed.rev)));
113
+ const candidates = fetched.filter((c) => c !== undefined);
114
+ const capacity = corroboratorCapacity(targets.length, deps.repairCorroborationClusterSize);
115
+ const revClaims = candidates.map(({ peerId, rev, actionId }) => ({ peerId, rev, actionId }));
116
+ const selected = selectQuorumRev(revClaims, deps.simpleMajorityThreshold, capacity);
117
+ if (!selected) {
118
+ // Leave the block behind; churn/rebalance and the next commit retry.
119
+ log('reconcile:no-rev-quorum', { blockId, rev: committed.rev, responders: revClaims.length, capacity });
120
+ return;
121
+ }
122
+ const hashCandidates = await hashCarriers(candidates, selected);
123
+ const agreed = selectQuorumBlock(hashCandidates, deps.simpleMajorityThreshold, capacity);
124
+ if (!agreed) {
125
+ log('reconcile:no-content-quorum', { blockId, rev: selected.rev, carriers: hashCandidates.length, capacity });
126
+ return;
127
+ }
128
+ penalizeContradictingContent(deps.reputation, hashCandidates, agreed.hash, blockId);
129
+ await deps.saveReplicatedBlock(blockId, agreed.block, { actionId: selected.actionId, rev: selected.rev });
130
+ log('reconcile:restored', { blockId, rev: selected.rev, actionId: selected.actionId });
131
+ };
132
+ }
133
+ //# sourceMappingURL=reconcile-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-block.js","sourceRoot":"","sources":["../../../src/cluster/reconcile-block.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { Startable, Logger, StreamHandler, PeerId } from '@libp2p/interface';
2
2
  import type { ICluster, ClusterRecord } from '@optimystic/db-core';
3
3
  import { type RedirectPayload } from '../repo/redirect.js';
4
+ import { type InboundStreamAuthorizationInit } from '../inbound-authorization.js';
4
5
  interface BaseComponents {
5
6
  logger: {
6
7
  forComponent: (name: string) => Logger;
@@ -24,7 +25,7 @@ export interface ClusterServiceComponents extends BaseComponents {
24
25
  */
25
26
  getConnectionAddrs?: (peerId: PeerId) => string[];
26
27
  }
27
- export interface ClusterServiceInit {
28
+ export interface ClusterServiceInit extends InboundStreamAuthorizationInit {
28
29
  protocol?: string;
29
30
  protocolPrefix?: string;
30
31
  maxInboundStreams?: number;
@@ -54,6 +55,8 @@ export declare class ClusterService implements Startable {
54
55
  private running;
55
56
  /** Responsibility K - small-mesh bypass threshold for redirect decisions */
56
57
  private readonly responsibilityK;
58
+ /** Optional embedder authorization gate; `undefined` (the default) means no check runs. */
59
+ private readonly authorization;
57
60
  constructor(components: ClusterServiceComponents, init?: ClusterServiceInit);
58
61
  readonly [Symbol.toStringTag] = "@libp2p/cluster";
59
62
  private getSelfId;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/cluster/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAsB,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtG,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKxE,UAAU,cAAc;IACvB,MAAM,EAAE;QAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QACV,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAC7C,CAAA;CACD;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC/D,OAAO,EAAE,QAAQ,CAAA;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;CACjD;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,kBAAuB,GAAG,CAAC,UAAU,EAAE,wBAAwB,KAAK,cAAc,CAEtH;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,SAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2B;IACtD,OAAO,CAAC,OAAO,CAAU;IACzB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,UAAU,EAAE,wBAAwB,EAAE,IAAI,GAAE,kBAAuB;IAW/E,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB;IAElD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,YAAY;IAmBpB;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,GAAG,IAAI;IAwBtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;;;;OAKG;YACW,gBAAgB;IAU9B,OAAO,CAAC,oBAAoB;CAmD5B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/cluster/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAsB,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtG,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAO,EAAqE,KAAK,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAErJ,UAAU,cAAc;IACvB,MAAM,EAAE;QAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QACV,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAC7C,CAAA;CACD;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC/D,OAAO,EAAE,QAAQ,CAAA;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;CACjD;AAED,MAAM,WAAW,kBAAmB,SAAQ,8BAA8B;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,kBAAuB,GAAG,CAAC,UAAU,EAAE,wBAAwB,KAAK,cAAc,CAEtH;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,SAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2B;IACtD,OAAO,CAAC,OAAO,CAAU;IACzB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;gBAE3D,UAAU,EAAE,wBAAwB,EAAE,IAAI,GAAE,kBAAuB;IAY/E,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB;IAElD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,YAAY;IAmBpB;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,GAAG,IAAI;IAwBtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;;;;OAKG;YACW,gBAAgB;IAU9B,OAAO,CAAC,oBAAoB;CAsD5B"}
@@ -4,6 +4,7 @@ import { peerIdFromString } from '@libp2p/peer-id';
4
4
  import { encodePeers } from '../repo/redirect.js';
5
5
  import { toClusterErrorEnvelope } from './cluster-error.js';
6
6
  import { MAX_CONTROL_MESSAGE_BYTES } from '../protocol-limits.js';
7
+ import { createInboundStreamAuthorization } from '../inbound-authorization.js';
7
8
  export function clusterService(init = {}) {
8
9
  return (components) => new ClusterService(components, init);
9
10
  }
@@ -20,6 +21,8 @@ export class ClusterService {
20
21
  running;
21
22
  /** Responsibility K - small-mesh bypass threshold for redirect decisions */
22
23
  responsibilityK;
24
+ /** Optional embedder authorization gate; `undefined` (the default) means no check runs. */
25
+ authorization;
23
26
  constructor(components, init = {}) {
24
27
  this.components = components;
25
28
  this.protocol = init.protocol ?? (init.protocolPrefix ?? '/db-p2p') + '/cluster/1.0.0';
@@ -29,6 +32,7 @@ export class ClusterService {
29
32
  this.cluster = components.cluster;
30
33
  this.running = false;
31
34
  this.responsibilityK = init.responsibilityK ?? 1;
35
+ this.authorization = createInboundStreamAuthorization(init, this.protocol, (msg, ...args) => this.log.error(msg, ...args));
32
36
  }
33
37
  [Symbol.toStringTag] = '@libp2p/cluster';
34
38
  getSelfId() {
@@ -127,7 +131,7 @@ export class ClusterService {
127
131
  throw new Error(`Unknown operation: ${message.operation}`);
128
132
  }
129
133
  handleIncomingStream(stream, connection) {
130
- const peerId = connection.remotePeer;
134
+ const peerId = connection?.remotePeer;
131
135
  const processStream = async function* (source) {
132
136
  for await (const msg of source) {
133
137
  // Decode the framing. A malformed/undecodable message is a transport
@@ -158,6 +162,10 @@ export class ClusterService {
158
162
  };
159
163
  void (async () => {
160
164
  try {
165
+ // Authorization runs before ANY decoding or execution. Guarded on the field so a
166
+ // node without a predicate keeps the original path untouched.
167
+ if (this.authorization && await this.authorization.deny(stream, peerId?.toString()))
168
+ return;
161
169
  const responses = pipe(stream, (source) => lpDecode(source, { maxDataLength: MAX_CONTROL_MESSAGE_BYTES }), processStream.bind(this), (source) => lpEncode(source));
162
170
  for await (const chunk of responses) {
163
171
  stream.send(chunk);
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/cluster/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/cluster/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAwB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,gCAAgC,EAAwE,MAAM,6BAA6B,CAAC;AA0CrJ,MAAM,UAAU,cAAc,CAAC,OAA2B,EAAE;IAC3D,OAAO,CAAC,UAAoC,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IACT,QAAQ,CAAS;IACjB,iBAAiB,CAAS;IAC1B,kBAAkB,CAAS;IAC3B,GAAG,CAAS;IACZ,OAAO,CAAW;IAClB,UAAU,CAA2B;IAC9C,OAAO,CAAU;IACzB,4EAA4E;IAC3D,eAAe,CAAS;IACzC,2FAA2F;IAC1E,aAAa,CAAyC;IAEvE,YAAY,UAAoC,EAAE,OAA2B,EAAE;QAC9E,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC,GAAG,gBAAgB,CAAC;QACvF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;QACxD,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC;QAC9E,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,gCAAgC,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5H,CAAC;IAEQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,iBAAiB,CAAC;IAE1C,SAAS;QAChB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC1D,OAAQ,IAAI,CAAC,UAAkB,CAAC,MAAM,EAAE,MAA4B,CAAC;IACtE,CAAC;IAEO,YAAY,CAAC,EAAU;QAC9B,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACJ,GAAG,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACvF,MAAM,MAAM,GAAI,IAAI,CAAC,UAAkB,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,cAAc;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,KAAK,GAAU,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,MAAqB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,CAAK,6CAA6C;QAE3E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAE,6CAA6C;QAErF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QAExD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YACpD,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACR,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC3F,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC3C,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,gBAAgB,CAAC,OAAqD;QACnF,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACpC,mEAAmE;YACnE,oEAAoE;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,oBAAoB,CAAC,MAAc,EAAE,UAAuB;QACnE,MAAM,MAAM,GAAG,UAAU,EAAE,UAAU,CAAC;QAEtC,MAAM,aAAa,GAAG,KAAK,SAAS,CAAC,EAAwB,MAAqC;YACjG,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBAChC,qEAAqE;gBACrE,mEAAmE;gBACnE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiD,CAAC;gBAEpF,wEAAwE;gBACxE,uEAAuE;gBACvE,yEAAyE;gBACzE,uEAAuE;gBACvE,oEAAoE;gBACpE,IAAI,QAAiB,CAAC;gBACtB,IAAI,CAAC;oBACJ,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACjD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0CAA0C,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC3F,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBACxC,CAAC;gBAED,gCAAgC;gBAChC,MAAM,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACzD,qEAAqE;gBACrE,wEAAwE;gBACxE,sEAAsE;gBACtE,0DAA0D;gBAC1D,OAAO;YACR,CAAC;QACF,CAAC,CAAC;QAEF,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACJ,iFAAiF;gBACjF,8DAA8D;gBAC9D,IAAI,IAAI,CAAC,aAAa,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;oBAAE,OAAO;gBAC5F,MAAM,SAAS,GAAG,IAAI,CACrB,MAAM,EACN,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,yBAAyB,EAAE,CAAC,EAC1E,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EACxB,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC5B,CAAC;gBACF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBACpF,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;IACN,CAAC;CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"spread-on-churn.d.ts","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAShE,MAAM,WAAW,mBAAmB;IACnC,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,qBAAqB,EAAE,OAAO,CAAA;IAC9B,kFAAkF;IAClF,eAAe,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,WAAW,CAAA;IACjB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,IAAI,EAAE,KAAK,CAAA;IACX,WAAW,EAAE,YAAY,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,8BAA8B;IAC9B,MAAM,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,SAAS,EAAE,MAAM,EAAE,CAAA;QACnB,MAAM,EAAE,MAAM,EAAE,CAAA;KAChB,CAAC,CAAA;IACF,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAiBjD,qBAAa,oBAAqB,YAAW,SAAS;IAYpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXtB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,mBAAmB,CAAe;IAC1C,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAY;gBAG5B,IAAI,EAAE,iBAAiB,EACxC,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAWpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAItC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,oBAAoB,IAAI,MAAM;IAI9B,4DAA4D;IACtD,QAAQ,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAM7C,OAAO,CAAC,eAAe;YA2BT,aAAa;IA0G3B,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,SAAS;CASjB"}
1
+ {"version":3,"file":"spread-on-churn.d.ts","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAShE,MAAM,WAAW,mBAAmB;IACnC,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,qBAAqB,EAAE,OAAO,CAAA;IAC9B,kFAAkF;IAClF,eAAe,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,WAAW,CAAA;IACjB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,IAAI,EAAE,KAAK,CAAA;IACX,WAAW,EAAE,YAAY,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,8BAA8B;IAC9B,MAAM,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,SAAS,EAAE,MAAM,EAAE,CAAA;QACnB,MAAM,EAAE,MAAM,EAAE,CAAA;KAChB,CAAC,CAAA;IACF,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAiBjD,qBAAa,oBAAqB,YAAW,SAAS;IAYpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXtB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,mBAAmB,CAAe;IAC1C,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAY;gBAG5B,IAAI,EAAE,iBAAiB,EACxC,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAWpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAItC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,oBAAoB,IAAI,MAAM;IAI9B,4DAA4D;IACtD,QAAQ,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAM7C,OAAO,CAAC,eAAe;YA2BT,aAAa;IAkH3B,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,SAAS;CASjB"}
@@ -124,6 +124,14 @@ export class SpreadOnChurnMonitor {
124
124
  // Read block data from local storage
125
125
  const result = await this.deps.repo.get({ blockIds: [blockId] });
126
126
  const blockResult = result[blockId];
127
+ if (blockResult?.unavailable !== undefined) {
128
+ // The repo could not work out whether it still holds this block (unmaterializable
129
+ // history / failed restore). Untracking on that answer would silently drop the block
130
+ // from the spread set on a guess, and only a later re-commit would put it back — so
131
+ // keep it tracked and let the next sweep (or a heal) settle it.
132
+ log('unavailable block=%s reason=%s (keeping tracked)', blockId, blockResult.unavailable);
133
+ continue;
134
+ }
127
135
  if (!blockResult?.block) {
128
136
  // The block has left local storage. No deletion event exists today to evict it
129
137
  // from the tracked set, so prune here. Deleting the current element of a Set mid
@@ -1 +1 @@
1
- {"version":3,"file":"spread-on-churn.js","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spread-on-churn.js","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Optional, embedder-supplied authorization for inbound protocol streams.
3
+ *
4
+ * The `repo`, `cluster`, `sync` and `block-transfer` services otherwise go straight from
5
+ * "stream opened" to "decode and execute", so any peer that can open a connection can issue
6
+ * database operations. An application that owns a *private* database (only nodes it admitted
7
+ * may read or write) needs a seam ahead of decoding; this is that seam.
8
+ *
9
+ * Contract:
10
+ *
11
+ * - **Absent predicate → today's behavior exactly.** Every service holds
12
+ * `InboundStreamAuthorization | undefined`; when it is `undefined` the handler never
13
+ * awaits anything extra and no code on this path runs.
14
+ * - **Supplied predicate → fail closed.** Only a literal `true` allows the stream. `false`,
15
+ * a throw, a rejection, a timeout, or an unidentifiable remote peer all deny, and denial
16
+ * aborts the stream *before* any frame is decoded or any operation executed.
17
+ * - **Called once per inbound stream**, not once per operation — which is equivalent here
18
+ * because all four protocols are strictly one request per stream (each handler's generator
19
+ * `return`s after the first response, so a second queued frame is never read).
20
+ * - **Peer id encoding**: the predicate receives `connection.remotePeer.toString()` — the
21
+ * libp2p base58btc/CIDv1 peer-id string (e.g. `12D3KooW…`), the same form
22
+ * `PeerId.toString()` produces everywhere else in this codebase. Compare against that,
23
+ * never against a multiaddr, a public-key hash, or a base64 encoding.
24
+ * - **What a caller observes**: a stream reset. Denial is deliberately *not* reported on the
25
+ * wire — telling an unauthorized peer "you are not a member" confirms membership state to
26
+ * exactly the party the embedder decided not to trust, and the four protocols have four
27
+ * different response shapes with no common error frame. The denial is instead loud on the
28
+ * *denying* node: it is logged with the peer id, protocol and reason, and the stream is
29
+ * aborted with an {@link UnauthorizedInboundStreamError} carrying
30
+ * {@link INBOUND_STREAM_UNAUTHORIZED_CODE}, so local diagnostics can tell a denial apart
31
+ * from a transport fault.
32
+ * - **Cost**: the predicate sits in the hot path of every inbound stream, ahead of the work
33
+ * that stream would do. Embedders are expected to make it cheap — an in-memory set lookup —
34
+ * and to memoize anything that would otherwise hit storage or the network per stream.
35
+ *
36
+ * NOTE: denial is stateless and unthrottled — a denied peer may reopen streams as fast as
37
+ * libp2p's per-connection `maxInboundStreams` allows, and nothing here records the denial. That
38
+ * is fine while the predicate is an in-memory lookup. If a denied peer ever shows up as load, the
39
+ * fix is upstream of this module, not inside it: feed denials into `PeerReputationService`, or
40
+ * refuse the peer at the connection level with `NodeOptions.connectionGater`.
41
+ */
42
+ /**
43
+ * Predicate deciding whether `remotePeerId` may open `protocol` on this node.
44
+ *
45
+ * @param remotePeerId the dialing peer's `PeerId.toString()` (base58btc / CIDv1, `12D3KooW…`)
46
+ * @param protocol the full protocol id the stream was opened on, e.g.
47
+ * `/optimystic/<network>/repo/1.0.0`
48
+ * @returns `true` to allow. Anything else — `false`, a throw, or a rejection — denies.
49
+ */
50
+ export type AuthorizeInboundStream = (remotePeerId: string, protocol: string) => Promise<boolean> | boolean;
51
+ /** Stable error code carried by {@link UnauthorizedInboundStreamError}. */
52
+ export declare const INBOUND_STREAM_UNAUTHORIZED_CODE = "ERR_INBOUND_STREAM_UNAUTHORIZED";
53
+ /**
54
+ * The reason an inbound stream was aborted by the authorization gate. Distinct from a
55
+ * transport fault so the denying node's logs and any local abort-reason inspection can tell
56
+ * the two apart; the remote only ever sees the stream reset (see the module doc).
57
+ */
58
+ export declare class UnauthorizedInboundStreamError extends Error {
59
+ readonly code = "ERR_INBOUND_STREAM_UNAUTHORIZED";
60
+ constructor(remotePeerId: string, protocol: string, reason: string);
61
+ }
62
+ /**
63
+ * How long the predicate may take before the stream is denied. A hanging predicate would
64
+ * otherwise pin an inbound stream slot indefinitely; timing out is the fail-closed reading of
65
+ * "we could not establish that this peer is allowed".
66
+ */
67
+ export declare const DEFAULT_INBOUND_AUTHORIZATION_TIMEOUT_MS = 5000;
68
+ /** The slice of a service's init that configures this gate. Mixed into all four service inits. */
69
+ export interface InboundStreamAuthorizationInit {
70
+ /**
71
+ * Optional predicate consulted once per inbound stream, before any decoding or execution.
72
+ * Absent → no check at all. See {@link AuthorizeInboundStream}.
73
+ */
74
+ authorizeInboundStream?: AuthorizeInboundStream;
75
+ /**
76
+ * Deadline for {@link InboundStreamAuthorizationInit.authorizeInboundStream}; expiry denies
77
+ * the stream. Default {@link DEFAULT_INBOUND_AUTHORIZATION_TIMEOUT_MS}.
78
+ */
79
+ authorizeInboundStreamTimeoutMs?: number;
80
+ }
81
+ /** The part of a libp2p `Stream` this gate needs: the ability to tear it down. */
82
+ interface AbortableStream {
83
+ abort: (err: Error) => void;
84
+ }
85
+ /** Log sink shape shared by the component loggers and the `debug` loggers the services use. */
86
+ export type AuthorizationLog = (message: string, ...args: unknown[]) => void;
87
+ /**
88
+ * A configured authorization gate for one service's protocol. Constructed only when the
89
+ * embedder supplied a predicate, so a service holding `undefined` runs the original code path.
90
+ */
91
+ export declare class InboundStreamAuthorization {
92
+ private readonly authorize;
93
+ private readonly protocol;
94
+ private readonly timeoutMs;
95
+ private readonly log;
96
+ constructor(authorize: AuthorizeInboundStream, protocol: string, timeoutMs: number, log: AuthorizationLog);
97
+ /**
98
+ * Consult the predicate for one inbound stream and abort the stream if it is not allowed.
99
+ *
100
+ * @returns `true` when the stream was denied — the caller must return immediately without
101
+ * decoding anything — and `false` when it may proceed.
102
+ */
103
+ deny(stream: AbortableStream, remotePeerId: string | undefined): Promise<boolean>;
104
+ /** Run the predicate under its deadline, converting every failure mode into a denial. */
105
+ private decide;
106
+ /** Log the denial and tear the stream down. Always returns `true` (denied). */
107
+ private abort;
108
+ }
109
+ /**
110
+ * Build the gate for a service, or `undefined` when the embedder supplied no predicate.
111
+ *
112
+ * Returning `undefined` (rather than an always-allow gate) is what makes the absent-predicate
113
+ * case genuinely free: the call site guards on the field and never awaits.
114
+ */
115
+ export declare function createInboundStreamAuthorization(init: InboundStreamAuthorizationInit, protocol: string, log: AuthorizationLog): InboundStreamAuthorization | undefined;
116
+ export {};
117
+ //# sourceMappingURL=inbound-authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-authorization.d.ts","sourceRoot":"","sources":["../../src/inbound-authorization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAE5G,2EAA2E;AAC3E,eAAO,MAAM,gCAAgC,oCAAoC,CAAC;AAElF;;;;GAIG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;IACxD,QAAQ,CAAC,IAAI,qCAAoC;gBACrC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAIlE;AAED;;;;GAIG;AACH,eAAO,MAAM,wCAAwC,OAAQ,CAAC;AAE9D,kGAAkG;AAClG,MAAM,WAAW,8BAA8B;IAC9C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD;;;OAGG;IACH,+BAA+B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,kFAAkF;AAClF,UAAU,eAAe;IACxB,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC5B;AAED,+FAA+F;AAC/F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAK7E;;;GAGG;AACH,qBAAa,0BAA0B;IAErC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAHH,SAAS,EAAE,sBAAsB,EACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,gBAAgB;IAGvC;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvF,yFAAyF;YAC3E,MAAM;IA0BpB,+EAA+E;IAC/E,OAAO,CAAC,KAAK;CAWb;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC/C,IAAI,EAAE,8BAA8B,EACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,gBAAgB,GACnB,0BAA0B,GAAG,SAAS,CAUxC"}