├── .eslintrc.json
├── .gitignore
├── README.md
├── api
└── v1.api.history.js
├── build_indexes.sh
├── cache
├── cache.daemon.js
└── init.cache.js
├── config.example.js
├── html
└── index.html
├── index.js
├── package-lock.json
├── package.json
├── sql
└── indexes.sql
├── start.sh
└── stop.sh
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "node": true
4 | },
5 | "extends": "airbnb-base",
6 | "parserOptions": {
7 | "ecmaFeatures": {
8 | "experimentalObjectRestSpread": true,
9 | "modules": true
10 | },
11 | "sourceType": "module"
12 | },
13 | "rules": {
14 | "prefer-destructuring": ["error", {"object": true, "array": false}],
15 | "no-param-reassign": 0,
16 | "indent": [
17 | "error",
18 | 2,
19 | { "SwitchCase" : 1 }
20 | ],
21 | "import/prefer-default-export": 1,
22 | "no-unused-vars": 1,
23 | "linebreak-style": [
24 | "error",
25 | "unix"
26 | ],
27 | "quotes": [
28 | "error",
29 | "double"
30 | ],
31 | "semi": [
32 | "error",
33 | "never"
34 | ],
35 | "max-len": [
36 | "error",
37 | {
38 | "ignoreStrings": true,
39 | "ignoreTemplateLiterals": true,
40 | "ignoreTrailingComments": true,
41 | "ignoreComments": true,
42 | "code": 1000
43 | }
44 | ],
45 | "no-underscore-dangle": 0,
46 | "object-curly-newline": 0,
47 | "no-restricted-syntax": 0,
48 | "no-continue": 0,
49 | "no-await-in-loop": 0,
50 | "class-methods-use-this": 0,
51 | "no-console": [
52 | "error",
53 | { "allow": ["info", "warn", "error"] }
54 | ]
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | config.js
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Background
2 | The State History plugin is a new Nodeos plugin developed by Todd Fleming at Block.one which gives us another option to query history on the EOSIO mainnet blockchain. Together with his fill-Postgres utility, we can populate a Postgresql database with historical data such as action traces, transaction traces, block states, and other interesting things such as contract table changes at every block.
3 |
4 | ### How it works:
5 | * The plugin writes the history events to new a new directory in the `/data` directory of Nodeos.
6 | * A separate utility `fill-Postgres` connects via websocket to the state history plugin running on Nodeos and reads from the new state history files to then insert the data into a Postgres database.
7 | * We can then query the Postgres database for things like action traces, account information and block / transaction information.
8 |
9 | ### Advantages:
10 | * The Postgres filler utility is decoupled from Nodeos, so if you need to rebuild your database you don't need to replay Nodeos.
11 | * Multiple Postgres fillers can connect to the same Nodeos instance and fill 2 or more separate databases at the same time as they read from independent locations in the state history files.
12 | * This opens the door in the future for additional database fillers to be created which read from the state history files.
13 | * The state history plugin only inserts data that makes it into a block, and action traces are only inserted once. No data is duplicated.
14 | * The state history plugin will automatically handle and resolve forks in realtime so the plugin will work even with Nodeos running in speculative read mode.
15 |
16 | # Overview
17 | The goal of this project is to create a new public API interface to allow existing dApp developers to seamlessly query the new Postgresql database format created by the state history plugin and have it return everything in the same format as the existing (now deprecated and unmaintainable) history plugin.
18 |
19 | As ongoing development efforts continue on a new API standard with the Elastic Search plugin, this API will be maintained to that new standard as it is developed.
20 |
21 | This will give block producers more flexibility in choosing the history backend they are most comfortable with, and further advances efforts to develop a full replacement for the existing history plugin.
22 |
23 | # Installation
24 | * State history plugin can be found on the EOSIO github `v1.5.0-rc1` tag: https://github.com/EOSIO/eos/
25 | * `fill-postgres` can be found here: https://github.com/EOSIO/fill-postgresql
26 |
27 | ## Nodeos Config
28 | Add this to your Nodeos config.ini
29 | ```
30 | ##########################################
31 | # State History Plugin
32 | ##########################################
33 | plugin = eosio::state_history_plugin
34 | state-history-endpoint = 0.0.0.0:8080
35 | trace-history = true
36 | chain-state-history = true
37 | ##########################################
38 | ```
39 | And start Nodeos with the flag `--disable-replay-opts`
40 |
41 | ## Tips:
42 | * `fill-postgresql` works best on Ubuntu 18.10
43 | * Use the `build_indexes.sh` script to create the required Postgres indexes (will take several hours depending on database hardware used)
44 |
45 | # Requirements
46 | Storage requirements on Nodeos as of block ~28.6M:
47 | ```
48 | 4.0K data/snapshots
49 | 250M data/blocks/reversible
50 | 106G data/blocks
51 | 198G data/state-history
52 | 3.1G data/state
53 | 307G data/
54 | ```
55 |
56 | Storage requirements in Postgresql to sync everything as of block ~29.5M:
57 | ```
58 | List of databases
59 | Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
60 | --------------+--------------+----------+-------------+-------------+-------------------------------+-----------+------------+--------------------------------------------
61 | eos42freedom | eos42freedom | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 3788 GB | pg_default |
62 | ```
63 |
64 | ```
65 | List of relations
66 | Schema | Name | Type | Owner | Size | Description
67 | --------+----------------------------+-------+--------------+----------+-------------
68 | chain | account | table | eos42freedom | 518 MB |
69 | chain | action_trace | table | eos42freedom | 790 GB |
70 | chain | action_trace_auth_sequence | table | eos42freedom | 296 GB |
71 | chain | action_trace_authorization | table | eos42freedom | 297 GB |
72 | chain | action_trace_ram_delta | table | eos42freedom | 31 GB |
73 | chain | block_info | table | eos42freedom | 10 GB |
74 | chain | contract_index128 | table | eos42freedom | 1843 MB |
75 | chain | contract_index256 | table | eos42freedom | 158 MB |
76 | chain | contract_index64 | table | eos42freedom | 12 GB |
77 | chain | contract_index_double | table | eos42freedom | 719 MB |
78 | chain | contract_index_long_double | table | eos42freedom | 4776 kB |
79 | chain | contract_row | table | eos42freedom | 176 GB |
80 | chain | contract_table | table | eos42freedom | 9210 MB |
81 | chain | fill_status | table | eos42freedom | 72 kB |
82 | chain | generated_transaction | table | eos42freedom | 39 GB |
83 | chain | global_property | table | eos42freedom | 1256 kB |
84 | chain | permission | table | eos42freedom | 257 MB |
85 | chain | permission_link | table | eos42freedom | 176 kB |
86 | chain | received_block | table | eos42freedom | 3078 MB |
87 | chain | resource_limits | table | eos42freedom | 172 MB |
88 | chain | resource_limits_config | table | eos42freedom | 5772 MB |
89 | chain | resource_limits_state | table | eos42freedom | 4551 MB |
90 | chain | resource_usage | table | eos42freedom | 30 GB |
91 | chain | transaction_trace | table | eos42freedom | 87 GB |
92 | (24 rows)
93 | ```
94 |
95 | ## Change Log
96 |
97 | v1.0.0:
98 | - Initial release porting queries to Postgresql
99 |
--------------------------------------------------------------------------------
/api/v1.api.history.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const MAX_ELEMENTS = 1000;
4 | const async = require('async');
5 | const request = require('request');
6 | const config = require('../config');
7 |
8 | module.exports = (app, DB, swaggerSpec) => {
9 |
10 | app.get('/api-docs.json', (req, res) => {
11 | res.setHeader('Content-Type', 'application/json');
12 | res.send(swaggerSpec);
13 | });
14 |
15 | /**
16 | * @swagger
17 | *
18 | * /v1/history/get_accounts?counter=on:
19 | * get:
20 | * description: get_accounts
21 | * produces:
22 | * - application/json
23 | * parameters:
24 | * - in: query
25 | * name: counter
26 | * description: Counter of all EOS Accounts (default off).
27 | * required: false
28 | * type: string
29 | * - in: query
30 | * name: skip
31 | * description: Skip elements (default 0).
32 | * required: false
33 | * type: number
34 | * - in: query
35 | * name: limit
36 | * description: Limit elements (default 10).
37 | * required: false
38 | * type: number
39 | */
40 | app.get('/v1/history/get_accounts', getAccounts);
41 |
42 | /**
43 | * @swagger
44 | *
45 | * /v1/history/get_voters/cryptolions1:
46 | * get:
47 | * description: get_voters
48 | * produces:
49 | * - application/json
50 | * parameters:
51 | * - in: query
52 | * name: skip
53 | * description: Skip elements (default 0).
54 | * required: false
55 | * type: number
56 | * - in: query
57 | * name: limit
58 | * description: Limit elements (default 100).
59 | * required: false
60 | * type: number
61 | */
62 | app.get('/v1/history/get_voters/:account', getVoters);
63 |
64 | /**
65 | * @swagger
66 | *
67 | * /v1/history/get_actions:
68 | * post:
69 | * description: get_actions
70 | * requestBody:
71 | * content:
72 | * application/json:
73 | * schema:
74 | * type: object
75 | * properties:
76 | * pos:
77 | * type: number
78 | * default: -1
79 | * offset:
80 | * type: number
81 | * default: 10
82 | * account_name:
83 | * type: string
84 | * default: cryptolions1
85 | * action_name:
86 | * type: string
87 | * default: all
88 | * counter:
89 | * type: number
90 | * default: 0
91 | */
92 | app.post('/v1/history/get_actions', getActionsPOST);
93 |
94 | /**
95 | * @swagger
96 | *
97 | * /v1/history/get_actions/cryptolions1:
98 | * get:
99 | * description: Get Account actions
100 | * produces:
101 | * - application/json
102 | * parameters:
103 | * - in: query
104 | * name: skip
105 | * description: Skip elements default (0).
106 | * required: false
107 | * type: number
108 | * - in: query
109 | * name: limit
110 | * description: Limit elements default (10).
111 | * required: false
112 | * type: number
113 | * - in: query
114 | * name: sort
115 | * description: Sort elements default (-1).
116 | * required: false
117 | * type: number
118 | * - in: query
119 | * name: counter
120 | * description: Enable counter if you need actionsTotal (?counter=1).
121 | * required: false
122 | * type: number
123 | */
124 | app.get('/v1/history/get_actions/:account', getActions);
125 |
126 | app.get('/v1/history/get_actions_unique/:account', getActionsDistinct);
127 |
128 | /**
129 | * @swagger
130 | *
131 | * /v1/history/get_actions/cryptolions1/sethash:
132 | * get:
133 | * description: Get Account actions by action name
134 | * produces:
135 | * - application/json
136 | * parameters:
137 | * - in: query
138 | * name: skip
139 | * description: Skip elements default (0).
140 | * required: false
141 | * type: number
142 | * - in: query
143 | * name: limit
144 | * description: Limit elements default (10).
145 | * required: false
146 | * type: number
147 | * - in: query
148 | * name: sort
149 | * description: Sort elements default (-1).
150 | * required: false
151 | * type: number
152 | */
153 | app.get('/v1/history/get_actions/:account/:action', getActions);
154 |
155 | /**
156 | * @swagger
157 | *
158 | * /v1/history/get_transaction:
159 | * post:
160 | * description: get_transaction
161 | * requestBody:
162 | * content:
163 | * application/json:
164 | * schema:
165 | * type: object
166 | * properties:
167 | * id:
168 | * type: string
169 | */
170 | app.post('/v1/history/get_transaction', getTransactionPOST);
171 |
172 | /**
173 | * @swagger
174 | *
175 | * /v1/history/get_transaction/${id}:
176 | * get:
177 | * description: Get Transaction by id
178 | * produces:
179 | * - application/json
180 | */
181 | app.get('/v1/history/get_transaction/:id', getTransaction);
182 |
183 | /**
184 | * @swagger
185 | *
186 | * /v1/history/get_controlled_accounts:
187 | * post:
188 | * description: get_controlled_accounts
189 | * requestBody:
190 | * content:
191 | * application/json:
192 | * schema:
193 | * type: object
194 | * properties:
195 | * controlling_account:
196 | * type: string
197 | */
198 | app.post('/v1/history/get_controlled_accounts', getControlledAccountsPOST);
199 |
200 | /**
201 | * @swagger
202 | *
203 | * /v1/history/get_controlled_accounts/${controlling_account}:
204 | * get:
205 | * description: Get controlled accounts
206 | * produces:
207 | * - application/json
208 | */
209 | app.get('/v1/history/get_controlled_accounts/:controlling_account', getControlledAccounts);
210 |
211 | /**
212 | * @swagger
213 | *
214 | * /v1/history/get_key_accounts:
215 | * post:
216 | * description: get_key_accounts
217 | * requestBody:
218 | * content:
219 | * application/json:
220 | * schema:
221 | * type: object
222 | * properties:
223 | * public_key:
224 | * type: string
225 | */
226 | app.post('/v1/history/get_key_accounts', getKeyAccountsPOST);
227 |
228 | /**
229 | * @swagger
230 | *
231 | * /v1/history/get_key_accounts/${public_key}:
232 | * get:
233 | * description: Get key accounts
234 | * produces:
235 | * - application/json
236 | */
237 | app.get('/v1/history/get_key_accounts/:public_key', getKeyAccounts);
238 |
239 | /**
240 | * @swagger
241 | *
242 | * /v1/chain/${chain_rpc_method_name}:
243 | * post:
244 | * description: Proxy for chain RPC endpoints
245 | * produces:
246 | * - application/json
247 | */
248 | app.post('/v1/chain/*', (req, res) => {
249 | request.post({ url: `${config.chainUrl}${req.originalUrl}`, json: req.body }).pipe(res);
250 | });
251 |
252 | app.get('/v1/chain/get_info', (req, res) => {
253 | request.get(`${config.chainUrl}${req.originalUrl}`).pipe(res);
254 | });
255 |
256 | // ========= Custom functions
257 | function getActions(req, res){
258 | // default values
259 | let skip = 0;
260 | let limit = 10;
261 | let sort = -1;
262 | let accountName = String(req.params.account);
263 | let action = String(req.params.action);
264 | let counter = Number(req.query.counter);
265 |
266 | let query = { $or: [
267 | {"act.account": accountName},
268 | {"act.data.receiver": accountName},
269 | {"act.data.from": accountName},
270 | {"act.data.to": accountName},
271 | {"act.data.name": accountName},
272 | {"act.data.voter": accountName},
273 | {"act.authorization.actor": accountName}
274 | ]};
275 | if (action !== "undefined" && action !== "all"){
276 | query["act.name"] = action;
277 | }
278 |
279 | skip = (isNaN(Number(req.query.skip))) ? skip : Number(req.query.skip);
280 | limit = (isNaN(Number(req.query.limit))) ? limit : Number(req.query.limit);
281 | sort = (isNaN(Number(req.query.sort))) ? sort : Number(req.query.sort);
282 |
283 | if (limit > MAX_ELEMENTS){
284 | return res.status(401).send(`Max elements ${MAX_ELEMENTS}!`);
285 | }
286 | if (skip < 0 || limit < 0){
287 | return res.status(401).send(`Skip (${skip}) || (${limit}) limit < 0`);
288 | }
289 | if (sort !== -1 && sort !== 1){
290 | return res.status(401).send(`Sort param must be 1 or -1`);
291 | }
292 |
293 | let parallelObject = {
294 | actions: (callback) => {
295 | DB.collection("action_traces").find(query).sort({"_id": sort}).skip(skip).limit(limit).toArray(callback);
296 | }
297 | };
298 |
299 | if (counter === 1){
300 | parallelObject["actionsTotal"] = (callback) => {
301 | /*DB.collection("action_traces").aggregate([
302 | { $match: query },
303 | { $group: { _id: null, sum: { $sum: 1 } } }
304 | ]).toArray((err, result) => {
305 | if (err){
306 | return callback(err);
307 | }
308 | if (!result || !result[0] || !result[0].sum){
309 | return callback('counter error')
310 | }
311 | callback(null, result[0].sum);
312 | });*/
313 | callback(null, 'Under construction');
314 | }
315 | }
316 |
317 | async.parallel(parallelObject, (err, result) => {
318 | if (err){
319 | console.error(err);
320 | return res.status(500).end();
321 | }
322 | res.json(result)
323 | });
324 | }
325 |
326 | function getActionsPOST(req, res){
327 | // default values
328 | let skip = 0;
329 | let limit = 10;
330 | let sort = -1;
331 | let accountName = String(req.body.account_name);
332 | let action = String(req.body.action_name);
333 | let counter = Number(req.body.counter);
334 |
335 | let query = { $or: [
336 | {"act.account": accountName},
337 | {"act.data.receiver": accountName},
338 | {"act.data.from": accountName},
339 | {"act.data.to": accountName},
340 | {"act.data.name": accountName},
341 | {"act.data.voter": accountName},
342 | {"act.authorization.actor": accountName}
343 | ]};
344 | if (action !== "undefined"){
345 | query["act.name"] = action;
346 | }
347 |
348 | let pos = Number(req.body.pos);
349 | let offset = Number(req.body.offset);
350 | if (!isNaN(pos) && !isNaN(offset)){
351 | sort = (pos < 0) ? -1: 1;
352 | limit = Math.abs(offset + 1);
353 | //skip = (pos < 0) ? Math.abs(offset * ( pos * -1 - 1 )) : Math.abs(offset * ( pos - 1 ));
354 | skip = (pos < 0) ? Math.abs(pos + 1) : Math.abs(pos - 1);
355 | }
356 |
357 | if (limit > MAX_ELEMENTS){
358 | return res.status(401).send(`Max elements ${MAX_ELEMENTS}!`);
359 | }
360 | if (skip < 0 || limit < 0){
361 | return res.status(401).send(`Skip (${skip}) || (${limit}) limit < 0`);
362 | }
363 | if (sort !== -1 && sort !== 1){
364 | return res.status(401).send(`Sort param must be 1 or -1`);
365 | }
366 |
367 | let parallelObject = {
368 | actions: (callback) => {
369 | DB.collection("action_traces").find(query).sort({"_id": sort}).skip(skip).limit(limit).toArray(callback);
370 | }
371 | };
372 |
373 | if (counter === 1){
374 | parallelObject["actionsTotal"] = (callback) => {
375 | /*DB.collection("action_traces").aggregate([
376 | { $match: query },
377 | { $group: { _id: null, sum: { $sum: 1 } } }
378 | ]).toArray((err, result) => {
379 | if (err){
380 | return callback(err);
381 | }
382 | if (!result || !result[0] || !result[0].sum){
383 | return callback('counter error')
384 | }
385 | callback(null, result[0].sum);
386 | });*/
387 | callback(null, 'Under construction');
388 | }
389 | }
390 |
391 | async.parallel(parallelObject, (err, result) => {
392 | if (err){
393 | console.error(err);
394 | return res.status(500).end();
395 | }
396 | res.json(result)
397 | });
398 | }
399 |
400 | function getActionsDistinct(req, res){
401 | // default values
402 | let accountName = String(req.params.account);
403 | let query = { $or: [
404 | {"act.account": accountName},
405 | {"act.data.receiver": accountName},
406 | {"act.data.from": accountName},
407 | {"act.data.to": accountName},
408 | {"act.data.name": accountName},
409 | {"act.data.voter": accountName},
410 | {"act.authorization.actor": accountName}
411 | ]};
412 |
413 | DB.collection("action_traces").distinct("act.name", query, (err, result) => {
414 | if (err){
415 | console.error(err);
416 | return res.status(500).end();
417 | };
418 | res.json(result);
419 | });
420 | }
421 |
422 | function getTransactionPOST(req, res){
423 | let key = String(req.body.id);
424 | if (key === "undefined"){
425 | return res.status(401).send("Wrong transactions ID!");
426 | }
427 | let query = { id: key };
428 | DB.collection("transaction_traces").findOne(query, (err, result) => {
429 | if (err){
430 | console.error(err);
431 | return res.status(500).end();
432 | };
433 | res.json(result);
434 | });
435 | }
436 |
437 | function getTransaction(req, res){
438 | let key = String(req.params.id);
439 | if (key === "undefined"){
440 | return res.status(401).send("Wrong transactions ID!");
441 | }
442 | let query = { id: key };
443 | DB.collection("transaction_traces").findOne(query, (err, result) => {
444 | if (err){
445 | console.error(err);
446 | return res.status(500).end();
447 | };
448 | res.json(result);
449 | });
450 | }
451 |
452 | function getControlledAccountsPOST(req, res){
453 | let key = String(req.body.controlling_account);
454 | if (key === "undefined"){
455 | return res.status(401).send("Wrong transactions ID!");
456 | }
457 | let query = { controlling_account: key };
458 | DB.collection("account_controls").find(query).toArray((err, result) => {
459 | if (err){
460 | console.error(err);
461 | return res.status(500).end();
462 | };
463 | res.json(result);
464 | });
465 | }
466 |
467 | function getControlledAccounts(req, res){
468 | let key = String(req.params.controlling_account);
469 | if (key === "undefined"){
470 | return res.status(401).send("Wrong transactions ID!");
471 | }
472 | let query = { controlling_account: key };
473 | DB.collection("account_controls").find(query).toArray((err, result) => {
474 | if (err){
475 | console.error(err);
476 | return res.status(500).end();
477 | };
478 | res.json(result);
479 | });
480 | }
481 |
482 | function getKeyAccountsPOST(req, res){
483 | let key = String(req.body.public_key);
484 | if (key === "undefined"){
485 | return res.status(401).send("Wrong transactions ID!");
486 | }
487 | let query = { public_key: key };
488 | DB.collection("pub_keys").find(query).toArray((err, result) => {
489 | if (err){
490 | console.error(err);
491 | return res.status(500).end();
492 | };
493 | res.json(result);
494 | });
495 | }
496 |
497 | function getKeyAccounts(req, res){
498 | let key = String(req.params.public_key);
499 | if (key === "undefined"){
500 | return res.status(401).send("Wrong transactions ID!");
501 | }
502 | let query = { public_key: key };
503 | DB.collection("pub_keys").find(query).toArray((err, result) => {
504 | if (err){
505 | console.error(err);
506 | return res.status(500).end();
507 | };
508 | res.json(result);
509 | });
510 | }
511 |
512 | function getAccounts(req, res){
513 | let skip = 0;
514 | let limit = 10;
515 | let counterAccounts = false;
516 | let accountName = String(req.query.account);
517 |
518 | let query = {};
519 | if (accountName !== "undefined"){
520 | query.name = accountName;
521 | }
522 |
523 | skip = (isNaN(Number(req.query.skip))) ? skip : Number(req.query.skip);
524 | limit = (isNaN(Number(req.query.limit))) ? limit : Number(req.query.limit);
525 | counterAccounts = (req.query.counter === "on") ? true : false;
526 |
527 | if (limit > MAX_ELEMENTS){
528 | return res.status(401).send(`Max limit accounts per query = ${MAX_ELEMENTS}`);
529 | }
530 | if (skip < 0 || limit < 0){
531 | return res.status(401).send(`Skip (${skip}) || (${limit}) limit < 0`);
532 | }
533 |
534 | DB.collection("accounts").find(query).skip(skip).limit(limit).toArray((err, result) => {
535 | if (err){
536 | console.error(err);
537 | return res.status(500).end();
538 | };
539 | if (counterAccounts){
540 | DB.collection("accounts").count((err, accs) => {
541 | if (err){
542 | console.error(err);
543 | return res.status(500).end();
544 | };
545 | res.json({ allEosAccounts: accs, accounts: result });
546 | });
547 | } else {
548 | res.json({ accounts: result });
549 | }
550 | });
551 | }
552 |
553 | function getVoters(req, res){
554 | // default values
555 | let skip = 0;
556 | let limit = 100;
557 | let sort = -1;
558 | let accountName = String(req.params.account);
559 |
560 | let query = { "act.name": "voteproducer", "act.data.producers": { $in: [accountName] } };
561 |
562 | skip = (isNaN(Number(req.query.skip))) ? skip : Number(req.query.skip);
563 | limit = (isNaN(Number(req.query.limit))) ? limit : Number(req.query.limit);
564 | sort = (isNaN(Number(req.query.sort))) ? sort : Number(req.query.sort);
565 |
566 | if (limit > MAX_ELEMENTS){
567 | return res.status(401).send(`Max elements ${MAX_ELEMENTS}!`);
568 | }
569 | if (skip < 0 || limit < 0){
570 | return res.status(401).send(`Skip (${skip}) || (${limit}) limit < 0`);
571 | }
572 | if (sort !== -1 && sort !== 1){
573 | return res.status(401).send(`Sort param must be 1 or -1`);
574 | }
575 |
576 | async.parallel({
577 | votesCounter: (callback) => {
578 | DB.collection("action_traces").find(query).count(callback);
579 | },
580 | voters: (callback) => {
581 | DB.collection("action_traces").find(query).sort({"_id": sort}).skip(skip).limit(limit).toArray(callback);
582 | }
583 | }, (err, result) => {
584 | if (err){
585 | console.error(err);
586 | return res.status(500).end();
587 | }
588 | res.json(result)
589 | });
590 | }
591 |
592 | //========= end Custom Functions
593 | }
594 |
595 |
596 |
597 |
--------------------------------------------------------------------------------
/build_indexes.sh:
--------------------------------------------------------------------------------
1 | sudo -u postgres psql -f sql/indexes.sql
2 |
--------------------------------------------------------------------------------
/cache/cache.daemon.js:
--------------------------------------------------------------------------------
1 | /*
2 | Cache accounts with actions > 500k
3 | */
4 | const MongoClient = require('mongodb').MongoClient;
5 | const CONFIG = require('../config.js');
6 | const async = require('async');
7 |
8 | const MONGO_OPTIONS = {
9 | socketTimeoutMS: 10000,
10 | keepAlive: true,
11 | reconnectTries: 30000,
12 | useNewUrlParser: true
13 | };
14 | const MAX_ACTIONS = 500000;
15 | const MAX_ELEMS = 50000;
16 |
17 | process.on('uncaughtException', (err) => {
18 | console.error(`======= UncaughtException Cache : ${err}`);
19 | });
20 |
21 | MongoClient.connect( CONFIG.mongoURL, MONGO_OPTIONS, (err, db) => {
22 | if (err){
23 | return console.error("Database error !!!", err);
24 | }
25 | console.log("=== Database Connected!");
26 | let DBO = db.db(CONFIG.mongoDB);
27 |
28 | // Start cache daemon =====
29 | getAccounts();
30 |
31 | // clear slow operations
32 | clearSlowOperations();
33 |
34 | function clearSlowOperations(){
35 | DBO.admin().command({ currentOp: 1, microsecs_running: { $gte: 15000 }, "command.aggregate": { $exists: true } }, (err, result) => {
36 | if (err){
37 | console.error(err);
38 | return setTimeout(clearSlowOperations, 10000);
39 | }
40 | console.log(result);
41 | if(result && result.inprog && result.inprog.length){
42 | result.inprog.forEach((elem) => {
43 | console.log('Kill operation: ', elem.opid, elem.command.aggregate);
44 | DBO.admin().command({ killOp: 1, op: elem.opid });
45 | });
46 | }
47 | setTimeout(clearSlowOperations, 10000);
48 | });
49 | }
50 |
51 | // Cache logic =====
52 | let cursor = 0;
53 | let counter = 0;
54 |
55 | function getAccounts(){
56 | async.waterfall([
57 | (callback) => {
58 | DBO.collection("accounts").count(callback);
59 | },
60 | (accounts, callback) => {
61 | console.log('All Accounts -', accounts);
62 | let skip = (cursor === 0) ? 0 : cursor;
63 | let elements = Array.from({length: MAX_ELEMS }, (v, k) => k);
64 |
65 | cursor += MAX_ELEMS;
66 |
67 | console.log('skip =', skip, 'limit =', MAX_ELEMS);
68 | DBO.collection("accounts").find({}).skip(skip).limit(MAX_ELEMS).toArray((err, accountsArr) => {
69 | if (err){
70 | return callback(err);
71 | };
72 | if (!accountsArr || !accountsArr.length){
73 | return callback(null, 'FINISH');
74 | }
75 | accountActionCount(accountsArr, callback);
76 | });
77 | }
78 | ], (err, result) => {
79 | if (err){
80 | console.error('getAccounts callback error', err);
81 | getAccounts();
82 | return;
83 | //process.exit(1);
84 | }
85 | if (result === 'FINISH'){
86 | console.log(`Scanned ${counter} accounts :)`);
87 | process.exit();
88 | }
89 | getAccounts();
90 | });
91 | }
92 |
93 |
94 | function accountActionCount(accountsArr, callback){
95 | async.eachLimit(accountsArr, CONFIG.limitAsync, (elem, cb) => {
96 | let query = { $or: [
97 | {"act.account": elem.name },
98 | {"act.data.receiver": elem.name },
99 | {"act.data.from": elem.name },
100 | {"act.data.to": elem.name },
101 | {"act.data.name": elem.name },
102 | {"act.data.voter": elem.name },
103 | {"act.authorization.actor": elem.name }
104 | ]};
105 | console.log(counter+=1, ' Account -', elem.name);
106 | DBO.collection("action_traces").aggregate([
107 | { $match: query },
108 | { $group: { _id: null, sum: { $sum: 1 } } }
109 | ]).toArray((err, result) => {
110 | if (err){
111 | if(err.name === 'MongoNetworkError'){
112 | console.log('MongoNetworkError ---- ', elem.name);
113 | let query = { name: elem.name };
114 | DBO.collection("smart_cache").update(query, query, { upsert: true });
115 | }
116 | return cb();
117 | }
118 | if (!result || !result[0] || !result[0].sum){
119 | console.log('counter error')
120 | return cb();
121 | }
122 | console.log('Account -', elem.name, ' Actions -', result[0].sum);
123 | if (result[0].sum > MAX_ACTIONS){
124 | DBO.collection("smart_cache").update({ name: elem.name }, { name: elem.name, actions: result[0].sum }, { upsert: true });
125 | }
126 | cb();
127 | });
128 | }, (error) => {
129 | if (error){
130 | return callback(error)
131 | }
132 | callback(null);
133 | });
134 | }
135 | });
136 |
137 |
138 |
139 |
140 |
141 |
--------------------------------------------------------------------------------
/cache/init.cache.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acoutts/EOS-state-history-API/7f2222ba4a02ce5c4823d7404beb1663fdad8fcc/cache/init.cache.js
--------------------------------------------------------------------------------
/config.example.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | serverPort: 3333,
3 | mongoURL: "mongodb://localhost:27017/EOS",
4 | mongoDB: "EOS"
5 | }
6 |
--------------------------------------------------------------------------------
/html/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | EOS Mongo History by Cryptolions
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /* ###############################################################################
2 | #
3 | # EOS Postgres State History API
4 | # API to get actions using EOS state history plugin + Postgresql (similar to history plugin)
5 | #
6 | # Examples:
7 | # https://history.cryptolions.io/v1/history/get_actions/cryptolions1
8 | # https://history.cryptolions.io/v1/history/get_actions/cryptolions1/sethash
9 | # https://history.cryptolions.io/v1/history/get_actions/cryptolions1/sethash?limit=2&skip=1&sort=-1
10 | #
11 | # Created by Andrew Coutts
12 | # Based on CryptoLions Mongo History API: https://github.com/CryptoLions/EOS-mongo-history-API
13 | #
14 | ############################################################################### */
15 | require('appmetrics-dash').monitor();
16 | const MongoClient = require('mongodb').MongoClient;
17 | const swaggerJSDoc = require('swagger-jsdoc');
18 | const bodyparser = require('body-parser');
19 | const CONFIG = require('./config.js');
20 | const express = require('express');
21 | const app = express();
22 |
23 | const MONGO_OPTIONS = {
24 | socketTimeoutMS: 60000,
25 | keepAlive: true,
26 | reconnectTries: 30000,
27 | useNewUrlParser: true
28 | };
29 |
30 | const swaggerSpec = swaggerJSDoc({
31 | definition: {
32 | info: {
33 | title: 'EOS history API by Cryptolions',
34 | version: '1.0.0',
35 | },
36 | },
37 | apis: ['./api/v1.api.history.js'],
38 | });
39 |
40 | // parse requests from eosjs (v16.0.0 - 16.0.9)
41 | app.use((req, res, next) => {
42 | if (req.method !== 'POST' || req.headers['content-type'] === 'application/json'){
43 | return next();
44 | }
45 | let body = '';
46 | req.on('data', chunk => {
47 | body += chunk.toString();
48 | });
49 | req.on('end', () => {
50 | try{
51 | req.body = JSON.parse(body);
52 | } catch(e){
53 | console.error('JSON POST request parse error - ', e);
54 | }
55 | next();
56 | });
57 | });
58 | app.use(bodyparser.json());
59 |
60 | app.use((req, res, next) => {
61 | res.header("Access-Control-Allow-Origin", "*");
62 | res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
63 | next();
64 | });
65 | app.use('/', express.static(__dirname + '/html'));
66 |
67 |
68 | process.on('uncaughtException', (err) => {
69 | console.error(`======= UncaughtException API Server : ${err}`);
70 | });
71 |
72 | MongoClient.connect( CONFIG.mongoURL, MONGO_OPTIONS, (err, db) => {
73 | if (err){
74 | return console.error("Database error !!!", err);
75 | }
76 | console.log("=== Database Connected!");
77 | let dbo = db.db(CONFIG.mongoDB);
78 | require('./api/v1.api.history')(app, dbo, swaggerSpec);
79 | });
80 |
81 | const http = require('http').Server(app);
82 | http.listen(CONFIG.serverPort, () => {
83 | console.log('=== Listening on port:', CONFIG.serverPort);
84 | });
85 | http.on('error', (err) => {
86 | console.error('=== Http server error', err);
87 | });
88 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "EOS-history-mongo-api",
3 | "version": "0.0.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "abbrev": {
8 | "version": "1.1.1",
9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
11 | },
12 | "accepts": {
13 | "version": "1.3.5",
14 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
15 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
16 | "requires": {
17 | "mime-types": "~2.1.18",
18 | "negotiator": "0.6.1"
19 | }
20 | },
21 | "after": {
22 | "version": "0.8.2",
23 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
24 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
25 | },
26 | "agent-base": {
27 | "version": "4.2.1",
28 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
29 | "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
30 | "requires": {
31 | "es6-promisify": "^5.0.0"
32 | }
33 | },
34 | "ajv": {
35 | "version": "5.5.2",
36 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
37 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
38 | "requires": {
39 | "co": "^4.6.0",
40 | "fast-deep-equal": "^1.0.0",
41 | "fast-json-stable-stringify": "^2.0.0",
42 | "json-schema-traverse": "^0.3.0"
43 | }
44 | },
45 | "ansi-regex": {
46 | "version": "2.1.1",
47 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
48 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
49 | },
50 | "appmetrics": {
51 | "version": "4.0.0",
52 | "resolved": "https://registry.npmjs.org/appmetrics/-/appmetrics-4.0.0.tgz",
53 | "integrity": "sha512-pN38LVaLrhqDUy6aNkPMuXzPITx3zJo2HAlIT7Xo4lBID34+Yq/V4tgegUTEqNAl//OA9cc2K+RV91dc8TrUcg==",
54 | "requires": {
55 | "ibmapm-embed": "^1.0.0",
56 | "jszip": "2.5.x",
57 | "nan": "2.x",
58 | "semver": "^5.3.0",
59 | "tar": "2.x"
60 | },
61 | "dependencies": {
62 | "tar": {
63 | "version": "2.2.1",
64 | "bundled": true,
65 | "requires": {
66 | "block-stream": "*",
67 | "fstream": "^1.0.2",
68 | "inherits": "2"
69 | },
70 | "dependencies": {
71 | "block-stream": {
72 | "version": "0.0.9",
73 | "bundled": true,
74 | "requires": {
75 | "inherits": "~2.0.0"
76 | }
77 | },
78 | "fstream": {
79 | "version": "1.0.11",
80 | "bundled": true,
81 | "requires": {
82 | "graceful-fs": "^4.1.2",
83 | "inherits": "~2.0.0",
84 | "mkdirp": ">=0.5 0",
85 | "rimraf": "2"
86 | },
87 | "dependencies": {
88 | "graceful-fs": {
89 | "version": "4.1.11",
90 | "bundled": true
91 | },
92 | "mkdirp": {
93 | "version": "0.5.1",
94 | "bundled": true,
95 | "requires": {
96 | "minimist": "0.0.8"
97 | },
98 | "dependencies": {
99 | "minimist": {
100 | "version": "0.0.8",
101 | "bundled": true
102 | }
103 | }
104 | },
105 | "rimraf": {
106 | "version": "2.6.2",
107 | "bundled": true,
108 | "requires": {
109 | "glob": "^7.0.5"
110 | },
111 | "dependencies": {
112 | "glob": {
113 | "version": "7.1.2",
114 | "bundled": true,
115 | "requires": {
116 | "fs.realpath": "^1.0.0",
117 | "inflight": "^1.0.4",
118 | "inherits": "2",
119 | "minimatch": "^3.0.4",
120 | "once": "^1.3.0",
121 | "path-is-absolute": "^1.0.0"
122 | },
123 | "dependencies": {
124 | "fs.realpath": {
125 | "version": "1.0.0",
126 | "bundled": true
127 | },
128 | "inflight": {
129 | "version": "1.0.6",
130 | "bundled": true,
131 | "requires": {
132 | "once": "^1.3.0",
133 | "wrappy": "1"
134 | },
135 | "dependencies": {
136 | "wrappy": {
137 | "version": "1.0.2",
138 | "bundled": true
139 | }
140 | }
141 | },
142 | "minimatch": {
143 | "version": "3.0.4",
144 | "bundled": true,
145 | "requires": {
146 | "brace-expansion": "^1.1.7"
147 | },
148 | "dependencies": {
149 | "brace-expansion": {
150 | "version": "1.1.11",
151 | "bundled": true,
152 | "requires": {
153 | "balanced-match": "^1.0.0",
154 | "concat-map": "0.0.1"
155 | },
156 | "dependencies": {
157 | "balanced-match": {
158 | "version": "1.0.0",
159 | "bundled": true
160 | },
161 | "concat-map": {
162 | "version": "0.0.1",
163 | "bundled": true
164 | }
165 | }
166 | }
167 | }
168 | },
169 | "once": {
170 | "version": "1.4.0",
171 | "bundled": true,
172 | "requires": {
173 | "wrappy": "1"
174 | },
175 | "dependencies": {
176 | "wrappy": {
177 | "version": "1.0.2",
178 | "bundled": true
179 | }
180 | }
181 | },
182 | "path-is-absolute": {
183 | "version": "1.0.1",
184 | "bundled": true
185 | }
186 | }
187 | }
188 | }
189 | }
190 | }
191 | },
192 | "inherits": {
193 | "version": "2.0.3",
194 | "bundled": true
195 | }
196 | }
197 | }
198 | }
199 | },
200 | "appmetrics-dash": {
201 | "version": "4.0.0",
202 | "resolved": "https://registry.npmjs.org/appmetrics-dash/-/appmetrics-dash-4.0.0.tgz",
203 | "integrity": "sha512-u7St2I1444C8SB6zgF+TH1blTX6Rs7tTf1Z9PSzKj1kJ1J/XKp3axgz0OACKrjpFk7YAv0gsvg5tGmZaQ3TS7A==",
204 | "requires": {
205 | "appmetrics": "^4.0.0",
206 | "debug": "^2.6.0",
207 | "express": "^4.14.1",
208 | "node-report": "^2.1.0",
209 | "socket.io": "^2.0.3"
210 | }
211 | },
212 | "aproba": {
213 | "version": "1.2.0",
214 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
215 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
216 | },
217 | "are-we-there-yet": {
218 | "version": "1.1.5",
219 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
220 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
221 | "requires": {
222 | "delegates": "^1.0.0",
223 | "readable-stream": "^2.0.6"
224 | },
225 | "dependencies": {
226 | "isarray": {
227 | "version": "1.0.0",
228 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
229 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
230 | },
231 | "readable-stream": {
232 | "version": "2.3.6",
233 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
234 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
235 | "requires": {
236 | "core-util-is": "~1.0.0",
237 | "inherits": "~2.0.3",
238 | "isarray": "~1.0.0",
239 | "process-nextick-args": "~2.0.0",
240 | "safe-buffer": "~5.1.1",
241 | "string_decoder": "~1.1.1",
242 | "util-deprecate": "~1.0.1"
243 | }
244 | },
245 | "string_decoder": {
246 | "version": "1.1.1",
247 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
248 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
249 | "requires": {
250 | "safe-buffer": "~5.1.0"
251 | }
252 | }
253 | }
254 | },
255 | "argparse": {
256 | "version": "1.0.10",
257 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
258 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
259 | "requires": {
260 | "sprintf-js": "~1.0.2"
261 | }
262 | },
263 | "array-flatten": {
264 | "version": "1.1.1",
265 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
266 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
267 | },
268 | "arraybuffer.slice": {
269 | "version": "0.0.7",
270 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
271 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
272 | },
273 | "asn1": {
274 | "version": "0.2.4",
275 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
276 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
277 | "requires": {
278 | "safer-buffer": "~2.1.0"
279 | }
280 | },
281 | "assert-plus": {
282 | "version": "1.0.0",
283 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
284 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
285 | },
286 | "async": {
287 | "version": "2.6.1",
288 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
289 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
290 | "requires": {
291 | "lodash": "^4.17.10"
292 | }
293 | },
294 | "async-limiter": {
295 | "version": "1.0.0",
296 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
297 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
298 | },
299 | "asynckit": {
300 | "version": "0.4.0",
301 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
302 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
303 | },
304 | "aws-sign2": {
305 | "version": "0.7.0",
306 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
307 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
308 | },
309 | "aws4": {
310 | "version": "1.8.0",
311 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
312 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
313 | },
314 | "backo2": {
315 | "version": "1.0.2",
316 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
317 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
318 | },
319 | "balanced-match": {
320 | "version": "1.0.0",
321 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
322 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
323 | },
324 | "base64-arraybuffer": {
325 | "version": "0.1.5",
326 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
327 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
328 | },
329 | "base64id": {
330 | "version": "1.0.0",
331 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
332 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
333 | },
334 | "bcrypt-pbkdf": {
335 | "version": "1.0.2",
336 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
337 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
338 | "requires": {
339 | "tweetnacl": "^0.14.3"
340 | }
341 | },
342 | "better-assert": {
343 | "version": "1.0.2",
344 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
345 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
346 | "requires": {
347 | "callsite": "1.0.0"
348 | }
349 | },
350 | "blob": {
351 | "version": "0.0.4",
352 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
353 | "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE="
354 | },
355 | "block-stream": {
356 | "version": "0.0.9",
357 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
358 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
359 | "requires": {
360 | "inherits": "~2.0.0"
361 | }
362 | },
363 | "body-parser": {
364 | "version": "1.18.3",
365 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
366 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
367 | "requires": {
368 | "bytes": "3.0.0",
369 | "content-type": "~1.0.4",
370 | "debug": "2.6.9",
371 | "depd": "~1.1.2",
372 | "http-errors": "~1.6.3",
373 | "iconv-lite": "0.4.23",
374 | "on-finished": "~2.3.0",
375 | "qs": "6.5.2",
376 | "raw-body": "2.3.3",
377 | "type-is": "~1.6.16"
378 | },
379 | "dependencies": {
380 | "qs": {
381 | "version": "6.5.2",
382 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
383 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
384 | }
385 | }
386 | },
387 | "brace-expansion": {
388 | "version": "1.1.11",
389 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
390 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
391 | "requires": {
392 | "balanced-match": "^1.0.0",
393 | "concat-map": "0.0.1"
394 | }
395 | },
396 | "bson": {
397 | "version": "1.1.0",
398 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz",
399 | "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA=="
400 | },
401 | "bytes": {
402 | "version": "3.0.0",
403 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
404 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
405 | },
406 | "call-me-maybe": {
407 | "version": "1.0.1",
408 | "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
409 | "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
410 | },
411 | "callsite": {
412 | "version": "1.0.0",
413 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
414 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
415 | },
416 | "caseless": {
417 | "version": "0.12.0",
418 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
419 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
420 | },
421 | "co": {
422 | "version": "4.6.0",
423 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
424 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
425 | },
426 | "code-point-at": {
427 | "version": "1.1.0",
428 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
429 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
430 | },
431 | "combined-stream": {
432 | "version": "1.0.7",
433 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
434 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
435 | "requires": {
436 | "delayed-stream": "~1.0.0"
437 | }
438 | },
439 | "commander": {
440 | "version": "2.17.1",
441 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
442 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
443 | },
444 | "component-bind": {
445 | "version": "1.0.0",
446 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
447 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
448 | },
449 | "component-emitter": {
450 | "version": "1.2.1",
451 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
452 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
453 | },
454 | "component-inherit": {
455 | "version": "0.0.3",
456 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
457 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
458 | },
459 | "concat-map": {
460 | "version": "0.0.1",
461 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
462 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
463 | },
464 | "console-control-strings": {
465 | "version": "1.1.0",
466 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
467 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
468 | },
469 | "content-disposition": {
470 | "version": "0.5.2",
471 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
472 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
473 | },
474 | "content-type": {
475 | "version": "1.0.4",
476 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
477 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
478 | },
479 | "cookie": {
480 | "version": "0.3.1",
481 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
482 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
483 | },
484 | "cookie-signature": {
485 | "version": "1.0.6",
486 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
487 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
488 | },
489 | "core-js": {
490 | "version": "2.5.7",
491 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
492 | "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
493 | },
494 | "core-util-is": {
495 | "version": "1.0.2",
496 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
497 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
498 | },
499 | "dashdash": {
500 | "version": "1.14.1",
501 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
502 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
503 | "requires": {
504 | "assert-plus": "^1.0.0"
505 | }
506 | },
507 | "debug": {
508 | "version": "2.6.9",
509 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
510 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
511 | "requires": {
512 | "ms": "2.0.0"
513 | }
514 | },
515 | "define-properties": {
516 | "version": "1.1.3",
517 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
518 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
519 | "requires": {
520 | "object-keys": "^1.0.12"
521 | }
522 | },
523 | "delayed-stream": {
524 | "version": "1.0.0",
525 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
526 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
527 | },
528 | "delegates": {
529 | "version": "1.0.0",
530 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
531 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
532 | },
533 | "depd": {
534 | "version": "1.1.2",
535 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
536 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
537 | },
538 | "destroy": {
539 | "version": "1.0.4",
540 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
541 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
542 | },
543 | "doctrine": {
544 | "version": "2.1.0",
545 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
546 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
547 | "requires": {
548 | "esutils": "^2.0.2"
549 | }
550 | },
551 | "ecc-jsbn": {
552 | "version": "0.1.2",
553 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
554 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
555 | "requires": {
556 | "jsbn": "~0.1.0",
557 | "safer-buffer": "^2.1.0"
558 | }
559 | },
560 | "ee-first": {
561 | "version": "1.1.1",
562 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
563 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
564 | },
565 | "encodeurl": {
566 | "version": "1.0.2",
567 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
568 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
569 | },
570 | "engine.io": {
571 | "version": "3.2.0",
572 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz",
573 | "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==",
574 | "requires": {
575 | "accepts": "~1.3.4",
576 | "base64id": "1.0.0",
577 | "cookie": "0.3.1",
578 | "debug": "~3.1.0",
579 | "engine.io-parser": "~2.1.0",
580 | "ws": "~3.3.1"
581 | },
582 | "dependencies": {
583 | "debug": {
584 | "version": "3.1.0",
585 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
586 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
587 | "requires": {
588 | "ms": "2.0.0"
589 | }
590 | }
591 | }
592 | },
593 | "engine.io-client": {
594 | "version": "3.2.1",
595 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
596 | "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
597 | "requires": {
598 | "component-emitter": "1.2.1",
599 | "component-inherit": "0.0.3",
600 | "debug": "~3.1.0",
601 | "engine.io-parser": "~2.1.1",
602 | "has-cors": "1.1.0",
603 | "indexof": "0.0.1",
604 | "parseqs": "0.0.5",
605 | "parseuri": "0.0.5",
606 | "ws": "~3.3.1",
607 | "xmlhttprequest-ssl": "~1.5.4",
608 | "yeast": "0.1.2"
609 | },
610 | "dependencies": {
611 | "debug": {
612 | "version": "3.1.0",
613 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
614 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
615 | "requires": {
616 | "ms": "2.0.0"
617 | }
618 | }
619 | }
620 | },
621 | "engine.io-parser": {
622 | "version": "2.1.2",
623 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
624 | "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
625 | "requires": {
626 | "after": "0.8.2",
627 | "arraybuffer.slice": "~0.0.7",
628 | "base64-arraybuffer": "0.1.5",
629 | "blob": "0.0.4",
630 | "has-binary2": "~1.0.2"
631 | }
632 | },
633 | "eosio-mongodb-queries": {
634 | "version": "0.9.0",
635 | "resolved": "https://registry.npmjs.org/eosio-mongodb-queries/-/eosio-mongodb-queries-0.9.0.tgz",
636 | "integrity": "sha512-BANaRnlhYY5W922tpFZ878J5+xijmHEA6kty464KmWvGChrLGzWC29ReOmV2jT5DO3sxOKaTKgFXORc/YPf30w=="
637 | },
638 | "es-abstract": {
639 | "version": "1.12.0",
640 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
641 | "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
642 | "requires": {
643 | "es-to-primitive": "^1.1.1",
644 | "function-bind": "^1.1.1",
645 | "has": "^1.0.1",
646 | "is-callable": "^1.1.3",
647 | "is-regex": "^1.0.4"
648 | }
649 | },
650 | "es-to-primitive": {
651 | "version": "1.2.0",
652 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
653 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
654 | "requires": {
655 | "is-callable": "^1.1.4",
656 | "is-date-object": "^1.0.1",
657 | "is-symbol": "^1.0.2"
658 | }
659 | },
660 | "es6-promise": {
661 | "version": "4.2.5",
662 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
663 | "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg=="
664 | },
665 | "es6-promisify": {
666 | "version": "5.0.0",
667 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
668 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
669 | "requires": {
670 | "es6-promise": "^4.0.3"
671 | }
672 | },
673 | "escape-html": {
674 | "version": "1.0.3",
675 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
676 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
677 | },
678 | "esprima": {
679 | "version": "4.0.1",
680 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
681 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
682 | },
683 | "esutils": {
684 | "version": "2.0.2",
685 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
686 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
687 | },
688 | "etag": {
689 | "version": "1.8.1",
690 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
691 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
692 | },
693 | "express": {
694 | "version": "4.16.3",
695 | "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz",
696 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
697 | "requires": {
698 | "accepts": "~1.3.5",
699 | "array-flatten": "1.1.1",
700 | "body-parser": "1.18.2",
701 | "content-disposition": "0.5.2",
702 | "content-type": "~1.0.4",
703 | "cookie": "0.3.1",
704 | "cookie-signature": "1.0.6",
705 | "debug": "2.6.9",
706 | "depd": "~1.1.2",
707 | "encodeurl": "~1.0.2",
708 | "escape-html": "~1.0.3",
709 | "etag": "~1.8.1",
710 | "finalhandler": "1.1.1",
711 | "fresh": "0.5.2",
712 | "merge-descriptors": "1.0.1",
713 | "methods": "~1.1.2",
714 | "on-finished": "~2.3.0",
715 | "parseurl": "~1.3.2",
716 | "path-to-regexp": "0.1.7",
717 | "proxy-addr": "~2.0.3",
718 | "qs": "6.5.1",
719 | "range-parser": "~1.2.0",
720 | "safe-buffer": "5.1.1",
721 | "send": "0.16.2",
722 | "serve-static": "1.13.2",
723 | "setprototypeof": "1.1.0",
724 | "statuses": "~1.4.0",
725 | "type-is": "~1.6.16",
726 | "utils-merge": "1.0.1",
727 | "vary": "~1.1.2"
728 | },
729 | "dependencies": {
730 | "body-parser": {
731 | "version": "1.18.2",
732 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
733 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
734 | "requires": {
735 | "bytes": "3.0.0",
736 | "content-type": "~1.0.4",
737 | "debug": "2.6.9",
738 | "depd": "~1.1.1",
739 | "http-errors": "~1.6.2",
740 | "iconv-lite": "0.4.19",
741 | "on-finished": "~2.3.0",
742 | "qs": "6.5.1",
743 | "raw-body": "2.3.2",
744 | "type-is": "~1.6.15"
745 | }
746 | },
747 | "iconv-lite": {
748 | "version": "0.4.19",
749 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
750 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
751 | },
752 | "raw-body": {
753 | "version": "2.3.2",
754 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
755 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
756 | "requires": {
757 | "bytes": "3.0.0",
758 | "http-errors": "1.6.2",
759 | "iconv-lite": "0.4.19",
760 | "unpipe": "1.0.0"
761 | },
762 | "dependencies": {
763 | "depd": {
764 | "version": "1.1.1",
765 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
766 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
767 | },
768 | "http-errors": {
769 | "version": "1.6.2",
770 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
771 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
772 | "requires": {
773 | "depd": "1.1.1",
774 | "inherits": "2.0.3",
775 | "setprototypeof": "1.0.3",
776 | "statuses": ">= 1.3.1 < 2"
777 | }
778 | },
779 | "setprototypeof": {
780 | "version": "1.0.3",
781 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
782 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
783 | }
784 | }
785 | }
786 | }
787 | },
788 | "extend": {
789 | "version": "3.0.2",
790 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
791 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
792 | },
793 | "extsprintf": {
794 | "version": "1.3.0",
795 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
796 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
797 | },
798 | "fast-deep-equal": {
799 | "version": "1.1.0",
800 | "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
801 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
802 | },
803 | "fast-json-stable-stringify": {
804 | "version": "2.0.0",
805 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
806 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
807 | },
808 | "finalhandler": {
809 | "version": "1.1.1",
810 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
811 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
812 | "requires": {
813 | "debug": "2.6.9",
814 | "encodeurl": "~1.0.2",
815 | "escape-html": "~1.0.3",
816 | "on-finished": "~2.3.0",
817 | "parseurl": "~1.3.2",
818 | "statuses": "~1.4.0",
819 | "unpipe": "~1.0.0"
820 | }
821 | },
822 | "forever-agent": {
823 | "version": "0.6.1",
824 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
825 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
826 | },
827 | "form-data": {
828 | "version": "2.3.3",
829 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
830 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
831 | "requires": {
832 | "asynckit": "^0.4.0",
833 | "combined-stream": "^1.0.6",
834 | "mime-types": "^2.1.12"
835 | }
836 | },
837 | "format-util": {
838 | "version": "1.0.3",
839 | "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.3.tgz",
840 | "integrity": "sha1-Ay3KShFiYqEsQ/TD7IVmQWxbLZU="
841 | },
842 | "forwarded": {
843 | "version": "0.1.2",
844 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
845 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
846 | },
847 | "fresh": {
848 | "version": "0.5.2",
849 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
850 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
851 | },
852 | "fs.realpath": {
853 | "version": "1.0.0",
854 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
855 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
856 | },
857 | "fstream": {
858 | "version": "1.0.11",
859 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
860 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
861 | "requires": {
862 | "graceful-fs": "^4.1.2",
863 | "inherits": "~2.0.0",
864 | "mkdirp": ">=0.5 0",
865 | "rimraf": "2"
866 | }
867 | },
868 | "function-bind": {
869 | "version": "1.1.1",
870 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
871 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
872 | },
873 | "gauge": {
874 | "version": "2.7.4",
875 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
876 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
877 | "requires": {
878 | "aproba": "^1.0.3",
879 | "console-control-strings": "^1.0.0",
880 | "has-unicode": "^2.0.0",
881 | "object-assign": "^4.1.0",
882 | "signal-exit": "^3.0.0",
883 | "string-width": "^1.0.1",
884 | "strip-ansi": "^3.0.1",
885 | "wide-align": "^1.1.0"
886 | }
887 | },
888 | "getpass": {
889 | "version": "0.1.7",
890 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
891 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
892 | "requires": {
893 | "assert-plus": "^1.0.0"
894 | }
895 | },
896 | "glob": {
897 | "version": "7.1.3",
898 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
899 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
900 | "requires": {
901 | "fs.realpath": "^1.0.0",
902 | "inflight": "^1.0.4",
903 | "inherits": "2",
904 | "minimatch": "^3.0.4",
905 | "once": "^1.3.0",
906 | "path-is-absolute": "^1.0.0"
907 | }
908 | },
909 | "graceful-fs": {
910 | "version": "4.1.11",
911 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
912 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
913 | },
914 | "har-schema": {
915 | "version": "2.0.0",
916 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
917 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
918 | },
919 | "har-validator": {
920 | "version": "5.1.0",
921 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
922 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
923 | "requires": {
924 | "ajv": "^5.3.0",
925 | "har-schema": "^2.0.0"
926 | }
927 | },
928 | "has": {
929 | "version": "1.0.3",
930 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
931 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
932 | "requires": {
933 | "function-bind": "^1.1.1"
934 | }
935 | },
936 | "has-binary2": {
937 | "version": "1.0.3",
938 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
939 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
940 | "requires": {
941 | "isarray": "2.0.1"
942 | },
943 | "dependencies": {
944 | "isarray": {
945 | "version": "2.0.1",
946 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
947 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
948 | }
949 | }
950 | },
951 | "has-cors": {
952 | "version": "1.1.0",
953 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
954 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
955 | },
956 | "has-symbols": {
957 | "version": "1.0.0",
958 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
959 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
960 | },
961 | "has-unicode": {
962 | "version": "2.0.1",
963 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
964 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
965 | },
966 | "http": {
967 | "version": "0.0.0",
968 | "resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz",
969 | "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I="
970 | },
971 | "http-errors": {
972 | "version": "1.6.3",
973 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
974 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
975 | "requires": {
976 | "depd": "~1.1.2",
977 | "inherits": "2.0.3",
978 | "setprototypeof": "1.1.0",
979 | "statuses": ">= 1.4.0 < 2"
980 | }
981 | },
982 | "http-signature": {
983 | "version": "1.2.0",
984 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
985 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
986 | "requires": {
987 | "assert-plus": "^1.0.0",
988 | "jsprim": "^1.2.2",
989 | "sshpk": "^1.7.0"
990 | }
991 | },
992 | "https-proxy-agent": {
993 | "version": "2.2.1",
994 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
995 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
996 | "requires": {
997 | "agent-base": "^4.1.0",
998 | "debug": "^3.1.0"
999 | },
1000 | "dependencies": {
1001 | "debug": {
1002 | "version": "3.2.5",
1003 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
1004 | "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
1005 | "requires": {
1006 | "ms": "^2.1.1"
1007 | }
1008 | },
1009 | "ms": {
1010 | "version": "2.1.1",
1011 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1012 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1013 | }
1014 | }
1015 | },
1016 | "ibmapm-embed": {
1017 | "version": "1.0.19",
1018 | "resolved": "https://registry.npmjs.org/ibmapm-embed/-/ibmapm-embed-1.0.19.tgz",
1019 | "integrity": "sha512-4oVhOJiCpG5CC3u0u/4O92Ud7ScS+sDfPyddFQINoePlpGUxLSjOGpLrnNqdXpXqIuO991L/7LRn5e6RA9JjeA==",
1020 | "requires": {
1021 | "ibmapm-restclient": "^1.0.0",
1022 | "log4js": "^0.6.38",
1023 | "properties": "^1.2.1",
1024 | "uuid": "^2.0.2"
1025 | }
1026 | },
1027 | "ibmapm-restclient": {
1028 | "version": "1.0.12",
1029 | "resolved": "https://registry.npmjs.org/ibmapm-restclient/-/ibmapm-restclient-1.0.12.tgz",
1030 | "integrity": "sha512-uu3sgKlZxK3lwWU+kmAXz5g5dGCbzjw11jkfxU9vWDsmE2TqMqkTven22B39I1OGwz6IG+8ANSP8GIUdaEVAag==",
1031 | "requires": {
1032 | "https-proxy-agent": "^2.2.1",
1033 | "kubernetes-client": "^3.16.0",
1034 | "log4js": "^0.6.38",
1035 | "properties": "^1.2.1",
1036 | "request": "^2.72.0",
1037 | "uuid": "^2.0.2"
1038 | }
1039 | },
1040 | "iconv-lite": {
1041 | "version": "0.4.23",
1042 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
1043 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
1044 | "requires": {
1045 | "safer-buffer": ">= 2.1.2 < 3"
1046 | }
1047 | },
1048 | "indexof": {
1049 | "version": "0.0.1",
1050 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
1051 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
1052 | },
1053 | "inflight": {
1054 | "version": "1.0.6",
1055 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1056 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1057 | "requires": {
1058 | "once": "^1.3.0",
1059 | "wrappy": "1"
1060 | }
1061 | },
1062 | "inherits": {
1063 | "version": "2.0.3",
1064 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1065 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1066 | },
1067 | "ipaddr.js": {
1068 | "version": "1.8.0",
1069 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
1070 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
1071 | },
1072 | "is-callable": {
1073 | "version": "1.1.4",
1074 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
1075 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA=="
1076 | },
1077 | "is-date-object": {
1078 | "version": "1.0.1",
1079 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
1080 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
1081 | },
1082 | "is-fullwidth-code-point": {
1083 | "version": "1.0.0",
1084 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1085 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1086 | "requires": {
1087 | "number-is-nan": "^1.0.0"
1088 | }
1089 | },
1090 | "is-regex": {
1091 | "version": "1.0.4",
1092 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
1093 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
1094 | "requires": {
1095 | "has": "^1.0.1"
1096 | }
1097 | },
1098 | "is-symbol": {
1099 | "version": "1.0.2",
1100 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
1101 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
1102 | "requires": {
1103 | "has-symbols": "^1.0.0"
1104 | }
1105 | },
1106 | "is-typedarray": {
1107 | "version": "1.0.0",
1108 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1109 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
1110 | },
1111 | "isarray": {
1112 | "version": "0.0.1",
1113 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1114 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
1115 | },
1116 | "isexe": {
1117 | "version": "2.0.0",
1118 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1119 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
1120 | },
1121 | "isstream": {
1122 | "version": "0.1.2",
1123 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1124 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
1125 | },
1126 | "js-yaml": {
1127 | "version": "3.12.0",
1128 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
1129 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
1130 | "requires": {
1131 | "argparse": "^1.0.7",
1132 | "esprima": "^4.0.0"
1133 | }
1134 | },
1135 | "jsbn": {
1136 | "version": "0.1.1",
1137 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1138 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
1139 | },
1140 | "json-schema": {
1141 | "version": "0.2.3",
1142 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1143 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
1144 | },
1145 | "json-schema-ref-parser": {
1146 | "version": "5.1.3",
1147 | "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-5.1.3.tgz",
1148 | "integrity": "sha512-CpDFlBwz/6la78hZxyB9FECVKGYjIIl3Ms3KLqFj99W7IIb7D00/RDgc++IGB4BBALl0QRhh5m4q5WNSopvLtQ==",
1149 | "requires": {
1150 | "call-me-maybe": "^1.0.1",
1151 | "debug": "^3.1.0",
1152 | "js-yaml": "^3.12.0",
1153 | "ono": "^4.0.6"
1154 | },
1155 | "dependencies": {
1156 | "debug": {
1157 | "version": "3.2.5",
1158 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
1159 | "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
1160 | "requires": {
1161 | "ms": "^2.1.1"
1162 | }
1163 | },
1164 | "ms": {
1165 | "version": "2.1.1",
1166 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1167 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1168 | }
1169 | }
1170 | },
1171 | "json-schema-traverse": {
1172 | "version": "0.3.1",
1173 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
1174 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
1175 | },
1176 | "json-stringify-safe": {
1177 | "version": "5.0.1",
1178 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1179 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
1180 | },
1181 | "jsonschema": {
1182 | "version": "1.2.4",
1183 | "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
1184 | "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw=="
1185 | },
1186 | "jsonschema-draft4": {
1187 | "version": "1.0.0",
1188 | "resolved": "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz",
1189 | "integrity": "sha1-8K8gBQVPDwrefqIRhhS2ncUS2GU="
1190 | },
1191 | "jsprim": {
1192 | "version": "1.4.1",
1193 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1194 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1195 | "requires": {
1196 | "assert-plus": "1.0.0",
1197 | "extsprintf": "1.3.0",
1198 | "json-schema": "0.2.3",
1199 | "verror": "1.10.0"
1200 | }
1201 | },
1202 | "jszip": {
1203 | "version": "2.5.0",
1204 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz",
1205 | "integrity": "sha1-dET9hVHd8+XacZj+oMkbyDCMwnQ=",
1206 | "requires": {
1207 | "pako": "~0.2.5"
1208 | }
1209 | },
1210 | "kubernetes-client": {
1211 | "version": "3.18.1",
1212 | "resolved": "https://registry.npmjs.org/kubernetes-client/-/kubernetes-client-3.18.1.tgz",
1213 | "integrity": "sha512-6sS9osVL8RvzAwblnAeWc8gdeD0WQ2g9NytscCV7i5H3rJ4ptCXZW1xOMFbMRkW3zMUS4Elg/Z0f+0hUqSiqMw==",
1214 | "requires": {
1215 | "async": "^2.6.0",
1216 | "js-yaml": "^3.10.0",
1217 | "lodash.merge": "^4.6.0",
1218 | "request": "^2.83.0",
1219 | "util.promisify": "^1.0.0"
1220 | }
1221 | },
1222 | "lodash": {
1223 | "version": "4.17.11",
1224 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
1225 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
1226 | },
1227 | "lodash.get": {
1228 | "version": "4.4.2",
1229 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
1230 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
1231 | },
1232 | "lodash.isequal": {
1233 | "version": "4.5.0",
1234 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
1235 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
1236 | },
1237 | "lodash.merge": {
1238 | "version": "4.6.1",
1239 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
1240 | "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ=="
1241 | },
1242 | "log4js": {
1243 | "version": "0.6.38",
1244 | "resolved": "http://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz",
1245 | "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=",
1246 | "requires": {
1247 | "readable-stream": "~1.0.2",
1248 | "semver": "~4.3.3"
1249 | },
1250 | "dependencies": {
1251 | "semver": {
1252 | "version": "4.3.6",
1253 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
1254 | "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto="
1255 | }
1256 | }
1257 | },
1258 | "media-typer": {
1259 | "version": "0.3.0",
1260 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1261 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1262 | },
1263 | "memory-pager": {
1264 | "version": "1.1.0",
1265 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz",
1266 | "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==",
1267 | "optional": true
1268 | },
1269 | "merge-descriptors": {
1270 | "version": "1.0.1",
1271 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1272 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1273 | },
1274 | "methods": {
1275 | "version": "1.1.2",
1276 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1277 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1278 | },
1279 | "mime": {
1280 | "version": "1.4.1",
1281 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
1282 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
1283 | },
1284 | "mime-db": {
1285 | "version": "1.36.0",
1286 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
1287 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
1288 | },
1289 | "mime-types": {
1290 | "version": "2.1.20",
1291 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
1292 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
1293 | "requires": {
1294 | "mime-db": "~1.36.0"
1295 | }
1296 | },
1297 | "minimatch": {
1298 | "version": "3.0.4",
1299 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1300 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1301 | "requires": {
1302 | "brace-expansion": "^1.1.7"
1303 | }
1304 | },
1305 | "minimist": {
1306 | "version": "0.0.8",
1307 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1308 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
1309 | },
1310 | "mkdirp": {
1311 | "version": "0.5.1",
1312 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1313 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1314 | "requires": {
1315 | "minimist": "0.0.8"
1316 | }
1317 | },
1318 | "mongodb": {
1319 | "version": "3.1.6",
1320 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.6.tgz",
1321 | "integrity": "sha512-E5QJuXQoMlT7KyCYqNNMfAkhfQD79AT4F8Xd+6x37OX+8BL17GyXyWvfm6wuyx4wnzCCPoCSLeMeUN2S7dU9yw==",
1322 | "requires": {
1323 | "mongodb-core": "3.1.5",
1324 | "safe-buffer": "^5.1.2"
1325 | },
1326 | "dependencies": {
1327 | "safe-buffer": {
1328 | "version": "5.1.2",
1329 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1330 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1331 | }
1332 | }
1333 | },
1334 | "mongodb-core": {
1335 | "version": "3.1.5",
1336 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.5.tgz",
1337 | "integrity": "sha512-emT/tM4ZBinqd6RZok+EzDdtN4LjYJIckv71qQVOEFmvXgT5cperZegVmTgox/1cx4XQu6LJ5ZuIwipP/eKdQg==",
1338 | "requires": {
1339 | "bson": "^1.1.0",
1340 | "require_optional": "^1.0.1",
1341 | "safe-buffer": "^5.1.2",
1342 | "saslprep": "^1.0.0"
1343 | },
1344 | "dependencies": {
1345 | "safe-buffer": {
1346 | "version": "5.1.2",
1347 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1348 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1349 | }
1350 | }
1351 | },
1352 | "ms": {
1353 | "version": "2.0.0",
1354 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1355 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1356 | },
1357 | "nan": {
1358 | "version": "2.11.1",
1359 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
1360 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA=="
1361 | },
1362 | "negotiator": {
1363 | "version": "0.6.1",
1364 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
1365 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
1366 | },
1367 | "node-gyp": {
1368 | "version": "3.8.0",
1369 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
1370 | "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
1371 | "requires": {
1372 | "fstream": "^1.0.0",
1373 | "glob": "^7.0.3",
1374 | "graceful-fs": "^4.1.2",
1375 | "mkdirp": "^0.5.0",
1376 | "nopt": "2 || 3",
1377 | "npmlog": "0 || 1 || 2 || 3 || 4",
1378 | "osenv": "0",
1379 | "request": "^2.87.0",
1380 | "rimraf": "2",
1381 | "semver": "~5.3.0",
1382 | "tar": "^2.0.0",
1383 | "which": "1"
1384 | },
1385 | "dependencies": {
1386 | "semver": {
1387 | "version": "5.3.0",
1388 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
1389 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
1390 | }
1391 | }
1392 | },
1393 | "node-report": {
1394 | "version": "2.2.1",
1395 | "resolved": "https://registry.npmjs.org/node-report/-/node-report-2.2.1.tgz",
1396 | "integrity": "sha1-1R0fUlBNuoRDuNnCMyVB26Bn7lU=",
1397 | "optional": true,
1398 | "requires": {
1399 | "nan": "^2.3.5"
1400 | }
1401 | },
1402 | "nopt": {
1403 | "version": "3.0.6",
1404 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
1405 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
1406 | "requires": {
1407 | "abbrev": "1"
1408 | }
1409 | },
1410 | "npmlog": {
1411 | "version": "4.1.2",
1412 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
1413 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
1414 | "requires": {
1415 | "are-we-there-yet": "~1.1.2",
1416 | "console-control-strings": "~1.1.0",
1417 | "gauge": "~2.7.3",
1418 | "set-blocking": "~2.0.0"
1419 | }
1420 | },
1421 | "number-is-nan": {
1422 | "version": "1.0.1",
1423 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1424 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
1425 | },
1426 | "oauth-sign": {
1427 | "version": "0.9.0",
1428 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1429 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1430 | },
1431 | "object-assign": {
1432 | "version": "4.1.1",
1433 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1434 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1435 | },
1436 | "object-component": {
1437 | "version": "0.0.3",
1438 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
1439 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
1440 | },
1441 | "object-keys": {
1442 | "version": "1.0.12",
1443 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
1444 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="
1445 | },
1446 | "object.getownpropertydescriptors": {
1447 | "version": "2.0.3",
1448 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
1449 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
1450 | "requires": {
1451 | "define-properties": "^1.1.2",
1452 | "es-abstract": "^1.5.1"
1453 | }
1454 | },
1455 | "on-finished": {
1456 | "version": "2.3.0",
1457 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1458 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1459 | "requires": {
1460 | "ee-first": "1.1.1"
1461 | }
1462 | },
1463 | "once": {
1464 | "version": "1.4.0",
1465 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1466 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1467 | "requires": {
1468 | "wrappy": "1"
1469 | }
1470 | },
1471 | "ono": {
1472 | "version": "4.0.9",
1473 | "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.9.tgz",
1474 | "integrity": "sha512-HuSv0Z//JsX3246ykva50NDq2dw2UOaUKRK/CrD3UN96FQ3kr9msI5wR0lMezAIKgfN9+utK+iDfWzj1df3TZg==",
1475 | "requires": {
1476 | "format-util": "^1.0.3"
1477 | }
1478 | },
1479 | "openapi-schema-validation": {
1480 | "version": "0.4.2",
1481 | "resolved": "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz",
1482 | "integrity": "sha512-K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==",
1483 | "requires": {
1484 | "jsonschema": "1.2.4",
1485 | "jsonschema-draft4": "^1.0.0",
1486 | "swagger-schema-official": "2.0.0-bab6bed"
1487 | }
1488 | },
1489 | "os-homedir": {
1490 | "version": "1.0.2",
1491 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1492 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
1493 | },
1494 | "os-tmpdir": {
1495 | "version": "1.0.2",
1496 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1497 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
1498 | },
1499 | "osenv": {
1500 | "version": "0.1.5",
1501 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
1502 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
1503 | "requires": {
1504 | "os-homedir": "^1.0.0",
1505 | "os-tmpdir": "^1.0.0"
1506 | }
1507 | },
1508 | "pako": {
1509 | "version": "0.2.9",
1510 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
1511 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU="
1512 | },
1513 | "parseqs": {
1514 | "version": "0.0.5",
1515 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
1516 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
1517 | "requires": {
1518 | "better-assert": "~1.0.0"
1519 | }
1520 | },
1521 | "parseuri": {
1522 | "version": "0.0.5",
1523 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
1524 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
1525 | "requires": {
1526 | "better-assert": "~1.0.0"
1527 | }
1528 | },
1529 | "parseurl": {
1530 | "version": "1.3.2",
1531 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
1532 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
1533 | },
1534 | "path-is-absolute": {
1535 | "version": "1.0.1",
1536 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1537 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1538 | },
1539 | "path-to-regexp": {
1540 | "version": "0.1.7",
1541 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1542 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1543 | },
1544 | "performance-now": {
1545 | "version": "2.1.0",
1546 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1547 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
1548 | },
1549 | "process-nextick-args": {
1550 | "version": "2.0.0",
1551 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1552 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
1553 | },
1554 | "properties": {
1555 | "version": "1.2.1",
1556 | "resolved": "https://registry.npmjs.org/properties/-/properties-1.2.1.tgz",
1557 | "integrity": "sha1-Dul6f8AgsaKlW4ZZ7aSqjYaQlL0="
1558 | },
1559 | "proxy-addr": {
1560 | "version": "2.0.4",
1561 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
1562 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
1563 | "requires": {
1564 | "forwarded": "~0.1.2",
1565 | "ipaddr.js": "1.8.0"
1566 | }
1567 | },
1568 | "psl": {
1569 | "version": "1.1.29",
1570 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
1571 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ=="
1572 | },
1573 | "punycode": {
1574 | "version": "1.4.1",
1575 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1576 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
1577 | },
1578 | "qs": {
1579 | "version": "6.5.1",
1580 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
1581 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
1582 | },
1583 | "range-parser": {
1584 | "version": "1.2.0",
1585 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
1586 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
1587 | },
1588 | "raw-body": {
1589 | "version": "2.3.3",
1590 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
1591 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
1592 | "requires": {
1593 | "bytes": "3.0.0",
1594 | "http-errors": "1.6.3",
1595 | "iconv-lite": "0.4.23",
1596 | "unpipe": "1.0.0"
1597 | }
1598 | },
1599 | "readable-stream": {
1600 | "version": "1.0.34",
1601 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
1602 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
1603 | "requires": {
1604 | "core-util-is": "~1.0.0",
1605 | "inherits": "~2.0.1",
1606 | "isarray": "0.0.1",
1607 | "string_decoder": "~0.10.x"
1608 | }
1609 | },
1610 | "request": {
1611 | "version": "2.88.0",
1612 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
1613 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
1614 | "requires": {
1615 | "aws-sign2": "~0.7.0",
1616 | "aws4": "^1.8.0",
1617 | "caseless": "~0.12.0",
1618 | "combined-stream": "~1.0.6",
1619 | "extend": "~3.0.2",
1620 | "forever-agent": "~0.6.1",
1621 | "form-data": "~2.3.2",
1622 | "har-validator": "~5.1.0",
1623 | "http-signature": "~1.2.0",
1624 | "is-typedarray": "~1.0.0",
1625 | "isstream": "~0.1.2",
1626 | "json-stringify-safe": "~5.0.1",
1627 | "mime-types": "~2.1.19",
1628 | "oauth-sign": "~0.9.0",
1629 | "performance-now": "^2.1.0",
1630 | "qs": "~6.5.2",
1631 | "safe-buffer": "^5.1.2",
1632 | "tough-cookie": "~2.4.3",
1633 | "tunnel-agent": "^0.6.0",
1634 | "uuid": "^3.3.2"
1635 | },
1636 | "dependencies": {
1637 | "qs": {
1638 | "version": "6.5.2",
1639 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1640 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
1641 | },
1642 | "safe-buffer": {
1643 | "version": "5.1.2",
1644 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1645 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1646 | },
1647 | "uuid": {
1648 | "version": "3.3.2",
1649 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1650 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
1651 | }
1652 | }
1653 | },
1654 | "require_optional": {
1655 | "version": "1.0.1",
1656 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
1657 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
1658 | "requires": {
1659 | "resolve-from": "^2.0.0",
1660 | "semver": "^5.1.0"
1661 | }
1662 | },
1663 | "resolve-from": {
1664 | "version": "2.0.0",
1665 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
1666 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
1667 | },
1668 | "rimraf": {
1669 | "version": "2.6.2",
1670 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
1671 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1672 | "requires": {
1673 | "glob": "^7.0.5"
1674 | }
1675 | },
1676 | "safe-buffer": {
1677 | "version": "5.1.1",
1678 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
1679 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
1680 | },
1681 | "safer-buffer": {
1682 | "version": "2.1.2",
1683 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1684 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1685 | },
1686 | "saslprep": {
1687 | "version": "1.0.2",
1688 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz",
1689 | "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==",
1690 | "optional": true,
1691 | "requires": {
1692 | "sparse-bitfield": "^3.0.3"
1693 | }
1694 | },
1695 | "semver": {
1696 | "version": "5.5.1",
1697 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
1698 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw=="
1699 | },
1700 | "send": {
1701 | "version": "0.16.2",
1702 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
1703 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
1704 | "requires": {
1705 | "debug": "2.6.9",
1706 | "depd": "~1.1.2",
1707 | "destroy": "~1.0.4",
1708 | "encodeurl": "~1.0.2",
1709 | "escape-html": "~1.0.3",
1710 | "etag": "~1.8.1",
1711 | "fresh": "0.5.2",
1712 | "http-errors": "~1.6.2",
1713 | "mime": "1.4.1",
1714 | "ms": "2.0.0",
1715 | "on-finished": "~2.3.0",
1716 | "range-parser": "~1.2.0",
1717 | "statuses": "~1.4.0"
1718 | }
1719 | },
1720 | "serve-static": {
1721 | "version": "1.13.2",
1722 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
1723 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
1724 | "requires": {
1725 | "encodeurl": "~1.0.2",
1726 | "escape-html": "~1.0.3",
1727 | "parseurl": "~1.3.2",
1728 | "send": "0.16.2"
1729 | }
1730 | },
1731 | "set-blocking": {
1732 | "version": "2.0.0",
1733 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1734 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
1735 | },
1736 | "setprototypeof": {
1737 | "version": "1.1.0",
1738 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1739 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
1740 | },
1741 | "signal-exit": {
1742 | "version": "3.0.2",
1743 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1744 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
1745 | },
1746 | "socket.io": {
1747 | "version": "2.1.1",
1748 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
1749 | "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==",
1750 | "requires": {
1751 | "debug": "~3.1.0",
1752 | "engine.io": "~3.2.0",
1753 | "has-binary2": "~1.0.2",
1754 | "socket.io-adapter": "~1.1.0",
1755 | "socket.io-client": "2.1.1",
1756 | "socket.io-parser": "~3.2.0"
1757 | },
1758 | "dependencies": {
1759 | "debug": {
1760 | "version": "3.1.0",
1761 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1762 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1763 | "requires": {
1764 | "ms": "2.0.0"
1765 | }
1766 | }
1767 | }
1768 | },
1769 | "socket.io-adapter": {
1770 | "version": "1.1.1",
1771 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
1772 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs="
1773 | },
1774 | "socket.io-client": {
1775 | "version": "2.1.1",
1776 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
1777 | "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==",
1778 | "requires": {
1779 | "backo2": "1.0.2",
1780 | "base64-arraybuffer": "0.1.5",
1781 | "component-bind": "1.0.0",
1782 | "component-emitter": "1.2.1",
1783 | "debug": "~3.1.0",
1784 | "engine.io-client": "~3.2.0",
1785 | "has-binary2": "~1.0.2",
1786 | "has-cors": "1.1.0",
1787 | "indexof": "0.0.1",
1788 | "object-component": "0.0.3",
1789 | "parseqs": "0.0.5",
1790 | "parseuri": "0.0.5",
1791 | "socket.io-parser": "~3.2.0",
1792 | "to-array": "0.1.4"
1793 | },
1794 | "dependencies": {
1795 | "debug": {
1796 | "version": "3.1.0",
1797 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1798 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1799 | "requires": {
1800 | "ms": "2.0.0"
1801 | }
1802 | }
1803 | }
1804 | },
1805 | "socket.io-parser": {
1806 | "version": "3.2.0",
1807 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
1808 | "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
1809 | "requires": {
1810 | "component-emitter": "1.2.1",
1811 | "debug": "~3.1.0",
1812 | "isarray": "2.0.1"
1813 | },
1814 | "dependencies": {
1815 | "debug": {
1816 | "version": "3.1.0",
1817 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1818 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1819 | "requires": {
1820 | "ms": "2.0.0"
1821 | }
1822 | },
1823 | "isarray": {
1824 | "version": "2.0.1",
1825 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
1826 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
1827 | }
1828 | }
1829 | },
1830 | "sparse-bitfield": {
1831 | "version": "3.0.3",
1832 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1833 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
1834 | "optional": true,
1835 | "requires": {
1836 | "memory-pager": "^1.0.2"
1837 | }
1838 | },
1839 | "sprintf-js": {
1840 | "version": "1.0.3",
1841 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1842 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
1843 | },
1844 | "sshpk": {
1845 | "version": "1.15.2",
1846 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
1847 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
1848 | "requires": {
1849 | "asn1": "~0.2.3",
1850 | "assert-plus": "^1.0.0",
1851 | "bcrypt-pbkdf": "^1.0.0",
1852 | "dashdash": "^1.12.0",
1853 | "ecc-jsbn": "~0.1.1",
1854 | "getpass": "^0.1.1",
1855 | "jsbn": "~0.1.0",
1856 | "safer-buffer": "^2.0.2",
1857 | "tweetnacl": "~0.14.0"
1858 | }
1859 | },
1860 | "statuses": {
1861 | "version": "1.4.0",
1862 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1863 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
1864 | },
1865 | "string-width": {
1866 | "version": "1.0.2",
1867 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1868 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1869 | "requires": {
1870 | "code-point-at": "^1.0.0",
1871 | "is-fullwidth-code-point": "^1.0.0",
1872 | "strip-ansi": "^3.0.0"
1873 | }
1874 | },
1875 | "string_decoder": {
1876 | "version": "0.10.31",
1877 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1878 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
1879 | },
1880 | "strip-ansi": {
1881 | "version": "3.0.1",
1882 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1883 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1884 | "requires": {
1885 | "ansi-regex": "^2.0.0"
1886 | }
1887 | },
1888 | "swagger-jsdoc": {
1889 | "version": "3.2.3",
1890 | "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-3.2.3.tgz",
1891 | "integrity": "sha512-vwOLoZOFnS7XUkDz1QG7Bt4GcJDo1jx0WGhBlJegPyPqCLaQi3WuadCX5bAyfx20ycCGceY5PD2o7q1NY8+ICg==",
1892 | "requires": {
1893 | "commander": "2.17.1",
1894 | "doctrine": "2.1.0",
1895 | "glob": "7.1.3",
1896 | "js-yaml": "3.12.0",
1897 | "swagger-parser": "5.0.5"
1898 | }
1899 | },
1900 | "swagger-methods": {
1901 | "version": "1.0.4",
1902 | "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.4.tgz",
1903 | "integrity": "sha512-xrKFLbrZ6VxRsg+M3uJozJtsEpNI/aPfZsOkoEjXw8vhAqdMIqwTYGj1f4dmUgvJvCdZhV5iArgtqXgs403ltg=="
1904 | },
1905 | "swagger-parser": {
1906 | "version": "5.0.5",
1907 | "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-5.0.5.tgz",
1908 | "integrity": "sha512-6UiaUT9nH5nEzvxDvwZpTfhCs2VOwxrP9neZ83QpsTA3mMGHdun4x8vSXiqjaGQzLh2LG8ND5TRhmVNG1hRUqA==",
1909 | "requires": {
1910 | "call-me-maybe": "^1.0.1",
1911 | "debug": "^3.1.0",
1912 | "json-schema-ref-parser": "^5.1.3",
1913 | "ono": "^4.0.6",
1914 | "openapi-schema-validation": "^0.4.2",
1915 | "swagger-methods": "^1.0.4",
1916 | "swagger-schema-official": "2.0.0-bab6bed",
1917 | "z-schema": "^3.23.0"
1918 | },
1919 | "dependencies": {
1920 | "debug": {
1921 | "version": "3.2.5",
1922 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
1923 | "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
1924 | "requires": {
1925 | "ms": "^2.1.1"
1926 | }
1927 | },
1928 | "ms": {
1929 | "version": "2.1.1",
1930 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1931 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1932 | }
1933 | }
1934 | },
1935 | "swagger-schema-official": {
1936 | "version": "2.0.0-bab6bed",
1937 | "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz",
1938 | "integrity": "sha1-cAcEaNbSl3ylI3suUZyn0Gouo/0="
1939 | },
1940 | "tar": {
1941 | "version": "2.2.1",
1942 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
1943 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
1944 | "requires": {
1945 | "block-stream": "*",
1946 | "fstream": "^1.0.2",
1947 | "inherits": "2"
1948 | }
1949 | },
1950 | "to-array": {
1951 | "version": "0.1.4",
1952 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
1953 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
1954 | },
1955 | "tough-cookie": {
1956 | "version": "2.4.3",
1957 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
1958 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
1959 | "requires": {
1960 | "psl": "^1.1.24",
1961 | "punycode": "^1.4.1"
1962 | }
1963 | },
1964 | "tunnel-agent": {
1965 | "version": "0.6.0",
1966 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1967 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1968 | "requires": {
1969 | "safe-buffer": "^5.0.1"
1970 | }
1971 | },
1972 | "tweetnacl": {
1973 | "version": "0.14.5",
1974 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1975 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1976 | },
1977 | "type-is": {
1978 | "version": "1.6.16",
1979 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
1980 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
1981 | "requires": {
1982 | "media-typer": "0.3.0",
1983 | "mime-types": "~2.1.18"
1984 | }
1985 | },
1986 | "ultron": {
1987 | "version": "1.1.1",
1988 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
1989 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
1990 | },
1991 | "unpipe": {
1992 | "version": "1.0.0",
1993 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1994 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1995 | },
1996 | "util-deprecate": {
1997 | "version": "1.0.2",
1998 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1999 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2000 | },
2001 | "util.promisify": {
2002 | "version": "1.0.0",
2003 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
2004 | "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
2005 | "requires": {
2006 | "define-properties": "^1.1.2",
2007 | "object.getownpropertydescriptors": "^2.0.3"
2008 | }
2009 | },
2010 | "utils-merge": {
2011 | "version": "1.0.1",
2012 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2013 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
2014 | },
2015 | "uuid": {
2016 | "version": "2.0.3",
2017 | "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
2018 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho="
2019 | },
2020 | "validator": {
2021 | "version": "10.8.0",
2022 | "resolved": "https://registry.npmjs.org/validator/-/validator-10.8.0.tgz",
2023 | "integrity": "sha512-mXqMxfCh5NLsVgYVKl9WvnHNDPCcbNppHSPPowu0VjtSsGWVY+z8hJF44edLR1nbLNzi3jYoYsIl8KZpioIk6g=="
2024 | },
2025 | "vary": {
2026 | "version": "1.1.2",
2027 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2028 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
2029 | },
2030 | "verror": {
2031 | "version": "1.10.0",
2032 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2033 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2034 | "requires": {
2035 | "assert-plus": "^1.0.0",
2036 | "core-util-is": "1.0.2",
2037 | "extsprintf": "^1.2.0"
2038 | }
2039 | },
2040 | "which": {
2041 | "version": "1.3.1",
2042 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2043 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2044 | "requires": {
2045 | "isexe": "^2.0.0"
2046 | }
2047 | },
2048 | "wide-align": {
2049 | "version": "1.1.3",
2050 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
2051 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
2052 | "requires": {
2053 | "string-width": "^1.0.2 || 2"
2054 | }
2055 | },
2056 | "wrappy": {
2057 | "version": "1.0.2",
2058 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2059 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
2060 | },
2061 | "ws": {
2062 | "version": "3.3.3",
2063 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
2064 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
2065 | "requires": {
2066 | "async-limiter": "~1.0.0",
2067 | "safe-buffer": "~5.1.0",
2068 | "ultron": "~1.1.0"
2069 | }
2070 | },
2071 | "xmlhttprequest-ssl": {
2072 | "version": "1.5.5",
2073 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
2074 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
2075 | },
2076 | "yeast": {
2077 | "version": "0.1.2",
2078 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
2079 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
2080 | },
2081 | "z-schema": {
2082 | "version": "3.24.1",
2083 | "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.24.1.tgz",
2084 | "integrity": "sha512-2eR8eq/v1coNqyBc5HzswEcoLbw+S33RMnR326uiuOIr97ve5vwPNMDrKS1IRCB12bZ3a8BrfGxrRwuSXUyPvw==",
2085 | "requires": {
2086 | "commander": "^2.7.1",
2087 | "core-js": "^2.5.7",
2088 | "lodash.get": "^4.0.0",
2089 | "lodash.isequal": "^4.0.0",
2090 | "validator": "^10.0.0"
2091 | }
2092 | }
2093 | }
2094 | }
2095 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "EOS-history-mongo-api",
3 | "version": "0.0.1",
4 | "description": "API to get actions using EOS mongo plugin (similar to history plugin)",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "CryptoLions.io",
10 | "license": "ISC",
11 | "dependencies": {
12 | "appmetrics-dash": "^4.0.0",
13 | "async": "^2.6.1",
14 | "body-parser": "^1.18.3",
15 | "eosio-mongodb-queries": "^0.9.0",
16 | "express": "^4.16.3",
17 | "http": "0.0.0",
18 | "mongodb": "^3.1.6",
19 | "node-gyp": "^3.8.0",
20 | "request": "^2.88.0",
21 | "swagger-jsdoc": "^3.2.3"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/sql/indexes.sql:
--------------------------------------------------------------------------------
1 | create index if not exists name_idx on chain.action_trace(name)
2 | create index if not exists account_name_idx on chain.account(name);
3 | create index if not exists action_trace_receipt_receiver_block_index_order_desc_idx on chain.action_trace(receipt_receiver, block_index DESC NULLS LAST);
4 | create index if not exists action_trace_receipt_receiver_order_desc_idx on chain.action_trace(receipt_receiver DESC NULLS LAST);
5 | create index if not exists action_trace_receipt_receiver_block_index_idx on chain.action_trace(receipt_receiver, block_index);
6 | create index if not exists action_trace_receipt_receiver_idx on chain.action_trace(receipt_receiver);
7 | create index if not exists action_trace_receipt_receiver_idx on chain.action_trace(receipt_receiver);
8 | create index if not exists action_trace_block_index_idx on chain.action_trace(block_index);
9 | create index if not exists contract_row_code_table_scope_primary_key_block_index_prese_idx on chain.contract_row(code, "table", scope, primary_key, block_index, present);
10 | create index if not exists action_trace_block_index_receipt_receiver_account_name_tx_id_ix on chain.action_trace(block_index, receipt_receiver, account, name, transaction_id);
11 |
--------------------------------------------------------------------------------
/start.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | ###########################################################################
3 | # Startup script based on http://CryptoLions.io
4 | ###########################################################################
5 |
6 | mkdir -p logs
7 |
8 | ./stop.sh
9 | node index.js &> $(pwd)/logs/$(date +%Y-%m-%d_%H-%M-%S.log) & echo $! > $(pwd)/statehistoryapi.pid
10 |
--------------------------------------------------------------------------------
/stop.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | ###########################################################################
3 | # Startup script based on http://CryptoLions.io
4 | ###########################################################################
5 |
6 | if [ -f $(pwd)"/statehistoryapi.pid" ]; then
7 | pid=`cat $(pwd)"/statehistoryapi.pid"`
8 | echo $pid
9 | kill $pid
10 | rm -r $(pwd)"/statehistoryapi.pid"
11 |
12 | echo -ne "Stoping State History API"
13 |
14 | while true; do
15 | [ ! -d "/proc/$pid/fd" ] && break
16 | echo -ne "."
17 | sleep 1
18 | done
19 | echo -ne "\rState History API Stopped. \n"
20 | fi
21 |
--------------------------------------------------------------------------------