diff --git a/src/workerd/api/modules.h b/src/workerd/api/modules.h index 419aae1fbb84..70710b2f4964 100644 --- a/src/workerd/api/modules.h +++ b/src/workerd/api/modules.h @@ -20,7 +20,9 @@ namespace workerd::api { template void registerModules(Registry& registry, auto featureFlags) { node::registerNodeJsCompatModules(registry, featureFlags); - pyodide::registerPyodideModules(registry, featureFlags); + if (featureFlags.getPythonWorkers()) { + pyodide::registerPyodideModules(registry, featureFlags); + } registerUnsafeModules(registry, featureFlags); if (featureFlags.getRttiApi()) { registerRTTIModule(registry); @@ -45,11 +47,6 @@ void registerBuiltinModules(jsg::modules::ModuleRegistry::Builder& builder, auto builder.add(getExternalUnsafeModuleBundle(featureFlags)); } - if (featureFlags.getPythonWorkers()) { - builder.add(pyodide::getExternalPyodideModuleBundle(featureFlags)); - builder.add(pyodide::getInternalPyodideModuleBundle(featureFlags)); - } - if (featureFlags.getRttiApi()) { builder.add(getExternalRttiModuleBundle(featureFlags)); } diff --git a/src/workerd/api/pyodide/pyodide.c++ b/src/workerd/api/pyodide/pyodide.c++ index a491ec87b2be..dee110c1bfc0 100644 --- a/src/workerd/api/pyodide/pyodide.c++ +++ b/src/workerd/api/pyodide/pyodide.c++ @@ -7,6 +7,17 @@ namespace workerd::api::pyodide { +kj::Maybe> pyodideBundleDataGlobal = kj::none; +kj::Maybe> pyodideBundleReaderGlobal = kj::none; +kj::Maybe pyodideBundleGlobal = kj::none; + +void setPyodideBundleData(kj::Array data) { + pyodideBundleReaderGlobal = kj::heap(kj::arrayPtr( + reinterpret_cast(data.begin()), data.size() / sizeof(capnp::word))); + pyodideBundleGlobal = KJ_REQUIRE_NONNULL(pyodideBundleReaderGlobal)->getRoot(); + pyodideBundleDataGlobal = kj::mv(data); +} + static int readToTarget(kj::ArrayPtr source, int offset, kj::ArrayPtr buf) { int size = source.size(); if (offset >= size || offset < 0) { diff --git a/src/workerd/api/pyodide/pyodide.h b/src/workerd/api/pyodide/pyodide.h index 6e7d9d9f3f84..9449de9e5e48 100644 --- a/src/workerd/api/pyodide/pyodide.h +++ b/src/workerd/api/pyodide/pyodide.h @@ -11,9 +11,16 @@ #include #include #include +#include "capnp/serialize.h" namespace workerd::api::pyodide { +// singleton that owns bundle +extern kj::Maybe pyodideBundleGlobal; + +void setPyodideBundleData(kj::Array data); + + struct PythonConfig { kj::Maybe> diskCacheRoot; bool createSnapshot; @@ -344,26 +351,7 @@ bool hasPythonModules(capnp::List::Reader module api::pyodide::SimplePythonLimiter template void registerPyodideModules(Registry& registry, auto featureFlags) { - if (featureFlags.getPythonWorkers()) { - // We add `pyodide:` packages here including python-entrypoint-helper.js. - registry.addBuiltinBundle(PYODIDE_BUNDLE, kj::none); - registry.template addBuiltinModule( - "pyodide-internal:packages_tar_reader", workerd::jsg::ModuleRegistry::Type::INTERNAL); - } + registry.template addBuiltinModule( + "pyodide-internal:packages_tar_reader", workerd::jsg::ModuleRegistry::Type::INTERNAL); } - -kj::Own getInternalPyodideModuleBundle(auto featureFlags) { - jsg::modules::ModuleBundle::BuiltinBuilder builder( - jsg::modules::ModuleBundle::BuiltinBuilder::Type::BUILTIN_ONLY); - jsg::modules::ModuleBundle::getBuiltInBundleFromCapnp(builder, PYODIDE_BUNDLE); - return builder.finish(); -} - -kj::Own getExternalPyodideModuleBundle(auto featureFlags) { - jsg::modules::ModuleBundle::BuiltinBuilder builder( - jsg::modules::ModuleBundle::BuiltinBuilder::Type::BUILTIN); - jsg::modules::ModuleBundle::getBuiltInBundleFromCapnp(builder, PYODIDE_BUNDLE); - return builder.finish(); -} - } // namespace workerd::api::pyodide diff --git a/src/workerd/server/workerd-api.c++ b/src/workerd/server/workerd-api.c++ index e7e624b0ea73..f29c62e07553 100644 --- a/src/workerd/server/workerd-api.c++ +++ b/src/workerd/server/workerd-api.c++ @@ -446,7 +446,9 @@ void WorkerdApi::compileModules( if (hasPythonModules(confModules)) { KJ_REQUIRE(featureFlags.getPythonWorkers(), "The python_workers compatibility flag is required to use Python."); - // Inject pyodide bootstrap module. + // Inject Pyodide bundle + modules->addBuiltinBundle(PYODIDE_BUNDLE, kj::none); + // Inject pyodide bootstrap module (TODO: load this from the capnproto bundle?) { auto mainModule = confModules.begin(); capnp::MallocMessageBuilder message;