feat: switched from worker API to fs based

This commit is contained in:
Morten Olsen
2024-01-12 14:14:40 +01:00
parent 6d8e5bf955
commit 5e7461c10b
36 changed files with 419 additions and 58 deletions

View File

@@ -16,12 +16,13 @@
}
},
"devDependencies": {
"@morten-olsen/mini-loader-configs": "workspace:^",
"@morten-olsen/mini-loader": "workspace:^",
"@morten-olsen/mini-loader-configs": "workspace:^",
"@types/node": "^20.10.8",
"typescript": "^5.3.3"
},
"dependencies": {
"eventemitter3": "^5.0.1"
"eventemitter3": "^5.0.1",
"nanoid": "^5.0.4"
}
}

View File

@@ -1,6 +1,11 @@
import { Worker } from 'worker_threads';
import os from 'os';
import { EventEmitter } from 'eventemitter3';
import { Event } from '@morten-olsen/mini-loader';
import { join } from 'path';
import { createServer } from 'http';
import { nanoid } from 'nanoid';
import { chmod, mkdir, unlink, writeFile } from 'fs/promises';
type RunEvents = {
message: (event: Event) => void;
@@ -10,18 +15,40 @@ type RunEvents = {
type RunOptions = {
script: string;
input?: unknown;
input?: Buffer | string;
secrets?: Record<string, string>;
};
const run = async ({ script, input, secrets }: RunOptions) => {
const dataDir = join(os.tmpdir(), 'mini-loader', nanoid());
await mkdir(dataDir, { recursive: true });
await chmod(dataDir, 0o700);
const hostSocket = join(dataDir, 'host');
const server = createServer();
const inputLocation = join(dataDir, 'input');
if (input) {
await writeFile(inputLocation, input);
}
const emitter = new EventEmitter<RunEvents>();
server.on('connection', (socket) => {
socket.on('data', (data) => {
const message = JSON.parse(data.toString());
emitter.emit('message', message);
});
});
const worker = new Worker(script, {
eval: true,
env: secrets,
env: {
HOST_SOCKET: hostSocket,
SECRETS: JSON.stringify(secrets),
INPUT_PATH: inputLocation,
},
workerData: {
input,
secrets,
},
});
@@ -29,10 +56,14 @@ const run = async ({ script, input, secrets }: RunOptions) => {
worker.on('message', (message: Event) => {
emitter.emit('message', message);
});
worker.on('exit', () => {
worker.on('exit', async () => {
server.close();
await unlink(hostSocket);
resolve();
});
worker.on('error', (error) => {
worker.on('error', async (error) => {
server.close();
await unlink(hostSocket);
reject(error);
});
});