@streamr/node 100.0.0-rc.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/LICENSE +78 -0
- package/README.md +54 -0
- package/bin/broker.ts +36 -0
- package/bin/config-wizard.js +4 -0
- package/bin/config-wizard.ts +17 -0
- package/bin/delete-expired-data.ts +41 -0
- package/bin/entry-point.ts +27 -0
- package/configs/development-1.env.json +68 -0
- package/configs/development-2.env.json +53 -0
- package/configs/development-3.env.json +53 -0
- package/configs/development-prod-resend.env.json +21 -0
- package/configs/docker-1.env.json +72 -0
- package/configs/docker-2.env.json +58 -0
- package/configs/docker-3.env.json +58 -0
- package/configuration.md +38 -0
- package/dist/bin/broker.d.ts +2 -0
- package/dist/bin/broker.js +42 -0
- package/dist/bin/broker.js.map +1 -0
- package/dist/bin/config-wizard.d.ts +2 -0
- package/dist/bin/config-wizard.js +22 -0
- package/dist/bin/config-wizard.js.map +1 -0
- package/dist/bin/delete-expired-data.d.ts +2 -0
- package/dist/bin/delete-expired-data.js +44 -0
- package/dist/bin/delete-expired-data.js.map +1 -0
- package/dist/bin/entry-point.d.ts +2 -0
- package/dist/bin/entry-point.js +28 -0
- package/dist/bin/entry-point.js.map +1 -0
- package/dist/package.json +78 -0
- package/dist/src/Plugin.d.ts +33 -0
- package/dist/src/Plugin.js +43 -0
- package/dist/src/Plugin.js.map +1 -0
- package/dist/src/apiAuthentication.d.ts +4 -0
- package/dist/src/apiAuthentication.js +16 -0
- package/dist/src/apiAuthentication.js.map +1 -0
- package/dist/src/broker.d.ts +8 -0
- package/dist/src/broker.js +69 -0
- package/dist/src/broker.js.map +1 -0
- package/dist/src/config/ConfigWizard.d.ts +5 -0
- package/dist/src/config/ConfigWizard.js +466 -0
- package/dist/src/config/ConfigWizard.js.map +1 -0
- package/dist/src/config/config.d.ts +26 -0
- package/dist/src/config/config.js +92 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/config.schema.json +86 -0
- package/dist/src/config/definitions.schema.json +35 -0
- package/dist/src/config/migration.d.ts +6 -0
- package/dist/src/config/migration.js +210 -0
- package/dist/src/config/migration.js.map +1 -0
- package/dist/src/config/validateConfig.d.ts +4 -0
- package/dist/src/config/validateConfig.js +40 -0
- package/dist/src/config/validateConfig.js.map +1 -0
- package/dist/src/exports.d.ts +3 -0
- package/dist/src/exports.js +6 -0
- package/dist/src/exports.js.map +1 -0
- package/dist/src/helpers/PayloadFormat.d.ts +19 -0
- package/dist/src/helpers/PayloadFormat.js +85 -0
- package/dist/src/helpers/PayloadFormat.js.map +1 -0
- package/dist/src/helpers/applyPluginClientConfigs.d.ts +3 -0
- package/dist/src/helpers/applyPluginClientConfigs.js +29 -0
- package/dist/src/helpers/applyPluginClientConfigs.js.map +1 -0
- package/dist/src/helpers/fetchOrThrow.d.ts +2 -0
- package/dist/src/helpers/fetchOrThrow.js +20 -0
- package/dist/src/helpers/fetchOrThrow.js.map +1 -0
- package/dist/src/helpers/generateMnemonicFromAddress.d.ts +5 -0
- package/dist/src/helpers/generateMnemonicFromAddress.js +16 -0
- package/dist/src/helpers/generateMnemonicFromAddress.js.map +1 -0
- package/dist/src/helpers/multiply.d.ts +1 -0
- package/dist/src/helpers/multiply.js +10 -0
- package/dist/src/helpers/multiply.js.map +1 -0
- package/dist/src/helpers/parser.d.ts +9 -0
- package/dist/src/helpers/parser.js +62 -0
- package/dist/src/helpers/parser.js.map +1 -0
- package/dist/src/helpers/partitions.d.ts +8 -0
- package/dist/src/helpers/partitions.js +32 -0
- package/dist/src/helpers/partitions.js.map +1 -0
- package/dist/src/helpers/weightedSample.d.ts +16 -0
- package/dist/src/helpers/weightedSample.js +35 -0
- package/dist/src/helpers/weightedSample.js.map +1 -0
- package/dist/src/httpServer.d.ts +16 -0
- package/dist/src/httpServer.js +71 -0
- package/dist/src/httpServer.js.map +1 -0
- package/dist/src/pluginRegistry.d.ts +3 -0
- package/dist/src/pluginRegistry.js +35 -0
- package/dist/src/pluginRegistry.js.map +1 -0
- package/dist/src/plugins/consoleMetrics/ConsoleMetricsPlugin.d.ts +12 -0
- package/dist/src/plugins/consoleMetrics/ConsoleMetricsPlugin.js +36 -0
- package/dist/src/plugins/consoleMetrics/ConsoleMetricsPlugin.js.map +1 -0
- package/dist/src/plugins/consoleMetrics/config.schema.json +18 -0
- package/dist/src/plugins/http/HttpPlugin.d.ts +8 -0
- package/dist/src/plugins/http/HttpPlugin.js +23 -0
- package/dist/src/plugins/http/HttpPlugin.js.map +1 -0
- package/dist/src/plugins/http/config.schema.json +12 -0
- package/dist/src/plugins/http/publishEndpoint.d.ts +3 -0
- package/dist/src/plugins/http/publishEndpoint.js +72 -0
- package/dist/src/plugins/http/publishEndpoint.js.map +1 -0
- package/dist/src/plugins/info/InfoPlugin.d.ts +9 -0
- package/dist/src/plugins/info/InfoPlugin.js +31 -0
- package/dist/src/plugins/info/InfoPlugin.js.map +1 -0
- package/dist/src/plugins/info/config.schema.json +12 -0
- package/dist/src/plugins/mqtt/Bridge.d.ts +40 -0
- package/dist/src/plugins/mqtt/Bridge.js +136 -0
- package/dist/src/plugins/mqtt/Bridge.js.map +1 -0
- package/dist/src/plugins/mqtt/MqttPlugin.d.ts +14 -0
- package/dist/src/plugins/mqtt/MqttPlugin.js +30 -0
- package/dist/src/plugins/mqtt/MqttPlugin.js.map +1 -0
- package/dist/src/plugins/mqtt/MqttServer.d.ts +22 -0
- package/dist/src/plugins/mqtt/MqttServer.js +109 -0
- package/dist/src/plugins/mqtt/MqttServer.js.map +1 -0
- package/dist/src/plugins/mqtt/config.schema.json +26 -0
- package/dist/src/plugins/operator/ConsistentHashRing.d.ts +20 -0
- package/dist/src/plugins/operator/ConsistentHashRing.js +64 -0
- package/dist/src/plugins/operator/ConsistentHashRing.js.map +1 -0
- package/dist/src/plugins/operator/ContractFacade.d.ts +80 -0
- package/dist/src/plugins/operator/ContractFacade.js +364 -0
- package/dist/src/plugins/operator/ContractFacade.js.map +1 -0
- package/dist/src/plugins/operator/MaintainTopologyHelper.d.ts +23 -0
- package/dist/src/plugins/operator/MaintainTopologyHelper.js +75 -0
- package/dist/src/plugins/operator/MaintainTopologyHelper.js.map +1 -0
- package/dist/src/plugins/operator/MaintainTopologyService.d.ts +11 -0
- package/dist/src/plugins/operator/MaintainTopologyService.js +57 -0
- package/dist/src/plugins/operator/MaintainTopologyService.js.map +1 -0
- package/dist/src/plugins/operator/OperatorFleetState.d.ts +33 -0
- package/dist/src/plugins/operator/OperatorFleetState.js +112 -0
- package/dist/src/plugins/operator/OperatorFleetState.js.map +1 -0
- package/dist/src/plugins/operator/OperatorPlugin.d.ts +50 -0
- package/dist/src/plugins/operator/OperatorPlugin.js +159 -0
- package/dist/src/plugins/operator/OperatorPlugin.js.map +1 -0
- package/dist/src/plugins/operator/StreamPartAssignments.d.ts +28 -0
- package/dist/src/plugins/operator/StreamPartAssignments.js +104 -0
- package/dist/src/plugins/operator/StreamPartAssignments.js.map +1 -0
- package/dist/src/plugins/operator/announceNodeToContract.d.ts +3 -0
- package/dist/src/plugins/operator/announceNodeToContract.js +39 -0
- package/dist/src/plugins/operator/announceNodeToContract.js.map +1 -0
- package/dist/src/plugins/operator/announceNodeToStream.d.ts +3 -0
- package/dist/src/plugins/operator/announceNodeToStream.js +25 -0
- package/dist/src/plugins/operator/announceNodeToStream.js.map +1 -0
- package/dist/src/plugins/operator/checkOperatorValueBreach.d.ts +2 -0
- package/dist/src/plugins/operator/checkOperatorValueBreach.js +21 -0
- package/dist/src/plugins/operator/checkOperatorValueBreach.js.map +1 -0
- package/dist/src/plugins/operator/closeExpiredFlags.d.ts +3 -0
- package/dist/src/plugins/operator/closeExpiredFlags.js +24 -0
- package/dist/src/plugins/operator/closeExpiredFlags.js.map +1 -0
- package/dist/src/plugins/operator/config.schema.json +152 -0
- package/dist/src/plugins/operator/createIsLeaderFn.d.ts +4 -0
- package/dist/src/plugins/operator/createIsLeaderFn.js +14 -0
- package/dist/src/plugins/operator/createIsLeaderFn.js.map +1 -0
- package/dist/src/plugins/operator/fetchRedundancyFactor.d.ts +2 -0
- package/dist/src/plugins/operator/fetchRedundancyFactor.js +43 -0
- package/dist/src/plugins/operator/fetchRedundancyFactor.js.map +1 -0
- package/dist/src/plugins/operator/formCoordinationStreamId.d.ts +3 -0
- package/dist/src/plugins/operator/formCoordinationStreamId.js +9 -0
- package/dist/src/plugins/operator/formCoordinationStreamId.js.map +1 -0
- package/dist/src/plugins/operator/heartbeatUtils.d.ts +67 -0
- package/dist/src/plugins/operator/heartbeatUtils.js +26 -0
- package/dist/src/plugins/operator/heartbeatUtils.js.map +1 -0
- package/dist/src/plugins/operator/inspectOverTime.d.ts +22 -0
- package/dist/src/plugins/operator/inspectOverTime.js +146 -0
- package/dist/src/plugins/operator/inspectOverTime.js.map +1 -0
- package/dist/src/plugins/operator/inspectRandomNode.d.ts +8 -0
- package/dist/src/plugins/operator/inspectRandomNode.js +44 -0
- package/dist/src/plugins/operator/inspectRandomNode.js.map +1 -0
- package/dist/src/plugins/operator/inspectionUtils.d.ts +23 -0
- package/dist/src/plugins/operator/inspectionUtils.js +120 -0
- package/dist/src/plugins/operator/inspectionUtils.js.map +1 -0
- package/dist/src/plugins/operator/maintainOperatorValue.d.ts +2 -0
- package/dist/src/plugins/operator/maintainOperatorValue.js +21 -0
- package/dist/src/plugins/operator/maintainOperatorValue.js.map +1 -0
- package/dist/src/plugins/operator/reviewSuspectNode.d.ts +24 -0
- package/dist/src/plugins/operator/reviewSuspectNode.js +56 -0
- package/dist/src/plugins/operator/reviewSuspectNode.js.map +1 -0
- package/dist/src/plugins/storage/Batch.d.ts +51 -0
- package/dist/src/plugins/storage/Batch.js +121 -0
- package/dist/src/plugins/storage/Batch.js.map +1 -0
- package/dist/src/plugins/storage/BatchManager.d.ts +27 -0
- package/dist/src/plugins/storage/BatchManager.js +117 -0
- package/dist/src/plugins/storage/BatchManager.js.map +1 -0
- package/dist/src/plugins/storage/Bucket.d.ts +23 -0
- package/dist/src/plugins/storage/Bucket.js +90 -0
- package/dist/src/plugins/storage/Bucket.js.map +1 -0
- package/dist/src/plugins/storage/BucketManager.d.ts +56 -0
- package/dist/src/plugins/storage/BucketManager.js +306 -0
- package/dist/src/plugins/storage/BucketManager.js.map +1 -0
- package/dist/src/plugins/storage/DataQueryFormat.d.ts +10 -0
- package/dist/src/plugins/storage/DataQueryFormat.js +51 -0
- package/dist/src/plugins/storage/DataQueryFormat.js.map +1 -0
- package/dist/src/plugins/storage/DeleteExpiredCmd.d.ts +28 -0
- package/dist/src/plugins/storage/DeleteExpiredCmd.js +155 -0
- package/dist/src/plugins/storage/DeleteExpiredCmd.js.map +1 -0
- package/dist/src/plugins/storage/SetMembershipSynchronizer.d.ts +33 -0
- package/dist/src/plugins/storage/SetMembershipSynchronizer.js +102 -0
- package/dist/src/plugins/storage/SetMembershipSynchronizer.js.map +1 -0
- package/dist/src/plugins/storage/Storage.d.ts +47 -0
- package/dist/src/plugins/storage/Storage.js +459 -0
- package/dist/src/plugins/storage/Storage.js.map +1 -0
- package/dist/src/plugins/storage/StorageConfig.d.ts +43 -0
- package/dist/src/plugins/storage/StorageConfig.js +83 -0
- package/dist/src/plugins/storage/StorageConfig.js.map +1 -0
- package/dist/src/plugins/storage/StorageEventListener.d.ts +17 -0
- package/dist/src/plugins/storage/StorageEventListener.js +46 -0
- package/dist/src/plugins/storage/StorageEventListener.js.map +1 -0
- package/dist/src/plugins/storage/StoragePlugin.d.ts +32 -0
- package/dist/src/plugins/storage/StoragePlugin.js +103 -0
- package/dist/src/plugins/storage/StoragePlugin.js.map +1 -0
- package/dist/src/plugins/storage/StoragePoller.d.ts +15 -0
- package/dist/src/plugins/storage/StoragePoller.js +47 -0
- package/dist/src/plugins/storage/StoragePoller.js.map +1 -0
- package/dist/src/plugins/storage/config.schema.json +88 -0
- package/dist/src/plugins/storage/dataMetadataEndpoint.d.ts +3 -0
- package/dist/src/plugins/storage/dataMetadataEndpoint.js +35 -0
- package/dist/src/plugins/storage/dataMetadataEndpoint.js.map +1 -0
- package/dist/src/plugins/storage/dataQueryEndpoint.d.ts +6 -0
- package/dist/src/plugins/storage/dataQueryEndpoint.js +181 -0
- package/dist/src/plugins/storage/dataQueryEndpoint.js.map +1 -0
- package/dist/src/plugins/storage/storageConfigEndpoint.d.ts +3 -0
- package/dist/src/plugins/storage/storageConfigEndpoint.js +31 -0
- package/dist/src/plugins/storage/storageConfigEndpoint.js.map +1 -0
- package/dist/src/plugins/subscriber/SubscriberPlugin.d.ts +16 -0
- package/dist/src/plugins/subscriber/SubscriberPlugin.js +22 -0
- package/dist/src/plugins/subscriber/SubscriberPlugin.js.map +1 -0
- package/dist/src/plugins/subscriber/config.schema.json +31 -0
- package/dist/src/plugins/websocket/Connection.d.ts +9 -0
- package/dist/src/plugins/websocket/Connection.js +45 -0
- package/dist/src/plugins/websocket/Connection.js.map +1 -0
- package/dist/src/plugins/websocket/PublishConnection.d.ts +12 -0
- package/dist/src/plugins/websocket/PublishConnection.js +46 -0
- package/dist/src/plugins/websocket/PublishConnection.js.map +1 -0
- package/dist/src/plugins/websocket/SubscribeConnection.d.ts +13 -0
- package/dist/src/plugins/websocket/SubscribeConnection.js +50 -0
- package/dist/src/plugins/websocket/SubscribeConnection.js.map +1 -0
- package/dist/src/plugins/websocket/WebsocketPlugin.d.ts +19 -0
- package/dist/src/plugins/websocket/WebsocketPlugin.js +26 -0
- package/dist/src/plugins/websocket/WebsocketPlugin.js.map +1 -0
- package/dist/src/plugins/websocket/WebsocketServer.d.ts +16 -0
- package/dist/src/plugins/websocket/WebsocketServer.js +132 -0
- package/dist/src/plugins/websocket/WebsocketServer.js.map +1 -0
- package/dist/src/plugins/websocket/config.schema.json +51 -0
- package/package.json +78 -0
- package/plugins.md +318 -0
|
@@ -0,0 +1,120 @@
|
|
|
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.inspectTarget = exports.findNodesForTargetGivenFleetState = exports.findTarget = void 0;
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const protocol_1 = require("@streamr/protocol");
|
|
9
|
+
const ConsistentHashRing_1 = require("./ConsistentHashRing");
|
|
10
|
+
const weightedSample_1 = require("../../helpers/weightedSample");
|
|
11
|
+
const sample_1 = __importDefault(require("lodash/sample"));
|
|
12
|
+
const without_1 = __importDefault(require("lodash/without"));
|
|
13
|
+
function createStreamIDMatcher(streamId) {
|
|
14
|
+
return (streamPart) => {
|
|
15
|
+
return protocol_1.StreamPartIDUtils.getStreamID(streamPart) === streamId;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function isAnyPartitionOfStreamAssignedToMe(assignments, streamId) {
|
|
19
|
+
return assignments.getMyStreamParts().some(createStreamIDMatcher(streamId));
|
|
20
|
+
}
|
|
21
|
+
function getPartitionsOfStreamAssignedToMe(assignments, streamId) {
|
|
22
|
+
return assignments.getMyStreamParts().filter(createStreamIDMatcher(streamId));
|
|
23
|
+
}
|
|
24
|
+
async function findTarget(myOperatorContractAddress, contractFacade, assignments, logger) {
|
|
25
|
+
// choose sponsorship
|
|
26
|
+
const sponsorships = await contractFacade.getSponsorshipsOfOperator(myOperatorContractAddress);
|
|
27
|
+
const suitableSponsorships = sponsorships
|
|
28
|
+
.filter(({ operatorCount }) => operatorCount >= 2) // exclude sponsorships with only self
|
|
29
|
+
.filter(({ streamId }) => isAnyPartitionOfStreamAssignedToMe(assignments, streamId));
|
|
30
|
+
if (suitableSponsorships.length === 0) {
|
|
31
|
+
logger.info('Skip inspection (no suitable sponsorship)', { totalSponsorships: sponsorships.length });
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const targetSponsorship = (0, weightedSample_1.weightedSample)(suitableSponsorships, ({ operatorCount }) => operatorCount - 1 // account for self to keep ratios correct
|
|
35
|
+
);
|
|
36
|
+
// choose operator
|
|
37
|
+
const operators = await contractFacade.getOperatorsInSponsorship(targetSponsorship.sponsorshipAddress);
|
|
38
|
+
const targetOperatorAddress = (0, sample_1.default)((0, without_1.default)(operators, myOperatorContractAddress));
|
|
39
|
+
if (targetOperatorAddress === undefined) {
|
|
40
|
+
// Only happens if during the async awaits the other operator(s) were removed from the sponsorship.
|
|
41
|
+
logger.info('Skip inspection (no suitable operator)', { targetSponsorship });
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
// choose stream part
|
|
45
|
+
const streamParts = getPartitionsOfStreamAssignedToMe(assignments, targetSponsorship.streamId);
|
|
46
|
+
const targetStreamPart = (0, sample_1.default)(streamParts);
|
|
47
|
+
if (targetStreamPart === undefined) {
|
|
48
|
+
// Only happens if during the async awaits the stream parts I am assigned to have changed.
|
|
49
|
+
logger.info('Skip inspection (no suitable stream part)', { targetSponsorship, targetOperatorAddress });
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const flagAlreadyRaised = await contractFacade.hasOpenFlag(targetOperatorAddress, targetSponsorship.sponsorshipAddress);
|
|
53
|
+
if (flagAlreadyRaised) {
|
|
54
|
+
logger.info('Skip inspection (target already has open flag)', { targetSponsorship, targetOperatorAddress });
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
sponsorshipAddress: targetSponsorship.sponsorshipAddress,
|
|
59
|
+
operatorAddress: targetOperatorAddress,
|
|
60
|
+
streamPart: targetStreamPart
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
exports.findTarget = findTarget;
|
|
64
|
+
async function findNodesForTargetGivenFleetState(target, targetOperatorFleetState, getRedundancyFactor, logger) {
|
|
65
|
+
const replicationFactor = await getRedundancyFactor(target.operatorAddress);
|
|
66
|
+
if (replicationFactor === undefined) {
|
|
67
|
+
logger.debug('Encountered misconfigured replication factor');
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
const consistentHashRing = new ConsistentHashRing_1.ConsistentHashRing(replicationFactor);
|
|
71
|
+
for (const nodeId of targetOperatorFleetState.getNodeIds()) {
|
|
72
|
+
consistentHashRing.add(nodeId);
|
|
73
|
+
}
|
|
74
|
+
const targetNodes = consistentHashRing.get(target.streamPart);
|
|
75
|
+
return targetNodes.map((nodeId) => targetOperatorFleetState.getPeerDescriptor(nodeId));
|
|
76
|
+
}
|
|
77
|
+
exports.findNodesForTargetGivenFleetState = findNodesForTargetGivenFleetState;
|
|
78
|
+
async function inspectTarget({ target, targetPeerDescriptors, streamrClient, abortSignal, logger }) {
|
|
79
|
+
logger.info('Inspecting nodes of operator', {
|
|
80
|
+
targetOperator: target.operatorAddress,
|
|
81
|
+
targetStreamPart: target.streamPart,
|
|
82
|
+
targetNodes: targetPeerDescriptors.map(({ nodeId }) => nodeId),
|
|
83
|
+
targetSponsorship: target.sponsorshipAddress
|
|
84
|
+
});
|
|
85
|
+
// need to subscribe before inspecting, otherwise inspect will instantly return false
|
|
86
|
+
const sub = await streamrClient.subscribe({
|
|
87
|
+
id: protocol_1.StreamPartIDUtils.getStreamID(target.streamPart),
|
|
88
|
+
partition: protocol_1.StreamPartIDUtils.getStreamPartition(target.streamPart),
|
|
89
|
+
raw: true
|
|
90
|
+
});
|
|
91
|
+
try {
|
|
92
|
+
for (const descriptor of (0, lodash_1.shuffle)(targetPeerDescriptors)) {
|
|
93
|
+
// TODO: re-enable when works
|
|
94
|
+
//const result = await streamrClient.inspect(descriptor, target.streamPart)
|
|
95
|
+
const result = true;
|
|
96
|
+
abortSignal.throwIfAborted();
|
|
97
|
+
if (result) {
|
|
98
|
+
logger.info('Inspection done (no issue detected)', {
|
|
99
|
+
targetOperator: target.operatorAddress,
|
|
100
|
+
targetStreamPart: target.streamPart,
|
|
101
|
+
targetNode: descriptor.nodeId,
|
|
102
|
+
targetSponsorship: target.sponsorshipAddress
|
|
103
|
+
});
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
logger.info('Inspection done (issue detected)', {
|
|
108
|
+
targetOperator: target.operatorAddress,
|
|
109
|
+
targetStreamPart: target.streamPart,
|
|
110
|
+
targetNodes: targetPeerDescriptors.map(({ nodeId }) => nodeId),
|
|
111
|
+
targetSponsorship: target.sponsorshipAddress
|
|
112
|
+
});
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await sub.unsubscribe();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.inspectTarget = inspectTarget;
|
|
120
|
+
//# sourceMappingURL=inspectionUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectionUtils.js","sourceRoot":"","sources":["../../../../src/plugins/operator/inspectionUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.maintainOperatorValue = void 0;
|
|
4
|
+
const utils_1 = require("@streamr/utils");
|
|
5
|
+
const multiply_1 = require("../../helpers/multiply");
|
|
6
|
+
const logger = new utils_1.Logger(module);
|
|
7
|
+
const maintainOperatorValue = async (withdrawLimitSafetyFraction, minSponsorshipEarningsInWithdraw, maxSponsorshipsInWithdraw, contractFacade) => {
|
|
8
|
+
logger.info('Check whether it is time to withdraw my earnings');
|
|
9
|
+
const { sumDataWei, maxAllowedEarningsDataWei, sponsorshipAddresses } = await contractFacade.getMyEarnings(minSponsorshipEarningsInWithdraw, maxSponsorshipsInWithdraw);
|
|
10
|
+
const triggerWithdrawLimitDataWei = (0, multiply_1.multiply)(maxAllowedEarningsDataWei, 1 - withdrawLimitSafetyFraction);
|
|
11
|
+
logger.trace(` -> is ${sumDataWei} > ${triggerWithdrawLimitDataWei} ?`);
|
|
12
|
+
if (sumDataWei > triggerWithdrawLimitDataWei) {
|
|
13
|
+
logger.info('Withdraw earnings from sponsorships', { sponsorshipAddresses });
|
|
14
|
+
await contractFacade.withdrawMyEarningsFromSponsorships(sponsorshipAddresses);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
logger.info('Skip withdrawing earnings');
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.maintainOperatorValue = maintainOperatorValue;
|
|
21
|
+
//# sourceMappingURL=maintainOperatorValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintainOperatorValue.js","sourceRoot":"","sources":["../../../../src/plugins/operator/maintainOperatorValue.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AACvC,qDAAiD;AAGjD,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAE1B,MAAM,qBAAqB,GAAG,KAAK,EACtC,2BAAmC,EACnC,gCAAwC,EACxC,yBAAiC,EACjC,cAA8B,EACjB,EAAE;IACf,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC/D,MAAM,EAAE,UAAU,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,GAAG,MAAM,cAAc,CAAC,aAAa,CACtG,gCAAgC,EAChC,yBAAyB,CAC5B,CAAA;IACD,MAAM,2BAA2B,GAAG,IAAA,mBAAQ,EAAC,yBAAyB,EAAE,CAAC,GAAG,2BAA2B,CAAC,CAAA;IACxG,MAAM,CAAC,KAAK,CAAC,UAAU,UAAU,MAAM,2BAA2B,IAAI,CAAC,CAAA;IACvE,IAAI,UAAU,GAAG,2BAA2B,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAA;QAC5E,MAAM,cAAc,CAAC,kCAAkC,CAAC,oBAAoB,CAAC,CAAA;IACjF,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IAC5C,CAAC;AACL,CAAC,CAAA;AAnBY,QAAA,qBAAqB,yBAmBjC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { EthereumAddress } from '@streamr/utils';
|
|
3
|
+
import { ContractFacade } from './ContractFacade';
|
|
4
|
+
import { StreamrClient } from '@streamr/sdk';
|
|
5
|
+
import { CreateOperatorFleetStateFn } from './OperatorFleetState';
|
|
6
|
+
export interface ReviewProcessOpts {
|
|
7
|
+
sponsorshipAddress: EthereumAddress;
|
|
8
|
+
targetOperator: EthereumAddress;
|
|
9
|
+
partition: number;
|
|
10
|
+
contractFacade: ContractFacade;
|
|
11
|
+
streamrClient: StreamrClient;
|
|
12
|
+
createOperatorFleetState: CreateOperatorFleetStateFn;
|
|
13
|
+
getRedundancyFactor: (operatorContractAddress: EthereumAddress) => Promise<number | undefined>;
|
|
14
|
+
maxSleepTime: number;
|
|
15
|
+
heartbeatTimeoutInMs: number;
|
|
16
|
+
votingPeriod: {
|
|
17
|
+
startTime: number;
|
|
18
|
+
endTime: number;
|
|
19
|
+
};
|
|
20
|
+
inspectionIntervalInMs: number;
|
|
21
|
+
maxInspections: number;
|
|
22
|
+
abortSignal: AbortSignal;
|
|
23
|
+
}
|
|
24
|
+
export declare const reviewSuspectNode: ({ sponsorshipAddress, targetOperator, partition, contractFacade, streamrClient, createOperatorFleetState, getRedundancyFactor, maxSleepTime, heartbeatTimeoutInMs, votingPeriod, inspectionIntervalInMs, maxInspections, abortSignal }: ReviewProcessOpts) => Promise<void>;
|
|
@@ -0,0 +1,56 @@
|
|
|
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.reviewSuspectNode = void 0;
|
|
7
|
+
const utils_1 = require("@streamr/utils");
|
|
8
|
+
const protocol_1 = require("@streamr/protocol");
|
|
9
|
+
const random_1 = __importDefault(require("lodash/random"));
|
|
10
|
+
const inspectOverTime_1 = require("./inspectOverTime");
|
|
11
|
+
const logger = new utils_1.Logger(module);
|
|
12
|
+
const reviewSuspectNode = async ({ sponsorshipAddress, targetOperator, partition, contractFacade, streamrClient, createOperatorFleetState, getRedundancyFactor, maxSleepTime, heartbeatTimeoutInMs, votingPeriod, inspectionIntervalInMs, maxInspections, abortSignal }) => {
|
|
13
|
+
if (Date.now() + maxSleepTime > votingPeriod.startTime) {
|
|
14
|
+
throw new Error('Max sleep time overlaps with voting period');
|
|
15
|
+
}
|
|
16
|
+
const streamId = await contractFacade.getStreamId(sponsorshipAddress);
|
|
17
|
+
// random sleep time to make sure multiple instances of voters don't all inspect at the same time
|
|
18
|
+
const sleepTimeInMsBeforeFirstInspection = (0, random_1.default)(maxSleepTime);
|
|
19
|
+
const consumeResults = (0, inspectOverTime_1.inspectOverTime)({
|
|
20
|
+
target: {
|
|
21
|
+
sponsorshipAddress: sponsorshipAddress,
|
|
22
|
+
operatorAddress: targetOperator,
|
|
23
|
+
streamPart: (0, protocol_1.toStreamPartID)(streamId, partition),
|
|
24
|
+
},
|
|
25
|
+
streamrClient,
|
|
26
|
+
createOperatorFleetState,
|
|
27
|
+
getRedundancyFactor,
|
|
28
|
+
sleepTimeInMsBeforeFirstInspection,
|
|
29
|
+
heartbeatTimeoutInMs,
|
|
30
|
+
inspectionIntervalInMs,
|
|
31
|
+
maxInspections,
|
|
32
|
+
waitUntilPassOrDone: false,
|
|
33
|
+
abortSignal,
|
|
34
|
+
traceId: (0, utils_1.randomString)(6)
|
|
35
|
+
});
|
|
36
|
+
const timeUntilVoteInMs = ((votingPeriod.startTime + votingPeriod.endTime) / 2) - Date.now();
|
|
37
|
+
logger.debug('Schedule voting on flag', { timeUntilVoteInMs });
|
|
38
|
+
(0, utils_1.setAbortableTimeout)(async () => {
|
|
39
|
+
const results = await consumeResults();
|
|
40
|
+
const kick = results.filter((b) => b).length <= results.length / 2;
|
|
41
|
+
logger.info('Vote on flag', { sponsorshipAddress, targetOperator, kick });
|
|
42
|
+
try {
|
|
43
|
+
await contractFacade.voteOnFlag(sponsorshipAddress, targetOperator, kick);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
logger.warn('Encountered error while voting on flag', {
|
|
47
|
+
sponsorshipAddress,
|
|
48
|
+
targetOperator,
|
|
49
|
+
kick,
|
|
50
|
+
reason: err?.message
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}, timeUntilVoteInMs, abortSignal);
|
|
54
|
+
};
|
|
55
|
+
exports.reviewSuspectNode = reviewSuspectNode;
|
|
56
|
+
//# sourceMappingURL=reviewSuspectNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewSuspectNode.js","sourceRoot":"","sources":["../../../../src/plugins/operator/reviewSuspectNode.ts"],"names":[],"mappings":";;;;;;AAAA,0CAA2F;AAI3F,gDAAkD;AAClD,2DAAkC;AAClC,uDAAmD;AAEnD,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAqB1B,MAAM,iBAAiB,GAAG,KAAK,EAAE,EACpC,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,WAAW,EACK,EAAiB,EAAE;IACnC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAA;IACrE,iGAAiG;IACjG,MAAM,kCAAkC,GAAG,IAAA,gBAAM,EAAC,YAAY,CAAC,CAAA;IAC/D,MAAM,cAAc,GAAG,IAAA,iCAAe,EAAC;QACnC,MAAM,EAAE;YACJ,kBAAkB,EAAE,kBAAkB;YACtC,eAAe,EAAE,cAAc;YAC/B,UAAU,EAAE,IAAA,yBAAc,EAAC,QAAQ,EAAE,SAAS,CAAC;SAClD;QACD,aAAa;QACb,wBAAwB;QACxB,mBAAmB;QACnB,kCAAkC;QAClC,oBAAoB;QACpB,sBAAsB;QACtB,cAAc;QACd,mBAAmB,EAAE,KAAK;QAC1B,WAAW;QACX,OAAO,EAAE,IAAA,oBAAY,EAAC,CAAC,CAAC;KAC3B,CAAC,CAAA;IAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5F,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAA;IAC9D,IAAA,2BAAmB,EAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QAClE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,kBAAkB,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAA;QACzE,IAAI,CAAC;YACD,MAAM,cAAc,CAAC,UAAU,CAAC,kBAAkB,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;gBAClD,kBAAkB;gBAClB,cAAc;gBACd,IAAI;gBACJ,MAAM,EAAE,GAAG,EAAE,OAAO;aACvB,CAAC,CAAA;QACN,CAAC;IACL,CAAC,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAA;AACtC,CAAC,CAAA;AAxDY,QAAA,iBAAiB,qBAwD7B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
import { Logger } from '@streamr/utils';
|
|
5
|
+
import { BucketId } from './Bucket';
|
|
6
|
+
export type BatchId = string;
|
|
7
|
+
export type State = string;
|
|
8
|
+
export type DoneCallback = (err?: Error) => void;
|
|
9
|
+
export interface InsertRecord {
|
|
10
|
+
streamId: string;
|
|
11
|
+
partition: number;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
sequenceNo: number;
|
|
14
|
+
publisherId: string;
|
|
15
|
+
msgChainId: string;
|
|
16
|
+
payload: Buffer;
|
|
17
|
+
}
|
|
18
|
+
export declare class Batch extends EventEmitter {
|
|
19
|
+
static states: Readonly<{
|
|
20
|
+
OPENED: "opened";
|
|
21
|
+
LOCKED: "locked";
|
|
22
|
+
PENDING: "pending";
|
|
23
|
+
INSERTED: "inserted";
|
|
24
|
+
}>;
|
|
25
|
+
private id;
|
|
26
|
+
private bucketId;
|
|
27
|
+
logger: Logger;
|
|
28
|
+
private maxSize;
|
|
29
|
+
private maxRecordCount;
|
|
30
|
+
private maxRetries;
|
|
31
|
+
private closeTimeout;
|
|
32
|
+
private timeout;
|
|
33
|
+
createdAt: number;
|
|
34
|
+
records: InsertRecord[];
|
|
35
|
+
size: number;
|
|
36
|
+
retries: number;
|
|
37
|
+
state: State;
|
|
38
|
+
private doneCbs;
|
|
39
|
+
constructor(bucketId: BucketId, maxSize: number, maxRecordCount: number, closeTimeout: number, maxRetries: number);
|
|
40
|
+
reachedMaxRetries(): boolean;
|
|
41
|
+
getId(): string;
|
|
42
|
+
getBucketId(): string;
|
|
43
|
+
lock(): void;
|
|
44
|
+
scheduleInsert(): void;
|
|
45
|
+
done(): void;
|
|
46
|
+
clear(): void;
|
|
47
|
+
push(record: InsertRecord, doneCb?: DoneCallback): void;
|
|
48
|
+
isFull(): boolean;
|
|
49
|
+
private getRecordCount;
|
|
50
|
+
private setState;
|
|
51
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Batch = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const utils_1 = require("@streamr/utils");
|
|
6
|
+
const uuid_1 = require("uuid");
|
|
7
|
+
class Batch extends events_1.EventEmitter {
|
|
8
|
+
// TODO convert to enum and rename to uppercase
|
|
9
|
+
static states = Object.freeze({
|
|
10
|
+
// OPENED => LOCKED => PENDING => INSERTED
|
|
11
|
+
OPENED: 'opened', // opened for adding new messages
|
|
12
|
+
LOCKED: 'locked', // locked for adding new messages, because isFull or timeout
|
|
13
|
+
PENDING: 'pending', // awaiting to be inserted,
|
|
14
|
+
INSERTED: 'inserted'
|
|
15
|
+
});
|
|
16
|
+
id;
|
|
17
|
+
bucketId;
|
|
18
|
+
logger;
|
|
19
|
+
maxSize;
|
|
20
|
+
maxRecordCount;
|
|
21
|
+
maxRetries;
|
|
22
|
+
closeTimeout;
|
|
23
|
+
timeout;
|
|
24
|
+
createdAt;
|
|
25
|
+
records;
|
|
26
|
+
size;
|
|
27
|
+
retries;
|
|
28
|
+
state;
|
|
29
|
+
doneCbs;
|
|
30
|
+
constructor(bucketId, maxSize, maxRecordCount, closeTimeout, maxRetries) {
|
|
31
|
+
if (!bucketId || !bucketId.length) {
|
|
32
|
+
throw new TypeError('bucketId must be not empty string');
|
|
33
|
+
}
|
|
34
|
+
if (maxSize <= 0) {
|
|
35
|
+
throw new TypeError('maxSize must be > 0');
|
|
36
|
+
}
|
|
37
|
+
if (maxRecordCount <= 0) {
|
|
38
|
+
throw new TypeError('maxRecordCount must be > 0');
|
|
39
|
+
}
|
|
40
|
+
if (closeTimeout <= 0) {
|
|
41
|
+
throw new TypeError('closeTimeout must be > 0');
|
|
42
|
+
}
|
|
43
|
+
if (maxRetries <= 0) {
|
|
44
|
+
throw new TypeError('maxRetries must be > 0');
|
|
45
|
+
}
|
|
46
|
+
super();
|
|
47
|
+
this.id = (0, uuid_1.v4)();
|
|
48
|
+
this.bucketId = bucketId;
|
|
49
|
+
this.createdAt = Date.now();
|
|
50
|
+
this.records = [];
|
|
51
|
+
this.size = 0;
|
|
52
|
+
this.retries = 0;
|
|
53
|
+
this.state = Batch.states.OPENED;
|
|
54
|
+
this.doneCbs = [];
|
|
55
|
+
this.logger = new utils_1.Logger(module, { id: this.id });
|
|
56
|
+
this.maxSize = maxSize;
|
|
57
|
+
this.maxRecordCount = maxRecordCount;
|
|
58
|
+
this.maxRetries = maxRetries;
|
|
59
|
+
this.closeTimeout = closeTimeout;
|
|
60
|
+
this.timeout = setTimeout(() => {
|
|
61
|
+
this.logger.trace('lock timeout');
|
|
62
|
+
this.lock();
|
|
63
|
+
}, this.closeTimeout);
|
|
64
|
+
this.logger.trace('init new batch');
|
|
65
|
+
}
|
|
66
|
+
reachedMaxRetries() {
|
|
67
|
+
return this.retries === this.maxRetries;
|
|
68
|
+
}
|
|
69
|
+
getId() {
|
|
70
|
+
return this.id;
|
|
71
|
+
}
|
|
72
|
+
getBucketId() {
|
|
73
|
+
return this.bucketId;
|
|
74
|
+
}
|
|
75
|
+
lock() {
|
|
76
|
+
clearTimeout(this.timeout);
|
|
77
|
+
this.setState(Batch.states.LOCKED);
|
|
78
|
+
}
|
|
79
|
+
scheduleInsert() {
|
|
80
|
+
clearTimeout(this.timeout);
|
|
81
|
+
this.logger.trace('scheduleRetry', {
|
|
82
|
+
retries: this.retries
|
|
83
|
+
});
|
|
84
|
+
this.timeout = setTimeout(() => {
|
|
85
|
+
if (this.retries < this.maxRetries) {
|
|
86
|
+
this.retries += 1;
|
|
87
|
+
}
|
|
88
|
+
this.setState(Batch.states.PENDING);
|
|
89
|
+
}, this.closeTimeout * this.retries);
|
|
90
|
+
}
|
|
91
|
+
done() {
|
|
92
|
+
this.doneCbs.forEach((doneCb) => doneCb());
|
|
93
|
+
this.doneCbs = [];
|
|
94
|
+
}
|
|
95
|
+
clear() {
|
|
96
|
+
this.logger.trace('clear');
|
|
97
|
+
clearTimeout(this.timeout);
|
|
98
|
+
this.records = [];
|
|
99
|
+
this.setState(Batch.states.INSERTED);
|
|
100
|
+
}
|
|
101
|
+
push(record, doneCb) {
|
|
102
|
+
this.records.push(record);
|
|
103
|
+
this.size += record.payload.length;
|
|
104
|
+
if (doneCb !== undefined) {
|
|
105
|
+
this.doneCbs.push(doneCb);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
isFull() {
|
|
109
|
+
return this.size >= this.maxSize || this.getRecordCount() >= this.maxRecordCount;
|
|
110
|
+
}
|
|
111
|
+
getRecordCount() {
|
|
112
|
+
return this.records.length;
|
|
113
|
+
}
|
|
114
|
+
setState(state) {
|
|
115
|
+
this.state = state;
|
|
116
|
+
this.logger.trace('setState', { state });
|
|
117
|
+
this.emit(this.state, this.getBucketId(), this.getId(), this.state, this.size, this.getRecordCount());
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.Batch = Batch;
|
|
121
|
+
//# sourceMappingURL=Batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Batch.js","sourceRoot":"","sources":["../../../../src/plugins/storage/Batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Client } from 'cassandra-driver';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
import { Logger } from '@streamr/utils';
|
|
5
|
+
import { Batch, BatchId, DoneCallback, InsertRecord } from './Batch';
|
|
6
|
+
import { BucketId } from './Bucket';
|
|
7
|
+
export interface BatchManagerOptions {
|
|
8
|
+
useTtl: boolean;
|
|
9
|
+
logErrors: boolean;
|
|
10
|
+
batchMaxSize: number;
|
|
11
|
+
batchMaxRecordCount: number;
|
|
12
|
+
batchCloseTimeout: number;
|
|
13
|
+
batchMaxRetries: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class BatchManager extends EventEmitter {
|
|
16
|
+
opts: BatchManagerOptions;
|
|
17
|
+
batches: Record<BucketId, Batch>;
|
|
18
|
+
pendingBatches: Record<BatchId, Batch>;
|
|
19
|
+
cassandraClient: Client;
|
|
20
|
+
insertStatement: string;
|
|
21
|
+
logger: Logger;
|
|
22
|
+
constructor(cassandraClient: Client, opts?: Partial<BatchManagerOptions>);
|
|
23
|
+
store(bucketId: BucketId, record: InsertRecord, doneCb?: DoneCallback): void;
|
|
24
|
+
stop(): void;
|
|
25
|
+
private moveFullBatch;
|
|
26
|
+
private insert;
|
|
27
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BatchManager = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const utils_1 = require("@streamr/utils");
|
|
6
|
+
const Batch_1 = require("./Batch");
|
|
7
|
+
const utils_2 = require("@streamr/utils");
|
|
8
|
+
const INSERT_STATEMENT = 'INSERT INTO stream_data '
|
|
9
|
+
+ '(stream_id, partition, bucket_id, ts, sequence_no, publisher_id, msg_chain_id, payload) '
|
|
10
|
+
+ 'VALUES (?, ?, ?, ?, ?, ?, ?, ?)';
|
|
11
|
+
const INSERT_STATEMENT_WITH_TTL = 'INSERT INTO stream_data '
|
|
12
|
+
+ '(stream_id, partition, bucket_id, ts, sequence_no, publisher_id, msg_chain_id, payload) '
|
|
13
|
+
+ 'VALUES (?, ?, ?, ?, ?, ?, ?, ?) USING TTL 259200'; // 3 days
|
|
14
|
+
let ID = 0;
|
|
15
|
+
class BatchManager extends events_1.EventEmitter {
|
|
16
|
+
opts;
|
|
17
|
+
batches;
|
|
18
|
+
pendingBatches;
|
|
19
|
+
cassandraClient;
|
|
20
|
+
insertStatement;
|
|
21
|
+
logger;
|
|
22
|
+
constructor(cassandraClient, opts = {}) {
|
|
23
|
+
super();
|
|
24
|
+
ID += 1;
|
|
25
|
+
this.logger = new utils_1.Logger(module, { id: `${ID}` });
|
|
26
|
+
const defaultOptions = {
|
|
27
|
+
useTtl: false,
|
|
28
|
+
logErrors: false,
|
|
29
|
+
batchMaxSize: 8000 * 300,
|
|
30
|
+
batchMaxRecordCount: 8000,
|
|
31
|
+
batchCloseTimeout: 1000,
|
|
32
|
+
batchMaxRetries: 1000 // in total max ~16 minutes timeout
|
|
33
|
+
};
|
|
34
|
+
this.opts = (0, utils_2.merge)(defaultOptions, opts);
|
|
35
|
+
// bucketId => batch
|
|
36
|
+
this.batches = Object.create(null);
|
|
37
|
+
// batchId => batch
|
|
38
|
+
this.pendingBatches = Object.create(null);
|
|
39
|
+
this.cassandraClient = cassandraClient;
|
|
40
|
+
this.insertStatement = this.opts.useTtl ? INSERT_STATEMENT_WITH_TTL : INSERT_STATEMENT;
|
|
41
|
+
}
|
|
42
|
+
store(bucketId, record, doneCb) {
|
|
43
|
+
const batch = this.batches[bucketId];
|
|
44
|
+
if (batch && batch.isFull()) {
|
|
45
|
+
batch.lock();
|
|
46
|
+
}
|
|
47
|
+
if (this.batches[bucketId] === undefined) {
|
|
48
|
+
this.logger.trace('Create new batch');
|
|
49
|
+
const newBatch = new Batch_1.Batch(bucketId, this.opts.batchMaxSize, this.opts.batchMaxRecordCount, this.opts.batchCloseTimeout, this.opts.batchMaxRetries);
|
|
50
|
+
newBatch.on('locked', () => this.moveFullBatch(bucketId, newBatch));
|
|
51
|
+
newBatch.on('pending', () => this.insert(newBatch.getId()));
|
|
52
|
+
this.batches[bucketId] = newBatch;
|
|
53
|
+
}
|
|
54
|
+
this.batches[bucketId].push(record, doneCb);
|
|
55
|
+
}
|
|
56
|
+
stop() {
|
|
57
|
+
const { batches, pendingBatches } = this;
|
|
58
|
+
this.batches = Object.create(null);
|
|
59
|
+
this.pendingBatches = Object.create(null);
|
|
60
|
+
Object.values(batches).forEach((batch) => batch.clear());
|
|
61
|
+
Object.values(pendingBatches).forEach((batch) => batch.clear());
|
|
62
|
+
}
|
|
63
|
+
moveFullBatch(bucketId, batch) {
|
|
64
|
+
const batchId = batch.getId();
|
|
65
|
+
this.pendingBatches[batchId] = batch;
|
|
66
|
+
batch.scheduleInsert();
|
|
67
|
+
delete this.batches[bucketId];
|
|
68
|
+
}
|
|
69
|
+
async insert(batchId) {
|
|
70
|
+
const batch = this.pendingBatches[batchId];
|
|
71
|
+
try {
|
|
72
|
+
const queries = batch.records.map((record) => {
|
|
73
|
+
return {
|
|
74
|
+
query: this.insertStatement,
|
|
75
|
+
params: [
|
|
76
|
+
record.streamId,
|
|
77
|
+
record.partition,
|
|
78
|
+
batch.getBucketId(),
|
|
79
|
+
record.timestamp,
|
|
80
|
+
record.sequenceNo,
|
|
81
|
+
record.publisherId,
|
|
82
|
+
record.msgChainId,
|
|
83
|
+
record.payload,
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
await this.cassandraClient.batch(queries, {
|
|
88
|
+
prepare: true
|
|
89
|
+
});
|
|
90
|
+
this.logger.trace('Insert batch', { batchId: batch.getId() });
|
|
91
|
+
batch.done();
|
|
92
|
+
batch.clear();
|
|
93
|
+
delete this.pendingBatches[batch.getId()];
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
if (this.opts.logErrors) {
|
|
97
|
+
this.logger.error('Failed to insert batch', { batchId, err });
|
|
98
|
+
}
|
|
99
|
+
// stop if reached max retries
|
|
100
|
+
// TODO: This probably belongs in Batch
|
|
101
|
+
if (batch.reachedMaxRetries()) {
|
|
102
|
+
if (this.opts.logErrors) {
|
|
103
|
+
this.logger.error('Drop batch (max retries reached)', {
|
|
104
|
+
batchId: batch.getId(),
|
|
105
|
+
retries: batch.retries
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
batch.clear();
|
|
109
|
+
delete this.pendingBatches[batch.getId()];
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
batch.scheduleInsert();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.BatchManager = BatchManager;
|
|
117
|
+
//# sourceMappingURL=BatchManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchManager.js","sourceRoot":"","sources":["../../../../src/plugins/storage/BatchManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type BucketId = string;
|
|
2
|
+
export declare class Bucket {
|
|
3
|
+
id: BucketId;
|
|
4
|
+
streamId: string;
|
|
5
|
+
partition: number;
|
|
6
|
+
size: number;
|
|
7
|
+
records: number;
|
|
8
|
+
dateCreate: Date;
|
|
9
|
+
private maxSize;
|
|
10
|
+
private maxRecordCount;
|
|
11
|
+
private keepAliveSeconds;
|
|
12
|
+
ttl: Date;
|
|
13
|
+
private stored;
|
|
14
|
+
constructor(id: BucketId, streamId: string, partition: number, size: number, records: number, dateCreate: Date, maxSize: number, maxRecordCount: number, keepAliveSeconds: number);
|
|
15
|
+
isStored(): boolean;
|
|
16
|
+
setStored(): void;
|
|
17
|
+
private checkSize;
|
|
18
|
+
isAlmostFull(percentDeduction?: number): boolean;
|
|
19
|
+
getId(): string;
|
|
20
|
+
incrementBucket(size: number): void;
|
|
21
|
+
private updateTTL;
|
|
22
|
+
isAlive(): boolean;
|
|
23
|
+
}
|