UNPKG

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