1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const reduct_1 = require("reduct");
|
4 | const lodash_1 = require("lodash");
|
5 | const log_1 = require("./common/log");
|
6 | const log = log_1.create('app');
|
7 | const config_1 = require("./services/config");
|
8 | const route_builder_1 = require("./services/route-builder");
|
9 | const route_broadcaster_1 = require("./services/route-broadcaster");
|
10 | const accounts_1 = require("./services/accounts");
|
11 | const rate_backend_1 = require("./services/rate-backend");
|
12 | const store_1 = require("./services/store");
|
13 | const middleware_manager_1 = require("./services/middleware-manager");
|
14 | const admin_api_1 = require("./services/admin-api");
|
15 | const Prometheus = require("prom-client");
|
16 | const version = require('../package.json').version;
|
17 | function 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 | }
|
50 | async 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 | }
|
58 | async 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 | }
|
66 | function getPlugin(accounts, id) {
|
67 | return accounts.getPlugin(id);
|
68 | }
|
69 | function shutdown(accounts, routeBroadcaster) {
|
70 | routeBroadcaster.stop();
|
71 | return accounts.disconnect();
|
72 | }
|
73 | function 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 | }
|
113 | exports.default = createApp;
|
114 |
|
\ | No newline at end of file |