@streamr/trackerless-network 103.1.2 → 103.2.0-experiment.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.
- package/dist/exports.cjs +4489 -0
- package/dist/exports.cjs.map +1 -0
- package/dist/exports.d.ts +1391 -0
- package/dist/exports.js +4477 -0
- package/dist/exports.js.map +1 -0
- package/package.json +25 -18
- package/dist/generated/google/protobuf/any.d.ts +0 -180
- package/dist/generated/google/protobuf/any.js +0 -155
- package/dist/generated/google/protobuf/any.js.map +0 -1
- package/dist/generated/google/protobuf/empty.d.ts +0 -31
- package/dist/generated/google/protobuf/empty.js +0 -45
- package/dist/generated/google/protobuf/empty.js.map +0 -1
- package/dist/generated/google/protobuf/timestamp.d.ts +0 -156
- package/dist/generated/google/protobuf/timestamp.js +0 -136
- package/dist/generated/google/protobuf/timestamp.js.map +0 -1
- package/dist/generated/packages/dht/protos/DhtRpc.client.d.ts +0 -371
- package/dist/generated/packages/dht/protos/DhtRpc.client.js +0 -292
- package/dist/generated/packages/dht/protos/DhtRpc.client.js.map +0 -1
- package/dist/generated/packages/dht/protos/DhtRpc.d.ts +0 -1031
- package/dist/generated/packages/dht/protos/DhtRpc.js +0 -702
- package/dist/generated/packages/dht/protos/DhtRpc.js.map +0 -1
- package/dist/generated/packages/dht/protos/DhtRpc.server.d.ts +0 -168
- package/dist/generated/packages/dht/protos/DhtRpc.server.js +0 -3
- package/dist/generated/packages/dht/protos/DhtRpc.server.js.map +0 -1
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.d.ts +0 -87
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js +0 -66
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js.map +0 -1
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.client.d.ts +0 -237
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.client.js +0 -190
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.client.js.map +0 -1
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.d.ts +0 -687
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.js +0 -479
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.js.map +0 -1
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.server.d.ts +0 -102
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.server.js +0 -3
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.server.js.map +0 -1
- package/dist/package.json +0 -56
- package/dist/src/ContentDeliveryManager.d.ts +0 -82
- package/dist/src/ContentDeliveryManager.js +0 -325
- package/dist/src/ContentDeliveryManager.js.map +0 -1
- package/dist/src/NetworkNode.d.ts +0 -44
- package/dist/src/NetworkNode.js +0 -98
- package/dist/src/NetworkNode.js.map +0 -1
- package/dist/src/NetworkStack.d.ts +0 -36
- package/dist/src/NetworkStack.js +0 -165
- package/dist/src/NetworkStack.js.map +0 -1
- package/dist/src/NodeInfoClient.d.ts +0 -9
- package/dist/src/NodeInfoClient.js +0 -21
- package/dist/src/NodeInfoClient.js.map +0 -1
- package/dist/src/NodeInfoRpcLocal.d.ts +0 -12
- package/dist/src/NodeInfoRpcLocal.js +0 -22
- package/dist/src/NodeInfoRpcLocal.js.map +0 -1
- package/dist/src/NodeInfoRpcRemote.d.ts +0 -6
- package/dist/src/NodeInfoRpcRemote.js +0 -11
- package/dist/src/NodeInfoRpcRemote.js.map +0 -1
- package/dist/src/StreamPartNetworkSplitAvoidance.d.ts +0 -18
- package/dist/src/StreamPartNetworkSplitAvoidance.js +0 -74
- package/dist/src/StreamPartNetworkSplitAvoidance.js.map +0 -1
- package/dist/src/StreamPartReconnect.d.ts +0 -11
- package/dist/src/StreamPartReconnect.js +0 -37
- package/dist/src/StreamPartReconnect.js.map +0 -1
- package/dist/src/content-delivery-layer/ContentDeliveryLayerNode.d.ts +0 -78
- package/dist/src/content-delivery-layer/ContentDeliveryLayerNode.js +0 -240
- package/dist/src/content-delivery-layer/ContentDeliveryLayerNode.js.map +0 -1
- package/dist/src/content-delivery-layer/ContentDeliveryRpcLocal.d.ts +0 -23
- package/dist/src/content-delivery-layer/ContentDeliveryRpcLocal.js +0 -40
- package/dist/src/content-delivery-layer/ContentDeliveryRpcLocal.js.map +0 -1
- package/dist/src/content-delivery-layer/ContentDeliveryRpcRemote.d.ts +0 -11
- package/dist/src/content-delivery-layer/ContentDeliveryRpcRemote.js +0 -38
- package/dist/src/content-delivery-layer/ContentDeliveryRpcRemote.js.map +0 -1
- package/dist/src/content-delivery-layer/DuplicateMessageDetector.d.ts +0 -55
- package/dist/src/content-delivery-layer/DuplicateMessageDetector.js +0 -159
- package/dist/src/content-delivery-layer/DuplicateMessageDetector.js.map +0 -1
- package/dist/src/content-delivery-layer/NodeList.d.ts +0 -26
- package/dist/src/content-delivery-layer/NodeList.js +0 -93
- package/dist/src/content-delivery-layer/NodeList.js.map +0 -1
- package/dist/src/content-delivery-layer/createContentDeliveryLayerNode.d.ts +0 -14
- package/dist/src/content-delivery-layer/createContentDeliveryLayerNode.js +0 -129
- package/dist/src/content-delivery-layer/createContentDeliveryLayerNode.js.map +0 -1
- package/dist/src/content-delivery-layer/formStreamPartDeliveryServiceId.d.ts +0 -3
- package/dist/src/content-delivery-layer/formStreamPartDeliveryServiceId.js +0 -9
- package/dist/src/content-delivery-layer/formStreamPartDeliveryServiceId.js.map +0 -1
- package/dist/src/content-delivery-layer/inspection/InspectSession.d.ts +0 -19
- package/dist/src/content-delivery-layer/inspection/InspectSession.js +0 -43
- package/dist/src/content-delivery-layer/inspection/InspectSession.js.map +0 -1
- package/dist/src/content-delivery-layer/inspection/Inspector.d.ts +0 -30
- package/dist/src/content-delivery-layer/inspection/Inspector.js +0 -75
- package/dist/src/content-delivery-layer/inspection/Inspector.js.map +0 -1
- package/dist/src/content-delivery-layer/neighbor-discovery/HandshakeRpcLocal.d.ts +0 -29
- package/dist/src/content-delivery-layer/neighbor-discovery/HandshakeRpcLocal.js +0 -106
- package/dist/src/content-delivery-layer/neighbor-discovery/HandshakeRpcLocal.js.map +0 -1
- package/dist/src/content-delivery-layer/neighbor-discovery/HandshakeRpcRemote.d.ts +0 -14
- package/dist/src/content-delivery-layer/neighbor-discovery/HandshakeRpcRemote.js +0 -55
- package/dist/src/content-delivery-layer/neighbor-discovery/HandshakeRpcRemote.js.map +0 -1
- package/dist/src/content-delivery-layer/neighbor-discovery/Handshaker.d.ts +0 -32
- package/dist/src/content-delivery-layer/neighbor-discovery/Handshaker.js +0 -149
- package/dist/src/content-delivery-layer/neighbor-discovery/Handshaker.js.map +0 -1
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborFinder.d.ts +0 -22
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborFinder.js +0 -64
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborFinder.js.map +0 -1
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateManager.d.ts +0 -27
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateManager.js +0 -47
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateManager.js.map +0 -1
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +0 -25
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateRpcLocal.js +0 -52
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateRpcLocal.js.map +0 -1
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateRpcRemote.d.ts +0 -11
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateRpcRemote.js +0 -31
- package/dist/src/content-delivery-layer/neighbor-discovery/NeighborUpdateRpcRemote.js.map +0 -1
- package/dist/src/content-delivery-layer/plumtree/PausedNeighbors.d.ts +0 -12
- package/dist/src/content-delivery-layer/plumtree/PausedNeighbors.js +0 -50
- package/dist/src/content-delivery-layer/plumtree/PausedNeighbors.js.map +0 -1
- package/dist/src/content-delivery-layer/plumtree/PlumtreeManager.d.ts +0 -37
- package/dist/src/content-delivery-layer/plumtree/PlumtreeManager.js +0 -141
- package/dist/src/content-delivery-layer/plumtree/PlumtreeManager.js.map +0 -1
- package/dist/src/content-delivery-layer/plumtree/PlumtreeRpcLocal.d.ts +0 -20
- package/dist/src/content-delivery-layer/plumtree/PlumtreeRpcLocal.js +0 -37
- package/dist/src/content-delivery-layer/plumtree/PlumtreeRpcLocal.js.map +0 -1
- package/dist/src/content-delivery-layer/plumtree/PlumtreeRpcRemote.d.ts +0 -8
- package/dist/src/content-delivery-layer/plumtree/PlumtreeRpcRemote.js +0 -26
- package/dist/src/content-delivery-layer/plumtree/PlumtreeRpcRemote.js.map +0 -1
- package/dist/src/content-delivery-layer/propagation/FifoMapWithTTL.d.ts +0 -29
- package/dist/src/content-delivery-layer/propagation/FifoMapWithTTL.js +0 -93
- package/dist/src/content-delivery-layer/propagation/FifoMapWithTTL.js.map +0 -1
- package/dist/src/content-delivery-layer/propagation/Propagation.d.ts +0 -35
- package/dist/src/content-delivery-layer/propagation/Propagation.js +0 -68
- package/dist/src/content-delivery-layer/propagation/Propagation.js.map +0 -1
- package/dist/src/content-delivery-layer/propagation/PropagationTaskStore.d.ts +0 -22
- package/dist/src/content-delivery-layer/propagation/PropagationTaskStore.js +0 -33
- package/dist/src/content-delivery-layer/propagation/PropagationTaskStore.js.map +0 -1
- package/dist/src/content-delivery-layer/proxy/ProxyClient.d.ts +0 -46
- package/dist/src/content-delivery-layer/proxy/ProxyClient.js +0 -214
- package/dist/src/content-delivery-layer/proxy/ProxyClient.js.map +0 -1
- package/dist/src/content-delivery-layer/proxy/ProxyConnectionRpcLocal.d.ts +0 -34
- package/dist/src/content-delivery-layer/proxy/ProxyConnectionRpcLocal.js +0 -72
- package/dist/src/content-delivery-layer/proxy/ProxyConnectionRpcLocal.js.map +0 -1
- package/dist/src/content-delivery-layer/proxy/ProxyConnectionRpcRemote.d.ts +0 -7
- package/dist/src/content-delivery-layer/proxy/ProxyConnectionRpcRemote.js +0 -27
- package/dist/src/content-delivery-layer/proxy/ProxyConnectionRpcRemote.js.map +0 -1
- package/dist/src/content-delivery-layer/temporary-connection/TemporaryConnectionRpcLocal.d.ts +0 -26
- package/dist/src/content-delivery-layer/temporary-connection/TemporaryConnectionRpcLocal.js +0 -45
- package/dist/src/content-delivery-layer/temporary-connection/TemporaryConnectionRpcLocal.js.map +0 -1
- package/dist/src/content-delivery-layer/temporary-connection/TemporaryConnectionRpcRemote.d.ts +0 -6
- package/dist/src/content-delivery-layer/temporary-connection/TemporaryConnectionRpcRemote.js +0 -31
- package/dist/src/content-delivery-layer/temporary-connection/TemporaryConnectionRpcRemote.js.map +0 -1
- package/dist/src/control-layer/ControlLayerNode.d.ts +0 -16
- package/dist/src/control-layer/ControlLayerNode.js +0 -3
- package/dist/src/control-layer/ControlLayerNode.js.map +0 -1
- package/dist/src/control-layer/ExternalNetworkRpc.d.ts +0 -16
- package/dist/src/control-layer/ExternalNetworkRpc.js +0 -23
- package/dist/src/control-layer/ExternalNetworkRpc.js.map +0 -1
- package/dist/src/control-layer/PeerDescriptorStoreManager.d.ts +0 -28
- package/dist/src/control-layer/PeerDescriptorStoreManager.js +0 -78
- package/dist/src/control-layer/PeerDescriptorStoreManager.js.map +0 -1
- package/dist/src/discovery-layer/DiscoveryLayerNode.d.ts +0 -28
- package/dist/src/discovery-layer/DiscoveryLayerNode.js +0 -3
- package/dist/src/discovery-layer/DiscoveryLayerNode.js.map +0 -1
- package/dist/src/exports.d.ts +0 -6
- package/dist/src/exports.js +0 -24
- package/dist/src/exports.js.map +0 -1
- package/dist/src/types.d.ts +0 -6
- package/dist/src/types.js +0 -3
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.d.ts +0 -3
- package/dist/src/utils.js +0 -17
- package/dist/src/utils.js.map +0 -1
- package/dist/test/benchmark/first-message.d.ts +0 -1
- package/dist/test/benchmark/first-message.js +0 -139
- package/dist/test/benchmark/first-message.js.map +0 -1
- package/dist/test/utils/utils.d.ts +0 -15
- package/dist/test/utils/utils.js +0 -106
- package/dist/test/utils/utils.js.map +0 -1
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { DhtAddress, ListeningRpcCommunicator, PeerDescriptor } from '@streamr/dht';
|
|
2
|
-
import { StreamMessage } from '../../../generated/packages/trackerless-network/protos/NetworkRpc';
|
|
3
|
-
import { NodeList } from '../NodeList';
|
|
4
|
-
import EventEmitter from 'eventemitter3';
|
|
5
|
-
interface Options {
|
|
6
|
-
neighbors: NodeList;
|
|
7
|
-
localPeerDescriptor: PeerDescriptor;
|
|
8
|
-
rpcCommunicator: ListeningRpcCommunicator;
|
|
9
|
-
maxPausedNeighbors?: number;
|
|
10
|
-
}
|
|
11
|
-
export declare const MAX_PAUSED_NEIGHBORS_DEFAULT = 3;
|
|
12
|
-
interface Events {
|
|
13
|
-
message: (msg: StreamMessage) => void;
|
|
14
|
-
}
|
|
15
|
-
export declare class PlumtreeManager extends EventEmitter<Events> {
|
|
16
|
-
private readonly neighbors;
|
|
17
|
-
private readonly localPeerDescriptor;
|
|
18
|
-
private readonly localPausedNeighbors;
|
|
19
|
-
private readonly remotePausedNeighbors;
|
|
20
|
-
private readonly rpcLocal;
|
|
21
|
-
private readonly latestMessages;
|
|
22
|
-
private readonly rpcCommunicator;
|
|
23
|
-
private readonly metadataTimestampsAheadOfRealData;
|
|
24
|
-
private readonly maxPausedNeighbors;
|
|
25
|
-
constructor(options: Options);
|
|
26
|
-
pauseNeighbor(node: PeerDescriptor, msgChainId: string): Promise<void>;
|
|
27
|
-
resumeNeighbor(node: PeerDescriptor, msgChainId: string, fromTimestamp: number): Promise<void>;
|
|
28
|
-
private onNeighborRemoved;
|
|
29
|
-
getLatestMessageTimestamp(msgChainId: string): number;
|
|
30
|
-
private sendBuffer;
|
|
31
|
-
private onMetadata;
|
|
32
|
-
private createRemote;
|
|
33
|
-
broadcast(msg: StreamMessage, previousNode: DhtAddress): void;
|
|
34
|
-
isNeighborPaused(node: PeerDescriptor, msgChainId: string): boolean;
|
|
35
|
-
stop(): void;
|
|
36
|
-
}
|
|
37
|
-
export {};
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.PlumtreeManager = exports.MAX_PAUSED_NEIGHBORS_DEFAULT = void 0;
|
|
7
|
-
const dht_1 = require("@streamr/dht");
|
|
8
|
-
const NetworkRpc_1 = require("../../../generated/packages/trackerless-network/protos/NetworkRpc");
|
|
9
|
-
const PlumtreeRpcLocal_1 = require("./PlumtreeRpcLocal");
|
|
10
|
-
const PlumtreeRpcRemote_1 = require("./PlumtreeRpcRemote");
|
|
11
|
-
const NetworkRpc_client_1 = require("../../../generated/packages/trackerless-network/protos/NetworkRpc.client");
|
|
12
|
-
const eventemitter3_1 = __importDefault(require("eventemitter3"));
|
|
13
|
-
const utils_1 = require("@streamr/utils");
|
|
14
|
-
const ContentDeliveryRpcRemote_1 = require("../ContentDeliveryRpcRemote");
|
|
15
|
-
const PausedNeighbors_1 = require("./PausedNeighbors");
|
|
16
|
-
exports.MAX_PAUSED_NEIGHBORS_DEFAULT = 3;
|
|
17
|
-
const logger = new utils_1.Logger(module);
|
|
18
|
-
class PlumtreeManager extends eventemitter3_1.default {
|
|
19
|
-
neighbors;
|
|
20
|
-
localPeerDescriptor;
|
|
21
|
-
// We have paused sending real data to these neighbrs and only send metadata
|
|
22
|
-
localPausedNeighbors;
|
|
23
|
-
// We have asked these nodes to pause sending real data to us, used to limit sending of pausing and resuming requests
|
|
24
|
-
remotePausedNeighbors;
|
|
25
|
-
rpcLocal;
|
|
26
|
-
latestMessages = new Map();
|
|
27
|
-
rpcCommunicator;
|
|
28
|
-
metadataTimestampsAheadOfRealData = new Map();
|
|
29
|
-
maxPausedNeighbors;
|
|
30
|
-
constructor(options) {
|
|
31
|
-
super();
|
|
32
|
-
this.neighbors = options.neighbors;
|
|
33
|
-
this.maxPausedNeighbors = options.maxPausedNeighbors ?? exports.MAX_PAUSED_NEIGHBORS_DEFAULT;
|
|
34
|
-
this.localPeerDescriptor = options.localPeerDescriptor;
|
|
35
|
-
this.localPausedNeighbors = new PausedNeighbors_1.PausedNeighbors(options.maxPausedNeighbors ?? exports.MAX_PAUSED_NEIGHBORS_DEFAULT);
|
|
36
|
-
this.remotePausedNeighbors = new PausedNeighbors_1.PausedNeighbors(options.maxPausedNeighbors ?? exports.MAX_PAUSED_NEIGHBORS_DEFAULT);
|
|
37
|
-
this.rpcLocal = new PlumtreeRpcLocal_1.PlumtreeRpcLocal(this.neighbors, this.localPausedNeighbors, (metadata, previousNode) => this.onMetadata(metadata, previousNode), (fromTimestamp, msgChainId, remotePeerDescriptor) => this.sendBuffer(fromTimestamp, msgChainId, remotePeerDescriptor));
|
|
38
|
-
this.neighbors.on('nodeRemoved', (nodeId) => this.onNeighborRemoved(nodeId));
|
|
39
|
-
this.rpcCommunicator = options.rpcCommunicator;
|
|
40
|
-
this.rpcCommunicator.registerRpcNotification(NetworkRpc_1.MessageID, 'sendMetadata', (msg, context) => this.rpcLocal.sendMetadata(msg, context));
|
|
41
|
-
this.rpcCommunicator.registerRpcNotification(NetworkRpc_1.PauseNeighborRequest, 'pauseNeighbor', (msg, context) => this.rpcLocal.pauseNeighbor(msg, context));
|
|
42
|
-
this.rpcCommunicator.registerRpcNotification(NetworkRpc_1.ResumeNeighborRequest, 'resumeNeighbor', (msg, context) => this.rpcLocal.resumeNeighbor(msg, context));
|
|
43
|
-
}
|
|
44
|
-
async pauseNeighbor(node, msgChainId) {
|
|
45
|
-
if (this.neighbors.has((0, dht_1.toNodeId)(node))
|
|
46
|
-
&& !this.remotePausedNeighbors.isPaused((0, dht_1.toNodeId)(node), msgChainId)
|
|
47
|
-
&& this.remotePausedNeighbors.size(msgChainId) < this.maxPausedNeighbors) {
|
|
48
|
-
logger.debug(`Pausing neighbor ${(0, dht_1.toNodeId)(node)}`);
|
|
49
|
-
this.remotePausedNeighbors.add((0, dht_1.toNodeId)(node), msgChainId);
|
|
50
|
-
const remote = this.createRemote(node);
|
|
51
|
-
await remote.pauseNeighbor(msgChainId);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async resumeNeighbor(node, msgChainId, fromTimestamp) {
|
|
55
|
-
if (this.remotePausedNeighbors.isPaused((0, dht_1.toNodeId)(node), msgChainId)) {
|
|
56
|
-
logger.debug(`Resuming neighbor ${(0, dht_1.toNodeId)(node)}`);
|
|
57
|
-
this.remotePausedNeighbors.delete((0, dht_1.toNodeId)(node), msgChainId);
|
|
58
|
-
const remote = this.createRemote(node);
|
|
59
|
-
await remote.resumeNeighbor(fromTimestamp, msgChainId);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
onNeighborRemoved(nodeId) {
|
|
63
|
-
this.localPausedNeighbors.deleteAll(nodeId);
|
|
64
|
-
this.remotePausedNeighbors.deleteAll(nodeId);
|
|
65
|
-
if (this.neighbors.size() > 0) {
|
|
66
|
-
this.remotePausedNeighbors.forEach((pausedNeighbors, msgChainId) => {
|
|
67
|
-
if (pausedNeighbors.size >= this.neighbors.size()) {
|
|
68
|
-
logger.debug('All neighbors are paused, resuming first neighbor');
|
|
69
|
-
const neighborToResume = this.neighbors.getFirst([]).getPeerDescriptor();
|
|
70
|
-
setImmediate(() => this.resumeNeighbor(neighborToResume, msgChainId, this.getLatestMessageTimestamp(msgChainId)));
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
getLatestMessageTimestamp(msgChainId) {
|
|
76
|
-
if (!this.latestMessages.has(msgChainId) || this.latestMessages.get(msgChainId).length === 0) {
|
|
77
|
-
return 0;
|
|
78
|
-
}
|
|
79
|
-
return this.latestMessages.get(msgChainId)[this.latestMessages.get(msgChainId).length - 1].messageId.timestamp;
|
|
80
|
-
}
|
|
81
|
-
async sendBuffer(fromTimestamp, msgChainId, neighbor) {
|
|
82
|
-
const remote = new ContentDeliveryRpcRemote_1.ContentDeliveryRpcRemote(this.localPeerDescriptor, neighbor, this.rpcCommunicator, NetworkRpc_client_1.ContentDeliveryRpcClient);
|
|
83
|
-
const messages = this.latestMessages.get(msgChainId)?.filter((msg) => msg.messageId.timestamp > fromTimestamp) ?? [];
|
|
84
|
-
await Promise.all(messages.map((msg) => remote.sendStreamMessage(msg)));
|
|
85
|
-
}
|
|
86
|
-
async onMetadata(msg, previousNode) {
|
|
87
|
-
// If we receive newer metadata than messages in the buffer, resume the sending neighbor
|
|
88
|
-
const latestMessageTimestamp = this.getLatestMessageTimestamp(msg.messageChainId);
|
|
89
|
-
if (latestMessageTimestamp < msg.timestamp) {
|
|
90
|
-
if (!this.metadataTimestampsAheadOfRealData.has(msg.messageChainId)) {
|
|
91
|
-
this.metadataTimestampsAheadOfRealData.set(msg.messageChainId, new Set());
|
|
92
|
-
}
|
|
93
|
-
this.metadataTimestampsAheadOfRealData.get(msg.messageChainId).add(msg.timestamp);
|
|
94
|
-
if (this.metadataTimestampsAheadOfRealData.get(msg.messageChainId).size > 1) {
|
|
95
|
-
await this.resumeNeighbor(previousNode, msg.messageChainId, this.getLatestMessageTimestamp(msg.messageChainId));
|
|
96
|
-
this.metadataTimestampsAheadOfRealData.get(msg.messageChainId).forEach((timestamp) => {
|
|
97
|
-
this.metadataTimestampsAheadOfRealData.get(msg.messageChainId).delete(timestamp);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
createRemote(neighbor) {
|
|
103
|
-
return new PlumtreeRpcRemote_1.PlumtreeRpcRemote(this.localPeerDescriptor, neighbor, this.rpcCommunicator, NetworkRpc_client_1.PlumtreeRpcClient);
|
|
104
|
-
}
|
|
105
|
-
broadcast(msg, previousNode) {
|
|
106
|
-
const messageChainId = msg.messageId.messageChainId;
|
|
107
|
-
if (!this.latestMessages.has(messageChainId)) {
|
|
108
|
-
this.latestMessages.set(messageChainId, []);
|
|
109
|
-
}
|
|
110
|
-
if (this.latestMessages.get(messageChainId).length < 20) {
|
|
111
|
-
this.latestMessages.get(messageChainId).push(msg);
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
this.latestMessages.get(messageChainId).shift();
|
|
115
|
-
this.latestMessages.get(messageChainId).push(msg);
|
|
116
|
-
}
|
|
117
|
-
if (this.metadataTimestampsAheadOfRealData.has(msg.messageId.messageChainId)) {
|
|
118
|
-
this.metadataTimestampsAheadOfRealData.get(msg.messageId.messageChainId).delete(msg.messageId.timestamp);
|
|
119
|
-
}
|
|
120
|
-
this.emit('message', msg);
|
|
121
|
-
const neighbors = this.neighbors.getAll().filter((neighbor) => (0, dht_1.toNodeId)(neighbor.getPeerDescriptor()) !== previousNode);
|
|
122
|
-
for (const neighbor of neighbors) {
|
|
123
|
-
if (this.localPausedNeighbors.isPaused((0, dht_1.toNodeId)(neighbor.getPeerDescriptor()), msg.messageId.messageChainId)) {
|
|
124
|
-
const remote = this.createRemote(neighbor.getPeerDescriptor());
|
|
125
|
-
setImmediate(() => remote.sendMetadata(msg.messageId));
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
setImmediate(() => neighbor.sendStreamMessage(msg));
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
isNeighborPaused(node, msgChainId) {
|
|
133
|
-
return this.localPausedNeighbors.isPaused((0, dht_1.toNodeId)(node), msgChainId)
|
|
134
|
-
|| this.remotePausedNeighbors.isPaused((0, dht_1.toNodeId)(node), msgChainId);
|
|
135
|
-
}
|
|
136
|
-
stop() {
|
|
137
|
-
this.neighbors.off('nodeRemoved', this.onNeighborRemoved);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
exports.PlumtreeManager = PlumtreeManager;
|
|
141
|
-
//# sourceMappingURL=PlumtreeManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PlumtreeManager.js","sourceRoot":"","sources":["../../../../src/content-delivery-layer/plumtree/PlumtreeManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { PeerDescriptor } from '@streamr/dht';
|
|
2
|
-
import { MessageID, PauseNeighborRequest, ResumeNeighborRequest } from '../../../generated/packages/trackerless-network/protos/NetworkRpc';
|
|
3
|
-
import { Empty } from '../../../generated/google/protobuf/empty';
|
|
4
|
-
import { ServerCallContext } from '@protobuf-ts/runtime-rpc';
|
|
5
|
-
import { IPlumtreeRpc } from '../../../generated/packages/trackerless-network/protos/NetworkRpc.server';
|
|
6
|
-
import { NodeList } from '../NodeList';
|
|
7
|
-
import { PausedNeighbors } from './PausedNeighbors';
|
|
8
|
-
type OnMetadataCb = (msg: MessageID, previousNode: PeerDescriptor) => Promise<void>;
|
|
9
|
-
type SendBufferCb = (fromTimestamp: number, msgChainId: string, remotePeerDescriptor: PeerDescriptor) => Promise<void>;
|
|
10
|
-
export declare class PlumtreeRpcLocal implements IPlumtreeRpc {
|
|
11
|
-
private readonly neighbors;
|
|
12
|
-
private readonly pausedNodes;
|
|
13
|
-
private readonly onMetadataCb;
|
|
14
|
-
private readonly sendBuffer;
|
|
15
|
-
constructor(neighbors: NodeList, pausedNodes: PausedNeighbors, onMetaDataCb: OnMetadataCb, sendBuffer: SendBufferCb);
|
|
16
|
-
sendMetadata(message: MessageID, context: ServerCallContext): Promise<Empty>;
|
|
17
|
-
pauseNeighbor(request: PauseNeighborRequest, context: ServerCallContext): Promise<Empty>;
|
|
18
|
-
resumeNeighbor(request: ResumeNeighborRequest, context: ServerCallContext): Promise<Empty>;
|
|
19
|
-
}
|
|
20
|
-
export {};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PlumtreeRpcLocal = void 0;
|
|
4
|
-
const dht_1 = require("@streamr/dht");
|
|
5
|
-
const empty_1 = require("../../../generated/google/protobuf/empty");
|
|
6
|
-
class PlumtreeRpcLocal {
|
|
7
|
-
neighbors;
|
|
8
|
-
pausedNodes;
|
|
9
|
-
onMetadataCb;
|
|
10
|
-
sendBuffer;
|
|
11
|
-
constructor(neighbors, pausedNodes, onMetaDataCb, sendBuffer) {
|
|
12
|
-
this.neighbors = neighbors;
|
|
13
|
-
this.pausedNodes = pausedNodes;
|
|
14
|
-
this.onMetadataCb = onMetaDataCb;
|
|
15
|
-
this.sendBuffer = sendBuffer;
|
|
16
|
-
}
|
|
17
|
-
async sendMetadata(message, context) {
|
|
18
|
-
const previousNode = context.incomingSourceDescriptor;
|
|
19
|
-
await this.onMetadataCb(message, previousNode);
|
|
20
|
-
return empty_1.Empty;
|
|
21
|
-
}
|
|
22
|
-
async pauseNeighbor(request, context) {
|
|
23
|
-
const sender = (0, dht_1.toNodeId)(context.incomingSourceDescriptor);
|
|
24
|
-
if (this.neighbors.has(sender)) {
|
|
25
|
-
this.pausedNodes.add(sender, request.messageChainId);
|
|
26
|
-
}
|
|
27
|
-
return empty_1.Empty;
|
|
28
|
-
}
|
|
29
|
-
async resumeNeighbor(request, context) {
|
|
30
|
-
const sender = context.incomingSourceDescriptor;
|
|
31
|
-
this.pausedNodes.delete((0, dht_1.toNodeId)(sender), request.messageChainId);
|
|
32
|
-
await this.sendBuffer(request.fromTimestamp, request.messageChainId, sender);
|
|
33
|
-
return empty_1.Empty;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
exports.PlumtreeRpcLocal = PlumtreeRpcLocal;
|
|
37
|
-
//# sourceMappingURL=PlumtreeRpcLocal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PlumtreeRpcLocal.js","sourceRoot":"","sources":["../../../../src/content-delivery-layer/plumtree/PlumtreeRpcLocal.ts"],"names":[],"mappings":";;;AAAA,sCAAuE;AAEvE,oEAAgE;AAQhE,MAAa,gBAAgB;IAER,SAAS,CAAU;IACnB,WAAW,CAAiB;IAC5B,YAAY,CAAc;IAC1B,UAAU,CAAc;IAEzC,YACI,SAAmB,EACnB,WAA4B,EAC5B,YAA0B,EAC1B,UAAwB;QAExB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAkB,EAAE,OAA0B;QAC7D,MAAM,YAAY,GAAI,OAA0B,CAAC,wBAAyB,CAAA;QAC1E,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QAC9C,OAAO,aAAK,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAA6B,EAAE,OAA0B;QACzE,MAAM,MAAM,GAAG,IAAA,cAAQ,EAAE,OAA0B,CAAC,wBAAyB,CAAC,CAAA;QAC9E,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,aAAK,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAA8B,EAAE,OAA0B;QAC3E,MAAM,MAAM,GAAI,OAA0B,CAAC,wBAAyB,CAAA;QACpE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAA,cAAQ,EAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;QACjE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAC5E,OAAO,aAAK,CAAA;IAChB,CAAC;CACJ;AAvCD,4CAuCC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { RpcRemote } from '@streamr/dht';
|
|
2
|
-
import { MessageID } from '../../../generated/packages/trackerless-network/protos/NetworkRpc';
|
|
3
|
-
import { PlumtreeRpcClient } from '../../../generated/packages/trackerless-network/protos/NetworkRpc.client';
|
|
4
|
-
export declare class PlumtreeRpcRemote extends RpcRemote<PlumtreeRpcClient> {
|
|
5
|
-
sendMetadata(msg: MessageID): Promise<void>;
|
|
6
|
-
pauseNeighbor(messageChainId: string): Promise<void>;
|
|
7
|
-
resumeNeighbor(fromTimestamp: number, messageChainId: string): Promise<void>;
|
|
8
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PlumtreeRpcRemote = void 0;
|
|
4
|
-
const dht_1 = require("@streamr/dht");
|
|
5
|
-
class PlumtreeRpcRemote extends dht_1.RpcRemote {
|
|
6
|
-
async sendMetadata(msg) {
|
|
7
|
-
const options = this.formDhtRpcOptions({
|
|
8
|
-
notification: true
|
|
9
|
-
});
|
|
10
|
-
await this.getClient().sendMetadata(msg, options);
|
|
11
|
-
}
|
|
12
|
-
async pauseNeighbor(messageChainId) {
|
|
13
|
-
const options = this.formDhtRpcOptions({
|
|
14
|
-
notification: true
|
|
15
|
-
});
|
|
16
|
-
await this.getClient().pauseNeighbor({ messageChainId }, options);
|
|
17
|
-
}
|
|
18
|
-
async resumeNeighbor(fromTimestamp, messageChainId) {
|
|
19
|
-
const options = this.formDhtRpcOptions({
|
|
20
|
-
notification: true
|
|
21
|
-
});
|
|
22
|
-
await this.getClient().resumeNeighbor({ fromTimestamp, messageChainId }, options);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
exports.PlumtreeRpcRemote = PlumtreeRpcRemote;
|
|
26
|
-
//# sourceMappingURL=PlumtreeRpcRemote.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PlumtreeRpcRemote.js","sourceRoot":"","sources":["../../../../src/content-delivery-layer/plumtree/PlumtreeRpcRemote.ts"],"names":[],"mappings":";;;AAAA,sCAAwC;AAIxC,MAAa,iBAAkB,SAAQ,eAA4B;IAE/D,KAAK,CAAC,YAAY,CAAC,GAAc;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACnC,YAAY,EAAE,IAAI;SACrB,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,cAAsB;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACnC,YAAY,EAAE,IAAI;SACrB,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,EAAE,OAAO,CAAC,CAAA;IACrE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,aAAqB,EAAE,cAAsB;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACnC,YAAY,EAAE,IAAI;SACrB,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,OAAO,CAAC,CAAA;IACrF,CAAC;CAEJ;AAvBD,8CAuBC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export interface FifoMapWithTtlOptions<K> {
|
|
2
|
-
ttlInMs: number;
|
|
3
|
-
maxSize: number;
|
|
4
|
-
onItemDropped?: (key: K) => void;
|
|
5
|
-
timeProvider?: () => number;
|
|
6
|
-
debugMode?: boolean;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* A "Map" implementation with a maximum size and TTL expiration on entries.
|
|
10
|
-
*
|
|
11
|
-
* When full, room is made for new entries by dropping existing by FIFO method.
|
|
12
|
-
*
|
|
13
|
-
* Entries have a TTL after which they are considered stale. Stale items are
|
|
14
|
-
* not returned when querying.
|
|
15
|
-
*
|
|
16
|
-
*/
|
|
17
|
-
export declare class FifoMapWithTTL<K, V> {
|
|
18
|
-
private readonly items;
|
|
19
|
-
private readonly dropQueue;
|
|
20
|
-
private readonly ttlInMs;
|
|
21
|
-
private readonly maxSize;
|
|
22
|
-
private readonly onItemDropped;
|
|
23
|
-
private readonly timeProvider;
|
|
24
|
-
constructor({ ttlInMs, maxSize, onItemDropped, timeProvider }: FifoMapWithTtlOptions<K>);
|
|
25
|
-
set(key: K, value: V): void;
|
|
26
|
-
delete(key: K): void;
|
|
27
|
-
get(key: K): V | undefined;
|
|
28
|
-
values(): V[];
|
|
29
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FifoMapWithTTL = void 0;
|
|
4
|
-
const yallist_1 = require("yallist");
|
|
5
|
-
/**
|
|
6
|
-
* A "Map" implementation with a maximum size and TTL expiration on entries.
|
|
7
|
-
*
|
|
8
|
-
* When full, room is made for new entries by dropping existing by FIFO method.
|
|
9
|
-
*
|
|
10
|
-
* Entries have a TTL after which they are considered stale. Stale items are
|
|
11
|
-
* not returned when querying.
|
|
12
|
-
*
|
|
13
|
-
*/
|
|
14
|
-
class FifoMapWithTTL {
|
|
15
|
-
// class invariant: the keys present in `items` and `dropQueue` are the same set.
|
|
16
|
-
items = new Map();
|
|
17
|
-
dropQueue = yallist_1.Yallist.create(); // queue is used to determine deletion order when full
|
|
18
|
-
ttlInMs;
|
|
19
|
-
maxSize;
|
|
20
|
-
onItemDropped;
|
|
21
|
-
timeProvider;
|
|
22
|
-
constructor({ ttlInMs, maxSize, onItemDropped = () => { }, timeProvider = Date.now }) {
|
|
23
|
-
if (ttlInMs < 0) {
|
|
24
|
-
throw new Error(`ttlInMs (${ttlInMs}) cannot be < 0`);
|
|
25
|
-
}
|
|
26
|
-
if (maxSize < 0) {
|
|
27
|
-
throw new Error(`maxSize (${maxSize}) cannot be < 0`);
|
|
28
|
-
}
|
|
29
|
-
this.ttlInMs = ttlInMs;
|
|
30
|
-
this.maxSize = maxSize;
|
|
31
|
-
this.onItemDropped = onItemDropped;
|
|
32
|
-
this.timeProvider = timeProvider;
|
|
33
|
-
}
|
|
34
|
-
set(key, value) {
|
|
35
|
-
if (this.maxSize === 0) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
if (this.items.size > this.maxSize) {
|
|
39
|
-
throw new Error('assertion error: maximum size exceeded');
|
|
40
|
-
}
|
|
41
|
-
// delete an existing entry if exists
|
|
42
|
-
this.delete(key);
|
|
43
|
-
// make room for new entry
|
|
44
|
-
if (this.items.size === this.maxSize) {
|
|
45
|
-
const keyToDel = this.dropQueue.shift();
|
|
46
|
-
if (keyToDel === undefined) {
|
|
47
|
-
throw new Error('assertion error: queue empty but still have items');
|
|
48
|
-
}
|
|
49
|
-
this.items.delete(keyToDel);
|
|
50
|
-
this.onItemDropped(keyToDel);
|
|
51
|
-
}
|
|
52
|
-
// add entry
|
|
53
|
-
const dropQueueNode = new yallist_1.Node(key);
|
|
54
|
-
this.dropQueue.pushNode(dropQueueNode);
|
|
55
|
-
this.items.set(key, {
|
|
56
|
-
value,
|
|
57
|
-
dropQueueNode,
|
|
58
|
-
expiresAt: this.timeProvider() + this.ttlInMs
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
delete(key) {
|
|
62
|
-
const item = this.items.get(key);
|
|
63
|
-
if (item !== undefined) {
|
|
64
|
-
this.items.delete(key);
|
|
65
|
-
this.dropQueue.removeNode(item.dropQueueNode);
|
|
66
|
-
this.onItemDropped(key);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
get(key) {
|
|
70
|
-
const item = this.items.get(key);
|
|
71
|
-
if (item === undefined) {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
if (item.expiresAt <= this.timeProvider()) {
|
|
75
|
-
this.delete(key);
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
78
|
-
return item.value;
|
|
79
|
-
}
|
|
80
|
-
values() {
|
|
81
|
-
const keys = [...this.items.keys()];
|
|
82
|
-
const values = [];
|
|
83
|
-
for (const key of keys) {
|
|
84
|
-
const value = this.get(key);
|
|
85
|
-
if (value !== undefined) {
|
|
86
|
-
values.push(value);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return values;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
exports.FifoMapWithTTL = FifoMapWithTTL;
|
|
93
|
-
//# sourceMappingURL=FifoMapWithTTL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FifoMapWithTTL.js","sourceRoot":"","sources":["../../../../src/content-delivery-layer/propagation/FifoMapWithTTL.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { DhtAddress } from '@streamr/dht';
|
|
2
|
-
import { StreamMessage } from '../../../generated/packages/trackerless-network/protos/NetworkRpc';
|
|
3
|
-
type SendToNeighborFn = (neighborId: DhtAddress, msg: StreamMessage) => Promise<void>;
|
|
4
|
-
interface ConstructorOptions {
|
|
5
|
-
sendToNeighbor: SendToNeighborFn;
|
|
6
|
-
minPropagationTargets: number;
|
|
7
|
-
maxMessages: number;
|
|
8
|
-
ttl: number;
|
|
9
|
-
}
|
|
10
|
-
export declare const DEFAULT_PROPAGATION_BUFFER_TTL: number;
|
|
11
|
-
export declare const DEFAULT_MIN_PROPAGATION_TARGETS = 2;
|
|
12
|
-
export declare const DEFAULT_MAX_PROPAGATION_BUFFER_SIZE = 150;
|
|
13
|
-
/**
|
|
14
|
-
* Message propagation logic of a node. Given a message, this class will actively attempt to propagate it to
|
|
15
|
-
* `minPropagationTargets` neighbors until success or TTL expiration.
|
|
16
|
-
*
|
|
17
|
-
* Setting `minPropagationTargets = 0` effectively disables any propagation reattempts. A message will then
|
|
18
|
-
* only be propagated exactly once, to neighbors that are present at that moment, in a fire-and-forget manner.
|
|
19
|
-
*/
|
|
20
|
-
export declare class Propagation {
|
|
21
|
-
private readonly sendToNeighbor;
|
|
22
|
-
private readonly minPropagationTargets;
|
|
23
|
-
private readonly activeTaskStore;
|
|
24
|
-
constructor({ sendToNeighbor, minPropagationTargets, maxMessages, ttl }: ConstructorOptions);
|
|
25
|
-
/**
|
|
26
|
-
* Node should invoke this when it learns about a new message
|
|
27
|
-
*/
|
|
28
|
-
feedUnseenMessage(message: StreamMessage, targets: DhtAddress[], source: DhtAddress | null): void;
|
|
29
|
-
/**
|
|
30
|
-
* Node should invoke this when it learns about a new node stream assignment
|
|
31
|
-
*/
|
|
32
|
-
onNeighborJoined(neighborId: DhtAddress): void;
|
|
33
|
-
private sendAndAwaitThenMark;
|
|
34
|
-
}
|
|
35
|
-
export {};
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Propagation = exports.DEFAULT_MAX_PROPAGATION_BUFFER_SIZE = exports.DEFAULT_MIN_PROPAGATION_TARGETS = exports.DEFAULT_PROPAGATION_BUFFER_TTL = void 0;
|
|
4
|
-
const PropagationTaskStore_1 = require("./PropagationTaskStore");
|
|
5
|
-
exports.DEFAULT_PROPAGATION_BUFFER_TTL = 10 * 1000;
|
|
6
|
-
exports.DEFAULT_MIN_PROPAGATION_TARGETS = 2;
|
|
7
|
-
exports.DEFAULT_MAX_PROPAGATION_BUFFER_SIZE = 150;
|
|
8
|
-
/**
|
|
9
|
-
* Message propagation logic of a node. Given a message, this class will actively attempt to propagate it to
|
|
10
|
-
* `minPropagationTargets` neighbors until success or TTL expiration.
|
|
11
|
-
*
|
|
12
|
-
* Setting `minPropagationTargets = 0` effectively disables any propagation reattempts. A message will then
|
|
13
|
-
* only be propagated exactly once, to neighbors that are present at that moment, in a fire-and-forget manner.
|
|
14
|
-
*/
|
|
15
|
-
class Propagation {
|
|
16
|
-
sendToNeighbor;
|
|
17
|
-
minPropagationTargets;
|
|
18
|
-
activeTaskStore;
|
|
19
|
-
constructor({ sendToNeighbor, minPropagationTargets, maxMessages, ttl }) {
|
|
20
|
-
this.sendToNeighbor = sendToNeighbor;
|
|
21
|
-
this.minPropagationTargets = minPropagationTargets;
|
|
22
|
-
this.activeTaskStore = new PropagationTaskStore_1.PropagationTaskStore(ttl, maxMessages);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Node should invoke this when it learns about a new message
|
|
26
|
-
*/
|
|
27
|
-
feedUnseenMessage(message, targets, source) {
|
|
28
|
-
const task = {
|
|
29
|
-
message,
|
|
30
|
-
source,
|
|
31
|
-
handledNeighbors: new Set()
|
|
32
|
-
};
|
|
33
|
-
this.activeTaskStore.add(task);
|
|
34
|
-
for (const target of targets) {
|
|
35
|
-
this.sendAndAwaitThenMark(task, target);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Node should invoke this when it learns about a new node stream assignment
|
|
40
|
-
*/
|
|
41
|
-
onNeighborJoined(neighborId) {
|
|
42
|
-
const tasks = this.activeTaskStore.get();
|
|
43
|
-
for (const task of tasks) {
|
|
44
|
-
this.sendAndAwaitThenMark(task, neighborId);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
sendAndAwaitThenMark({ message, source, handledNeighbors }, neighborId) {
|
|
48
|
-
if (!handledNeighbors.has(neighborId) && neighborId !== source) {
|
|
49
|
-
(async () => {
|
|
50
|
-
try {
|
|
51
|
-
await this.sendToNeighbor(neighborId, message);
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
// Side-note: due to asynchronicity, the task being modified at this point could already be stale and
|
|
57
|
-
// deleted from `activeTaskStore`. However, as modifying it or re-deleting it is pretty much
|
|
58
|
-
// inconsequential at this point, leaving the logic as is.
|
|
59
|
-
handledNeighbors.add(neighborId);
|
|
60
|
-
if (handledNeighbors.size >= this.minPropagationTargets) {
|
|
61
|
-
this.activeTaskStore.delete(message.messageId);
|
|
62
|
-
}
|
|
63
|
-
})();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
exports.Propagation = Propagation;
|
|
68
|
-
//# sourceMappingURL=Propagation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Propagation.js","sourceRoot":"","sources":["../../../../src/content-delivery-layer/propagation/Propagation.ts"],"names":[],"mappings":";;;AAEA,iEAA8E;AAWjE,QAAA,8BAA8B,GAAG,EAAE,GAAG,IAAI,CAAA;AAC1C,QAAA,+BAA+B,GAAG,CAAC,CAAA;AACnC,QAAA,mCAAmC,GAAG,GAAG,CAAA;AAEtD;;;;;;GAMG;AAEH,MAAa,WAAW;IACH,cAAc,CAAkB;IAChC,qBAAqB,CAAQ;IAC7B,eAAe,CAAsB;IAEtD,YAAY,EACR,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,GAAG,EACc;QACjB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAA;QAClD,IAAI,CAAC,eAAe,GAAG,IAAI,2CAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IACrE,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAsB,EAAE,OAAqB,EAAE,MAAyB;QACtF,MAAM,IAAI,GAAG;YACT,OAAO;YACP,MAAM;YACN,gBAAgB,EAAE,IAAI,GAAG,EAAc;SAC1C,CAAA;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC3C,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,UAAsB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAA;QACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC/C,CAAC;IACL,CAAC;IAEO,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAmB,EAAE,UAAsB;QACvG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC7D,CAAC,KAAK,IAAI,EAAE;gBACR,IAAI,CAAC;oBACD,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBAClD,CAAC;gBAAC,MAAM,CAAC;oBACL,OAAM;gBACV,CAAC;gBACD,qGAAqG;gBACrG,4FAA4F;gBAC5F,0DAA0D;gBAC1D,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAChC,IAAI,gBAAgB,CAAC,IAAI,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBACtD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,SAAU,CAAC,CAAA;gBACnD,CAAC;YACL,CAAC,CAAC,EAAE,CAAA;QACR,CAAC;IACL,CAAC;CACJ;AA3DD,kCA2DC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { DhtAddress } from '@streamr/dht';
|
|
2
|
-
import { MessageRef, StreamMessage } from '../../../generated/packages/trackerless-network/protos/NetworkRpc';
|
|
3
|
-
export interface PropagationTask {
|
|
4
|
-
message: StreamMessage;
|
|
5
|
-
source: string | null;
|
|
6
|
-
handledNeighbors: Set<DhtAddress>;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Keeps track of propagation tasks for the needs of message propagation logic.
|
|
10
|
-
*
|
|
11
|
-
* Properties:
|
|
12
|
-
* - Allows fetching propagation tasks by StreamPartID
|
|
13
|
-
* - Upper bound on number of tasks stored, replacement policy if FIFO
|
|
14
|
-
* - Items have a TTL, after which they are considered stale and not returned when querying
|
|
15
|
-
**/
|
|
16
|
-
export declare class PropagationTaskStore {
|
|
17
|
-
private readonly tasks;
|
|
18
|
-
constructor(ttlInMs: number, maxTasks: number);
|
|
19
|
-
get(): PropagationTask[];
|
|
20
|
-
add(task: PropagationTask): void;
|
|
21
|
-
delete(messageId: MessageRef): void;
|
|
22
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PropagationTaskStore = void 0;
|
|
4
|
-
const FifoMapWithTTL_1 = require("./FifoMapWithTTL");
|
|
5
|
-
/**
|
|
6
|
-
* Keeps track of propagation tasks for the needs of message propagation logic.
|
|
7
|
-
*
|
|
8
|
-
* Properties:
|
|
9
|
-
* - Allows fetching propagation tasks by StreamPartID
|
|
10
|
-
* - Upper bound on number of tasks stored, replacement policy if FIFO
|
|
11
|
-
* - Items have a TTL, after which they are considered stale and not returned when querying
|
|
12
|
-
**/
|
|
13
|
-
class PropagationTaskStore {
|
|
14
|
-
tasks;
|
|
15
|
-
constructor(ttlInMs, maxTasks) {
|
|
16
|
-
this.tasks = new FifoMapWithTTL_1.FifoMapWithTTL({
|
|
17
|
-
ttlInMs,
|
|
18
|
-
maxSize: maxTasks
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
get() {
|
|
22
|
-
return this.tasks.values();
|
|
23
|
-
}
|
|
24
|
-
add(task) {
|
|
25
|
-
const messageId = task.message.messageId;
|
|
26
|
-
this.tasks.set(messageId, task);
|
|
27
|
-
}
|
|
28
|
-
delete(messageId) {
|
|
29
|
-
this.tasks.delete(messageId); // causes `onKeyDropped` to be invoked
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
exports.PropagationTaskStore = PropagationTaskStore;
|
|
33
|
-
//# sourceMappingURL=PropagationTaskStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PropagationTaskStore.js","sourceRoot":"","sources":["../../../../src/content-delivery-layer/propagation/PropagationTaskStore.ts"],"names":[],"mappings":";;;AAEA,qDAAiD;AAQjD;;;;;;;GAOG;AACH,MAAa,oBAAoB;IACZ,KAAK,CAA6C;IAEnE,YAAY,OAAe,EAAE,QAAgB;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,+BAAc,CAA8B;YACzD,OAAO;YACP,OAAO,EAAE,QAAQ;SACpB,CAAC,CAAA;IACN,CAAC;IAED,GAAG;QACC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;IAC9B,CAAC;IAED,GAAG,CAAC,IAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAU,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,CAAC,SAAqB;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA,CAAC,sCAAsC;IACvE,CAAC;CACJ;AAtBD,oDAsBC"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { ConnectionLocker, DhtAddress, ITransport, PeerDescriptor } from '@streamr/dht';
|
|
2
|
-
import { StreamPartID, UserID } from '@streamr/utils';
|
|
3
|
-
import { EventEmitter } from 'eventemitter3';
|
|
4
|
-
import { ProxyDirection, StreamMessage } from '../../../generated/packages/trackerless-network/protos/NetworkRpc';
|
|
5
|
-
export declare const retry: <T>(task: () => Promise<T>, description: string, abortSignal: AbortSignal, delay?: number) => Promise<T>;
|
|
6
|
-
interface ProxyClientOptions {
|
|
7
|
-
transport: ITransport;
|
|
8
|
-
localPeerDescriptor: PeerDescriptor;
|
|
9
|
-
streamPartId: StreamPartID;
|
|
10
|
-
connectionLocker: ConnectionLocker;
|
|
11
|
-
maxPropagationBufferSize: number;
|
|
12
|
-
minPropagationTargets: number;
|
|
13
|
-
propagationBufferTtl: number;
|
|
14
|
-
}
|
|
15
|
-
interface Events {
|
|
16
|
-
message: (message: StreamMessage) => void;
|
|
17
|
-
}
|
|
18
|
-
export declare class ProxyClient extends EventEmitter<Events> {
|
|
19
|
-
private readonly rpcCommunicator;
|
|
20
|
-
private readonly contentDeliveryRpcLocal;
|
|
21
|
-
private readonly options;
|
|
22
|
-
private readonly duplicateDetectors;
|
|
23
|
-
private definition?;
|
|
24
|
-
private readonly connections;
|
|
25
|
-
private readonly propagation;
|
|
26
|
-
private readonly neighbors;
|
|
27
|
-
private readonly abortController;
|
|
28
|
-
constructor(options: ProxyClientOptions);
|
|
29
|
-
private registerDefaultServerMethods;
|
|
30
|
-
setProxies(nodes: PeerDescriptor[], direction: ProxyDirection, userId: UserID, connectionCount?: number): Promise<void>;
|
|
31
|
-
private updateConnections;
|
|
32
|
-
private getInvalidConnections;
|
|
33
|
-
private openRandomConnections;
|
|
34
|
-
private attemptConnection;
|
|
35
|
-
private closeRandomConnections;
|
|
36
|
-
private closeConnection;
|
|
37
|
-
private removeConnection;
|
|
38
|
-
broadcast(msg: StreamMessage, previousNode?: DhtAddress): void;
|
|
39
|
-
hasConnection(nodeId: DhtAddress, direction: ProxyDirection): boolean;
|
|
40
|
-
getDirection(): ProxyDirection;
|
|
41
|
-
private onNodeDisconnected;
|
|
42
|
-
start(): Promise<void>;
|
|
43
|
-
getDiagnosticInfo(): Record<string, unknown>;
|
|
44
|
-
stop(): void;
|
|
45
|
-
}
|
|
46
|
-
export {};
|