1 | 'use strict';
|
2 |
|
3 | const os = require('os');
|
4 |
|
5 | const IoPort = require('./io/IoPort');
|
6 |
|
7 | const processEnv = require('./processEnv');
|
8 |
|
9 | const {
|
10 | Command,
|
11 | Event,
|
12 | Job,
|
13 | events,
|
14 | } = require('./command-event-notification');
|
15 |
|
16 | const symbols = require('./symbols');
|
17 | const wires = require('./wires');
|
18 | const protocols = require('./protocols');
|
19 | const LoggerManager = require('./KellnerLoggerManager');
|
20 |
|
21 | const ErrorStream = require('./ErrorStream');
|
22 |
|
23 | const {
|
24 | kellnerEventbus,
|
25 | kellnerJobbus,
|
26 | kellnerCommandbus,
|
27 | kellnerNotificationbus,
|
28 | kellnerWires,
|
29 | kellnerProcesses,
|
30 | kellnerErrorStream,
|
31 | kellnerLoggerManager,
|
32 | } = symbols;
|
33 |
|
34 | class KellnerProcess {
|
35 | constructor(name) {
|
36 | this._name = name;
|
37 |
|
38 | this.services = {
|
39 | getLogger: () => this[kellnerLoggerManager].getLogger(),
|
40 | };
|
41 |
|
42 | this[kellnerEventbus] = new IoPort(this);
|
43 | this[kellnerCommandbus] = new IoPort(this);
|
44 | this[kellnerJobbus] = new IoPort(this);
|
45 | this[kellnerNotificationbus] = new IoPort(this);
|
46 |
|
47 | this[kellnerWires] = [];
|
48 | this[kellnerProcesses] = new Map();
|
49 |
|
50 | this[kellnerErrorStream] = new ErrorStream();
|
51 |
|
52 | this.use(this[kellnerEventbus]).use(this[kellnerCommandbus]).use(this[kellnerNotificationbus]).use(this[kellnerJobbus]);
|
53 | }
|
54 |
|
55 |
|
56 | get eventbus() {
|
57 | return this[kellnerEventbus];
|
58 | }
|
59 |
|
60 | get commandbus() {
|
61 | return this[kellnerCommandbus];
|
62 | }
|
63 |
|
64 | get notificationbus() {
|
65 | return this[kellnerNotificationbus];
|
66 | }
|
67 |
|
68 | get jobbus() {
|
69 | return this[kellnerJobbus];
|
70 | }
|
71 |
|
72 | get config() {
|
73 | return this.app._config;
|
74 | }
|
75 |
|
76 | get shortName() {
|
77 | return this._name;
|
78 | }
|
79 |
|
80 | get appName() {
|
81 | return this.app.name;
|
82 | }
|
83 |
|
84 | get version() {
|
85 | return this.app._version;
|
86 | }
|
87 |
|
88 | get connections() {
|
89 | return this.app._connections;
|
90 | }
|
91 |
|
92 |
|
93 | get Job() {
|
94 | return Job;
|
95 | }
|
96 |
|
97 | get Command() {
|
98 | return Command;
|
99 | }
|
100 |
|
101 | get Event() {
|
102 | return Event;
|
103 | }
|
104 |
|
105 | get events() {
|
106 | return events;
|
107 | }
|
108 |
|
109 | get wires() {
|
110 | return wires;
|
111 | }
|
112 |
|
113 | get symbols() {
|
114 | return symbols;
|
115 | }
|
116 |
|
117 | static get protocols() {
|
118 | return protocols;
|
119 | }
|
120 |
|
121 |
|
122 |
|
123 | getProcess(name) {
|
124 | if (!this[kellnerProcesses].has(name)) {
|
125 | const port = new KellnerProcess(name);
|
126 | this[kellnerProcesses].set(name, port);
|
127 | this.use(port);
|
128 | }
|
129 |
|
130 | return this[kellnerProcesses].get(name);
|
131 | }
|
132 |
|
133 |
|
134 | env(key) {
|
135 | return processEnv(key);
|
136 | }
|
137 |
|
138 |
|
139 | setApp(app) {
|
140 | this.app = app.app || app;
|
141 | this.name = app === this ? app.name : `${app.name}:${this._name}`;
|
142 | this.processIdentity = {
|
143 | name: this.name,
|
144 | id: `${os.hostname}:${process.pid}`,
|
145 | };
|
146 | this[kellnerLoggerManager] = LoggerManager.getManager({
|
147 | name: this.name,
|
148 | version: this.version,
|
149 | logLevel: this.config.logLevel,
|
150 | logEnabled: this.config.logEnabled,
|
151 | prettyPrint: this.config.logPrettyPrint,
|
152 | });
|
153 | }
|
154 |
|
155 | use(wire) {
|
156 | if (!wire)
|
157 | throw new Error('Wire is missing.');
|
158 |
|
159 |
|
160 | if (typeof wire === 'function')
|
161 | return this.useError(wire);
|
162 |
|
163 | if (typeof wire.link !== 'function')
|
164 | throw new Error('Wire must have a link funciton');
|
165 |
|
166 | if (typeof wire.prelink === 'function')
|
167 | wire.prelink(this);
|
168 |
|
169 | this[kellnerWires].push(() => wire.link(this));
|
170 |
|
171 | return this;
|
172 | }
|
173 |
|
174 | useError(handler) {
|
175 | this[kellnerErrorStream].addErrorHandler(handler);
|
176 | return this;
|
177 | }
|
178 |
|
179 | prelink(app) {
|
180 | this.setApp(app);
|
181 | }
|
182 |
|
183 | link(parent) {
|
184 | return this.init(parent);
|
185 | }
|
186 |
|
187 | async init(parent) {
|
188 | this[kellnerErrorStream].init(parent);
|
189 |
|
190 | const res = await Promise.all(this[kellnerWires].map(a => a()));
|
191 | return res;
|
192 |
|
193 | }
|
194 |
|
195 | fail(exp) {
|
196 | this[kellnerErrorStream].write(exp);
|
197 | }
|
198 | }
|
199 |
|
200 | module.exports = KellnerProcess;
|