| 1 | import * as Effect from "effect/Effect"; |
| 2 | import type { Module } from "../RuntimeWorker.ts"; |
| 3 | import type * as WorkerdConfig from "../workerd/Config.ts"; |
| 4 | |
| 5 | export const formatInternalWorkerModules = (worker: { |
| 6 | modules: Record<string, string>; |
| 7 | }): Array<WorkerdConfig.Worker_Module> => |
| 8 | Object.entries(worker.modules).map(([name, content]) => ({ |
| 9 | name, |
| 10 | esModule: content, |
| 11 | })); |
| 12 | |
| 13 | export const formatExtensionModule = (self: { |
| 14 | worker: () => Promise<{ main: string; modules: Record<string, string> }>; |
| 15 | }): Effect.Effect<string> => |
| 16 | Effect.promise(self.worker).pipe( |
| 17 | Effect.map(({ modules }) => { |
| 18 | const entries = Object.entries(modules); |
| 19 | if (entries.length !== 1) { |
| 20 | throw new Error(`Expected exactly one module, got ${entries.length}`); |
| 21 | } |
| 22 | return entries[0][1]; |
| 23 | }), |
| 24 | ); |
| 25 | |
| 26 | export const moduleToWorkerd = ( |
| 27 | module: Module, |
| 28 | ): WorkerdConfig.Worker_Module => { |
| 29 | switch (module.type) { |
| 30 | case "ESModule": |
| 31 | return { name: module.name, esModule: module.content }; |
| 32 | case "CommonJsModule": |
| 33 | return { name: module.name, commonJsModule: module.content }; |
| 34 | case "Text": |
| 35 | return { name: module.name, text: module.content }; |
| 36 | case "Data": |
| 37 | return { name: module.name, data: module.content }; |
| 38 | case "Wasm": |
| 39 | return { name: module.name, wasm: module.content }; |
| 40 | case "Json": |
| 41 | return { name: module.name, json: module.content }; |
| 42 | case "PythonModule": |
| 43 | return { name: module.name, pythonModule: module.content }; |
| 44 | } |
| 45 | }; |