From f16bdd4e458dbd7125fe5f0ec973ddf4f1db5d82 Mon Sep 17 00:00:00 2001 From: Kenton Varda Date: Fri, 29 Nov 2024 15:20:40 -0600 Subject: [PATCH] Refactor server.c++: Construct EntrypointService on-demand. This will allow us to extend it to support connection metadata, which might be different for each binding pointing to the same entrypoint. --- src/workerd/server/server.c++ | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/workerd/server/server.c++ b/src/workerd/server/server.c++ index 8c69541ee07..873d6950ac4 100644 --- a/src/workerd/server/server.c++ +++ b/src/workerd/server/server.c++ @@ -1602,7 +1602,7 @@ class Server::WorkerService final: public Service, WorkerService(ThreadContext& threadContext, kj::Own worker, kj::Maybe> defaultEntrypointHandlers, - kj::HashMap> namedEntrypointsParam, + kj::HashMap> namedEntrypoints, const kj::HashMap& actorClasses, LinkCallback linkCallback, AbortActorsCallback abortActorsCallback) @@ -1610,15 +1610,10 @@ class Server::WorkerService final: public Service, ioChannels(kj::mv(linkCallback)), worker(kj::mv(worker)), defaultEntrypointHandlers(kj::mv(defaultEntrypointHandlers)), + namedEntrypoints(kj::mv(namedEntrypoints)), waitUntilTasks(*this), abortActorsCallback(kj::mv(abortActorsCallback)) { - namedEntrypoints.reserve(namedEntrypointsParam.size()); - for (auto& ep: namedEntrypointsParam) { - kj::StringPtr epPtr = ep.key; - namedEntrypoints.insert(kj::mv(ep.key), EntrypointService(*this, epPtr, kj::mv(ep.value))); - } - actorNamespaces.reserve(actorClasses.size()); for (auto& entry: actorClasses) { auto ns = @@ -1627,8 +1622,9 @@ class Server::WorkerService final: public Service, } } - kj::Maybe getEntrypoint(kj::StringPtr name) { - return namedEntrypoints.find(name); + kj::Maybe> getEntrypoint(kj::StringPtr name) { + auto& entry = KJ_UNWRAP_OR_RETURN(namedEntrypoints.findEntry(name), kj::none); + return kj::heap(*this, entry.key, entry.value); } kj::Array getEntrypointNames() { @@ -2221,10 +2217,10 @@ class Server::WorkerService final: public Service, class EntrypointService final: public Service { public: EntrypointService( - WorkerService& worker, kj::StringPtr entrypoint, kj::HashSet handlers) + WorkerService& worker, kj::StringPtr entrypoint, kj::HashSet& handlers) : worker(worker), entrypoint(entrypoint), - handlers(kj::mv(handlers)) {} + handlers(handlers) {} kj::Own startRequest(IoChannelFactory::SubrequestMetadata metadata) override { return worker.startRequest(kj::mv(metadata), entrypoint); @@ -2237,7 +2233,7 @@ class Server::WorkerService final: public Service, private: WorkerService& worker; kj::StringPtr entrypoint; - kj::HashSet handlers; + kj::HashSet& handlers; }; ThreadContext& threadContext; @@ -2247,7 +2243,7 @@ class Server::WorkerService final: public Service, kj::Own worker; kj::Maybe> defaultEntrypointHandlers; - kj::HashMap namedEntrypoints; + kj::HashMap> namedEntrypoints; kj::HashMap> actorNamespaces; kj::TaskSet waitUntilTasks; AbortActorsCallback abortActorsCallback; @@ -3320,7 +3316,7 @@ kj::Own Server::lookupService( kj::StringPtr entrypointName = designator.getEntrypoint(); if (WorkerService* worker = dynamic_cast(service)) { KJ_IF_SOME(ep, worker->getEntrypoint(entrypointName)) { - return fakeOwn(ep); + return kj::mv(ep); } else { reportConfigError(kj::str(errorContext, " refers to service \"", targetName, "\" with a named entrypoint \"", entrypointName, "\", but \"", targetName, @@ -4076,9 +4072,9 @@ kj::Promise Server::test(jsg::V8System& v8System, if (WorkerService* worker = dynamic_cast(service.value.get())) { for (auto& name: worker->getEntrypointNames()) { if (entrypointGlob.matches(name)) { - Service& ep = KJ_ASSERT_NONNULL(worker->getEntrypoint(name)); - if (ep.hasHandler("test"_kj)) { - co_await doTest(ep, kj::str(service.key, ':', name)); + kj::Own ep = KJ_ASSERT_NONNULL(worker->getEntrypoint(name)); + if (ep->hasHandler("test"_kj)) { + co_await doTest(*ep, kj::str(service.key, ':', name)); } } }