mirror of
https://github.com/morten-olsen/mini-loader.git
synced 2026-02-08 01:36:26 +01:00
feat: switched from worker API to fs based
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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, rm, writeFile } from 'fs/promises';
|
||||
|
||||
type RunEvents = {
|
||||
message: (event: Event) => void;
|
||||
@@ -10,29 +15,75 @@ 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);
|
||||
});
|
||||
});
|
||||
server.listen(hostSocket);
|
||||
|
||||
const worker = new Worker(script, {
|
||||
eval: true,
|
||||
env: secrets,
|
||||
stdin: false,
|
||||
stdout: false,
|
||||
stderr: false,
|
||||
env: {
|
||||
HOST_SOCKET: hostSocket,
|
||||
SECRETS: JSON.stringify(secrets),
|
||||
INPUT_PATH: inputLocation,
|
||||
},
|
||||
workerData: {
|
||||
input,
|
||||
secrets,
|
||||
},
|
||||
});
|
||||
|
||||
const promise = new Promise<void>((resolve, reject) => {
|
||||
worker.on('message', (message: Event) => {
|
||||
emitter.emit('message', message);
|
||||
worker.stdout?.on('data', (data) => {
|
||||
emitter.emit('message', {
|
||||
type: 'log',
|
||||
payload: {
|
||||
severity: 'info',
|
||||
message: data.toString(),
|
||||
},
|
||||
});
|
||||
worker.on('exit', () => {
|
||||
});
|
||||
|
||||
worker.stderr?.on('data', (data) => {
|
||||
emitter.emit('message', {
|
||||
type: 'log',
|
||||
payload: {
|
||||
severity: 'error',
|
||||
message: data.toString(),
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
const promise = new Promise<void>((resolve, reject) => {
|
||||
worker.on('exit', async () => {
|
||||
server.close();
|
||||
await rm(dataDir, { recursive: true, force: true });
|
||||
resolve();
|
||||
});
|
||||
worker.on('error', (error) => {
|
||||
worker.on('error', async (error) => {
|
||||
server.close();
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user