Skip to content

Commit 1aa7669

Browse files
committed
Plugin refactor improvements
1 parent 3d50d78 commit 1aa7669

2 files changed

Lines changed: 28 additions & 24 deletions

File tree

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,26 @@
1-
import type { ChildProcess } from 'node:child_process';
2-
31
import { PluginIpcBridge } from '../ipc-bridge';
42
import { PluginData } from './plugin-data';
53

64
export class Plugin {
75

8-
process: ChildProcess;
96
ipcBridge: PluginIpcBridge;
107

118
// Separate out data so that the validation logic is testable.
129
data: PluginData;
1310

14-
constructor(data: PluginData, process: ChildProcess, ipcBridge: PluginIpcBridge = new PluginIpcBridge()) {
15-
this.process = process;
11+
constructor(data: PluginData, ipcBridge: PluginIpcBridge) {
1612
this.ipcBridge = ipcBridge;
1713
this.data = data;
1814
}
1915

20-
static async create(directory: string, name: string, ipcBridge: PluginIpcBridge = new PluginIpcBridge()): Promise<Plugin> {
21-
const process = await ipcBridge.createProcess(directory, name);
22-
const resourceDefinitions = await ipcBridge.sendMessageForResult(process, { cmd: 'getResourceDefinitions' });
16+
static async create(directory: string, name: string, ipcBridge?: PluginIpcBridge): Promise<Plugin> {
17+
ipcBridge = ipcBridge ?? await PluginIpcBridge.create(directory, name);
18+
const resourceDefinitions = await ipcBridge.sendMessageForResult({ cmd: 'getResourceDefinitions' });
2319

24-
return new Plugin(PluginData.create(directory, name, resourceDefinitions), process);
20+
return new Plugin(PluginData.create(directory, name, resourceDefinitions), ipcBridge);
2521
}
2622

2723
destroy() {
28-
this.ipcBridge.killPlugin(this.process);
24+
this.ipcBridge.killPlugin();
2925
}
3026
}

codify-core/src/plugins/ipc-bridge.ts

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,35 @@ import { PluginMessage } from './entities/message';
66

77
export class PluginIpcBridge {
88

9-
async createProcess(directory: string, name: string): Promise<ChildProcess> {
10-
return fork(
9+
process: ChildProcess;
10+
11+
constructor(process: ChildProcess) {
12+
this.process = process;
13+
}
14+
15+
static async create(directory: string, name: string): Promise<PluginIpcBridge> {
16+
const process = await fork(
1117
directory + '/' + name + config.defaultPluginEntryPoint,
1218
[],
1319
{ execArgv: ['-r', 'ts-node/register'], silent: true },
1420
);
21+
22+
return new PluginIpcBridge(process);
1523
}
1624

17-
killPlugin(process: ChildProcess): void {
18-
process.kill();
25+
killPlugin(): void {
26+
this.process.kill();
1927
}
2028

21-
async sendMessageForResult(process: ChildProcess, message: PluginMessage): Promise<unknown> {
29+
async sendMessageForResult(message: PluginMessage): Promise<unknown> {
2230
return new Promise((resolve, reject) => {
2331
const timer = setTimeout(() => {
24-
process.kill();
32+
this.process.kill();
2533
reject(new Error(`Plugin did not respond in 10s to call: ${message.cmd}`))
2634
}, 10_000);
2735

2836
const errorListener = (error: Buffer) => {
29-
process.kill();
37+
this.process.kill();
3038
reject(error.toString());
3139
}
3240

@@ -39,20 +47,20 @@ export class PluginIpcBridge {
3947

4048
if (incomingMessage.cmd === this.getResultFunctionName(message.cmd)) {
4149
clearTimeout(timer);
42-
process.removeListener('message', messageListener);
43-
process.removeListener('error', errorListener);
50+
this.process.removeListener('message', messageListener);
51+
this.process.removeListener('error', errorListener);
4452
resolve(incomingMessage.data);
4553
}
4654
};
4755

48-
process.on('message', messageListener);
49-
process.stderr!.on('data', errorListener);
50-
process.send(message);
56+
this.process.on('message', messageListener);
57+
this.process.stderr!.on('data', errorListener);
58+
this.process.send(message);
5159
});
5260
}
5361

54-
sendMessage(process: ChildProcess, message: PluginMessage): void {
55-
process.send(message);
62+
sendMessage(message: PluginMessage): void {
63+
this.process.send(message);
5664
}
5765

5866
private getResultFunctionName(rpcFunctionName: string): string {

0 commit comments

Comments
 (0)