UNPKG

3.75 kBJavaScriptView Raw
1'use strict';
2
3const os = require('os');
4
5const IoPort = require('./io/IoPort');
6
7const processEnv = require('./processEnv');
8
9const {
10 Command,
11 Event,
12 Job,
13 events,
14} = require('./command-event-notification');
15
16const symbols = require('./symbols');
17const wires = require('./wires');
18const protocols = require('./protocols');
19const LoggerManager = require('./KellnerLoggerManager');
20
21const ErrorStream = require('./ErrorStream');
22
23const {
24 kellnerEventbus,
25 kellnerJobbus,
26 kellnerCommandbus,
27 kellnerNotificationbus,
28 kellnerWires,
29 kellnerProcesses,
30 kellnerErrorStream,
31 kellnerLoggerManager,
32} = symbols;
33
34class 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 // #region Getters
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 /* eslint-disable class-methods-use-this */
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 /* eslint-enable class-methods-use-this */
121 // #endregion
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 /* eslint-disable class-methods-use-this */
134 env(key) {
135 return processEnv(key);
136 }
137 /* eslint-enable class-methods-use-this */
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 // error handler
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 // this._loggerManager = this.app._loggerManager.getManager({ name: this.name });
190 const res = await Promise.all(this[kellnerWires].map(a => a()));
191 return res;
192 // this._wires = [];
193 }
194
195 fail(exp) {
196 this[kellnerErrorStream].write(exp);
197 }
198}
199
200module.exports = KellnerProcess;