UNPKG

4.67 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const reduct_1 = require("reduct");
4const lodash_1 = require("lodash");
5const log_1 = require("./common/log");
6const log = log_1.create('app');
7const config_1 = require("./services/config");
8const route_builder_1 = require("./services/route-builder");
9const route_broadcaster_1 = require("./services/route-broadcaster");
10const accounts_1 = require("./services/accounts");
11const rate_backend_1 = require("./services/rate-backend");
12const store_1 = require("./services/store");
13const middleware_manager_1 = require("./services/middleware-manager");
14const admin_api_1 = require("./services/admin-api");
15const Prometheus = require("prom-client");
16const version = require('../package.json').version;
17function listen(config, accounts, backend, store, routeBuilder, routeBroadcaster, middlewareManager, adminApi) {
18 return (async function () {
19 adminApi.listen();
20 try {
21 await backend.connect();
22 }
23 catch (error) {
24 log.error(error);
25 process.exit(1);
26 }
27 await middlewareManager.setup();
28 await accounts.loadIlpAddress();
29 if (config.routeBroadcastEnabled) {
30 routeBroadcaster.start();
31 }
32 await new Promise((resolve, reject) => {
33 const connectTimeout = setTimeout(() => {
34 log.warn('one or more accounts failed to connect within the time limit, continuing anyway.');
35 resolve();
36 }, config.initialConnectTimeout);
37 accounts.connect({ timeout: config.initialConnectTimeout })
38 .then(() => {
39 clearTimeout(connectTimeout);
40 resolve();
41 }, reject);
42 });
43 await middlewareManager.startup();
44 if (config.collectDefaultMetrics) {
45 Prometheus.collectDefaultMetrics();
46 }
47 log.info('connector ready (republic attitude). address=%s version=%s', accounts.getOwnAddress(), version);
48 })().catch((err) => log.error(err));
49}
50async function addPlugin(config, accounts, backend, routeBroadcaster, middlewareManager, id, options) {
51 accounts.add(id, options);
52 const plugin = accounts.getPlugin(id);
53 await middlewareManager.addPlugin(id, plugin);
54 await plugin.connect({ timeout: Infinity });
55 routeBroadcaster.track(id);
56 routeBroadcaster.reloadLocalRoutes();
57}
58async function removePlugin(config, accounts, backend, routeBroadcaster, middlewareManager, id) {
59 const plugin = accounts.getPlugin(id);
60 await middlewareManager.removePlugin(id, plugin);
61 await plugin.disconnect();
62 routeBroadcaster.untrack(id);
63 accounts.remove(id);
64 routeBroadcaster.reloadLocalRoutes();
65}
66function getPlugin(accounts, id) {
67 return accounts.getPlugin(id);
68}
69function shutdown(accounts, routeBroadcaster) {
70 routeBroadcaster.stop();
71 return accounts.disconnect();
72}
73function createApp(opts, container) {
74 const deps = container || reduct_1.default();
75 const config = deps(config_1.default);
76 try {
77 if (opts) {
78 config.loadFromOpts(opts);
79 }
80 else {
81 config.loadFromEnv();
82 }
83 }
84 catch (err) {
85 if (err.name === 'InvalidJsonBodyError') {
86 log.warn('config validation error.');
87 err.debugPrint(log.warn.bind(log));
88 log.error('invalid configuration, shutting down.');
89 throw new Error('failed to initialize due to invalid configuration.');
90 }
91 throw err;
92 }
93 const accounts = deps(accounts_1.default);
94 const routeBuilder = deps(route_builder_1.default);
95 const routeBroadcaster = deps(route_broadcaster_1.default);
96 const backend = deps(rate_backend_1.default);
97 const store = deps(store_1.default);
98 const middlewareManager = deps(middleware_manager_1.default);
99 const adminApi = deps(admin_api_1.default);
100 const credentials = config.accounts;
101 for (let id of Object.keys(credentials)) {
102 accounts.add(id, credentials[id]);
103 }
104 return {
105 config,
106 listen: lodash_1.partial(listen, config, accounts, backend, store, routeBuilder, routeBroadcaster, middlewareManager, adminApi),
107 addPlugin: lodash_1.partial(addPlugin, config, accounts, backend, routeBroadcaster, middlewareManager),
108 removePlugin: lodash_1.partial(removePlugin, config, accounts, backend, routeBroadcaster, middlewareManager),
109 getPlugin: lodash_1.partial(getPlugin, accounts),
110 shutdown: lodash_1.partial(shutdown, accounts, routeBroadcaster)
111 };
112}
113exports.default = createApp;
114//# sourceMappingURL=app.js.map
\No newline at end of file