@peerbit/pubsub 4.1.3-e38a67b → 4.1.4-000e3f1
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/README.md +23 -20
- package/dist/benchmark/fanout-tree-sim-lib.d.ts +201 -0
- package/dist/benchmark/fanout-tree-sim-lib.d.ts.map +1 -0
- package/dist/benchmark/fanout-tree-sim-lib.js +1225 -0
- package/dist/benchmark/fanout-tree-sim-lib.js.map +1 -0
- package/dist/benchmark/fanout-tree-sim.d.ts +11 -0
- package/dist/benchmark/fanout-tree-sim.d.ts.map +1 -0
- package/dist/benchmark/fanout-tree-sim.js +521 -0
- package/dist/benchmark/fanout-tree-sim.js.map +1 -0
- package/dist/benchmark/index.d.ts +6 -0
- package/dist/benchmark/index.d.ts.map +1 -1
- package/dist/benchmark/index.js +38 -80
- package/dist/benchmark/index.js.map +1 -1
- package/dist/benchmark/pubsub-topic-sim-lib.d.ts +82 -0
- package/dist/benchmark/pubsub-topic-sim-lib.d.ts.map +1 -0
- package/dist/benchmark/pubsub-topic-sim-lib.js +625 -0
- package/dist/benchmark/pubsub-topic-sim-lib.js.map +1 -0
- package/dist/benchmark/pubsub-topic-sim.d.ts +9 -0
- package/dist/benchmark/pubsub-topic-sim.d.ts.map +1 -0
- package/dist/benchmark/pubsub-topic-sim.js +116 -0
- package/dist/benchmark/pubsub-topic-sim.js.map +1 -0
- package/dist/benchmark/sim/bench-utils.d.ts +25 -0
- package/dist/benchmark/sim/bench-utils.d.ts.map +1 -0
- package/dist/benchmark/sim/bench-utils.js +141 -0
- package/dist/benchmark/sim/bench-utils.js.map +1 -0
- package/dist/src/fanout-channel.d.ts +62 -0
- package/dist/src/fanout-channel.d.ts.map +1 -0
- package/dist/src/fanout-channel.js +114 -0
- package/dist/src/fanout-channel.js.map +1 -0
- package/dist/src/fanout-tree.d.ts +550 -0
- package/dist/src/fanout-tree.d.ts.map +1 -0
- package/dist/src/fanout-tree.js +4943 -0
- package/dist/src/fanout-tree.js.map +1 -0
- package/dist/src/index.d.ts +161 -39
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1380 -462
- package/dist/src/index.js.map +1 -1
- package/dist/src/topic-root-control-plane.d.ts +43 -0
- package/dist/src/topic-root-control-plane.d.ts.map +1 -0
- package/dist/src/topic-root-control-plane.js +120 -0
- package/dist/src/topic-root-control-plane.js.map +1 -0
- package/package.json +10 -9
- package/src/fanout-channel.ts +150 -0
- package/src/fanout-tree.ts +6297 -0
- package/src/index.ts +1691 -647
- package/src/topic-root-control-plane.ts +160 -0
package/README.md
CHANGED
|
@@ -1,28 +1,31 @@
|
|
|
1
|
-
#
|
|
1
|
+
# PubSub Transport
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This package contains two related building blocks that both run on top of
|
|
4
|
+
[`@peerbit/stream`](../stream/README.md):
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
- Accurate
|
|
7
|
-
|
|
8
|
-
```typescript
|
|
9
|
-
.getSubscribers(topic)
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
method based on aggregated subscriber info, not only from immediate peers.
|
|
6
|
+
## `TopicControlPlane` (`/peerbit/topic-control-plane/1.0.0`)
|
|
13
7
|
|
|
8
|
+
A DirectStream-based topic membership and forwarding layer.
|
|
14
9
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
will try to find the subscribers of "a" and "b" and send messages with the shortest path in the network.
|
|
10
|
+
This is useful for small to medium overlays and targeted messaging (explicit receiver
|
|
11
|
+
lists) where you can tolerate subscription gossip and do not need the strict fanout
|
|
12
|
+
economics of a tree.
|
|
20
13
|
|
|
21
|
-
|
|
22
|
-
- Mode'd delivery. Packages can be sent with different delivery mode 'Acknowledge' (wait for acknowledgement from all known subscribers), 'Seek' (find new subscribers for a topic), 'Silent' (just deliver).
|
|
23
|
-
- Redundancy in data delivery. Data packages can be sent with different redundancy. This means that you can choose to send some packages only in one path (the fastest) or send a package in the 'N' fastest paths (this gives you a redundancy degree of 'N'). This feature is useful when you want to adapt delivery for unstable networks or when you want to make sure that some messages are delivered with high probability (without waiting for Acknowledgemts and retry)
|
|
14
|
+
## `FanoutTree` (`/peerbit/fanout-tree/0.5.0`)
|
|
24
15
|
|
|
16
|
+
A scalable fanout tree for 1 writer to many subscribers (and tree-local unicast using
|
|
17
|
+
route tokens).
|
|
25
18
|
|
|
26
|
-
|
|
19
|
+
This is the intended mechanism for very large audiences where you must cap per-node
|
|
20
|
+
upload and avoid gossip-style explosion.
|
|
27
21
|
|
|
28
|
-
|
|
22
|
+
`FanoutChannel` is a small convenience wrapper around `FanoutTree` for channel-scoped
|
|
23
|
+
usage.
|
|
24
|
+
|
|
25
|
+
## `TopicRootControlPlane`
|
|
26
|
+
|
|
27
|
+
A small helper to resolve a topic root from:
|
|
28
|
+
|
|
29
|
+
- An explicit mapping (topic -> root)
|
|
30
|
+
- A set of default candidates (deterministic choice per topic)
|
|
31
|
+
- Optional trackers (if configured by the application)
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { InMemoryNetwork } from "@peerbit/libp2p-test-utils/inmemory-libp2p.js";
|
|
2
|
+
export type FanoutTreeSimParams = {
|
|
3
|
+
nodes: number;
|
|
4
|
+
rootIndex: number;
|
|
5
|
+
bootstraps: number;
|
|
6
|
+
bootstrapMaxPeers: number;
|
|
7
|
+
subscribers: number;
|
|
8
|
+
relayFraction: number;
|
|
9
|
+
messages: number;
|
|
10
|
+
msgRate: number;
|
|
11
|
+
msgSize: number;
|
|
12
|
+
intervalMs: number;
|
|
13
|
+
settleMs: number;
|
|
14
|
+
deadlineMs: number;
|
|
15
|
+
maxDataAgeMs: number;
|
|
16
|
+
timeoutMs: number;
|
|
17
|
+
seed: number;
|
|
18
|
+
topic: string;
|
|
19
|
+
rootUploadLimitBps: number;
|
|
20
|
+
rootMaxChildren: number;
|
|
21
|
+
relayUploadLimitBps: number;
|
|
22
|
+
relayMaxChildren: number;
|
|
23
|
+
allowKick: boolean;
|
|
24
|
+
bidPerByte: number;
|
|
25
|
+
bidPerByteRelay: number;
|
|
26
|
+
bidPerByteLeaf: number;
|
|
27
|
+
repair: boolean;
|
|
28
|
+
repairWindowMessages: number;
|
|
29
|
+
repairMaxBackfillMessages: number;
|
|
30
|
+
repairIntervalMs: number;
|
|
31
|
+
repairMaxPerReq: number;
|
|
32
|
+
neighborRepair: boolean;
|
|
33
|
+
neighborRepairPeers: number;
|
|
34
|
+
neighborMeshPeers: number;
|
|
35
|
+
neighborAnnounceIntervalMs: number;
|
|
36
|
+
neighborMeshRefreshIntervalMs: number;
|
|
37
|
+
neighborHaveTtlMs: number;
|
|
38
|
+
neighborRepairBudgetBps: number;
|
|
39
|
+
neighborRepairBurstMs: number;
|
|
40
|
+
streamRxDelayMs: number;
|
|
41
|
+
streamHighWaterMarkBytes: number;
|
|
42
|
+
dialDelayMs: number;
|
|
43
|
+
joinConcurrency: number;
|
|
44
|
+
joinReqTimeoutMs: number;
|
|
45
|
+
candidateShuffleTopK: number;
|
|
46
|
+
candidateScoringMode: "ranked-shuffle" | "ranked-strict" | "weighted";
|
|
47
|
+
bootstrapEnsureIntervalMs: number;
|
|
48
|
+
trackerQueryIntervalMs: number;
|
|
49
|
+
joinAttemptsPerRound: number;
|
|
50
|
+
candidateCooldownMs: number;
|
|
51
|
+
joinPhases: boolean;
|
|
52
|
+
joinPhaseSettleMs: number;
|
|
53
|
+
maxLatencySamples: number;
|
|
54
|
+
profile: boolean;
|
|
55
|
+
progress: boolean;
|
|
56
|
+
progressEveryMs: number;
|
|
57
|
+
dropDataFrameRate: number;
|
|
58
|
+
churnEveryMs: number;
|
|
59
|
+
churnDownMs: number;
|
|
60
|
+
churnFraction: number;
|
|
61
|
+
assertMinJoinedPct: number;
|
|
62
|
+
assertMinDeliveryPct: number;
|
|
63
|
+
assertMinDeadlineDeliveryPct: number;
|
|
64
|
+
assertMaxUploadFracPct: number;
|
|
65
|
+
assertMaxOverheadFactor: number;
|
|
66
|
+
assertMaxControlBpp: number;
|
|
67
|
+
assertMaxTrackerBpp: number;
|
|
68
|
+
assertMaxRepairBpp: number;
|
|
69
|
+
assertAttachP95Ms: number;
|
|
70
|
+
assertMaxTreeLevelP95: number;
|
|
71
|
+
assertMaxFormationScore: number;
|
|
72
|
+
assertMaxOrphans: number;
|
|
73
|
+
assertRecoveryP95Ms: number;
|
|
74
|
+
assertMaxReparentsPerMin: number;
|
|
75
|
+
assertMaxOrphanArea: number;
|
|
76
|
+
};
|
|
77
|
+
export type FanoutTreeSimResult = {
|
|
78
|
+
params: FanoutTreeSimParams;
|
|
79
|
+
bootstrapCount: number;
|
|
80
|
+
subscriberCount: number;
|
|
81
|
+
relayCount: number;
|
|
82
|
+
joinedCount: number;
|
|
83
|
+
joinedPct: number;
|
|
84
|
+
joinMs: number;
|
|
85
|
+
attachSamples: number;
|
|
86
|
+
attachP50: number;
|
|
87
|
+
attachP95: number;
|
|
88
|
+
attachP99: number;
|
|
89
|
+
attachMax: number;
|
|
90
|
+
formationTreeMaxLevel: number;
|
|
91
|
+
formationTreeLevelP95: number;
|
|
92
|
+
formationTreeLevelAvg: number;
|
|
93
|
+
formationTreeOrphans: number;
|
|
94
|
+
formationTreeChildrenP95: number;
|
|
95
|
+
formationTreeChildrenMax: number;
|
|
96
|
+
formationTreeRootChildren: number;
|
|
97
|
+
formationUnderlayEdges: number;
|
|
98
|
+
formationUnderlayDistP95: number;
|
|
99
|
+
formationUnderlayDistMax: number;
|
|
100
|
+
formationStretchP95: number;
|
|
101
|
+
formationStretchMax: number;
|
|
102
|
+
formationScore: number;
|
|
103
|
+
publishMs: number;
|
|
104
|
+
expected: number;
|
|
105
|
+
delivered: number;
|
|
106
|
+
deliveredPct: number;
|
|
107
|
+
deliveredWithinDeadline: number;
|
|
108
|
+
deliveredWithinDeadlinePct: number;
|
|
109
|
+
duplicates: number;
|
|
110
|
+
latencySamples: number;
|
|
111
|
+
latencyP50: number;
|
|
112
|
+
latencyP95: number;
|
|
113
|
+
latencyP99: number;
|
|
114
|
+
latencyMax: number;
|
|
115
|
+
droppedForwardsTotal: number;
|
|
116
|
+
droppedForwardsMax: number;
|
|
117
|
+
droppedForwardsMaxNode?: string;
|
|
118
|
+
staleForwardsDroppedTotal: number;
|
|
119
|
+
staleForwardsDroppedMax: number;
|
|
120
|
+
staleForwardsDroppedMaxNode?: string;
|
|
121
|
+
dataWriteDropsTotal: number;
|
|
122
|
+
dataWriteDropsMax: number;
|
|
123
|
+
dataWriteDropsMaxNode?: string;
|
|
124
|
+
reparentDisconnectTotal: number;
|
|
125
|
+
reparentStaleTotal: number;
|
|
126
|
+
reparentKickedTotal: number;
|
|
127
|
+
treeMaxLevel: number;
|
|
128
|
+
treeLevelP95: number;
|
|
129
|
+
treeLevelAvg: number;
|
|
130
|
+
treeOrphans: number;
|
|
131
|
+
treeChildrenP95: number;
|
|
132
|
+
treeChildrenMax: number;
|
|
133
|
+
treeRootChildren: number;
|
|
134
|
+
maxUploadBps: number;
|
|
135
|
+
maxUploadFracPct: number;
|
|
136
|
+
maxUploadNode?: string;
|
|
137
|
+
streamQueuedBytesTotal: number;
|
|
138
|
+
streamQueuedBytesMax: number;
|
|
139
|
+
streamQueuedBytesP95: number;
|
|
140
|
+
streamQueuedBytesMaxNode?: string;
|
|
141
|
+
streamQueuedBytesByLane: number[];
|
|
142
|
+
churnEvents: number;
|
|
143
|
+
churnedPeersTotal: number;
|
|
144
|
+
maintDurationMs: number;
|
|
145
|
+
maintSamples: number;
|
|
146
|
+
maintMaxOrphans: number;
|
|
147
|
+
maintOrphanArea: number;
|
|
148
|
+
maintRecoveryCount: number;
|
|
149
|
+
maintRecoveryP50Ms: number;
|
|
150
|
+
maintRecoveryP95Ms: number;
|
|
151
|
+
maintReparentsPerMin: number;
|
|
152
|
+
maintMaxReparentsPerPeer: number;
|
|
153
|
+
maintLevelP95DriftMax: number;
|
|
154
|
+
maintChildrenP95DriftMax: number;
|
|
155
|
+
overheadFactorData: number;
|
|
156
|
+
controlBpp: number;
|
|
157
|
+
trackerBpp: number;
|
|
158
|
+
repairBpp: number;
|
|
159
|
+
earningsTotal: number;
|
|
160
|
+
earningsRelayCount: number;
|
|
161
|
+
earningsRelayP50: number;
|
|
162
|
+
earningsRelayP95: number;
|
|
163
|
+
earningsRelayMax: number;
|
|
164
|
+
protocolControlSends: number;
|
|
165
|
+
protocolControlBytesSent: number;
|
|
166
|
+
protocolControlBytesSentJoin: number;
|
|
167
|
+
protocolControlBytesSentRepair: number;
|
|
168
|
+
protocolControlBytesSentTracker: number;
|
|
169
|
+
protocolControlReceives: number;
|
|
170
|
+
protocolControlBytesReceived: number;
|
|
171
|
+
protocolDataSends: number;
|
|
172
|
+
protocolDataPayloadBytesSent: number;
|
|
173
|
+
protocolDataReceives: number;
|
|
174
|
+
protocolDataPayloadBytesReceived: number;
|
|
175
|
+
protocolRepairReqSent: number;
|
|
176
|
+
protocolFetchReqSent: number;
|
|
177
|
+
protocolIHaveSent: number;
|
|
178
|
+
protocolTrackerFeedbackSent: number;
|
|
179
|
+
protocolCacheHitsServed: number;
|
|
180
|
+
protocolHoleFillsFromNeighbor: number;
|
|
181
|
+
protocolRouteCacheHits: number;
|
|
182
|
+
protocolRouteCacheMisses: number;
|
|
183
|
+
protocolRouteCacheExpirations: number;
|
|
184
|
+
protocolRouteCacheEvictions: number;
|
|
185
|
+
protocolRouteProxyQueries: number;
|
|
186
|
+
protocolRouteProxyTimeouts: number;
|
|
187
|
+
protocolRouteProxyFanout: number;
|
|
188
|
+
network: InMemoryNetwork["metrics"];
|
|
189
|
+
profile?: {
|
|
190
|
+
cpuUserMs: number;
|
|
191
|
+
cpuSystemMs: number;
|
|
192
|
+
rssMb: number;
|
|
193
|
+
heapUsedMb: number;
|
|
194
|
+
eventLoopDelayP95Ms: number;
|
|
195
|
+
eventLoopDelayMaxMs: number;
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
export declare const resolveFanoutTreeSimParams: (input: Partial<FanoutTreeSimParams>) => FanoutTreeSimParams;
|
|
199
|
+
export declare const formatFanoutTreeSimResult: (r: FanoutTreeSimResult) => string;
|
|
200
|
+
export declare const runFanoutTreeSim: (input: Partial<FanoutTreeSimParams>) => Promise<FanoutTreeSimResult>;
|
|
201
|
+
//# sourceMappingURL=fanout-tree-sim-lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fanout-tree-sim-lib.d.ts","sourceRoot":"","sources":["../../benchmark/fanout-tree-sim-lib.ts"],"names":[],"mappings":"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"}
|