1import * as Effect from "effect/Effect";
2import type { Module } from "../RuntimeWorker.ts";
3import type * as WorkerdConfig from "../workerd/Config.ts";
4
5export 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
13export 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
26export 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};