UNPKG

6.39 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11Object.defineProperty(exports, "__esModule", { value: true });
12exports.DevtoolServerController = void 0;
13const path = require("path");
14const child_process_1 = require("@testring/child-process");
15const utils_1 = require("@testring/utils");
16const pluggable_module_1 = require("@testring/pluggable-module");
17const logger_1 = require("@testring/logger");
18const default_devtool_config_1 = require("./default-devtool-config");
19const devtool_extension_1 = require("@testring/devtool-extension");
20class DevtoolServerController extends pluggable_module_1.PluggableModule {
21 constructor(transport) {
22 super([
23 "beforeStart" /* beforeStart */,
24 "afterStart" /* afterStart */,
25 "beforeStop" /* beforeStop */,
26 "afterStop" /* afterStop */,
27 ]);
28 this.transport = transport;
29 this.logger = logger_1.loggerClient.withPrefix('[recorder-server]');
30 }
31 getConfig() {
32 return default_devtool_config_1.defaultDevtoolConfig;
33 }
34 getRuntimeConfiguration() {
35 if (this.config === undefined) {
36 throw Error('Configuration is not initialized yet');
37 }
38 else {
39 const { httpPort, wsPort, host, } = this.config;
40 return {
41 extensionId: devtool_extension_1.extensionId,
42 httpPort,
43 wsPort,
44 host,
45 };
46 }
47 }
48 getWorkerID() {
49 if (!this.workerID) {
50 this.workerID = `recorder/${utils_1.generateUniqId()}`;
51 }
52 return this.workerID;
53 }
54 startServer() {
55 return __awaiter(this, void 0, void 0, function* () {
56 const workerPath = path.resolve(__dirname, 'worker');
57 const workerID = this.getWorkerID();
58 this.worker = yield child_process_1.fork(workerPath);
59 if (this.worker.stdout) {
60 this.worker.stdout.on('data', (data) => {
61 this.logger.log(`[logged] ${data.toString().trim()}`);
62 });
63 }
64 else {
65 this.logger.warn(`[logged] The STDOUT of worker ${this.getWorkerID()} is null`);
66 }
67 if (this.worker.stderr) {
68 this.worker.stderr.on('data', (data) => {
69 this.logger.warn(`[logged] ${data.toString().trim()}`);
70 });
71 }
72 else {
73 this.logger.warn(`[logged] The STDERR of worker ${this.getWorkerID()} is null`);
74 }
75 this.transport.registerChild(workerID, this.worker);
76 this.logger.debug(`Registered child process ${workerID}`);
77 });
78 }
79 stopServer() {
80 return __awaiter(this, void 0, void 0, function* () {
81 this.worker.kill();
82 });
83 }
84 addToServerProxyHandler(messageType) {
85 const toServerHandler = (messageData, processID = null) => {
86 this.transport.send(this.getWorkerID(), "RecorderMessage/TO_WORKER" /* TO_WORKER */, {
87 source: processID,
88 messageType,
89 messageData,
90 });
91 };
92 this.transport.on(messageType, toServerHandler);
93 }
94 handleProxiedMessage(message) {
95 if (message.source) {
96 this.transport.send(message.source, message.messageType, message.messageData);
97 }
98 else {
99 this.transport.broadcastLocal(message.messageType, message.messageData);
100 }
101 }
102 initMessagesProxy() {
103 [
104 "TestWorkerAction/register" /* register */,
105 "TestWorkerAction/updateExecutionState" /* updateExecutionState */,
106 "TestWorkerAction/unregister" /* unregister */,
107 "WebApplication/register" /* register */,
108 "WebApplication/unregister" /* unregister */,
109 ].forEach((event) => this.addToServerProxyHandler(event));
110 this.transport.on("RecorderMessage/FROM_WORKER" /* FROM_WORKER */, (payload) => {
111 this.handleProxiedMessage(payload);
112 });
113 }
114 init() {
115 return __awaiter(this, void 0, void 0, function* () {
116 this.config = yield this.callHook("beforeStart" /* beforeStart */, this.getConfig());
117 yield this.startServer();
118 this.transport.send(this.getWorkerID(), "RecorderServerEvents/START_SERVER" /* START_SERVER */, this.config);
119 let caughtError = null;
120 let pending = true;
121 let handler = (error) => {
122 caughtError = error;
123 pending = false;
124 };
125 this.transport.once("RecorderServerEvents/START_SERVER_COMPLETE" /* START_SERVER_COMPLETE */, (error) => handler(error));
126 yield new Promise((resolve, reject) => {
127 if (pending) {
128 handler = (error) => {
129 if (error) {
130 reject(error);
131 }
132 else {
133 resolve();
134 }
135 };
136 }
137 else if (caughtError) {
138 reject(caughtError);
139 }
140 else {
141 resolve();
142 }
143 });
144 yield this.initMessagesProxy();
145 yield this.callHook("afterStart" /* afterStart */);
146 });
147 }
148 kill() {
149 return __awaiter(this, void 0, void 0, function* () {
150 yield this.callHook("beforeStop" /* beforeStop */);
151 yield this.stopServer();
152 yield this.callHook("afterStop" /* afterStop */);
153 });
154 }
155}
156exports.DevtoolServerController = DevtoolServerController;