Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/replay/backend/api/ScriptRegistrationServer.ts
1030 views
1
import * as Http from 'http';
2
import * as Fs from 'fs';
3
import { IncomingMessage, ServerResponse } from 'http';
4
import { AddressInfo } from 'net';
5
import IReplayMeta from '~shared/interfaces/IReplayMeta';
6
import ReplayApi from '~backend/api/index';
7
import { getInstallDirectory } from '~install/Utils';
8
9
const apiPath = `${getInstallDirectory()}/api.txt`;
10
11
export default class ScriptRegistrationServer {
12
private server: Http.Server;
13
private readonly registerReplayMeta: (replayMeta: IReplayMeta) => any;
14
15
constructor(registerReplayMeta: (replayMeta: IReplayMeta) => any) {
16
this.registerReplayMeta = registerReplayMeta;
17
this.server = new Http.Server(this.handleRequest.bind(this));
18
this.server.listen(0, () => {
19
const port = (this.server.address() as AddressInfo).port;
20
console.log('ScriptRegistrationServer.started', port);
21
Fs.writeFileSync(apiPath, Buffer.from(`http://localhost:${port}`));
22
});
23
}
24
25
public close() {
26
Fs.writeFileSync(apiPath, '');
27
this.server.close();
28
}
29
30
private async handleRequest(request: IncomingMessage, response: ServerResponse) {
31
let data = '';
32
for await (const chunk of request) {
33
data += chunk.toString();
34
}
35
36
const meta: IReplayMeta & { apiStartPath: string; nodePath: string } = JSON.parse(data);
37
console.log('ScriptInstance Registered', meta);
38
39
ReplayApi.serverStartPath = meta.apiStartPath;
40
ReplayApi.nodePath = meta.nodePath;
41
this.registerReplayMeta(meta);
42
response.writeHead(200);
43
response.end();
44
}
45
}
46
47