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