@@ -621,22 +621,23 @@ class WritableStreamController {
621621 public:
622622 // When a Writer is locked to a controller, the controller will attach itself to the writer,
623623 // passing along the closed and ready promises that will be used to communicate state to the
624- // user code.
624+ // user code. LazyPromise is used to defer the creation of the V8 Promise until the promise
625+ // is actually accessed by JavaScript.
625626 //
626627 // The controller is guaranteed to either outlive the Writer or will detach the Writer so the
627628 // WritableStreamController& reference should always remain valid.
628629 virtual void attach (jsg::Lock& js,
629630 WritableStreamController& controller,
630- jsg::Promise <void > closedPromise,
631- jsg::Promise <void > readyPromise) = 0;
631+ jsg::LazyPromise <void > closedPromise,
632+ jsg::LazyPromise <void > readyPromise) = 0;
632633
633634 // When a Writer lock is released, the controller will signal to the writer that is has been
634635 // detached.
635636 virtual void detach () = 0;
636637
637638 // The ready promise can be replaced whenever backpressure is signaled by the underlying
638639 // controller.
639- virtual void replaceReadyPromise (jsg::Lock& js, jsg::Promise <void > readyPromise) = 0;
640+ virtual void replaceReadyPromise (jsg::Lock& js, jsg::LazyPromise <void > readyPromise) = 0;
640641 };
641642
642643 struct PendingAbort {
@@ -831,8 +832,8 @@ class WriterLocked {
831832 public:
832833 static constexpr kj::StringPtr NAME KJ_UNUSED = " writer-locked" _kj;
833834 WriterLocked (WritableStreamController::Writer& writer,
834- jsg::Promise <void >::Resolver closedFulfiller,
835- kj::Maybe<jsg::Promise <void >::Resolver> readyFulfiller = kj::none)
835+ jsg::LazyPromise <void >::Resolver closedFulfiller,
836+ kj::Maybe<jsg::LazyPromise <void >::Resolver> readyFulfiller = kj::none)
836837 : writer(writer),
837838 closedFulfiller (kj::mv(closedFulfiller)),
838839 readyFulfiller(kj::mv(readyFulfiller)) {}
@@ -852,15 +853,15 @@ class WriterLocked {
852853 return KJ_ASSERT_NONNULL (writer);
853854 }
854855
855- kj::Maybe<jsg::Promise <void >::Resolver>& getClosedFulfiller () {
856+ kj::Maybe<jsg::LazyPromise <void >::Resolver>& getClosedFulfiller () {
856857 return closedFulfiller;
857858 }
858859
859- kj::Maybe<jsg::Promise <void >::Resolver>& getReadyFulfiller () {
860+ kj::Maybe<jsg::LazyPromise <void >::Resolver>& getReadyFulfiller () {
860861 return readyFulfiller;
861862 }
862863
863- void setReadyFulfiller (jsg::Lock& js, jsg::PromiseResolverPair <void >& pair) {
864+ void setReadyFulfiller (jsg::Lock& js, jsg::LazyPromiseResolverPair <void >& pair) {
864865 KJ_IF_SOME (w, writer) {
865866 readyFulfiller = kj::mv (pair.resolver );
866867 w.replaceReadyPromise (js, kj::mv (pair.promise ));
@@ -880,8 +881,8 @@ class WriterLocked {
880881
881882 private:
882883 kj::Maybe<WritableStreamController::Writer&> writer;
883- kj::Maybe<jsg::Promise <void >::Resolver> closedFulfiller;
884- kj::Maybe<jsg::Promise <void >::Resolver> readyFulfiller;
884+ kj::Maybe<jsg::LazyPromise <void >::Resolver> closedFulfiller;
885+ kj::Maybe<jsg::LazyPromise <void >::Resolver> readyFulfiller;
885886};
886887
887888template <typename T>
@@ -911,6 +912,34 @@ void maybeRejectPromise(jsg::Lock& js,
911912 }
912913}
913914
915+ // LazyPromise resolver overloads
916+ template <typename T>
917+ void maybeResolvePromise (
918+ jsg::Lock& js, kj::Maybe<typename jsg::LazyPromise<T>::Resolver>& maybeResolver, T&& t) {
919+ KJ_IF_SOME (resolver, maybeResolver) {
920+ resolver.resolve (js, kj::fwd<T>(t));
921+ maybeResolver = kj::none;
922+ }
923+ }
924+
925+ inline void maybeResolvePromise (
926+ jsg::Lock& js, kj::Maybe<typename jsg::LazyPromise<void >::Resolver>& maybeResolver) {
927+ KJ_IF_SOME (resolver, maybeResolver) {
928+ resolver.resolve (js);
929+ maybeResolver = kj::none;
930+ }
931+ }
932+
933+ template <typename T>
934+ void maybeRejectPromise (jsg::Lock& js,
935+ kj::Maybe<typename jsg::LazyPromise<T>::Resolver>& maybeResolver,
936+ v8::Local<v8::Value> reason) {
937+ KJ_IF_SOME (resolver, maybeResolver) {
938+ resolver.reject (js, jsg::Value (js.v8Isolate , reason));
939+ maybeResolver = kj::none;
940+ }
941+ }
942+
914943template <typename T>
915944jsg::Promise<T> rejectedMaybeHandledPromise (
916945 jsg::Lock& js, v8::Local<v8::Value> reason, bool handled) {
0 commit comments