@@ -574,6 +574,10 @@ class AbortTriggerRpcClient final {
574574
575575namespace {
576576// The jsrpc handler that receives aborts from the remote and triggers them locally
577+ //
578+ // TODO(cleanup): This class has been copied to external-pusher.c++. The copy here can be
579+ // deleted as soon as we've switched from StreamSink to ExternalPusher and can delete all the
580+ // StreamSink-related code. For now I'm not trying to avoid duplication.
577581class AbortTriggerRpcServer final : public rpc::AbortTrigger::Server {
578582 public:
579583 AbortTriggerRpcServer (kj::Own<kj::PromiseFulfiller<void >> fulfiller,
@@ -858,15 +862,28 @@ void AbortSignal::serialize(jsg::Lock& js, jsg::Serializer& serializer) {
858862 return ;
859863 }
860864
861- auto streamCap = externalHandler
862- ->writeStream ([&](rpc::JsValue::External::Builder builder) mutable {
863- builder.setAbortTrigger ();
864- }).castAs <rpc::AbortTrigger>();
865+ auto triggerCap = [&]() -> rpc::AbortTrigger::Client {
866+ KJ_IF_SOME (pusher, externalHandler->getExternalPusher ()) {
867+ auto pipeline = pusher.pushAbortSignalRequest (capnp::MessageSize{2 , 0 }).sendForPipeline ();
868+
869+ externalHandler->write (
870+ [signal = pipeline.getSignal ()](rpc::JsValue::External::Builder builder) mutable {
871+ builder.setAbortSignal (kj::mv (signal));
872+ });
873+
874+ return pipeline.getTrigger ();
875+ } else {
876+ return externalHandler
877+ ->writeStream ([&](rpc::JsValue::External::Builder builder) mutable {
878+ builder.setAbortTrigger ();
879+ }).castAs <rpc::AbortTrigger>();
880+ }
881+ }();
865882
866883 auto & ioContext = IoContext::current ();
867884 // Keep track of every AbortSignal cloned from this one.
868885 // If this->triggerAbort(...) is called, each rpcClient will be informed.
869- rpcClients.add (ioContext.addObject (kj::heap<AbortTriggerRpcClient>(kj::mv (streamCap ))));
886+ rpcClients.add (ioContext.addObject (kj::heap<AbortTriggerRpcClient>(kj::mv (triggerCap ))));
870887}
871888
872889jsg::Ref<AbortSignal> AbortSignal::deserialize (
@@ -890,20 +907,31 @@ jsg::Ref<AbortSignal> AbortSignal::deserialize(
890907 return js.alloc <AbortSignal>(/* exception */ kj::none, /* maybeReason */ kj::none, flag);
891908 }
892909
893- auto reader = externalHandler->read ();
894- KJ_REQUIRE (reader.isAbortTrigger (), " external table slot type does't match serialization tag" );
895-
896910 // The AbortSignalImpl will receive any remote triggerAbort requests and fulfill the promise with the reason for abort
897911
898912 auto signal = js.alloc <AbortSignal>(/* exception */ kj::none, /* maybeReason */ kj::none, flag);
899913
900- auto paf = kj::newPromiseAndFulfiller<void >();
901- auto pendingReason = IoContext::current ().addObject (kj::refcounted<PendingReason>());
914+ auto & ioctx = IoContext::current ();
915+
916+ auto reader = externalHandler->read ();
917+ if (reader.isAbortTrigger ()) {
918+ // Old-style StreamSink.
919+ // TODO(cleanup): Remove this once the ExternalPusher autogate has rolled out.
920+ auto paf = kj::newPromiseAndFulfiller<void >();
921+ auto pendingReason = ioctx.addObject (kj::refcounted<PendingReason>());
922+
923+ externalHandler->setLastStream (
924+ kj::heap<AbortTriggerRpcServer>(kj::mv (paf.fulfiller ), kj::addRef (*pendingReason)));
925+ signal->rpcAbortPromise = ioctx.addObject (kj::heap (kj::mv (paf.promise )));
926+ signal->pendingReason = kj::mv (pendingReason);
927+ } else {
928+ KJ_REQUIRE (reader.isAbortSignal (), " external table slot type does't match serialization tag" );
929+
930+ auto resolvedSignal = ioctx.getExternalPusher ()->unwrapAbortSignal (reader.getAbortSignal ());
902931
903- externalHandler->setLastStream (
904- kj::heap<AbortTriggerRpcServer>(kj::mv (paf.fulfiller ), kj::addRef (*pendingReason)));
905- signal->rpcAbortPromise = IoContext::current ().addObject (kj::heap (kj::mv (paf.promise )));
906- signal->pendingReason = kj::mv (pendingReason);
932+ signal->rpcAbortPromise = ioctx.addObject (kj::heap (kj::mv (resolvedSignal.signal )));
933+ signal->pendingReason = ioctx.addObject (kj::mv (resolvedSignal.reason ));
934+ }
907935
908936 return signal;
909937}
0 commit comments