diff --git a/src/puter-js/src/index.js b/src/puter-js/src/index.js index 16fcc61f..84f49026 100644 --- a/src/puter-js/src/index.js +++ b/src/puter-js/src/index.js @@ -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); } /** diff --git a/src/puter-js/src/modules/Workers.js b/src/puter-js/src/modules/Workers.js new file mode 100644 index 00000000..3bc37556 --- /dev/null +++ b/src/puter-js/src/modules/Workers.js @@ -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; + } + } + +}