Puter.js workers api (#1339)

This commit is contained in:
Neal Shah
2025-07-08 16:29:02 -04:00
committed by GitHub
parent 858929a3b9
commit d8a4180b4f
2 changed files with 67 additions and 0 deletions

View File

@@ -25,6 +25,7 @@ import Perms from './modules/Perms.js';
import { pFetch } from './modules/networking/requests.js';
import localStorageMemory from './lib/polyfills/localStorage.js'
import xhrshim from './lib/polyfills/xhrshim.js'
import { WorkersHandler } from './modules/Workers.js';
// TODO: This is for a safe-guard below; we should check if we can
// generalize this behavior rather than hard-coding it.
@@ -378,6 +379,8 @@ export default globalThis.puter = (function() {
},
fetch: pFetch
}
this.workers = new WorkersHandler(this.authToken);
}
/**

View File

@@ -0,0 +1,64 @@
export class WorkersHandler {
constructor(authToken) {
this.authToken = authToken;
}
async create(workerName, filePath) {
const data = await puter.fs.read(filePath).then(r => r.text());
let currentWorkers = await puter.kv.get("user-workers");
if (!currentWorkers) {
currentWorkers = {};
}
const driverCall = await puter.drivers.call("workers", "worker-service", "create", { authorization: puter.authToken, fileData: data, workerName });
const driverResult = JSON.parse(driverCall.result);
if (!driverCall.success || !driverResult.success) {
throw new Error(driverResult?.errors || "Driver failed to execute, do you have the necessary permissions?");
}
currentWorkers[workerName] = { filePath, url: driverResult["url"], deployTime: Date.now() };
await puter.kv.set("user-workers", currentWorkers);
return driverResult;
}
// This is temporary until FS stuff is hooked properly
async update(workerName) {
let filePath = (await puter.kv.get("user-workers"))[workerName]["filePath"];
return this.create(workerName, filePath);
}
async list() {
return await puter.kv.get("user-workers");
}
async get(workerName) {
try {
return (await puter.kv.get("user-workers"))[workerName].url;
} catch (e) {
throw new Error("Failed to get worker");
}
}
async delete(workerName) {
const driverCall = await puter.drivers.call("workers", "worker-service", "destroy", { authorization: puter.authToken, workerName });
if (!driverCall.success || !driverCall.result.result) {
if (!driverCall.result.result) {
throw new Error("Worker doesn't exist");
}
throw new Error(driverResult?.errors || "Driver failed to execute, do you have the necessary permissions?");
} else {
let currentWorkers = await puter.kv.get("user-workers");
if (!currentWorkers) {
currentWorkers = {};
}
delete currentWorkers[workerName];
await puter.kv.set("user-workers", currentWorkers);
return true;
}
}
}