@peerbit/pubsub 4.1.4-bbf27fa → 4.1.4-cb91e7b

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 (46) hide show
  1. package/README.md +23 -20
  2. package/dist/benchmark/fanout-tree-sim-lib.d.ts +201 -0
  3. package/dist/benchmark/fanout-tree-sim-lib.d.ts.map +1 -0
  4. package/dist/benchmark/fanout-tree-sim-lib.js +1225 -0
  5. package/dist/benchmark/fanout-tree-sim-lib.js.map +1 -0
  6. package/dist/benchmark/fanout-tree-sim.d.ts +11 -0
  7. package/dist/benchmark/fanout-tree-sim.d.ts.map +1 -0
  8. package/dist/benchmark/fanout-tree-sim.js +521 -0
  9. package/dist/benchmark/fanout-tree-sim.js.map +1 -0
  10. package/dist/benchmark/index.d.ts +6 -0
  11. package/dist/benchmark/index.d.ts.map +1 -1
  12. package/dist/benchmark/index.js +38 -80
  13. package/dist/benchmark/index.js.map +1 -1
  14. package/dist/benchmark/pubsub-topic-sim-lib.d.ts +82 -0
  15. package/dist/benchmark/pubsub-topic-sim-lib.d.ts.map +1 -0
  16. package/dist/benchmark/pubsub-topic-sim-lib.js +625 -0
  17. package/dist/benchmark/pubsub-topic-sim-lib.js.map +1 -0
  18. package/dist/benchmark/pubsub-topic-sim.d.ts +9 -0
  19. package/dist/benchmark/pubsub-topic-sim.d.ts.map +1 -0
  20. package/dist/benchmark/pubsub-topic-sim.js +116 -0
  21. package/dist/benchmark/pubsub-topic-sim.js.map +1 -0
  22. package/dist/benchmark/sim/bench-utils.d.ts +25 -0
  23. package/dist/benchmark/sim/bench-utils.d.ts.map +1 -0
  24. package/dist/benchmark/sim/bench-utils.js +141 -0
  25. package/dist/benchmark/sim/bench-utils.js.map +1 -0
  26. package/dist/src/fanout-channel.d.ts +62 -0
  27. package/dist/src/fanout-channel.d.ts.map +1 -0
  28. package/dist/src/fanout-channel.js +114 -0
  29. package/dist/src/fanout-channel.js.map +1 -0
  30. package/dist/src/fanout-tree.d.ts +550 -0
  31. package/dist/src/fanout-tree.d.ts.map +1 -0
  32. package/dist/src/fanout-tree.js +4943 -0
  33. package/dist/src/fanout-tree.js.map +1 -0
  34. package/dist/src/index.d.ts +161 -39
  35. package/dist/src/index.d.ts.map +1 -1
  36. package/dist/src/index.js +1352 -455
  37. package/dist/src/index.js.map +1 -1
  38. package/dist/src/topic-root-control-plane.d.ts +43 -0
  39. package/dist/src/topic-root-control-plane.d.ts.map +1 -0
  40. package/dist/src/topic-root-control-plane.js +120 -0
  41. package/dist/src/topic-root-control-plane.js.map +1 -0
  42. package/package.json +10 -9
  43. package/src/fanout-channel.ts +150 -0
  44. package/src/fanout-tree.ts +6297 -0
  45. package/src/index.ts +1612 -595
  46. package/src/topic-root-control-plane.ts +160 -0
package/README.md CHANGED
@@ -1,28 +1,31 @@
1
- # Direct Sub
1
+ # PubSub Transport
2
2
 
3
- Pubsub protocol built on top of [Direct Stream](./../stream/README.md)
3
+ This package contains two related building blocks that both run on top of
4
+ [`@peerbit/stream`](../stream/README.md):
4
5
 
5
- Features
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
- - Efficient content routing through an approximate path finding algorithm
16
- ```typescript
17
- .publish(data, { topics: ["a","b"]})
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
- - Packet prioritization. Data packages can be sent with different priority. That allows some traffic to pass through the traffic faster than other. This is useful in case of congestion
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
- Protocol specification (TODO)
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
- Currently the protocol itself is not specificed more than as in this implementation with messages types found [here](https://github.com/dao-xyz/peerbit/blob/master/packages/transport/stream-interface/src/messages.ts) and [here](https://github.com/dao-xyz/peerbit/blob/master/packages/transport/pubsub-interface/src/messages.ts). Message handling logic can be found [here](https://github.com/dao-xyz/peerbit/blob/aa577a5e5b2b4920662de5e0efb92fb97a5dc63c/packages/transport/pubsub/src/index.ts#L502) and [here](https://github.com/dao-xyz/peerbit/blob/aa577a5e5b2b4920662de5e0efb92fb97a5dc63c/packages/transport/stream/src/index.ts#L1057).
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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"}