@weave-js/core 0.11.0 → 0.12.1
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 +7 -7
- package/lib/broker/context.js +49 -49
- package/lib/broker/defaultOptions.js +9 -9
- package/lib/broker/index.js +161 -165
- package/lib/buildRuntime.js +34 -34
- 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 +30 -24
- package/lib/constants.js +5 -5
- package/lib/errorHandler.js +8 -8
- package/lib/errors.js +35 -35
- 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 -22
- 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 +63 -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 +145 -148
- 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 +14 -5
- 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 +85 -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 +14 -17
- package/lib/transport/messageHandlers.js +200 -200
- package/lib/transport/messageTypes.js +19 -19
- package/lib/types.js +49 -25
- package/lib/utils/index.js +2 -2
- package/lib/utils/options.js +44 -44
- package/lib/utils/restoreError.js +4 -4
- package/package.json +4 -4
- package/lib/cache/base.js +0 -147
- package/lib/cache/inMemory.js +0 -140
- package/lib/cache/index.js +0 -48
package/lib/broker/index.js
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
// node packages
|
|
9
|
-
const { isFunction } = require('@weave-js/utils')
|
|
10
|
-
const path = require('path')
|
|
11
|
-
const glob = require('glob')
|
|
12
|
-
const Middlewares = require('../middlewares')
|
|
9
|
+
const { isFunction } = require('@weave-js/utils');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const glob = require('glob');
|
|
12
|
+
const Middlewares = require('../middlewares');
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Creates a new Weave Broker instance
|
|
@@ -28,206 +28,202 @@ exports.createBrokerInstance = (runtime) => {
|
|
|
28
28
|
validator,
|
|
29
29
|
log,
|
|
30
30
|
services,
|
|
31
|
-
transport
|
|
32
|
-
|
|
33
|
-
cache
|
|
34
|
-
} = runtime
|
|
31
|
+
transport
|
|
32
|
+
} = runtime;
|
|
35
33
|
|
|
36
34
|
// Log Messages
|
|
37
|
-
log.info(`Initializing #weave node version ${version}`)
|
|
38
|
-
log.info(`Node Id: ${options.nodeId}`)
|
|
35
|
+
log.info(`Initializing #weave node version ${version}`);
|
|
36
|
+
log.info(`Node Id: ${options.nodeId}`);
|
|
39
37
|
|
|
40
38
|
// Output namespace
|
|
41
39
|
if (options.namespace) {
|
|
42
|
-
log.info(`Namespace: ${options.namespace}`)
|
|
40
|
+
log.info(`Namespace: ${options.namespace}`);
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
// Init metrics
|
|
46
|
-
if (metrics) {
|
|
47
|
-
metrics.init()
|
|
44
|
+
if (runtime.metrics) {
|
|
45
|
+
runtime.metrics.init();
|
|
48
46
|
}
|
|
49
47
|
|
|
50
48
|
// Init cache
|
|
51
|
-
if (cache) {
|
|
52
|
-
cache.init()
|
|
49
|
+
if (runtime.cache) {
|
|
50
|
+
runtime.cache.init();
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
// broker object
|
|
56
54
|
/** @type {Broker} */
|
|
57
|
-
const broker = Object.create(null)
|
|
58
|
-
|
|
59
|
-
broker.runtime = runtime
|
|
60
|
-
broker.registry = registry
|
|
61
|
-
broker.bus = bus
|
|
62
|
-
broker.nodeId = options.nodeId
|
|
63
|
-
broker.version = version
|
|
64
|
-
broker.options = options
|
|
65
|
-
broker.validator = validator
|
|
66
|
-
broker.contextFactory = contextFactory
|
|
67
|
-
broker.log = log
|
|
68
|
-
broker.createLogger = runtime.createLogger
|
|
55
|
+
const broker = Object.create(null);
|
|
56
|
+
|
|
57
|
+
broker.runtime = runtime;
|
|
58
|
+
broker.registry = registry;
|
|
59
|
+
broker.bus = bus;
|
|
60
|
+
broker.nodeId = options.nodeId;
|
|
61
|
+
broker.version = version;
|
|
62
|
+
broker.options = options;
|
|
63
|
+
broker.validator = validator;
|
|
64
|
+
broker.contextFactory = contextFactory;
|
|
65
|
+
broker.log = log;
|
|
66
|
+
broker.createLogger = runtime.createLogger;
|
|
69
67
|
|
|
70
68
|
broker.getUUID = function () {
|
|
71
|
-
return runtime.generateUUID()
|
|
72
|
-
}
|
|
69
|
+
return runtime.generateUUID();
|
|
70
|
+
};
|
|
73
71
|
|
|
74
72
|
broker.getNextActionEndpoint = function (actionName, options = {}) {
|
|
75
|
-
return registry.getNextAvailableActionEndpoint(actionName, options)
|
|
76
|
-
}
|
|
73
|
+
return registry.getNextAvailableActionEndpoint(actionName, options);
|
|
74
|
+
};
|
|
77
75
|
|
|
78
|
-
broker.emit = eventBus.emit.bind(broker)
|
|
76
|
+
broker.emit = eventBus.emit.bind(broker);
|
|
79
77
|
|
|
80
|
-
broker.broadcast = eventBus.broadcast.bind(broker)
|
|
78
|
+
broker.broadcast = eventBus.broadcast.bind(broker);
|
|
81
79
|
|
|
82
|
-
broker.broadcastLocal = eventBus.broadcastLocal.bind(broker)
|
|
80
|
+
broker.broadcastLocal = eventBus.broadcastLocal.bind(broker);
|
|
83
81
|
|
|
84
|
-
broker.call = runtime.actionInvoker.call.bind(broker)
|
|
82
|
+
broker.call = runtime.actionInvoker.call.bind(broker);
|
|
85
83
|
|
|
86
|
-
broker.multiCall = runtime.actionInvoker.multiCall.bind(broker)
|
|
84
|
+
broker.multiCall = runtime.actionInvoker.multiCall.bind(broker);
|
|
87
85
|
|
|
88
|
-
broker.waitForServices = services.waitForServices.bind(broker)
|
|
86
|
+
broker.waitForServices = services.waitForServices.bind(broker);
|
|
89
87
|
|
|
90
|
-
broker.createService = services.createService.bind(broker)
|
|
88
|
+
broker.createService = services.createService.bind(broker);
|
|
91
89
|
|
|
92
90
|
/**
|
|
93
91
|
* Global error handler of the broker.
|
|
94
92
|
* @param {*} error Error
|
|
95
93
|
* @returns {void}
|
|
96
94
|
*/
|
|
97
|
-
broker.handleError = runtime.handleError
|
|
95
|
+
broker.handleError = runtime.handleError;
|
|
98
96
|
|
|
99
|
-
broker.fatalError = runtime.fatalError
|
|
97
|
+
broker.fatalError = runtime.fatalError;
|
|
100
98
|
|
|
101
99
|
/**
|
|
102
100
|
* Load and register a service from file.
|
|
103
|
-
* @param {string}
|
|
101
|
+
* @param {string} filename Path to the service file.
|
|
104
102
|
* @returns {Service} Service
|
|
105
103
|
*/
|
|
106
|
-
broker.loadService = function (
|
|
107
|
-
const filePath = path.resolve(
|
|
108
|
-
const schema = require(filePath)
|
|
109
|
-
const service = broker.createService(schema)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
service.filename = fileName
|
|
114
|
-
services.watchService.call(broker, service)
|
|
104
|
+
broker.loadService = function (filename) {
|
|
105
|
+
const filePath = path.resolve(filename);
|
|
106
|
+
const schema = require(filePath);
|
|
107
|
+
const service = broker.createService(schema);
|
|
108
|
+
|
|
109
|
+
if (service) {
|
|
110
|
+
service.filename = filename;
|
|
115
111
|
}
|
|
116
112
|
|
|
117
|
-
return service
|
|
118
|
-
}
|
|
113
|
+
return service;
|
|
114
|
+
};
|
|
119
115
|
|
|
120
116
|
broker.loadServices = function (folder = './services', fileMask = '*.service.js') {
|
|
121
|
-
const serviceFiles = glob.sync(path.join(folder, fileMask))
|
|
117
|
+
const serviceFiles = glob.sync(path.join(folder, fileMask));
|
|
122
118
|
|
|
123
|
-
log.info(`Searching services in folder '${folder}' with name pattern '${fileMask}'.`)
|
|
124
|
-
log.info(`${serviceFiles.length} services found.`)
|
|
119
|
+
log.info(`Searching services in folder '${folder}' with name pattern '${fileMask}'.`);
|
|
120
|
+
log.info(`${serviceFiles.length} services found.`);
|
|
125
121
|
|
|
126
|
-
serviceFiles.forEach(fileName => broker.loadService(fileName))
|
|
127
|
-
return serviceFiles.length
|
|
128
|
-
}
|
|
122
|
+
serviceFiles.forEach(fileName => broker.loadService(fileName));
|
|
123
|
+
return serviceFiles.length;
|
|
124
|
+
};
|
|
129
125
|
|
|
130
126
|
/**
|
|
131
127
|
* Starts the broker.
|
|
132
128
|
* @returns {Promise} Promise
|
|
133
129
|
*/
|
|
134
130
|
broker.start = async function () {
|
|
135
|
-
const startTime = Date.now()
|
|
136
|
-
await middlewareHandler.callHandlersAsync('starting', [runtime], true)
|
|
131
|
+
const startTime = Date.now();
|
|
132
|
+
await middlewareHandler.callHandlersAsync('starting', [runtime], true);
|
|
137
133
|
|
|
138
134
|
// If transport is used, we connect the transport adapter.
|
|
139
135
|
if (transport) {
|
|
140
|
-
await transport.connect()
|
|
136
|
+
await transport.connect();
|
|
141
137
|
}
|
|
142
138
|
|
|
143
139
|
try {
|
|
144
|
-
await Promise.all(services.serviceList.map(service => service.start()))
|
|
140
|
+
await Promise.all(services.serviceList.map(service => service.start()));
|
|
145
141
|
} catch (error) {
|
|
146
|
-
log.error(error, 'Unable to start all services')
|
|
147
|
-
clearInterval(options.waitForServiceInterval)
|
|
148
|
-
throw error
|
|
142
|
+
log.error(error, 'Unable to start all services');
|
|
143
|
+
clearInterval(options.waitForServiceInterval);
|
|
144
|
+
throw error;
|
|
149
145
|
}
|
|
150
146
|
|
|
151
|
-
runtime.state.isStarted = true
|
|
152
|
-
eventBus.broadcastLocal('$broker.started')
|
|
147
|
+
runtime.state.isStarted = true;
|
|
148
|
+
eventBus.broadcastLocal('$broker.started');
|
|
153
149
|
// refresh local node information
|
|
154
|
-
registry.generateLocalNodeInfo(true)
|
|
150
|
+
registry.generateLocalNodeInfo(true);
|
|
155
151
|
|
|
156
152
|
// If transport is used, we set the transport ready to inform the other nodes
|
|
157
153
|
if (transport) {
|
|
158
|
-
await transport.setReady()
|
|
154
|
+
await transport.setReady();
|
|
159
155
|
}
|
|
160
156
|
|
|
161
|
-
await middlewareHandler.callHandlersAsync('started', [runtime], true)
|
|
157
|
+
await middlewareHandler.callHandlersAsync('started', [runtime], true);
|
|
162
158
|
|
|
163
159
|
if (runtime.state.isStarted && isFunction(options.started)) {
|
|
164
|
-
options.started.call(broker)
|
|
160
|
+
options.started.call(broker);
|
|
165
161
|
}
|
|
166
162
|
|
|
167
|
-
const duration = Date.now() - startTime
|
|
168
|
-
log.info(`Node "${options.nodeId}" with ${services.serviceList.length} services successfully started in ${duration}ms.`)
|
|
169
|
-
}
|
|
163
|
+
const duration = Date.now() - startTime;
|
|
164
|
+
log.info(`Node "${options.nodeId}" with ${services.serviceList.length} services successfully started in ${duration}ms.`);
|
|
165
|
+
};
|
|
170
166
|
|
|
171
167
|
/**
|
|
172
168
|
* Stops the broker.
|
|
173
169
|
* @returns {Promise} Promise
|
|
174
170
|
*/
|
|
175
171
|
broker.stop = async function () {
|
|
176
|
-
runtime.state.isStarted = false
|
|
177
|
-
log.info('Shutting down the node...')
|
|
172
|
+
runtime.state.isStarted = false;
|
|
173
|
+
log.info('Shutting down the node...');
|
|
178
174
|
|
|
179
|
-
await middlewareHandler.callHandlersAsync('stopping', [runtime], true)
|
|
175
|
+
await middlewareHandler.callHandlersAsync('stopping', [runtime], true);
|
|
180
176
|
|
|
181
177
|
// Stop services
|
|
182
178
|
try {
|
|
183
|
-
await Promise.all(services.serviceList.map(service => service.stop()))
|
|
179
|
+
await Promise.all(services.serviceList.map(service => service.stop()));
|
|
184
180
|
} catch (error) {
|
|
185
|
-
log.error(error, 'Unable to stop all services.')
|
|
186
|
-
throw error
|
|
181
|
+
log.error(error, 'Unable to stop all services.');
|
|
182
|
+
throw error;
|
|
187
183
|
}
|
|
188
184
|
|
|
189
185
|
// Disconnect transports
|
|
190
186
|
if (transport) {
|
|
191
|
-
await transport.disconnect()
|
|
187
|
+
await transport.disconnect();
|
|
192
188
|
}
|
|
193
189
|
|
|
194
190
|
// Stop cache
|
|
195
191
|
if (runtime.cache) {
|
|
196
|
-
log.debug('Stopping caching adapters.')
|
|
197
|
-
await runtime.cache.stop()
|
|
192
|
+
log.debug('Stopping caching adapters.');
|
|
193
|
+
await runtime.cache.stop();
|
|
198
194
|
}
|
|
199
195
|
|
|
200
196
|
// Stop metrics
|
|
201
197
|
if (runtime.metrics) {
|
|
202
|
-
log.debug('Stopping metrics.')
|
|
203
|
-
await runtime.metrics.stop()
|
|
198
|
+
log.debug('Stopping metrics.');
|
|
199
|
+
await runtime.metrics.stop();
|
|
204
200
|
}
|
|
205
201
|
|
|
206
202
|
// Stop tracers
|
|
207
203
|
if (runtime.tracer) {
|
|
208
|
-
log.debug('Stopping tracing adapters.')
|
|
209
|
-
await runtime.tracer.stop()
|
|
204
|
+
log.debug('Stopping tracing adapters.');
|
|
205
|
+
await runtime.tracer.stop();
|
|
210
206
|
}
|
|
211
207
|
|
|
212
208
|
// Call "stopped" middleware method.
|
|
213
|
-
await middlewareHandler.callHandlersAsync('stopped', [runtime], true)
|
|
209
|
+
await middlewareHandler.callHandlersAsync('stopped', [runtime], true);
|
|
214
210
|
|
|
215
211
|
// Call "stopped" lifecycle hook
|
|
216
212
|
if (!runtime.state.isStarted && isFunction(options.stopped)) {
|
|
217
|
-
options.stopped.call(runtime)
|
|
213
|
+
options.stopped.call(runtime);
|
|
218
214
|
}
|
|
219
215
|
|
|
220
|
-
log.info('The node was successfully shut down. Bye bye! 👋')
|
|
216
|
+
log.info('The node was successfully shut down. Bye bye! 👋');
|
|
221
217
|
|
|
222
|
-
eventBus.broadcastLocal('$broker.stopped')
|
|
218
|
+
eventBus.broadcastLocal('$broker.stopped');
|
|
223
219
|
|
|
224
|
-
process.removeListener('beforeExit', onClose)
|
|
225
|
-
process.removeListener('exit', onClose)
|
|
226
|
-
process.removeListener('SIGINT', onClose)
|
|
227
|
-
process.removeListener('SIGTERM', onClose)
|
|
220
|
+
process.removeListener('beforeExit', onClose);
|
|
221
|
+
process.removeListener('exit', onClose);
|
|
222
|
+
process.removeListener('SIGINT', onClose);
|
|
223
|
+
process.removeListener('SIGTERM', onClose);
|
|
228
224
|
|
|
229
225
|
// todo: handle errors
|
|
230
|
-
}
|
|
226
|
+
};
|
|
231
227
|
|
|
232
228
|
/**
|
|
233
229
|
* Ping other nodes
|
|
@@ -240,167 +236,167 @@ exports.createBrokerInstance = (runtime) => {
|
|
|
240
236
|
if (nodeId) {
|
|
241
237
|
return new Promise((resolve) => {
|
|
242
238
|
const timeoutTimer = setTimeout(() => {
|
|
243
|
-
bus.off('$node.pong', pongHandler)
|
|
244
|
-
return resolve(null)
|
|
245
|
-
}, timeout)
|
|
239
|
+
bus.off('$node.pong', pongHandler);
|
|
240
|
+
return resolve(null);
|
|
241
|
+
}, timeout);
|
|
246
242
|
|
|
247
243
|
const pongHandler = pong => {
|
|
248
|
-
clearTimeout(timeoutTimer)
|
|
249
|
-
bus.off('$node.pong', pongHandler)
|
|
250
|
-
resolve(pong)
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
bus.on('$node.pong', pongHandler)
|
|
254
|
-
transport.sendPing(nodeId)
|
|
255
|
-
})
|
|
244
|
+
clearTimeout(timeoutTimer);
|
|
245
|
+
bus.off('$node.pong', pongHandler);
|
|
246
|
+
resolve(pong);
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
bus.on('$node.pong', pongHandler);
|
|
250
|
+
transport.sendPing(nodeId);
|
|
251
|
+
});
|
|
256
252
|
} else {
|
|
257
253
|
// handle arrays
|
|
258
|
-
const pongs = {}
|
|
254
|
+
const pongs = {};
|
|
259
255
|
|
|
260
|
-
const nodes = registry.
|
|
256
|
+
const nodes = registry.nodeCollection.list({})
|
|
261
257
|
.filter(node => !node.isLocal)
|
|
262
|
-
.map(node => node.id)
|
|
258
|
+
.map(node => node.id);
|
|
263
259
|
|
|
264
|
-
const onFlight = new Set(nodes)
|
|
260
|
+
const onFlight = new Set(nodes);
|
|
265
261
|
|
|
266
262
|
nodes.forEach(nodeId => {
|
|
267
|
-
pongs[nodeId] = null
|
|
268
|
-
})
|
|
263
|
+
pongs[nodeId] = null;
|
|
264
|
+
});
|
|
269
265
|
|
|
270
266
|
return new Promise((resolve) => {
|
|
271
267
|
// todo: handle timeout
|
|
272
268
|
const timeoutTimer = setTimeout(() => {
|
|
273
|
-
bus.off('$node.pong', pongHandler)
|
|
274
|
-
resolve(pongs)
|
|
275
|
-
}, timeout)
|
|
269
|
+
bus.off('$node.pong', pongHandler);
|
|
270
|
+
resolve(pongs);
|
|
271
|
+
}, timeout);
|
|
276
272
|
|
|
277
273
|
const pongHandler = pong => {
|
|
278
|
-
pongs[pong.nodeId] = pong
|
|
279
|
-
onFlight.delete(pong.nodeId)
|
|
274
|
+
pongs[pong.nodeId] = pong;
|
|
275
|
+
onFlight.delete(pong.nodeId);
|
|
280
276
|
if (onFlight.size === 0) {
|
|
281
|
-
clearTimeout(timeoutTimer)
|
|
282
|
-
bus.off('$node.pong', pongHandler)
|
|
283
|
-
resolve(pongs)
|
|
277
|
+
clearTimeout(timeoutTimer);
|
|
278
|
+
bus.off('$node.pong', pongHandler);
|
|
279
|
+
resolve(pongs);
|
|
284
280
|
}
|
|
285
|
-
}
|
|
281
|
+
};
|
|
286
282
|
|
|
287
|
-
bus.on('$node.pong', pongHandler)
|
|
288
|
-
nodes.map(nodeId => transport.sendPing(nodeId))
|
|
289
|
-
})
|
|
283
|
+
bus.on('$node.pong', pongHandler);
|
|
284
|
+
nodes.map(nodeId => transport.sendPing(nodeId));
|
|
285
|
+
});
|
|
290
286
|
}
|
|
291
287
|
}
|
|
292
288
|
|
|
293
|
-
return Promise.resolve(nodeId ? null : {})
|
|
294
|
-
}
|
|
289
|
+
return Promise.resolve(nodeId ? null : {});
|
|
290
|
+
};
|
|
295
291
|
|
|
296
292
|
// Register internal broker events
|
|
297
293
|
broker.bus.on('$node.disconnected', ({ nodeId }) => {
|
|
298
|
-
runtime.transport.removePendingRequestsByNodeId(nodeId)
|
|
299
|
-
services.serviceChanged(false)
|
|
300
|
-
})
|
|
294
|
+
runtime.transport.removePendingRequestsByNodeId(nodeId);
|
|
295
|
+
services.serviceChanged(false);
|
|
296
|
+
});
|
|
301
297
|
|
|
302
298
|
/**
|
|
303
299
|
* Register middlewares
|
|
304
300
|
* @param {Array<Object>} customMiddlewares Array of user defined middlewares
|
|
305
301
|
* @returns {void}
|
|
306
302
|
*/
|
|
307
|
-
const registerMiddlewares = customMiddlewares => {
|
|
303
|
+
const registerMiddlewares = (customMiddlewares) => {
|
|
308
304
|
// Register custom middlewares
|
|
309
305
|
if (Array.isArray(customMiddlewares) && customMiddlewares.length > 0) {
|
|
310
|
-
customMiddlewares.forEach(middleware => middlewareHandler.add(middleware))
|
|
306
|
+
customMiddlewares.forEach(middleware => middlewareHandler.add(middleware));
|
|
311
307
|
}
|
|
312
308
|
|
|
313
309
|
// Add the built-in middlewares. (The order is important)
|
|
314
310
|
if (options.loadInternalMiddlewares) {
|
|
315
|
-
middlewareHandler.add(Middlewares.ActionHooks)
|
|
311
|
+
middlewareHandler.add(Middlewares.ActionHooks);
|
|
316
312
|
|
|
317
313
|
// Validator middleware
|
|
318
314
|
if (options.validateActionParams && validator) {
|
|
319
|
-
middlewareHandler.add(Middlewares.Validator)
|
|
315
|
+
middlewareHandler.add(Middlewares.Validator);
|
|
320
316
|
}
|
|
321
317
|
|
|
322
318
|
// Bulkhead
|
|
323
319
|
if (options.bulkhead.enabled) {
|
|
324
|
-
middlewareHandler.add(Middlewares.Bulkhead)
|
|
320
|
+
middlewareHandler.add(Middlewares.Bulkhead);
|
|
325
321
|
}
|
|
326
322
|
|
|
327
323
|
// Cache
|
|
328
324
|
if (runtime.cache) {
|
|
329
|
-
middlewareHandler.add(Middlewares.Cache)
|
|
325
|
+
middlewareHandler.add(Middlewares.Cache);
|
|
330
326
|
}
|
|
331
327
|
|
|
332
328
|
// Context tracking
|
|
333
329
|
if (options.contextTracking.enabled) {
|
|
334
|
-
middlewareHandler.add(Middlewares.ContextTracker)
|
|
330
|
+
middlewareHandler.add(Middlewares.ContextTracker);
|
|
335
331
|
}
|
|
336
332
|
|
|
337
333
|
// Circuit breaker
|
|
338
334
|
if (options.circuitBreaker.enabled) {
|
|
339
|
-
middlewareHandler.add(Middlewares.CircuitBreaker)
|
|
335
|
+
middlewareHandler.add(Middlewares.CircuitBreaker);
|
|
340
336
|
}
|
|
341
337
|
|
|
342
338
|
// timeout middleware
|
|
343
|
-
middlewareHandler.add(Middlewares.Timeout)
|
|
339
|
+
middlewareHandler.add(Middlewares.Timeout);
|
|
344
340
|
|
|
345
341
|
// Retry policy
|
|
346
342
|
if (options.retryPolicy.enabled) {
|
|
347
|
-
middlewareHandler.add(Middlewares.Retry)
|
|
343
|
+
middlewareHandler.add(Middlewares.Retry);
|
|
348
344
|
}
|
|
349
345
|
|
|
350
346
|
// Error handler
|
|
351
|
-
middlewareHandler.add(Middlewares.ErrorHandler)
|
|
347
|
+
middlewareHandler.add(Middlewares.ErrorHandler);
|
|
352
348
|
|
|
353
349
|
// Tracing
|
|
354
350
|
if (options.tracing.enabled) {
|
|
355
|
-
middlewareHandler.add(Middlewares.Tracing)
|
|
351
|
+
middlewareHandler.add(Middlewares.Tracing);
|
|
356
352
|
}
|
|
357
353
|
|
|
358
354
|
// Metrics
|
|
359
355
|
if (options.metrics.enabled) {
|
|
360
|
-
middlewareHandler.add(Middlewares.Metrics)
|
|
356
|
+
middlewareHandler.add(Middlewares.Metrics);
|
|
361
357
|
}
|
|
362
358
|
}
|
|
363
359
|
|
|
364
360
|
// Wrap runtime and broker methods for middlewares
|
|
365
|
-
runtime.actionInvoker.call = middlewareHandler.wrapMethod('call', runtime.actionInvoker.call)
|
|
366
|
-
runtime.actionInvoker.multiCall = middlewareHandler.wrapMethod('multiCall', broker.multiCall)
|
|
367
|
-
runtime.eventBus.emit = middlewareHandler.wrapMethod('emit', runtime.eventBus.emit)
|
|
368
|
-
runtime.eventBus.broadcast = middlewareHandler.wrapMethod('broadcast', runtime.eventBus.broadcast)
|
|
369
|
-
runtime.eventBus.broadcastLocal = middlewareHandler.wrapMethod('broadcastLocal', runtime.eventBus.broadcastLocal)
|
|
361
|
+
runtime.actionInvoker.call = middlewareHandler.wrapMethod('call', runtime.actionInvoker.call);
|
|
362
|
+
runtime.actionInvoker.multiCall = middlewareHandler.wrapMethod('multiCall', broker.multiCall);
|
|
363
|
+
runtime.eventBus.emit = middlewareHandler.wrapMethod('emit', runtime.eventBus.emit);
|
|
364
|
+
runtime.eventBus.broadcast = middlewareHandler.wrapMethod('broadcast', runtime.eventBus.broadcast);
|
|
365
|
+
runtime.eventBus.broadcastLocal = middlewareHandler.wrapMethod('broadcastLocal', runtime.eventBus.broadcastLocal);
|
|
370
366
|
|
|
371
367
|
// Wrap broker methods
|
|
372
|
-
broker.createService = middlewareHandler.wrapMethod('createService', broker.createService)
|
|
373
|
-
broker.loadService = middlewareHandler.wrapMethod('loadService', broker.loadService)
|
|
374
|
-
broker.loadServices = middlewareHandler.wrapMethod('loadServices', broker.loadServices)
|
|
375
|
-
broker.ping = middlewareHandler.wrapMethod('ping', broker.ping)
|
|
376
|
-
}
|
|
368
|
+
broker.createService = middlewareHandler.wrapMethod('createService', broker.createService);
|
|
369
|
+
broker.loadService = middlewareHandler.wrapMethod('loadService', broker.loadService);
|
|
370
|
+
broker.loadServices = middlewareHandler.wrapMethod('loadServices', broker.loadServices);
|
|
371
|
+
broker.ping = middlewareHandler.wrapMethod('ping', broker.ping);
|
|
372
|
+
};
|
|
377
373
|
|
|
378
374
|
// Run "beforeRegisterMiddlewares" hook
|
|
379
375
|
if (isFunction(options.beforeRegisterMiddlewares)) {
|
|
380
|
-
options.beforeRegisterMiddlewares.call(broker, { broker, runtime })
|
|
376
|
+
options.beforeRegisterMiddlewares.call(broker, { broker, runtime });
|
|
381
377
|
}
|
|
382
378
|
|
|
383
379
|
// Register middlewares
|
|
384
|
-
registerMiddlewares(options.middlewares)
|
|
380
|
+
registerMiddlewares(options.middlewares);
|
|
385
381
|
|
|
386
382
|
// Stop the broker greaceful
|
|
387
383
|
/* istanbul ignore next */
|
|
388
384
|
const onClose = () => broker.stop()
|
|
389
385
|
.catch(error => broker.log.error(error))
|
|
390
|
-
.then(() => process.exit(0))
|
|
386
|
+
.then(() => process.exit(0));
|
|
391
387
|
|
|
392
388
|
// SIGTERM listener
|
|
393
|
-
process.setMaxListeners(0)
|
|
394
|
-
process.on('beforeExit', onClose)
|
|
395
|
-
process.on('exit', onClose)
|
|
396
|
-
process.on('SIGINT', onClose)
|
|
397
|
-
process.on('SIGTERM', onClose)
|
|
389
|
+
process.setMaxListeners(0);
|
|
390
|
+
process.on('beforeExit', onClose);
|
|
391
|
+
process.on('exit', onClose);
|
|
392
|
+
process.on('SIGINT', onClose);
|
|
393
|
+
process.on('SIGTERM', onClose);
|
|
398
394
|
|
|
399
395
|
// Add broker reference to runtime
|
|
400
|
-
Object.assign(runtime, { broker })
|
|
396
|
+
Object.assign(runtime, { broker });
|
|
401
397
|
|
|
402
398
|
// Call middleware hook for broker created.
|
|
403
|
-
middlewareHandler.callHandlersSync('created', [runtime])
|
|
399
|
+
middlewareHandler.callHandlersSync('created', [runtime]);
|
|
404
400
|
|
|
405
|
-
return broker
|
|
406
|
-
}
|
|
401
|
+
return broker;
|
|
402
|
+
};
|
package/lib/buildRuntime.js
CHANGED
|
@@ -4,23 +4,23 @@
|
|
|
4
4
|
* @typedef {import('./types.js').Broker} Broker
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
const { initLogger } = require('./runtime/initLogger')
|
|
8
|
-
const { initMiddlewareHandler } = require('./runtime/initMiddlewareManager')
|
|
9
|
-
const { initRegistry } = require('./runtime/initRegistry')
|
|
10
|
-
const { initContextFactory } = require('./runtime/initContextFactory')
|
|
11
|
-
const { initEventbus } = require('./runtime/initEventbus')
|
|
12
|
-
const { initValidator } = require('./runtime/initValidator')
|
|
13
|
-
const { initTransport } = require('./runtime/initTransport')
|
|
14
|
-
const { initCache } = require('./runtime/initCache')
|
|
15
|
-
const { initActionInvoker } = require('./runtime/initActionInvoker')
|
|
16
|
-
const { initServiceManager } = require('./runtime/initServiceManager')
|
|
17
|
-
const { initMetrics } = require('./runtime/initMetrics')
|
|
18
|
-
const { initTracer } = require('./runtime/initTracing')
|
|
19
|
-
const { initUUIDFactory } = require('./runtime/initUuidFactory')
|
|
20
|
-
const { errorHandler, fatalErrorHandler } = require('./errorHandler')
|
|
21
|
-
const { uuid } = require('@weave-js/utils')
|
|
22
|
-
const { version } = require('../package.json')
|
|
23
|
-
const EventEmitter = require('eventemitter2')
|
|
7
|
+
const { initLogger } = require('./runtime/initLogger');
|
|
8
|
+
const { initMiddlewareHandler } = require('./runtime/initMiddlewareManager');
|
|
9
|
+
const { initRegistry } = require('./runtime/initRegistry');
|
|
10
|
+
const { initContextFactory } = require('./runtime/initContextFactory');
|
|
11
|
+
const { initEventbus } = require('./runtime/initEventbus');
|
|
12
|
+
const { initValidator } = require('./runtime/initValidator');
|
|
13
|
+
const { initTransport } = require('./runtime/initTransport');
|
|
14
|
+
const { initCache } = require('./runtime/initCache');
|
|
15
|
+
const { initActionInvoker } = require('./runtime/initActionInvoker');
|
|
16
|
+
const { initServiceManager } = require('./runtime/initServiceManager');
|
|
17
|
+
const { initMetrics } = require('./runtime/initMetrics');
|
|
18
|
+
const { initTracer } = require('./runtime/initTracing');
|
|
19
|
+
const { initUUIDFactory } = require('./runtime/initUuidFactory');
|
|
20
|
+
const { errorHandler, fatalErrorHandler } = require('./errorHandler');
|
|
21
|
+
const { uuid } = require('@weave-js/utils');
|
|
22
|
+
const { version } = require('../package.json');
|
|
23
|
+
const EventEmitter = require('eventemitter2');
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Build runtime object
|
|
@@ -35,7 +35,7 @@ exports.initRuntime = (options) => {
|
|
|
35
35
|
const bus = new EventEmitter({
|
|
36
36
|
wildcard: true,
|
|
37
37
|
maxListeners: 1000
|
|
38
|
-
})
|
|
38
|
+
});
|
|
39
39
|
|
|
40
40
|
// Create base runtime object
|
|
41
41
|
const runtime = {
|
|
@@ -49,22 +49,22 @@ exports.initRuntime = (options) => {
|
|
|
49
49
|
},
|
|
50
50
|
handleError: (error) => errorHandler(runtime, error),
|
|
51
51
|
fatalError: (message, error, killProcess) => fatalErrorHandler(runtime, message, error, killProcess)
|
|
52
|
-
}
|
|
52
|
+
};
|
|
53
53
|
|
|
54
54
|
// Init modules
|
|
55
|
-
initLogger(runtime)
|
|
56
|
-
initUUIDFactory(runtime)
|
|
57
|
-
initMiddlewareHandler(runtime)
|
|
58
|
-
initRegistry(runtime)
|
|
59
|
-
initContextFactory(runtime)
|
|
60
|
-
initEventbus(runtime)
|
|
61
|
-
initValidator(runtime)
|
|
62
|
-
initTransport(runtime)
|
|
63
|
-
initCache(runtime)
|
|
64
|
-
initActionInvoker(runtime)
|
|
65
|
-
initServiceManager(runtime)
|
|
66
|
-
initMetrics(runtime)
|
|
67
|
-
initTracer(runtime)
|
|
55
|
+
initLogger(runtime);
|
|
56
|
+
initUUIDFactory(runtime);
|
|
57
|
+
initMiddlewareHandler(runtime);
|
|
58
|
+
initRegistry(runtime);
|
|
59
|
+
initContextFactory(runtime);
|
|
60
|
+
initEventbus(runtime);
|
|
61
|
+
initValidator(runtime);
|
|
62
|
+
initTransport(runtime);
|
|
63
|
+
initCache(runtime);
|
|
64
|
+
initActionInvoker(runtime);
|
|
65
|
+
initServiceManager(runtime);
|
|
66
|
+
initMetrics(runtime);
|
|
67
|
+
initTracer(runtime);
|
|
68
68
|
|
|
69
|
-
return runtime
|
|
70
|
-
}
|
|
69
|
+
return runtime;
|
|
70
|
+
};
|