Commit 562917649c8e64bfff7df0328005bb5087d88dae

Authored by Igor Kulikov
1 parent 5d64a270

Improve JS Executor

... ... @@ -203,7 +203,7 @@ sql:
203 203 attributes:
204 204 batch_size: "${SQL_ATTRIBUTES_BATCH_SIZE:10000}"
205 205 batch_max_delay: "${SQL_ATTRIBUTES_BATCH_MAX_DELAY_MS:100}"
206   - stats_print_interval_ms: "${SQL_ATTRIBUTES_BATCH_STATS_PRINT_MS:1000}"
  206 + stats_print_interval_ms: "${SQL_ATTRIBUTES_BATCH_STATS_PRINT_MS:10000}"
207 207 # Specify whether to remove null characters from strValue of attributes and timeseries before insert
208 208 remove_null_chars: "${SQL_REMOVE_NULL_CHARS:true}"
209 209
... ...
... ... @@ -17,11 +17,28 @@
17 17
18 18 const vm = require('vm');
19 19
20   -function JsExecutor() {
  20 +function JsExecutor(useSandbox) {
  21 + this.useSandbox = useSandbox;
21 22 }
22 23
23 24 JsExecutor.prototype.compileScript = function(code) {
24   - return new Promise(function(resolve, reject) {
  25 + if (this.useSandbox) {
  26 + return createScript(code);
  27 + } else {
  28 + return createFunction(code);
  29 + }
  30 +}
  31 +
  32 +JsExecutor.prototype.executeScript = function(script, args, timeout) {
  33 + if (this.useSandbox) {
  34 + return invokeScript(script, args, timeout);
  35 + } else {
  36 + return invokeFunction(script, args);
  37 + }
  38 +}
  39 +
  40 +function createScript(code) {
  41 + return new Promise((resolve, reject) => {
25 42 try {
26 43 code = "("+code+")(...args)";
27 44 var script = new vm.Script(code);
... ... @@ -32,8 +49,8 @@ JsExecutor.prototype.compileScript = function(code) {
32 49 });
33 50 }
34 51
35   -JsExecutor.prototype.executeScript = function(script, args, timeout) {
36   - return new Promise(function(resolve, reject) {
  52 +function invokeScript(script, args, timeout) {
  53 + return new Promise((resolve, reject) => {
37 54 try {
38 55 var sandbox = Object.create(null);
39 56 sandbox.args = args;
... ... @@ -45,4 +62,29 @@ JsExecutor.prototype.executeScript = function(script, args, timeout) {
45 62 });
46 63 }
47 64
  65 +
  66 +function createFunction(code) {
  67 + return new Promise((resolve, reject) => {
  68 + try {
  69 + code = "return ("+code+")(...args)";
  70 + const parsingContext = vm.createContext({});
  71 + const func = vm.compileFunction(code, ['args'], {parsingContext: parsingContext});
  72 + resolve(func);
  73 + } catch (err) {
  74 + reject(err);
  75 + }
  76 + });
  77 +}
  78 +
  79 +function invokeFunction(func, args) {
  80 + return new Promise((resolve, reject) => {
  81 + try {
  82 + var result = func(args);
  83 + resolve(result);
  84 + } catch (err) {
  85 + reject(err);
  86 + }
  87 + });
  88 +}
  89 +
48 90 module.exports = JsExecutor;
... ...
... ... @@ -15,18 +15,22 @@
15 15 */
16 16 'use strict';
17 17
  18 +const COMPILATION_ERROR = 0;
  19 +const RUNTIME_ERROR = 1;
  20 +const TIMEOUT_ERROR = 2;
  21 +const UNRECOGNIZED = -1;
  22 +
18 23 const config = require('config'),
19   - logger = require('../config/logger')('JsInvokeMessageProcessor'),
  24 + logger = require('../config/logger')._logger('JsInvokeMessageProcessor'),
20 25 Utils = require('./utils'),
21   - js = require('./jsinvoke.proto').js,
22   - KeyedMessage = require('kafka-node').KeyedMessage,
23 26 JsExecutor = require('./jsExecutor');
24 27
25 28 const scriptBodyTraceFrequency = Number(config.get('script.script_body_trace_frequency'));
  29 +const useSandbox = config.get('script.use_sandbox') === 'true';
26 30
27 31 function JsInvokeMessageProcessor(producer) {
28 32 this.producer = producer;
29   - this.executor = new JsExecutor();
  33 + this.executor = new JsExecutor(useSandbox);
30 34 this.scriptMap = {};
31 35 this.executedScriptsCounter = 0;
32 36 }
... ... @@ -34,18 +38,22 @@ function JsInvokeMessageProcessor(producer) {
34 38 JsInvokeMessageProcessor.prototype.onJsInvokeMessage = function(message) {
35 39
36 40 var requestId;
  41 + var responseTopic;
37 42 try {
38   - var request = js.RemoteJsRequest.decode(message.value);
39   - requestId = getRequestId(request);
  43 + var request = JSON.parse(message.value.toString('utf8'));
  44 + var buf = message.headers['requestId'];
  45 + requestId = Utils.UUIDFromBuffer(buf);
  46 + buf = message.headers['responseTopic'];
  47 + responseTopic = buf.toString('utf8');
40 48
41   - logger.debug('[%s] Received request, responseTopic: [%s]', requestId, request.responseTopic);
  49 + logger.debug('[%s] Received request, responseTopic: [%s]', requestId, responseTopic);
42 50
43 51 if (request.compileRequest) {
44   - this.processCompileRequest(requestId, request.responseTopic, request.compileRequest);
  52 + this.processCompileRequest(requestId, responseTopic, request.compileRequest);
45 53 } else if (request.invokeRequest) {
46   - this.processInvokeRequest(requestId, request.responseTopic, request.invokeRequest);
  54 + this.processInvokeRequest(requestId, responseTopic, request.invokeRequest);
47 55 } else if (request.releaseRequest) {
48   - this.processReleaseRequest(requestId, request.responseTopic, request.releaseRequest);
  56 + this.processReleaseRequest(requestId, responseTopic, request.releaseRequest);
49 57 } else {
50 58 logger.error('[%s] Unknown request recevied!', requestId);
51 59 }
... ... @@ -68,7 +76,7 @@ JsInvokeMessageProcessor.prototype.processCompileRequest = function(requestId, r
68 76 this.sendResponse(requestId, responseTopic, scriptId, compileResponse);
69 77 },
70 78 (err) => {
71   - var compileResponse = createCompileResponse(scriptId, false, js.JsInvokeErrorCode.COMPILATION_ERROR, err);
  79 + var compileResponse = createCompileResponse(scriptId, false, COMPILATION_ERROR, err);
72 80 logger.debug('[%s] Sending failed compile response, scriptId: [%s]', requestId, scriptId);
73 81 this.sendResponse(requestId, responseTopic, scriptId, compileResponse);
74 82 }
... ... @@ -96,9 +104,9 @@ JsInvokeMessageProcessor.prototype.processInvokeRequest = function(requestId, re
96 104 (err) => {
97 105 var errorCode;
98 106 if (err.message.includes('Script execution timed out')) {
99   - errorCode = js.JsInvokeErrorCode.TIMEOUT_ERROR;
  107 + errorCode = TIMEOUT_ERROR;
100 108 } else {
101   - errorCode = js.JsInvokeErrorCode.RUNTIME_ERROR;
  109 + errorCode = RUNTIME_ERROR;
102 110 }
103 111 var invokeResponse = createInvokeResponse("", false, errorCode, err);
104 112 logger.debug('[%s] Sending failed invoke response, scriptId: [%s], errorCode: [%s]', requestId, scriptId, errorCode);
... ... @@ -107,8 +115,8 @@ JsInvokeMessageProcessor.prototype.processInvokeRequest = function(requestId, re
107 115 )
108 116 },
109 117 (err) => {
110   - var invokeResponse = createInvokeResponse("", false, js.JsInvokeErrorCode.COMPILATION_ERROR, err);
111   - logger.debug('[%s] Sending failed invoke response, scriptId: [%s], errorCode: [%s]', requestId, scriptId, js.JsInvokeErrorCode.COMPILATION_ERROR);
  118 + var invokeResponse = createInvokeResponse("", false, COMPILATION_ERROR, err);
  119 + logger.debug('[%s] Sending failed invoke response, scriptId: [%s], errorCode: [%s]', requestId, scriptId, COMPILATION_ERROR);
112 120 this.sendResponse(requestId, responseTopic, scriptId, null, invokeResponse);
113 121 }
114 122 );
... ... @@ -127,15 +135,26 @@ JsInvokeMessageProcessor.prototype.processReleaseRequest = function(requestId, r
127 135
128 136 JsInvokeMessageProcessor.prototype.sendResponse = function (requestId, responseTopic, scriptId, compileResponse, invokeResponse, releaseResponse) {
129 137 var remoteResponse = createRemoteResponse(requestId, compileResponse, invokeResponse, releaseResponse);
130   - var rawResponse = js.RemoteJsResponse.encode(remoteResponse).finish();
131   - const message = new KeyedMessage(scriptId, rawResponse);
132   - const payloads = [ { topic: responseTopic, messages: message, key: scriptId } ];
133   - this.producer.send(payloads, function (err, data) {
134   - if (err) {
135   - logger.error('[%s] Failed to send response to kafka: %s', requestId, err.message);
136   - logger.error(err.stack);
  138 + var rawResponse = Buffer.from(JSON.stringify(remoteResponse), 'utf8');
  139 + this.producer.send(
  140 + {
  141 + topic: responseTopic,
  142 + messages: [
  143 + {
  144 + key: scriptId,
  145 + value: rawResponse
  146 + }
  147 + ]
137 148 }
138   - });
  149 + ).then(
  150 + () => {},
  151 + (err) => {
  152 + if (err) {
  153 + logger.error('[%s] Failed to send response to kafka: %s', requestId, err.message);
  154 + logger.error(err.stack);
  155 + }
  156 + }
  157 + );
139 158 }
140 159
141 160 JsInvokeMessageProcessor.prototype.getOrCompileScript = function(scriptId, scriptBody) {
... ... @@ -159,50 +178,42 @@ JsInvokeMessageProcessor.prototype.getOrCompileScript = function(scriptId, scrip
159 178
160 179 function createRemoteResponse(requestId, compileResponse, invokeResponse, releaseResponse) {
161 180 const requestIdBits = Utils.UUIDToBits(requestId);
162   - return js.RemoteJsResponse.create(
163   - {
  181 + return {
164 182 requestIdMSB: requestIdBits[0],
165 183 requestIdLSB: requestIdBits[1],
166 184 compileResponse: compileResponse,
167 185 invokeResponse: invokeResponse,
168 186 releaseResponse: releaseResponse
169   - }
170   - );
  187 + };
171 188 }
172 189
173 190 function createCompileResponse(scriptId, success, errorCode, err) {
174 191 const scriptIdBits = Utils.UUIDToBits(scriptId);
175   - return js.JsCompileResponse.create(
176   - {
  192 + return {
177 193 errorCode: errorCode,
178 194 success: success,
179 195 errorDetails: parseJsErrorDetails(err),
180 196 scriptIdMSB: scriptIdBits[0],
181 197 scriptIdLSB: scriptIdBits[1]
182   - }
183   - );
  198 + };
184 199 }
185 200
186 201 function createInvokeResponse(result, success, errorCode, err) {
187   - return js.JsInvokeResponse.create(
188   - {
  202 + return {
189 203 errorCode: errorCode,
190 204 success: success,
191 205 errorDetails: parseJsErrorDetails(err),
192 206 result: result
193   - }
194   - );
  207 + };
195 208 }
196 209
197 210 function createReleaseResponse(scriptId, success) {
198 211 const scriptIdBits = Utils.UUIDToBits(scriptId);
199   - return js.JsReleaseResponse.create(
200   - {
  212 + return {
201 213 success: success,
202 214 scriptIdMSB: scriptIdBits[0],
203 215 scriptIdLSB: scriptIdBits[1]
204   - }
205   - );
  216 + };
206 217 }
207 218
208 219 function parseJsErrorDetails(err) {
... ... @@ -229,8 +240,4 @@ function getScriptId(request) {
229 240 return Utils.toUUIDString(request.scriptIdMSB, request.scriptIdLSB);
230 241 }
231 242
232   -function getRequestId(request) {
233   - return Utils.toUUIDString(request.requestIdMSB, request.requestIdLSB);
234   -}
235   -
236   -module.exports = JsInvokeMessageProcessor;
\ No newline at end of file
  243 +module.exports = JsInvokeMessageProcessor;
... ...
... ... @@ -18,16 +18,17 @@
18 18 const Long = require('long'),
19 19 uuidParse = require('uuid-parse');
20 20
21   -var logger = require('../config/logger')('Utils');
22   -
23 21 exports.toUUIDString = function(mostSigBits, leastSigBits) {
24 22 var msbBytes = Long.fromValue(mostSigBits, false).toBytes(false);
25 23 var lsbBytes = Long.fromValue(leastSigBits, false).toBytes(false);
26 24 var uuidBytes = msbBytes.concat(lsbBytes);
27   - var buff = new Buffer(uuidBytes, 'utf8');
28 25 return uuidParse.unparse(uuidBytes);
29 26 }
30 27
  28 +exports.UUIDFromBuffer = function(buf) {
  29 + return uuidParse.unparse(buf);
  30 +}
  31 +
31 32 exports.UUIDToBits = function(uuidString) {
32 33 const bytes = uuidParse.parse(uuidString);
33 34 var msb = Long.fromBytes(bytes.slice(0,8), false, false).toString();
... ...
... ... @@ -25,4 +25,5 @@ logger:
25 25 filename: "LOGGER_FILENAME"
26 26
27 27 script:
  28 + use_sandbox: "SCRIPT_USE_SANDBOX"
28 29 script_body_trace_frequency: "SCRIPT_BODY_TRACE_FREQUENCY"
... ...
... ... @@ -26,4 +26,5 @@ logger:
26 26 filename: "tb-js-executor-%DATE%.log"
27 27
28 28 script:
  29 + use_sandbox: "true"
29 30 script_body_trace_frequency: "1000"
... ...
... ... @@ -17,9 +17,24 @@ var config = require('config'),
17 17 path = require('path'),
18 18 DailyRotateFile = require('winston-daily-rotate-file');
19 19
  20 +const { logLevel } = require('kafkajs');
20 21 const { createLogger, format, transports } = require('winston');
21 22 const { combine, timestamp, label, printf, splat } = format;
22 23
  24 +const toWinstonLogLevel = level => {
  25 + switch(level) {
  26 + case logLevel.ERROR:
  27 + case logLevel.NOTHING:
  28 + return 'error'
  29 + case logLevel.WARN:
  30 + return 'warn'
  31 + case logLevel.INFO:
  32 + return 'info'
  33 + case logLevel.DEBUG:
  34 + return 'debug'
  35 + }
  36 +}
  37 +
23 38 var loggerTransports = [];
24 39
25 40 if (process.env.NODE_ENV !== 'production' || process.env.DOCKER_MODE === 'true') {
... ... @@ -56,4 +71,33 @@ function _logger(moduleLabel) {
56 71 });
57 72 }
58 73
59   -module.exports = _logger;
\ No newline at end of file
  74 +const KafkaJsWinstonLogCreator = logLevel => {
  75 + const logger = createLogger({
  76 + level: toWinstonLogLevel(logLevel),
  77 + format:combine(
  78 + splat(),
  79 + label({ label: 'kafkajs' }),
  80 + timestamp({format: 'YYYY-MM-DD HH:mm:ss,SSS'}),
  81 + printf(info => {
  82 + var res = `${info.timestamp} [${info.label}] ${info.level.toUpperCase()}: ${info.message}`;
  83 + if (info.extra) {
  84 + res +=`: ${JSON.stringify(info.extra)}`;
  85 + }
  86 + return res;
  87 + }
  88 + )
  89 + ),
  90 + transports: loggerTransports
  91 + });
  92 +
  93 + return ({ namespace, level, label, log }) => {
  94 + const { message, ...extra } = log;
  95 + logger.log({
  96 + level: toWinstonLogLevel(level),
  97 + message,
  98 + extra,
  99 + });
  100 + }
  101 +}
  102 +
  103 +module.exports = {_logger, KafkaJsWinstonLogCreator};
... ...
... ... @@ -35,60 +35,6 @@
35 35 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
36 36 "dev": true
37 37 },
38   - "@protobufjs/aspromise": {
39   - "version": "1.1.2",
40   - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
41   - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
42   - },
43   - "@protobufjs/base64": {
44   - "version": "1.1.2",
45   - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
46   - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
47   - },
48   - "@protobufjs/codegen": {
49   - "version": "2.0.4",
50   - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
51   - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
52   - },
53   - "@protobufjs/eventemitter": {
54   - "version": "1.1.0",
55   - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
56   - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
57   - },
58   - "@protobufjs/fetch": {
59   - "version": "1.1.0",
60   - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
61   - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
62   - "requires": {
63   - "@protobufjs/aspromise": "^1.1.1",
64   - "@protobufjs/inquire": "^1.1.0"
65   - }
66   - },
67   - "@protobufjs/float": {
68   - "version": "1.0.2",
69   - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
70   - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
71   - },
72   - "@protobufjs/inquire": {
73   - "version": "1.1.0",
74   - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
75   - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
76   - },
77   - "@protobufjs/path": {
78   - "version": "1.1.2",
79   - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
80   - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
81   - },
82   - "@protobufjs/pool": {
83   - "version": "1.1.0",
84   - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
85   - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
86   - },
87   - "@protobufjs/utf8": {
88   - "version": "1.1.0",
89   - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
90   - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
91   - },
92 38 "@types/events": {
93 39 "version": "3.0.0",
94 40 "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
... ... @@ -106,11 +52,6 @@
106 52 "@types/node": "*"
107 53 }
108 54 },
109   - "@types/long": {
110   - "version": "4.0.0",
111   - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz",
112   - "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q=="
113   - },
114 55 "@types/minimatch": {
115 56 "version": "3.0.3",
116 57 "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
... ... @@ -120,7 +61,8 @@
120 61 "@types/node": {
121 62 "version": "10.12.10",
122 63 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.10.tgz",
123   - "integrity": "sha512-8xZEYckCbUVgK8Eg7lf5Iy4COKJ5uXlnIOnePN0WUwSQggy9tolM+tDJf7wMOnT/JT/W9xDYIaYggt3mRV2O5w=="
  64 + "integrity": "sha512-8xZEYckCbUVgK8Eg7lf5Iy4COKJ5uXlnIOnePN0WUwSQggy9tolM+tDJf7wMOnT/JT/W9xDYIaYggt3mRV2O5w==",
  65 + "dev": true
124 66 },
125 67 "abbrev": {
126 68 "version": "1.1.1",
... ... @@ -182,11 +124,6 @@
182 124 }
183 125 }
184 126 },
185   - "ansi-regex": {
186   - "version": "2.1.1",
187   - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
188   - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
189   - },
190 127 "ansi-styles": {
191 128 "version": "3.2.1",
192 129 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
... ... @@ -206,22 +143,6 @@
206 143 "normalize-path": "^2.1.1"
207 144 }
208 145 },
209   - "aproba": {
210   - "version": "1.2.0",
211   - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
212   - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
213   - "optional": true
214   - },
215   - "are-we-there-yet": {
216   - "version": "1.1.5",
217   - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
218   - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
219   - "optional": true,
220   - "requires": {
221   - "delegates": "^1.0.0",
222   - "readable-stream": "^2.0.6"
223   - }
224   - },
225 146 "argparse": {
226 147 "version": "1.0.10",
227 148 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
... ... @@ -331,7 +252,8 @@
331 252 "balanced-match": {
332 253 "version": "1.0.0",
333 254 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
334   - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
  255 + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
  256 + "dev": true
335 257 },
336 258 "base": {
337 259 "version": "0.11.2",
... ... @@ -397,39 +319,12 @@
397 319 "tweetnacl": "^0.14.3"
398 320 }
399 321 },
400   - "binary": {
401   - "version": "0.3.0",
402   - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
403   - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
404   - "requires": {
405   - "buffers": "~0.1.1",
406   - "chainsaw": "~0.1.0"
407   - }
408   - },
409 322 "binary-extensions": {
410 323 "version": "1.12.0",
411 324 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
412 325 "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
413 326 "dev": true
414 327 },
415   - "bindings": {
416   - "version": "1.5.0",
417   - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
418   - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
419   - "optional": true,
420   - "requires": {
421   - "file-uri-to-path": "1.0.0"
422   - }
423   - },
424   - "bl": {
425   - "version": "2.2.0",
426   - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
427   - "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
428   - "requires": {
429   - "readable-stream": "^2.3.5",
430   - "safe-buffer": "^5.1.1"
431   - }
432   - },
433 328 "boxen": {
434 329 "version": "1.3.0",
435 330 "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
... ... @@ -482,6 +377,7 @@
482 377 "version": "1.1.11",
483 378 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
484 379 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
  380 + "dev": true,
485 381 "requires": {
486 382 "balanced-match": "^1.0.0",
487 383 "concat-map": "0.0.1"
... ... @@ -516,53 +412,6 @@
516 412 }
517 413 }
518 414 },
519   - "buffer-alloc": {
520   - "version": "1.2.0",
521   - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
522   - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
523   - "optional": true,
524   - "requires": {
525   - "buffer-alloc-unsafe": "^1.1.0",
526   - "buffer-fill": "^1.0.0"
527   - }
528   - },
529   - "buffer-alloc-unsafe": {
530   - "version": "1.1.0",
531   - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
532   - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
533   - "optional": true
534   - },
535   - "buffer-crc32": {
536   - "version": "0.2.13",
537   - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
538   - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
539   - },
540   - "buffer-fill": {
541   - "version": "1.0.0",
542   - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
543   - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
544   - "optional": true
545   - },
546   - "buffermaker": {
547   - "version": "1.2.1",
548   - "resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.1.tgz",
549   - "integrity": "sha512-IdnyU2jDHU65U63JuVQNTHiWjPRH0CS3aYd/WPaEwyX84rFdukhOduAVb1jwUScmb5X0JWPw8NZOrhoLMiyAHQ==",
550   - "requires": {
551   - "long": "1.1.2"
552   - },
553   - "dependencies": {
554   - "long": {
555   - "version": "1.1.2",
556   - "resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz",
557   - "integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M="
558   - }
559   - }
560   - },
561   - "buffers": {
562   - "version": "0.1.1",
563   - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
564   - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s="
565   - },
566 415 "byline": {
567 416 "version": "5.0.0",
568 417 "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
... ... @@ -610,14 +459,6 @@
610 459 "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
611 460 "dev": true
612 461 },
613   - "chainsaw": {
614   - "version": "0.1.0",
615   - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
616   - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
617   - "requires": {
618   - "traverse": ">=0.3.0 <0.4"
619   - }
620   - },
621 462 "chalk": {
622 463 "version": "2.4.1",
623 464 "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
... ... @@ -650,12 +491,6 @@
650 491 "upath": "^1.0.5"
651 492 }
652 493 },
653   - "chownr": {
654   - "version": "1.1.2",
655   - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz",
656   - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==",
657   - "optional": true
658   - },
659 494 "ci-info": {
660 495 "version": "1.6.0",
661 496 "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
... ... @@ -691,11 +526,6 @@
691 526 "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
692 527 "dev": true
693 528 },
694   - "code-point-at": {
695   - "version": "1.1.0",
696   - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
697   - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
698   - },
699 529 "collection-visit": {
700 530 "version": "1.0.0",
701 531 "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
... ... @@ -774,7 +604,8 @@
774 604 "concat-map": {
775 605 "version": "0.0.1",
776 606 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
777   - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
  607 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
  608 + "dev": true
778 609 },
779 610 "config": {
780 611 "version": "3.2.2",
... ... @@ -798,11 +629,6 @@
798 629 "xdg-basedir": "^3.0.0"
799 630 }
800 631 },
801   - "console-control-strings": {
802   - "version": "1.1.0",
803   - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
804   - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
805   - },
806 632 "copy-descriptor": {
807 633 "version": "0.1.1",
808 634 "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
... ... @@ -858,6 +684,7 @@
858 684 "version": "2.6.9",
859 685 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
860 686 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  687 + "dev": true,
861 688 "requires": {
862 689 "ms": "2.0.0"
863 690 }
... ... @@ -868,19 +695,11 @@
868 695 "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
869 696 "dev": true
870 697 },
871   - "decompress-response": {
872   - "version": "3.3.0",
873   - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
874   - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
875   - "optional": true,
876   - "requires": {
877   - "mimic-response": "^1.0.0"
878   - }
879   - },
880 698 "deep-extend": {
881 699 "version": "0.6.0",
882 700 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
883   - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
  701 + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
  702 + "dev": true
884 703 },
885 704 "deep-is": {
886 705 "version": "0.1.3",
... ... @@ -935,23 +754,6 @@
935 754 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
936 755 "dev": true
937 756 },
938   - "delegates": {
939   - "version": "1.0.0",
940   - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
941   - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
942   - "optional": true
943   - },
944   - "denque": {
945   - "version": "1.4.1",
946   - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
947   - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
948   - },
949   - "detect-libc": {
950   - "version": "1.0.3",
951   - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
952   - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
953   - "optional": true
954   - },
955 757 "diagnostics": {
956 758 "version": "1.1.1",
957 759 "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
... ... @@ -1004,14 +806,6 @@
1004 806 "env-variable": "0.0.x"
1005 807 }
1006 808 },
1007   - "end-of-stream": {
1008   - "version": "1.4.1",
1009   - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
1010   - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
1011   - "requires": {
1012   - "once": "^1.4.0"
1013   - }
1014   - },
1015 809 "env-variable": {
1016 810 "version": "0.0.5",
1017 811 "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz",
... ... @@ -1272,12 +1066,6 @@
1272 1066 "moment": "^2.11.2"
1273 1067 }
1274 1068 },
1275   - "file-uri-to-path": {
1276   - "version": "1.0.0",
1277   - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
1278   - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
1279   - "optional": true
1280   - },
1281 1069 "fill-range": {
1282 1070 "version": "4.0.0",
1283 1071 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
... ... @@ -1343,12 +1131,6 @@
1343 1131 "readable-stream": "^2.0.0"
1344 1132 }
1345 1133 },
1346   - "fs-constants": {
1347   - "version": "1.0.0",
1348   - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
1349   - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
1350   - "optional": true
1351   - },
1352 1134 "fs-extra": {
1353 1135 "version": "6.0.1",
1354 1136 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
... ... @@ -1895,22 +1677,6 @@
1895 1677 }
1896 1678 }
1897 1679 },
1898   - "gauge": {
1899   - "version": "2.7.4",
1900   - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
1901   - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
1902   - "optional": true,
1903   - "requires": {
1904   - "aproba": "^1.0.3",
1905   - "console-control-strings": "^1.0.0",
1906   - "has-unicode": "^2.0.0",
1907   - "object-assign": "^4.1.0",
1908   - "signal-exit": "^3.0.0",
1909   - "string-width": "^1.0.1",
1910   - "strip-ansi": "^3.0.1",
1911   - "wide-align": "^1.1.0"
1912   - }
1913   - },
1914 1680 "get-stream": {
1915 1681 "version": "3.0.0",
1916 1682 "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
... ... @@ -1932,12 +1698,6 @@
1932 1698 "assert-plus": "^1.0.0"
1933 1699 }
1934 1700 },
1935   - "github-from-package": {
1936   - "version": "0.0.0",
1937   - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
1938   - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
1939   - "optional": true
1940   - },
1941 1701 "glob": {
1942 1702 "version": "7.1.4",
1943 1703 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
... ... @@ -2059,12 +1819,6 @@
2059 1819 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2060 1820 "dev": true
2061 1821 },
2062   - "has-unicode": {
2063   - "version": "2.0.1",
2064   - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
2065   - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
2066   - "optional": true
2067   - },
2068 1822 "has-value": {
2069 1823 "version": "1.0.0",
2070 1824 "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
... ... @@ -2150,7 +1904,8 @@
2150 1904 "ini": {
2151 1905 "version": "1.3.5",
2152 1906 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
2153   - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
  1907 + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
  1908 + "dev": true
2154 1909 },
2155 1910 "into-stream": {
2156 1911 "version": "5.1.0",
... ... @@ -2262,14 +2017,6 @@
2262 2017 "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
2263 2018 "dev": true
2264 2019 },
2265   - "is-fullwidth-code-point": {
2266   - "version": "1.0.0",
2267   - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
2268   - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
2269   - "requires": {
2270   - "number-is-nan": "^1.0.0"
2271   - }
2272   - },
2273 2020 "is-glob": {
2274 2021 "version": "4.0.0",
2275 2022 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
... ... @@ -2453,42 +2200,12 @@
2453 2200 "verror": "1.10.0"
2454 2201 }
2455 2202 },
2456   - "kafka-node": {
2457   - "version": "4.1.3",
2458   - "resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-4.1.3.tgz",
2459   - "integrity": "sha512-C2WHksRCr7vIKmbxYaCk2c5Q1lnHIi6C0f3AioK3ARcRHGO9DpqErcoaS9d8PP62yzTnkYras+iAlmPsZHNSfw==",
2460   - "requires": {
2461   - "async": "^2.6.2",
2462   - "binary": "~0.3.0",
2463   - "bl": "^2.2.0",
2464   - "buffer-crc32": "~0.2.5",
2465   - "buffermaker": "~1.2.0",
2466   - "debug": "^2.1.3",
2467   - "denque": "^1.3.0",
2468   - "lodash": "^4.17.4",
2469   - "minimatch": "^3.0.2",
2470   - "nested-error-stacks": "^2.0.0",
2471   - "optional": "^0.1.3",
2472   - "retry": "^0.10.1",
2473   - "snappy": "^6.0.1",
2474   - "uuid": "^3.0.0"
2475   - },
2476   - "dependencies": {
2477   - "async": {
2478   - "version": "2.6.3",
2479   - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
2480   - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
2481   - "requires": {
2482   - "lodash": "^4.17.14"
2483   - },
2484   - "dependencies": {
2485   - "lodash": {
2486   - "version": "4.17.15",
2487   - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
2488   - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
2489   - }
2490   - }
2491   - }
  2203 + "kafkajs": {
  2204 + "version": "1.11.0",
  2205 + "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-1.11.0.tgz",
  2206 + "integrity": "sha512-dLRCcFIBygZucR+e8U2ZqH2wgMrAu114K0szUyUseJoeOii3cG5bHZPIdqKecXxI6begPVCfGS3R0nJY4zHW2A==",
  2207 + "requires": {
  2208 + "long": "^4.0.0"
2492 2209 }
2493 2210 },
2494 2211 "kind-of": {
... ... @@ -2641,16 +2358,11 @@
2641 2358 "mime-db": "1.40.0"
2642 2359 }
2643 2360 },
2644   - "mimic-response": {
2645   - "version": "1.0.1",
2646   - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
2647   - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
2648   - "optional": true
2649   - },
2650 2361 "minimatch": {
2651 2362 "version": "3.0.4",
2652 2363 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2653 2364 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
  2365 + "dev": true,
2654 2366 "requires": {
2655 2367 "brace-expansion": "^1.1.7"
2656 2368 }
... ... @@ -2685,6 +2397,7 @@
2685 2397 "version": "0.5.1",
2686 2398 "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2687 2399 "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
  2400 + "dev": true,
2688 2401 "requires": {
2689 2402 "minimist": "0.0.8"
2690 2403 },
... ... @@ -2692,7 +2405,8 @@
2692 2405 "minimist": {
2693 2406 "version": "0.0.8",
2694 2407 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2695   - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
  2408 + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
  2409 + "dev": true
2696 2410 }
2697 2411 }
2698 2412 },
... ... @@ -2704,7 +2418,8 @@
2704 2418 "ms": {
2705 2419 "version": "2.0.0",
2706 2420 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2707   - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
  2421 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
  2422 + "dev": true
2708 2423 },
2709 2424 "multistream": {
2710 2425 "version": "2.1.1",
... ... @@ -2742,26 +2457,6 @@
2742 2457 "to-regex": "^3.0.1"
2743 2458 }
2744 2459 },
2745   - "napi-build-utils": {
2746   - "version": "1.0.1",
2747   - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz",
2748   - "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==",
2749   - "optional": true
2750   - },
2751   - "nested-error-stacks": {
2752   - "version": "2.1.0",
2753   - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz",
2754   - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug=="
2755   - },
2756   - "node-abi": {
2757   - "version": "2.9.0",
2758   - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.9.0.tgz",
2759   - "integrity": "sha512-jmEOvv0eanWjhX8dX1pmjb7oJl1U1oR4FOh0b2GnvALwSYoOdU7sj+kLDSAyjo4pfC9aj/IxkloxdLJQhSSQBA==",
2760   - "optional": true,
2761   - "requires": {
2762   - "semver": "^5.4.1"
2763   - }
2764   - },
2765 2460 "nodemon": {
2766 2461 "version": "1.18.7",
2767 2462 "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.7.tgz",
... ... @@ -2797,12 +2492,6 @@
2797 2492 }
2798 2493 }
2799 2494 },
2800   - "noop-logger": {
2801   - "version": "0.1.1",
2802   - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
2803   - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
2804   - "optional": true
2805   - },
2806 2495 "nopt": {
2807 2496 "version": "1.0.10",
2808 2497 "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
... ... @@ -2830,35 +2519,12 @@
2830 2519 "path-key": "^2.0.0"
2831 2520 }
2832 2521 },
2833   - "npmlog": {
2834   - "version": "4.1.2",
2835   - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
2836   - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
2837   - "optional": true,
2838   - "requires": {
2839   - "are-we-there-yet": "~1.1.2",
2840   - "console-control-strings": "~1.1.0",
2841   - "gauge": "~2.7.3",
2842   - "set-blocking": "~2.0.0"
2843   - }
2844   - },
2845   - "number-is-nan": {
2846   - "version": "1.0.1",
2847   - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
2848   - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
2849   - },
2850 2522 "oauth-sign": {
2851 2523 "version": "0.9.0",
2852 2524 "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
2853 2525 "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
2854 2526 "dev": true
2855 2527 },
2856   - "object-assign": {
2857   - "version": "4.1.1",
2858   - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2859   - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
2860   - "optional": true
2861   - },
2862 2528 "object-copy": {
2863 2529 "version": "0.1.0",
2864 2530 "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
... ... @@ -2917,6 +2583,7 @@
2917 2583 "version": "1.4.0",
2918 2584 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2919 2585 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
  2586 + "dev": true,
2920 2587 "requires": {
2921 2588 "wrappy": "1"
2922 2589 }
... ... @@ -2926,11 +2593,6 @@
2926 2593 "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
2927 2594 "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
2928 2595 },
2929   - "optional": {
2930   - "version": "0.1.4",
2931   - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz",
2932   - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw=="
2933   - },
2934 2596 "optionator": {
2935 2597 "version": "0.8.2",
2936 2598 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
... ... @@ -2945,12 +2607,6 @@
2945 2607 "wordwrap": "~1.0.0"
2946 2608 }
2947 2609 },
2948   - "os-homedir": {
2949   - "version": "1.0.2",
2950   - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
2951   - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
2952   - "optional": true
2953   - },
2954 2610 "os-tmpdir": {
2955 2611 "version": "1.0.2",
2956 2612 "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
... ... @@ -3127,38 +2783,6 @@
3127 2783 "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
3128 2784 "dev": true
3129 2785 },
3130   - "prebuild-install": {
3131   - "version": "5.3.0",
3132   - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz",
3133   - "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==",
3134   - "optional": true,
3135   - "requires": {
3136   - "detect-libc": "^1.0.3",
3137   - "expand-template": "^2.0.3",
3138   - "github-from-package": "0.0.0",
3139   - "minimist": "^1.2.0",
3140   - "mkdirp": "^0.5.1",
3141   - "napi-build-utils": "^1.0.1",
3142   - "node-abi": "^2.7.0",
3143   - "noop-logger": "^0.1.1",
3144   - "npmlog": "^4.0.1",
3145   - "os-homedir": "^1.0.1",
3146   - "pump": "^2.0.1",
3147   - "rc": "^1.2.7",
3148   - "simple-get": "^2.7.0",
3149   - "tar-fs": "^1.13.0",
3150   - "tunnel-agent": "^0.6.0",
3151   - "which-pm-runs": "^1.0.0"
3152   - },
3153   - "dependencies": {
3154   - "expand-template": {
3155   - "version": "2.0.3",
3156   - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
3157   - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
3158   - "optional": true
3159   - }
3160   - }
3161   - },
3162 2786 "prelude-ls": {
3163 2787 "version": "1.1.2",
3164 2788 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
... ... @@ -3182,26 +2806,6 @@
3182 2806 "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
3183 2807 "dev": true
3184 2808 },
3185   - "protobufjs": {
3186   - "version": "6.8.8",
3187   - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz",
3188   - "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==",
3189   - "requires": {
3190   - "@protobufjs/aspromise": "^1.1.2",
3191   - "@protobufjs/base64": "^1.1.2",
3192   - "@protobufjs/codegen": "^2.0.4",
3193   - "@protobufjs/eventemitter": "^1.1.0",
3194   - "@protobufjs/fetch": "^1.1.0",
3195   - "@protobufjs/float": "^1.0.2",
3196   - "@protobufjs/inquire": "^1.1.0",
3197   - "@protobufjs/path": "^1.1.2",
3198   - "@protobufjs/pool": "^1.1.0",
3199   - "@protobufjs/utf8": "^1.1.0",
3200   - "@types/long": "^4.0.0",
3201   - "@types/node": "^10.1.0",
3202   - "long": "^4.0.0"
3203   - }
3204   - },
3205 2809 "pseudomap": {
3206 2810 "version": "1.0.2",
3207 2811 "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
... ... @@ -3220,16 +2824,6 @@
3220 2824 "integrity": "sha512-vL6NLxNHzkNTjGJUpMm5PLC+94/0tTlC1vkP9bdU0pOHih+EujMjgMTwfZopZvHWRFbqJ5Y73OMoau50PewDDA==",
3221 2825 "dev": true
3222 2826 },
3223   - "pump": {
3224   - "version": "2.0.1",
3225   - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
3226   - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
3227   - "optional": true,
3228   - "requires": {
3229   - "end-of-stream": "^1.1.0",
3230   - "once": "^1.3.1"
3231   - }
3232   - },
3233 2827 "punycode": {
3234 2828 "version": "2.1.1",
3235 2829 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
... ... @@ -3246,6 +2840,7 @@
3246 2840 "version": "1.2.8",
3247 2841 "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
3248 2842 "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
  2843 + "dev": true,
3249 2844 "requires": {
3250 2845 "deep-extend": "^0.6.0",
3251 2846 "ini": "~1.3.0",
... ... @@ -3389,11 +2984,6 @@
3389 2984 "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
3390 2985 "dev": true
3391 2986 },
3392   - "retry": {
3393   - "version": "0.10.1",
3394   - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
3395   - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
3396   - },
3397 2987 "safe-buffer": {
3398 2988 "version": "5.1.2",
3399 2989 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
... ... @@ -3428,12 +3018,6 @@
3428 3018 "semver": "^5.0.3"
3429 3019 }
3430 3020 },
3431   - "set-blocking": {
3432   - "version": "2.0.0",
3433   - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
3434   - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
3435   - "optional": true
3436   - },
3437 3021 "set-value": {
3438 3022 "version": "2.0.0",
3439 3023 "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
... ... @@ -3475,24 +3059,8 @@
3475 3059 "signal-exit": {
3476 3060 "version": "3.0.2",
3477 3061 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
3478   - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
3479   - },
3480   - "simple-concat": {
3481   - "version": "1.0.0",
3482   - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
3483   - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
3484   - "optional": true
3485   - },
3486   - "simple-get": {
3487   - "version": "2.8.1",
3488   - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
3489   - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
3490   - "optional": true,
3491   - "requires": {
3492   - "decompress-response": "^3.3.0",
3493   - "once": "^1.3.1",
3494   - "simple-concat": "^1.0.0"
3495   - }
  3062 + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
  3063 + "dev": true
3496 3064 },
3497 3065 "simple-swizzle": {
3498 3066 "version": "0.2.2",
... ... @@ -3615,25 +3183,6 @@
3615 3183 }
3616 3184 }
3617 3185 },
3618   - "snappy": {
3619   - "version": "6.2.3",
3620   - "resolved": "https://registry.npmjs.org/snappy/-/snappy-6.2.3.tgz",
3621   - "integrity": "sha512-HZpVoIxMfQ4fL3iDuMdI1R5xycw1o9YDCAndTKZCY/EHRoKFvzwplttuBBVGeEg2fd1hYiwAXos/sM24W7N1LA==",
3622   - "optional": true,
3623   - "requires": {
3624   - "bindings": "^1.3.1",
3625   - "nan": "^2.14.0",
3626   - "prebuild-install": "^5.2.2"
3627   - },
3628   - "dependencies": {
3629   - "nan": {
3630   - "version": "2.14.0",
3631   - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
3632   - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
3633   - "optional": true
3634   - }
3635   - }
3636   - },
3637 3186 "source-map": {
3638 3187 "version": "0.5.7",
3639 3188 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
... ... @@ -3725,16 +3274,6 @@
3725 3274 "readable-stream": "^2.1.4"
3726 3275 }
3727 3276 },
3728   - "string-width": {
3729   - "version": "1.0.2",
3730   - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
3731   - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
3732   - "requires": {
3733   - "code-point-at": "^1.0.0",
3734   - "is-fullwidth-code-point": "^1.0.0",
3735   - "strip-ansi": "^3.0.0"
3736   - }
3737   - },
3738 3277 "string_decoder": {
3739 3278 "version": "1.1.1",
3740 3279 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
... ... @@ -3743,14 +3282,6 @@
3743 3282 "safe-buffer": "~5.1.0"
3744 3283 }
3745 3284 },
3746   - "strip-ansi": {
3747   - "version": "3.0.1",
3748   - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3749   - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3750   - "requires": {
3751   - "ansi-regex": "^2.0.0"
3752   - }
3753   - },
3754 3285 "strip-eof": {
3755 3286 "version": "1.0.0",
3756 3287 "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
... ... @@ -3760,7 +3291,8 @@
3760 3291 "strip-json-comments": {
3761 3292 "version": "2.0.1",
3762 3293 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
3763   - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
  3294 + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
  3295 + "dev": true
3764 3296 },
3765 3297 "supports-color": {
3766 3298 "version": "5.5.0",
... ... @@ -3771,57 +3303,6 @@
3771 3303 "has-flag": "^3.0.0"
3772 3304 }
3773 3305 },
3774   - "tar-fs": {
3775   - "version": "1.16.3",
3776   - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz",
3777   - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==",
3778   - "optional": true,
3779   - "requires": {
3780   - "chownr": "^1.0.1",
3781   - "mkdirp": "^0.5.1",
3782   - "pump": "^1.0.0",
3783   - "tar-stream": "^1.1.2"
3784   - },
3785   - "dependencies": {
3786   - "pump": {
3787   - "version": "1.0.3",
3788   - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
3789   - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
3790   - "optional": true,
3791   - "requires": {
3792   - "end-of-stream": "^1.1.0",
3793   - "once": "^1.3.1"
3794   - }
3795   - }
3796   - }
3797   - },
3798   - "tar-stream": {
3799   - "version": "1.6.2",
3800   - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
3801   - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
3802   - "optional": true,
3803   - "requires": {
3804   - "bl": "^1.0.0",
3805   - "buffer-alloc": "^1.2.0",
3806   - "end-of-stream": "^1.0.0",
3807   - "fs-constants": "^1.0.0",
3808   - "readable-stream": "^2.3.0",
3809   - "to-buffer": "^1.1.1",
3810   - "xtend": "^4.0.0"
3811   - },
3812   - "dependencies": {
3813   - "bl": {
3814   - "version": "1.2.2",
3815   - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
3816   - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
3817   - "optional": true,
3818   - "requires": {
3819   - "readable-stream": "^2.3.5",
3820   - "safe-buffer": "^5.1.1"
3821   - }
3822   - }
3823   - }
3824   - },
3825 3306 "term-size": {
3826 3307 "version": "1.2.0",
3827 3308 "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
... ... @@ -3848,12 +3329,6 @@
3848 3329 "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
3849 3330 "dev": true
3850 3331 },
3851   - "to-buffer": {
3852   - "version": "1.1.1",
3853   - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
3854   - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
3855   - "optional": true
3856   - },
3857 3332 "to-object-path": {
3858 3333 "version": "0.3.0",
3859 3334 "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
... ... @@ -3923,11 +3398,6 @@
3923 3398 }
3924 3399 }
3925 3400 },
3926   - "traverse": {
3927   - "version": "0.3.9",
3928   - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
3929   - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
3930   - },
3931 3401 "triple-beam": {
3932 3402 "version": "1.3.0",
3933 3403 "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
... ... @@ -3937,6 +3407,7 @@
3937 3407 "version": "0.6.0",
3938 3408 "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
3939 3409 "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
  3410 + "dev": true,
3940 3411 "requires": {
3941 3412 "safe-buffer": "^5.0.1"
3942 3413 }
... ... @@ -4140,7 +3611,8 @@
4140 3611 "uuid": {
4141 3612 "version": "3.3.2",
4142 3613 "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
4143   - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
  3614 + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
  3615 + "dev": true
4144 3616 },
4145 3617 "uuid-parse": {
4146 3618 "version": "1.0.0",
... ... @@ -4167,21 +3639,6 @@
4167 3639 "isexe": "^2.0.0"
4168 3640 }
4169 3641 },
4170   - "which-pm-runs": {
4171   - "version": "1.0.0",
4172   - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
4173   - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
4174   - "optional": true
4175   - },
4176   - "wide-align": {
4177   - "version": "1.1.3",
4178   - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
4179   - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
4180   - "optional": true,
4181   - "requires": {
4182   - "string-width": "^1.0.2 || 2"
4183   - }
4184   - },
4185 3642 "widest-line": {
4186 3643 "version": "2.0.1",
4187 3644 "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
... ... @@ -4281,7 +3738,8 @@
4281 3738 "wrappy": {
4282 3739 "version": "1.0.2",
4283 3740 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
4284   - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
  3741 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
  3742 + "dev": true
4285 3743 },
4286 3744 "write-file-atomic": {
4287 3745 "version": "2.3.0",
... ... @@ -4300,12 +3758,6 @@
4300 3758 "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
4301 3759 "dev": true
4302 3760 },
4303   - "xtend": {
4304   - "version": "4.0.2",
4305   - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
4306   - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
4307   - "optional": true
4308   - },
4309 3761 "yallist": {
4310 3762 "version": "3.0.3",
4311 3763 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
... ...
... ... @@ -6,18 +6,16 @@
6 6 "main": "server.js",
7 7 "bin": "server.js",
8 8 "scripts": {
9   - "build-proto": "pbjs -t static-module -w commonjs -o ./api/jsinvoke.proto.js ../../application/src/main/proto/jsinvoke.proto",
10   - "install": "npm run build-proto && pkg -t node10-linux-x64,node10-win-x64 --out-path ./target . && node install.js",
  9 + "install": "pkg -t node10-linux-x64,node10-win-x64 --out-path ./target . && node install.js",
11 10 "test": "echo \"Error: no test specified\" && exit 1",
12   - "start": "npm run build-proto && nodemon server.js",
13   - "start-prod": "npm run build-proto && NODE_ENV=production nodemon server.js"
  11 + "start": "nodemon server.js",
  12 + "start-prod": "NODE_ENV=production nodemon server.js"
14 13 },
15 14 "dependencies": {
16 15 "config": "^3.2.2",
17 16 "js-yaml": "^3.12.0",
18   - "kafka-node": "^4.1.3",
  17 + "kafkajs": "^1.11.0",
19 18 "long": "^4.0.0",
20   - "protobufjs": "^6.8.8",
21 19 "uuid-parse": "^1.0.0",
22 20 "winston": "^3.0.0",
23 21 "winston-daily-rotate-file": "^3.2.1"
... ...
... ... @@ -13,14 +13,17 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
  16 +
  17 +const { logLevel, Kafka } = require('kafkajs');
  18 +
16 19 const config = require('config'),
17   - kafka = require('kafka-node'),
18   - ConsumerGroup = kafka.ConsumerGroup,
19   - Producer = kafka.Producer,
20 20 JsInvokeMessageProcessor = require('./api/jsInvokeMessageProcessor'),
21   - logger = require('./config/logger')('main');
  21 + logger = require('./config/logger')._logger('main'),
  22 + KafkaJsWinstonLogCreator = require('./config/logger').KafkaJsWinstonLogCreator;
22 23
23 24 var kafkaClient;
  25 +var consumer;
  26 +var producer;
24 27
25 28 (async() => {
26 29 try {
... ... @@ -32,49 +35,24 @@ var kafkaClient;
32 35 logger.info('Kafka Bootstrap Servers: %s', kafkaBootstrapServers);
33 36 logger.info('Kafka Requests Topic: %s', kafkaRequestTopic);
34 37
35   - kafkaClient = new kafka.KafkaClient({kafkaHost: kafkaBootstrapServers});
36   -
37   - var consumer = new ConsumerGroup(
38   - {
39   - kafkaHost: kafkaBootstrapServers,
40   - groupId: 'js-executor-group',
41   - autoCommit: true,
42   - encoding: 'buffer'
43   - },
44   - kafkaRequestTopic
45   - );
46   -
47   - consumer.on('error', (err) => {
48   - logger.error('Unexpected kafka consumer error: %s', err.message);
49   - logger.error(err.stack);
50   - });
51   -
52   - consumer.on('offsetOutOfRange', (err) => {
53   - logger.error('Offset out of range error: %s', err.message);
54   - logger.error(err.stack);
55   - });
56   -
57   - consumer.on('rebalancing', () => {
58   - logger.info('Rebalancing event received.');
59   - })
60   -
61   - consumer.on('rebalanced', () => {
62   - logger.info('Rebalanced event received.');
63   - });
64   -
65   - var producer = new Producer(kafkaClient);
66   - producer.on('error', (err) => {
67   - logger.error('Unexpected kafka producer error: %s', err.message);
68   - logger.error(err.stack);
  38 + kafkaClient = new Kafka({
  39 + brokers: kafkaBootstrapServers.split(','),
  40 + logLevel: logLevel.INFO,
  41 + logCreator: KafkaJsWinstonLogCreator
69 42 });
70 43
71   - var messageProcessor = new JsInvokeMessageProcessor(producer);
  44 + consumer = kafkaClient.consumer({ groupId: 'js-executor-group' });
  45 + producer = kafkaClient.producer();
  46 + const messageProcessor = new JsInvokeMessageProcessor(producer);
  47 + await consumer.connect();
  48 + await producer.connect();
  49 + await consumer.subscribe({ topic: kafkaRequestTopic});
72 50
73   - producer.on('ready', () => {
74   - consumer.on('message', (message) => {
  51 + logger.info('Started ThingsBoard JavaScript Executor Microservice.');
  52 + await consumer.run({
  53 + eachMessage: async ({ topic, partition, message }) => {
75 54 messageProcessor.onJsInvokeMessage(message);
76   - });
77   - logger.info('Started ThingsBoard JavaScript Executor Microservice.');
  55 + },
78 56 });
79 57
80 58 } catch (e) {
... ... @@ -84,21 +62,41 @@ var kafkaClient;
84 62 }
85 63 })();
86 64
87   -process.on('exit', function () {
  65 +process.on('exit', () => {
88 66 exit(0);
89 67 });
90 68
91   -function exit(status) {
  69 +async function exit(status) {
92 70 logger.info('Exiting with status: %d ...', status);
93   - if (kafkaClient) {
94   - logger.info('Stopping Kafka Client...');
95   - var _kafkaClient = kafkaClient;
96   - kafkaClient = null;
97   - _kafkaClient.close(() => {
98   - logger.info('Kafka Client stopped.');
  71 + if (consumer) {
  72 + logger.info('Stopping Kafka Consumer...');
  73 + var _consumer = consumer;
  74 + consumer = null;
  75 + try {
  76 + await _consumer.disconnect();
  77 + logger.info('Kafka Consumer stopped.');
  78 + await disconnectProducer();
99 79 process.exit(status);
100   - });
  80 + } catch (e) {
  81 + logger.info('Kafka Consumer stop error.');
  82 + await disconnectProducer();
  83 + process.exit(status);
  84 + }
101 85 } else {
102 86 process.exit(status);
103 87 }
104 88 }
  89 +
  90 +async function disconnectProducer() {
  91 + if (producer) {
  92 + logger.info('Stopping Kafka Producer...');
  93 + var _producer = producer;
  94 + producer = null;
  95 + try {
  96 + await _producer.disconnect();
  97 + logger.info('Kafka Producer stopped.');
  98 + } catch (e) {
  99 + logger.info('Kafka Producer stop error.');
  100 + }
  101 + }
  102 +}
... ...