@weave-js/core 0.10.0 → 0.12.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/.eslintrc.js +1 -1
- package/jest.config.js +1 -1
- package/lib/ExtendableError.js +33 -0
- package/lib/broker/context.js +58 -46
- package/lib/broker/{default-options.js → defaultOptions.js} +31 -13
- package/lib/broker/index.js +273 -251
- package/lib/buildRuntime.js +70 -0
- package/lib/cache/adapters/base.js +119 -0
- package/lib/cache/adapters/inMemory.js +154 -0
- package/lib/cache/adapters/inMemoryLru.js +140 -0
- package/lib/cache/adapters/index.js +10 -0
- package/lib/cache/getCacheKeyByObject.js +31 -0
- package/lib/cache/getPropertyFromDataOrMetadata.js +20 -0
- package/lib/cache/lock.js +34 -11
- package/lib/constants.js +11 -8
- package/lib/{error-handler.js → errorHandler.js} +8 -8
- package/lib/errors.js +46 -39
- package/lib/helper/{define-action.js → defineAction.js} +5 -3
- package/lib/helper/{define-broker-options.js → defineBrokerOptions.js} +4 -2
- package/lib/helper/{define-service.js → defineService.js} +6 -3
- package/lib/index.js +25 -22
- package/lib/logger/base.js +38 -29
- package/lib/logger/format/asHumanReadable.js +15 -14
- package/lib/logger/format/asJson.js +10 -10
- package/lib/logger/format/index.js +3 -3
- package/lib/logger/index.js +28 -25
- package/lib/logger/levels.js +23 -22
- package/lib/logger/tools.js +17 -13
- package/lib/logger/utils/colorize.js +23 -23
- package/lib/logger/utils/format.js +89 -65
- package/lib/metrics/common.js +47 -47
- package/lib/metrics/constants.js +44 -44
- package/lib/metrics/exporter/base.js +8 -8
- package/lib/metrics/exporter/event.js +20 -20
- package/lib/metrics/exporter/index.js +15 -15
- package/lib/metrics/index.js +2 -2
- package/lib/metrics/types/base.js +20 -20
- package/lib/metrics/types/counter.js +6 -6
- package/lib/metrics/types/gauge.js +24 -24
- package/lib/metrics/types/histogram.js +26 -26
- package/lib/metrics/types/index.js +6 -6
- package/lib/metrics/types/info.js +17 -17
- package/lib/middlewares/action-hooks/index.js +82 -34
- package/lib/middlewares/bulkhead/index.js +34 -33
- package/lib/middlewares/cache/index.js +106 -0
- package/lib/middlewares/circuit-breaker/index.js +85 -60
- package/lib/middlewares/context-tracker/index.js +39 -39
- package/lib/middlewares/error-handler/index.js +14 -14
- package/lib/middlewares/index.js +3 -2
- package/lib/middlewares/metrics/getMiddlewareWrapper.js +17 -17
- package/lib/middlewares/metrics/index.js +29 -29
- package/lib/middlewares/retry/index.js +15 -15
- package/lib/middlewares/timeout/index.js +18 -18
- package/lib/middlewares/tracing/index.js +50 -37
- package/lib/middlewares/tracing/tags.js +43 -0
- package/lib/middlewares/validator/index.js +32 -32
- package/lib/registry/{action-endpoint.js → actionEndpoint.js} +8 -8
- package/lib/registry/collections/{action-collection.js → actionCollection.js} +39 -35
- package/lib/registry/collections/{endpoint-collection.js → endpointCollection.js} +64 -65
- package/lib/registry/collections/{event-collection.js → eventCollection.js} +65 -69
- package/lib/registry/collections/{node-collection.js → nodeCollection.js} +45 -45
- package/lib/registry/collections/{service-collection.js → serviceCollection.js} +61 -55
- package/lib/registry/eventEndpoint.js +26 -0
- package/lib/registry/load-balancer/base.js +3 -3
- package/lib/registry/load-balancer/index.js +7 -7
- package/lib/registry/node.js +27 -27
- package/lib/registry/registry.js +147 -163
- package/lib/registry/service/parseAction.js +16 -16
- package/lib/registry/service/parseEvent.js +18 -18
- package/lib/registry/service/reduceMixins.js +10 -10
- package/lib/registry/service/service.js +72 -72
- package/lib/registry/{service-item.js → serviceItem.js} +21 -21
- package/lib/runtime/{init-action-invoker.js → initActionInvoker.js} +21 -21
- package/lib/runtime/initCache.js +19 -0
- package/lib/runtime/{init-context-factory.js → initContextFactory.js} +22 -22
- package/lib/runtime/{init-eventbus.js → initEventbus.js} +54 -53
- package/lib/runtime/{init-logger.js → initLogger.js} +11 -11
- package/lib/runtime/{init-metrics.js → initMetrics.js} +55 -54
- package/lib/runtime/{init-middleware-manager.js → initMiddlewareManager.js} +21 -21
- package/lib/runtime/{init-registry.js → initRegistry.js} +6 -6
- package/lib/runtime/initServiceManager.js +145 -0
- package/lib/runtime/{init-tracing.js → initTracing.js} +25 -24
- package/lib/runtime/{init-transport.js → initTransport.js} +5 -5
- package/lib/runtime/{init-uuid-factory.js → initUuidFactory.js} +4 -4
- package/lib/runtime/{init-validator.js → initValidator.js} +5 -5
- package/lib/tracing/collectors/base.js +29 -37
- package/lib/tracing/collectors/event.js +33 -33
- package/lib/tracing/collectors/index.js +16 -16
- package/lib/tracing/span.js +34 -32
- package/lib/tracing/time.js +8 -8
- package/lib/transport/InboundTransformStream.js +75 -0
- package/lib/transport/adapters/adapteBase.js +107 -0
- package/lib/transport/adapters/adapters.js +4 -4
- package/lib/transport/adapters/dummy/index.js +19 -19
- package/lib/transport/adapters/fromURI.js +13 -13
- package/lib/transport/adapters/getAdapterByName.js +5 -5
- package/lib/transport/adapters/index.js +12 -12
- package/lib/transport/adapters/tcp/discovery/codec.js +4 -4
- package/lib/transport/adapters/tcp/discovery/index.js +90 -76
- package/lib/transport/adapters/tcp/index.js +180 -175
- package/lib/transport/adapters/tcp/tcp-messagetypes.js +7 -7
- package/lib/transport/adapters/tcp/tcpReader.js +39 -38
- package/lib/transport/adapters/tcp/tcpWriteStream.js +26 -26
- package/lib/transport/adapters/tcp/tcpWriter.js +58 -58
- package/lib/transport/adapters/tcp/utils.js +12 -12
- package/lib/transport/createMessage.js +11 -0
- package/lib/transport/createTransport.js +377 -334
- package/lib/transport/errorPayloadFactory.js +15 -0
- package/lib/transport/messageHandlers.js +517 -0
- package/lib/transport/messageTypes.js +23 -0
- package/lib/types.js +95 -71
- package/lib/utils/index.js +2 -2
- package/lib/utils/options.js +47 -45
- package/lib/utils/{restore-error.js → restoreError.js} +4 -4
- package/package.json +6 -12
- package/CHANGELOG.md +0 -1334
- package/lib/build-runtime.js +0 -70
- package/lib/cache/base.js +0 -142
- package/lib/cache/index.js +0 -48
- package/lib/cache/memory.js +0 -121
- package/lib/middlewares/tracing/buildTags.js +0 -17
- package/lib/new-errors.js +0 -25
- package/lib/registry/event-endpoint.js +0 -26
- package/lib/runtime/init-cache.js +0 -10
- package/lib/runtime/init-service-manager.js +0 -128
- package/lib/tracing/collectors/console.js +0 -34
- package/lib/tracing/index.js +0 -3
- package/lib/tracing/tracer.js +0 -64
- package/lib/transport/adapters/adapter-base.js +0 -92
- package/lib/transport/message-handlers.js +0 -448
- package/lib/transport/message-types.js +0 -59
- package/lib/transport/message.js +0 -16
|
@@ -1,54 +1,55 @@
|
|
|
1
1
|
|
|
2
|
-
const { defaultsDeep } = require('@weave-js/utils')
|
|
3
|
-
const TransportBase = require('../
|
|
4
|
-
const Swim = require('./discovery/index')
|
|
5
|
-
const MessageTypes = require('../../
|
|
6
|
-
const TCPReader = require('./tcpReader')
|
|
7
|
-
const TCPWriter = require('./tcpWriter')
|
|
8
|
-
|
|
2
|
+
const { defaultsDeep } = require('@weave-js/utils');
|
|
3
|
+
const TransportBase = require('../adapteBase');
|
|
4
|
+
const Swim = require('./discovery/index');
|
|
5
|
+
const MessageTypes = require('../../messageTypes');
|
|
6
|
+
const TCPReader = require('./tcpReader');
|
|
7
|
+
const TCPWriter = require('./tcpWriter');
|
|
8
|
+
const { createMessage } = require('../../createMessage');
|
|
9
9
|
|
|
10
10
|
const defaultOptions = {
|
|
11
11
|
port: null,
|
|
12
12
|
discovery: {
|
|
13
13
|
enabled: true,
|
|
14
14
|
type: 'udp4',
|
|
15
|
+
udpMulticast: true,
|
|
15
16
|
multicastAddress: '239.0.0.0',
|
|
16
17
|
port: 54355,
|
|
17
18
|
udpReuseAddress: true
|
|
18
19
|
},
|
|
19
20
|
gossipTimerInterval: 2000,
|
|
20
21
|
maxPacketSize: 1024 * 1024 * 50
|
|
21
|
-
}
|
|
22
|
+
};
|
|
22
23
|
|
|
23
24
|
module.exports = function SwimTransport (adapterOptions) {
|
|
24
|
-
adapterOptions = defaultsDeep(adapterOptions, defaultOptions)
|
|
25
|
+
adapterOptions = defaultsDeep(adapterOptions, defaultOptions);
|
|
25
26
|
|
|
26
|
-
const self = TransportBase(adapterOptions)
|
|
27
|
-
let tcpReader
|
|
28
|
-
let tcpWriter
|
|
29
|
-
let gossipTimer
|
|
27
|
+
const self = TransportBase(adapterOptions);
|
|
28
|
+
let tcpReader;
|
|
29
|
+
let tcpWriter;
|
|
30
|
+
let gossipTimer;
|
|
30
31
|
|
|
31
|
-
self.afterInit = function () {
|
|
32
|
-
self.nodes = this.broker.registry.nodeCollection
|
|
33
|
-
self.registry = self.broker.registry
|
|
34
|
-
self.swim = Swim(self, adapterOptions)
|
|
35
|
-
}
|
|
32
|
+
self.afterInit = async function () {
|
|
33
|
+
self.nodes = this.broker.registry.nodeCollection;
|
|
34
|
+
self.registry = self.broker.registry;
|
|
35
|
+
self.swim = Swim(self, adapterOptions);
|
|
36
|
+
};
|
|
36
37
|
|
|
37
38
|
self.connect = async () => {
|
|
38
|
-
const port = await startTCPServer()
|
|
39
|
+
const port = await startTCPServer();
|
|
39
40
|
|
|
40
|
-
await startDiscoveryServer(port)
|
|
41
|
-
await startTimers()
|
|
41
|
+
await startDiscoveryServer(port);
|
|
42
|
+
await startTimers();
|
|
42
43
|
|
|
43
|
-
self.log.info('TCP transport adapter started.')
|
|
44
|
+
self.log.info('TCP transport adapter started.');
|
|
44
45
|
|
|
45
|
-
self.broker.registry.nodeCollection.localNode.port = port
|
|
46
|
-
self.broker.registry.generateLocalNodeInfo()
|
|
46
|
+
self.broker.registry.nodeCollection.localNode.port = port;
|
|
47
|
+
self.broker.registry.generateLocalNodeInfo();
|
|
47
48
|
|
|
48
|
-
self.connected({ wasReconnect: false, useHeartbeatTimer: false, useRemoteNodeCheckTimer: false, useOfflineCheckTimer: true })
|
|
49
|
+
self.connected({ wasReconnect: false, useHeartbeatTimer: false, useRemoteNodeCheckTimer: false, useOfflineCheckTimer: true });
|
|
49
50
|
|
|
50
|
-
return Promise.resolve()
|
|
51
|
-
}
|
|
51
|
+
return Promise.resolve();
|
|
52
|
+
};
|
|
52
53
|
|
|
53
54
|
self.send = (message) => {
|
|
54
55
|
if (!message.targetNodeId || ![
|
|
@@ -59,256 +60,260 @@ module.exports = function SwimTransport (adapterOptions) {
|
|
|
59
60
|
MessageTypes.MESSAGE_RESPONSE,
|
|
60
61
|
MessageTypes.MESSAGE_GOSSIP_HELLO,
|
|
61
62
|
MessageTypes.MESSAGE_GOSSIP_REQUEST,
|
|
62
|
-
MessageTypes.MESSAGE_GOSSIP_RESPONSE
|
|
63
|
+
MessageTypes.MESSAGE_GOSSIP_RESPONSE,
|
|
64
|
+
MessageTypes.MESSAGE_RESPONSE_STREAM_BACKPRESSURE,
|
|
65
|
+
MessageTypes.MESSAGE_RESPONSE_STREAM_RESUME,
|
|
66
|
+
MessageTypes.MESSAGE_REQUEST_STREAM_BACKPRESSURE,
|
|
67
|
+
MessageTypes.MESSAGE_REQUEST_STREAM_RESUME
|
|
63
68
|
].includes(message.type)) {
|
|
64
69
|
if (message.type === MessageTypes.MESSAGE_DISCONNECT) {
|
|
65
70
|
// send a disconnect message to all connected nodes
|
|
66
|
-
return publishNodeDisconnect(message)
|
|
71
|
+
return publishNodeDisconnect(message);
|
|
67
72
|
}
|
|
68
|
-
return Promise.resolve()
|
|
73
|
+
return Promise.resolve();
|
|
69
74
|
}
|
|
70
75
|
|
|
71
|
-
const data = self.serialize(message)
|
|
72
|
-
return tcpWriter.send(message.targetNodeId, message.type, data)
|
|
73
|
-
}
|
|
76
|
+
const data = self.serialize(message);
|
|
77
|
+
return tcpWriter.send(message.targetNodeId, message.type, data);
|
|
78
|
+
};
|
|
74
79
|
|
|
75
80
|
self.sendHello = nodeId => {
|
|
76
|
-
const node = self.broker.registry.nodeCollection.get(nodeId)
|
|
81
|
+
const node = self.broker.registry.nodeCollection.get(nodeId);
|
|
77
82
|
|
|
78
83
|
if (!node) {
|
|
79
|
-
return Promise.reject(new Error('Node not found.'))
|
|
84
|
+
return Promise.reject(new Error('Node not found.'));
|
|
80
85
|
}
|
|
81
86
|
|
|
82
|
-
const localNode = self.broker.registry.nodeCollection.localNode
|
|
87
|
+
const localNode = self.broker.registry.nodeCollection.localNode;
|
|
83
88
|
|
|
84
|
-
const message =
|
|
89
|
+
const message = createMessage(MessageTypes.MESSAGE_GOSSIP_HELLO, nodeId, {
|
|
85
90
|
host: localNode.IPList[0],
|
|
86
91
|
port: localNode.port
|
|
87
|
-
})
|
|
92
|
+
});
|
|
88
93
|
|
|
89
|
-
self.send(message)
|
|
94
|
+
self.send(message);
|
|
90
95
|
|
|
91
|
-
return Promise.resolve()
|
|
92
|
-
}
|
|
96
|
+
return Promise.resolve();
|
|
97
|
+
};
|
|
93
98
|
|
|
94
99
|
self.close = () => {
|
|
95
|
-
clearInterval(gossipTimer)
|
|
100
|
+
clearInterval(gossipTimer);
|
|
96
101
|
if (tcpReader) {
|
|
97
|
-
tcpReader.close()
|
|
102
|
+
tcpReader.close();
|
|
98
103
|
}
|
|
99
104
|
if (tcpWriter) {
|
|
100
|
-
tcpWriter.close()
|
|
105
|
+
tcpWriter.close();
|
|
101
106
|
}
|
|
102
107
|
if (tcpReader) {
|
|
103
|
-
tcpReader.close()
|
|
108
|
+
tcpReader.close();
|
|
104
109
|
}
|
|
105
110
|
|
|
106
|
-
self.swim.close()
|
|
111
|
+
self.swim.close();
|
|
107
112
|
|
|
108
|
-
return Promise.resolve()
|
|
109
|
-
}
|
|
113
|
+
return Promise.resolve();
|
|
114
|
+
};
|
|
110
115
|
|
|
111
116
|
// Send a disconnect message to all connected nodes.
|
|
112
117
|
function publishNodeDisconnect (message) {
|
|
113
|
-
const nodes = self.broker.registry.nodeCollection.toArray()
|
|
118
|
+
const nodes = self.broker.registry.nodeCollection.toArray();
|
|
114
119
|
return Promise.all(
|
|
115
120
|
nodes
|
|
116
121
|
.filter(node => node.isAvailable && !node.isLocal)
|
|
117
122
|
.map(node => {
|
|
118
|
-
const data = self.serialize(message)
|
|
119
|
-
return tcpWriter.send(node.id, message.type, data)
|
|
123
|
+
const data = self.serialize(message);
|
|
124
|
+
return tcpWriter.send(node.id, message.type, data);
|
|
120
125
|
})
|
|
121
|
-
)
|
|
126
|
+
);
|
|
122
127
|
}
|
|
123
128
|
|
|
124
129
|
function addDiscoveredNode (nodeId, host, port) {
|
|
125
|
-
const node = self.broker.registry.nodeCollection.createNode(nodeId)
|
|
126
|
-
|
|
127
|
-
node.isLocal = false
|
|
128
|
-
node.isAvailable = false
|
|
129
|
-
node.IPList = [host]
|
|
130
|
-
node.hostname = host
|
|
131
|
-
node.port = port
|
|
132
|
-
node.sequence = 0
|
|
133
|
-
node.offlineTime = Date.now()
|
|
134
|
-
self.broker.registry.nodeCollection.add(node.id, node)
|
|
135
|
-
|
|
136
|
-
return node
|
|
130
|
+
const node = self.broker.registry.nodeCollection.createNode(nodeId);
|
|
131
|
+
|
|
132
|
+
node.isLocal = false;
|
|
133
|
+
node.isAvailable = false;
|
|
134
|
+
node.IPList = [host];
|
|
135
|
+
node.hostname = host;
|
|
136
|
+
node.port = port;
|
|
137
|
+
node.sequence = 0;
|
|
138
|
+
node.offlineTime = Date.now();
|
|
139
|
+
self.broker.registry.nodeCollection.add(node.id, node);
|
|
140
|
+
|
|
141
|
+
return node;
|
|
137
142
|
}
|
|
138
143
|
|
|
139
144
|
self.onIncomingMessage = (type, data, socket) => {
|
|
140
145
|
switch (type) {
|
|
141
146
|
case MessageTypes.MESSAGE_GOSSIP_HELLO:
|
|
142
|
-
return onGossipHelloMessage(data, socket)
|
|
147
|
+
return onGossipHelloMessage(data, socket);
|
|
143
148
|
case MessageTypes.MESSAGE_GOSSIP_REQUEST:
|
|
144
|
-
return onGossipRequestMessage(data, socket)
|
|
149
|
+
return onGossipRequestMessage(data, socket);
|
|
145
150
|
case MessageTypes.MESSAGE_GOSSIP_RESPONSE:
|
|
146
|
-
return onGossipResponseMessage(data, socket)
|
|
151
|
+
return onGossipResponseMessage(data, socket);
|
|
147
152
|
default:
|
|
148
|
-
return self.incomingMessage(type, data)
|
|
153
|
+
return self.incomingMessage(type, data);
|
|
149
154
|
}
|
|
150
|
-
}
|
|
155
|
+
};
|
|
151
156
|
|
|
152
157
|
function startDiscoveryServer (port) {
|
|
153
158
|
self.swim.bus.on('message', ({ nodeId, host, port }) => {
|
|
154
159
|
if (nodeId && nodeId !== self.broker.nodeId) {
|
|
155
|
-
let node = self.broker.registry.nodeCollection.get(nodeId)
|
|
160
|
+
let node = self.broker.registry.nodeCollection.get(nodeId);
|
|
156
161
|
if (!node) {
|
|
157
|
-
self.log.debug(`Discoverd a new node ${nodeId}`)
|
|
162
|
+
self.log.debug(`Discoverd a new node ${nodeId}`);
|
|
158
163
|
|
|
159
|
-
node = addDiscoveredNode(nodeId, host, port)
|
|
164
|
+
node = addDiscoveredNode(nodeId, host, port);
|
|
160
165
|
} else if (!node.isAvailable) {
|
|
161
166
|
// update tcp port
|
|
162
|
-
node.port = port
|
|
163
|
-
self.log.debug(`Node is still not available: ${node.id}`)
|
|
167
|
+
node.port = port;
|
|
168
|
+
self.log.debug(`Node is still not available: ${node.id}`);
|
|
164
169
|
}
|
|
165
170
|
}
|
|
166
|
-
})
|
|
171
|
+
});
|
|
167
172
|
|
|
168
|
-
self.swim.
|
|
173
|
+
self.swim.start(port);
|
|
169
174
|
}
|
|
170
175
|
|
|
171
176
|
function startTCPServer () {
|
|
172
|
-
tcpReader = TCPReader(self, adapterOptions)
|
|
173
|
-
tcpWriter = TCPWriter(self, adapterOptions)
|
|
177
|
+
tcpReader = TCPReader(self, adapterOptions);
|
|
178
|
+
tcpWriter = TCPWriter(self, adapterOptions);
|
|
174
179
|
|
|
175
|
-
tcpReader.on('message', onMessage)
|
|
180
|
+
tcpReader.on('message', onMessage);
|
|
176
181
|
|
|
177
|
-
tcpWriter.on('error', (error,
|
|
178
|
-
self.log.debug('TCP client error on ', error)
|
|
179
|
-
self.broker.registry.nodeDisconnected(
|
|
180
|
-
})
|
|
182
|
+
tcpWriter.on('error', (error, nodeId) => {
|
|
183
|
+
self.log.debug('TCP client error on ', error);
|
|
184
|
+
self.broker.registry.nodeDisconnected(nodeId, false);
|
|
185
|
+
});
|
|
181
186
|
|
|
182
|
-
tcpWriter.on('end',
|
|
183
|
-
self.log.debug('TCP connection ended with')
|
|
184
|
-
self.broker.registry.nodeDisconnected(
|
|
185
|
-
})
|
|
187
|
+
tcpWriter.on('end', nodeId => {
|
|
188
|
+
self.log.debug('TCP connection ended with');
|
|
189
|
+
self.broker.registry.nodeDisconnected(nodeId, false);
|
|
190
|
+
});
|
|
186
191
|
|
|
187
|
-
// tcpWriter.on('error', (_,
|
|
192
|
+
// tcpWriter.on('error', (_, nodeId) => {
|
|
188
193
|
// self.log.debug('TCP server error on ')
|
|
189
|
-
// // this.nodes.disconnected(
|
|
194
|
+
// // this.nodes.disconnected(nodeId, false)
|
|
190
195
|
// })
|
|
191
196
|
|
|
192
|
-
return tcpReader.listen()
|
|
197
|
+
return tcpReader.listen();
|
|
193
198
|
}
|
|
194
199
|
|
|
195
200
|
function startTimers () {
|
|
196
|
-
gossipTimer = setInterval(() => sendGossipRequest(), adapterOptions.gossipTimerInterval)
|
|
197
|
-
gossipTimer.unref()
|
|
201
|
+
gossipTimer = setInterval(() => sendGossipRequest(), adapterOptions.gossipTimerInterval);
|
|
202
|
+
gossipTimer.unref();
|
|
198
203
|
}
|
|
199
204
|
|
|
200
205
|
function sendGossipRequest () {
|
|
201
|
-
const list = self.broker.registry.nodeCollection.toArray()
|
|
206
|
+
const list = self.broker.registry.nodeCollection.toArray();
|
|
202
207
|
if (!list || list.length === 0) {
|
|
203
|
-
return
|
|
208
|
+
return;
|
|
204
209
|
}
|
|
205
210
|
|
|
206
211
|
const payload = {
|
|
207
212
|
online: {},
|
|
208
213
|
offline: {}
|
|
209
|
-
}
|
|
214
|
+
};
|
|
210
215
|
|
|
211
|
-
const onlineNodes = []
|
|
212
|
-
const offlineNodes = []
|
|
216
|
+
const onlineNodes = [];
|
|
217
|
+
const offlineNodes = [];
|
|
213
218
|
|
|
214
219
|
list.forEach(node => {
|
|
215
220
|
if (node.isAvailable) {
|
|
216
|
-
payload.online[node.id] = [node.sequence, node.cpuSequence || 0, node.cpu || 0]
|
|
221
|
+
payload.online[node.id] = [node.sequence, node.cpuSequence || 0, node.cpu || 0];
|
|
217
222
|
|
|
218
223
|
if (!node.isLocal) {
|
|
219
|
-
onlineNodes.push(node)
|
|
224
|
+
onlineNodes.push(node);
|
|
220
225
|
}
|
|
221
226
|
} else {
|
|
222
227
|
if (node.sequence > 0) {
|
|
223
|
-
payload.offline[node.id] = node.sequence
|
|
228
|
+
payload.offline[node.id] = node.sequence;
|
|
224
229
|
}
|
|
225
|
-
offlineNodes.push(node)
|
|
230
|
+
offlineNodes.push(node);
|
|
226
231
|
}
|
|
227
|
-
})
|
|
232
|
+
});
|
|
228
233
|
|
|
229
234
|
if (Object.keys(payload.online).length === 0) {
|
|
230
|
-
delete payload.online
|
|
235
|
+
delete payload.online;
|
|
231
236
|
}
|
|
232
237
|
|
|
233
238
|
if (Object.keys(payload.offline).length === 0) {
|
|
234
|
-
delete payload.offline
|
|
239
|
+
delete payload.offline;
|
|
235
240
|
}
|
|
236
241
|
|
|
237
242
|
if (onlineNodes.length > 0) {
|
|
238
|
-
sendGossipRequestToRandomEndpoint(payload, onlineNodes)
|
|
243
|
+
sendGossipRequestToRandomEndpoint(payload, onlineNodes);
|
|
239
244
|
}
|
|
240
245
|
|
|
241
246
|
if (offlineNodes.length > 0) {
|
|
242
|
-
sendGossipRequestToRandomEndpoint(payload, offlineNodes)
|
|
247
|
+
sendGossipRequestToRandomEndpoint(payload, offlineNodes);
|
|
243
248
|
}
|
|
244
249
|
}
|
|
245
250
|
|
|
246
251
|
function sendGossipRequestToRandomEndpoint (payload, nodes) {
|
|
247
252
|
if (!nodes || nodes.length === 0) {
|
|
248
|
-
return
|
|
253
|
+
return;
|
|
249
254
|
}
|
|
250
255
|
|
|
251
|
-
const destinationNode = nodes[Math.floor(Math.random() * nodes.length)]
|
|
256
|
+
const destinationNode = nodes[Math.floor(Math.random() * nodes.length)];
|
|
252
257
|
if (destinationNode) {
|
|
253
|
-
const message =
|
|
258
|
+
const message = createMessage(MessageTypes.MESSAGE_GOSSIP_REQUEST, destinationNode.id, payload);
|
|
254
259
|
|
|
255
260
|
self.send(message).catch(() => {
|
|
256
|
-
self.log.debug(`Unable to send gossip response to ${destinationNode.id}`)
|
|
257
|
-
})
|
|
261
|
+
self.log.debug(`Unable to send gossip response to ${destinationNode.id}`);
|
|
262
|
+
});
|
|
258
263
|
}
|
|
259
264
|
}
|
|
260
265
|
|
|
261
266
|
function onGossipHelloMessage (packet, socket) {
|
|
262
267
|
try {
|
|
263
|
-
const message = self.deserialize(packet)
|
|
264
|
-
const payload = message.payload
|
|
265
|
-
const nodeId = payload.sender
|
|
266
|
-
const node = self.broker.registry.nodeCollection.get(nodeId)
|
|
268
|
+
const message = self.deserialize(packet);
|
|
269
|
+
const payload = message.payload;
|
|
270
|
+
const nodeId = payload.sender;
|
|
271
|
+
const node = self.broker.registry.nodeCollection.get(nodeId);
|
|
267
272
|
|
|
268
273
|
if (!node) {
|
|
269
|
-
addDiscoveredNode(nodeId, payload.host, payload.port)
|
|
274
|
+
addDiscoveredNode(nodeId, payload.host, payload.port);
|
|
270
275
|
}
|
|
271
276
|
} catch (error) {
|
|
272
|
-
self.log.error('Invalid gossip hello message.', error.message)
|
|
277
|
+
self.log.error('Invalid gossip hello message.', error.message);
|
|
273
278
|
}
|
|
274
279
|
}
|
|
275
280
|
|
|
276
281
|
// Handle incoming gossip request
|
|
277
282
|
function onGossipRequestMessage (data) {
|
|
278
283
|
try {
|
|
279
|
-
const message = self.deserialize(data)
|
|
280
|
-
const payload = message.payload
|
|
281
|
-
const list = self.broker.registry.nodeCollection.toArray()
|
|
284
|
+
const message = self.deserialize(data);
|
|
285
|
+
const payload = message.payload;
|
|
286
|
+
const list = self.broker.registry.nodeCollection.toArray();
|
|
282
287
|
|
|
283
288
|
// Init gossip response
|
|
284
289
|
const response = {
|
|
285
290
|
online: {},
|
|
286
291
|
offline: {}
|
|
287
|
-
}
|
|
292
|
+
};
|
|
288
293
|
|
|
289
294
|
list.forEach(node => {
|
|
290
|
-
const online = payload.online ? payload.online[node.id] : null
|
|
291
|
-
const offline = payload.offline ? payload.offline[node.id] : null
|
|
295
|
+
const online = payload.online ? payload.online[node.id] : null;
|
|
296
|
+
const offline = payload.offline ? payload.offline[node.id] : null;
|
|
292
297
|
|
|
293
298
|
// eslint-disable-next-line no-unused-vars
|
|
294
|
-
let sequence, cpuSequence, cpu
|
|
299
|
+
let sequence, cpuSequence, cpu;
|
|
295
300
|
|
|
296
301
|
if (offline) {
|
|
297
|
-
sequence = offline
|
|
302
|
+
sequence = offline;
|
|
298
303
|
} else if (online) {
|
|
299
|
-
[sequence, cpuSequence, cpu] = online
|
|
304
|
+
[sequence, cpuSequence, cpu] = online;
|
|
300
305
|
}
|
|
301
306
|
|
|
302
307
|
// Local node information are newer
|
|
303
308
|
if (!sequence || sequence < node.sequence) {
|
|
304
309
|
// our node info is newer than the
|
|
305
310
|
if (node.isAvailable) {
|
|
306
|
-
const nodeInfo = self.broker.registry.getNodeInfo(node.id)
|
|
307
|
-
response.online[node.id] = [nodeInfo, node.cpuSequence || 0, node.cpu || 0]
|
|
311
|
+
const nodeInfo = self.broker.registry.getNodeInfo(node.id);
|
|
312
|
+
response.online[node.id] = [nodeInfo, node.cpuSequence || 0, node.cpu || 0];
|
|
308
313
|
} else {
|
|
309
|
-
response.offline[node.id] = node.sequence
|
|
314
|
+
response.offline[node.id] = node.sequence;
|
|
310
315
|
}
|
|
311
|
-
return
|
|
316
|
+
return;
|
|
312
317
|
}
|
|
313
318
|
|
|
314
319
|
// sender said node is offline
|
|
@@ -317,18 +322,18 @@ module.exports = function SwimTransport (adapterOptions) {
|
|
|
317
322
|
if (!node.isAvailable) {
|
|
318
323
|
// we know node is offline
|
|
319
324
|
if (sequence > node.sequence) {
|
|
320
|
-
node.sequence = sequence
|
|
325
|
+
node.sequence = sequence;
|
|
321
326
|
}
|
|
322
|
-
return
|
|
327
|
+
return;
|
|
323
328
|
} else if (!node.isLocal) {
|
|
324
329
|
// we know, the node is offline
|
|
325
|
-
self.broker.registry.nodeCollection.disconnected(node.id, false)
|
|
326
|
-
node.sequence = sequence
|
|
330
|
+
self.broker.registry.nodeCollection.disconnected(node.id, false);
|
|
331
|
+
node.sequence = sequence;
|
|
327
332
|
} else if (node.isLocal) {
|
|
328
333
|
// Remote node said we are offline, but we are online and send back our node information.
|
|
329
|
-
node.sequence = sequence + 1
|
|
330
|
-
const nodeInfo = self.broker.registry.getLocalNodeInfo(true)
|
|
331
|
-
response.online[node.id] = [nodeInfo, node.cpuSequence || 0, node.cpu || 0]
|
|
334
|
+
node.sequence = sequence + 1;
|
|
335
|
+
const nodeInfo = self.broker.registry.getLocalNodeInfo(true);
|
|
336
|
+
response.online[node.id] = [nodeInfo, node.cpuSequence || 0, node.cpu || 0];
|
|
332
337
|
}
|
|
333
338
|
} else if (online) {
|
|
334
339
|
// Remote node said we are online
|
|
@@ -337,115 +342,115 @@ module.exports = function SwimTransport (adapterOptions) {
|
|
|
337
342
|
node.heartbeat({
|
|
338
343
|
cpu,
|
|
339
344
|
cpuSequence
|
|
340
|
-
})
|
|
345
|
+
});
|
|
341
346
|
} else if (cpuSequence < node.cpuSequence) {
|
|
342
|
-
response.online[node.id] = [node.cpuSequence || 0, node.cpu || 0]
|
|
347
|
+
response.online[node.id] = [node.cpuSequence || 0, node.cpu || 0];
|
|
343
348
|
}
|
|
344
349
|
} else {
|
|
345
|
-
return
|
|
350
|
+
return;
|
|
346
351
|
}
|
|
347
352
|
}
|
|
348
|
-
})
|
|
353
|
+
});
|
|
349
354
|
|
|
350
355
|
if (Object.keys(response.online).length === 0) {
|
|
351
|
-
delete response.online
|
|
356
|
+
delete response.online;
|
|
352
357
|
}
|
|
353
358
|
|
|
354
359
|
if (Object.keys(response.offline).length === 0) {
|
|
355
|
-
delete response.offline
|
|
360
|
+
delete response.offline;
|
|
356
361
|
}
|
|
357
362
|
|
|
358
363
|
if (response.online || response.offline) {
|
|
359
|
-
const destinationNode = self.broker.registry.nodeCollection.get(payload.sender)
|
|
360
|
-
const message =
|
|
361
|
-
self.send(message).catch(() => {})
|
|
364
|
+
const destinationNode = self.broker.registry.nodeCollection.get(payload.sender);
|
|
365
|
+
const message = createMessage(MessageTypes.MESSAGE_GOSSIP_RESPONSE, destinationNode.id, response);
|
|
366
|
+
self.send(message).catch(() => {});
|
|
362
367
|
}
|
|
363
368
|
} catch (error) {
|
|
364
|
-
self.log.error(error)
|
|
369
|
+
self.log.error(error);
|
|
365
370
|
}
|
|
366
371
|
}
|
|
367
372
|
|
|
368
373
|
// Handle incoming gossip response
|
|
369
374
|
function onGossipResponseMessage (data, socket) {
|
|
370
375
|
try {
|
|
371
|
-
const message = self.deserialize(data)
|
|
372
|
-
const payload = message.payload
|
|
376
|
+
const message = self.deserialize(data);
|
|
377
|
+
const payload = message.payload;
|
|
373
378
|
|
|
374
379
|
// Process online nodes
|
|
375
380
|
if (payload.online) {
|
|
376
381
|
Object.keys(payload.online).forEach(nodeId => {
|
|
377
382
|
if (nodeId === self.broker.nodeId) {
|
|
378
|
-
return
|
|
383
|
+
return;
|
|
379
384
|
}
|
|
380
385
|
|
|
381
|
-
const item = payload.online[nodeId]
|
|
386
|
+
const item = payload.online[nodeId];
|
|
382
387
|
|
|
383
388
|
if (!Array.isArray(item)) {
|
|
384
|
-
return
|
|
389
|
+
return;
|
|
385
390
|
}
|
|
386
391
|
|
|
387
|
-
let info
|
|
388
|
-
let cpuSequence
|
|
389
|
-
let cpu
|
|
392
|
+
let info;
|
|
393
|
+
let cpuSequence;
|
|
394
|
+
let cpu;
|
|
390
395
|
|
|
391
396
|
if (item.length === 1) {
|
|
392
|
-
[info] = item
|
|
397
|
+
[info] = item;
|
|
393
398
|
} else if (item.length === 2) {
|
|
394
|
-
[cpuSequence, cpu] = item
|
|
399
|
+
[cpuSequence, cpu] = item;
|
|
395
400
|
} else if (item.length === 3) {
|
|
396
|
-
[info, cpuSequence, cpu] = item
|
|
401
|
+
[info, cpuSequence, cpu] = item;
|
|
397
402
|
}
|
|
398
403
|
|
|
399
|
-
const node = self.broker.registry.nodeCollection.get(nodeId)
|
|
404
|
+
const node = self.broker.registry.nodeCollection.get(nodeId);
|
|
400
405
|
|
|
401
406
|
if (info && (!node || node.sequence < info.sequence)) {
|
|
402
407
|
// if node is a new node or has a higher sequence update local info.
|
|
403
|
-
info.sender = nodeId
|
|
404
|
-
self.broker.registry.processNodeInfo(info)
|
|
408
|
+
info.sender = nodeId;
|
|
409
|
+
self.broker.registry.processNodeInfo(info);
|
|
405
410
|
}
|
|
406
411
|
|
|
407
412
|
if (node && node.isAvailable && cpuSequence && cpuSequence > node.cpuSequence) {
|
|
408
413
|
node.heartbeat({
|
|
409
414
|
cpu,
|
|
410
415
|
cpuSequence
|
|
411
|
-
})
|
|
416
|
+
});
|
|
412
417
|
}
|
|
413
|
-
})
|
|
418
|
+
});
|
|
414
419
|
}
|
|
415
420
|
|
|
416
421
|
// Offline nodes
|
|
417
422
|
if (payload.offline) {
|
|
418
423
|
Object.keys(payload.offline).forEach(nodeId => {
|
|
419
|
-
if (nodeId === self.broker.nodeId) return
|
|
424
|
+
if (nodeId === self.broker.nodeId) return;
|
|
420
425
|
|
|
421
|
-
const sequence = payload.offline[nodeId]
|
|
422
|
-
const node = self.broker.registry.nodeCollection.get(nodeId)
|
|
426
|
+
const sequence = payload.offline[nodeId];
|
|
427
|
+
const node = self.broker.registry.nodeCollection.get(nodeId);
|
|
423
428
|
|
|
424
429
|
if (!node) {
|
|
425
|
-
return
|
|
430
|
+
return;
|
|
426
431
|
}
|
|
427
432
|
|
|
428
433
|
// the remote node is newer
|
|
429
434
|
if (sequence > node.sequence) {
|
|
430
435
|
if (node.isAvailable) {
|
|
431
|
-
self.broker.registry.nodeCollection.disconnected(node.id, false)
|
|
436
|
+
self.broker.registry.nodeCollection.disconnected(node.id, false);
|
|
432
437
|
}
|
|
433
|
-
node.sequence = sequence
|
|
438
|
+
node.sequence = sequence;
|
|
434
439
|
}
|
|
435
|
-
})
|
|
440
|
+
});
|
|
436
441
|
}
|
|
437
442
|
} catch (error) {
|
|
438
|
-
self.log.error(error)
|
|
443
|
+
self.log.error(error);
|
|
439
444
|
}
|
|
440
445
|
}
|
|
441
446
|
|
|
442
447
|
function onMessage (type, data, socket) {
|
|
443
448
|
try {
|
|
444
|
-
self.onIncomingMessage(type, data, socket)
|
|
449
|
+
self.onIncomingMessage(type, data, socket);
|
|
445
450
|
} catch (error) {
|
|
446
|
-
console.log(error)
|
|
451
|
+
console.log(error);
|
|
447
452
|
}
|
|
448
453
|
}
|
|
449
454
|
|
|
450
|
-
return self
|
|
451
|
-
}
|
|
455
|
+
return self;
|
|
456
|
+
};
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
module.exports = messagetypes => {
|
|
2
|
-
const messageTypeIndexes = {}
|
|
2
|
+
const messageTypeIndexes = {};
|
|
3
3
|
|
|
4
4
|
Object
|
|
5
5
|
.keys(messagetypes)
|
|
6
6
|
.forEach((messageType, index) => {
|
|
7
|
-
messageTypeIndexes[messagetypes[messageType]] = index
|
|
8
|
-
})
|
|
7
|
+
messageTypeIndexes[messagetypes[messageType]] = index;
|
|
8
|
+
});
|
|
9
9
|
|
|
10
10
|
return {
|
|
11
11
|
getIndexByType (messageType) {
|
|
12
|
-
return messageTypeIndexes[messageType]
|
|
12
|
+
return messageTypeIndexes[messageType];
|
|
13
13
|
},
|
|
14
14
|
getTypeByIndex (index) {
|
|
15
|
-
return Object.keys(messageTypeIndexes).find(key => messageTypeIndexes[key] === index)
|
|
15
|
+
return Object.keys(messageTypeIndexes).find(key => messageTypeIndexes[key] === index);
|
|
16
16
|
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
17
|
+
};
|
|
18
|
+
};
|