@@ -313,7 +313,9 @@ func (w *WshRpc) handleRequestInternal(req *RpcMessage, pprofCtx context.Context
313313 }
314314 respHandler .contextCancelFn .Store (& cancelFn )
315315 respHandler .ctx = withRespHandler (ctx , respHandler )
316- w .registerResponseHandler (req .ReqId , respHandler )
316+ if req .ReqId != "" {
317+ w .registerResponseHandler (req .ReqId , respHandler )
318+ }
317319 isAsync := false
318320 defer func () {
319321 panicErr := panichandler .PanicHandler ("handleRequest" , recover ())
@@ -502,7 +504,7 @@ func (handler *RpcRequestHandler) Context() context.Context {
502504 return handler .ctx
503505}
504506
505- func (handler * RpcRequestHandler ) SendCancel () {
507+ func (handler * RpcRequestHandler ) SendCancel (ctx context. Context ) error {
506508 defer func () {
507509 panichandler .PanicHandler ("SendCancel" , recover ())
508510 }()
@@ -512,8 +514,14 @@ func (handler *RpcRequestHandler) SendCancel() {
512514 AuthToken : handler .w .GetAuthToken (),
513515 }
514516 barr , _ := json .Marshal (msg ) // will never fail
515- handler .w .OutputCh <- barr
516- handler .finalize ()
517+ select {
518+ case handler .w .OutputCh <- barr :
519+ handler .finalize ()
520+ return nil
521+ case <- ctx .Done ():
522+ handler .finalize ()
523+ return fmt .Errorf ("timeout sending cancel" )
524+ }
517525}
518526
519527func (handler * RpcRequestHandler ) ResponseDone () bool {
@@ -607,24 +615,28 @@ func (handler *RpcResponseHandler) SendMessage(msg string) {
607615 Message : msg ,
608616 },
609617 AuthToken : handler .w .GetAuthToken (),
618+ Route : handler .source , // send back to source
610619 }
611620 msgBytes , _ := json .Marshal (rpcMsg ) // will never fail
612- handler .w .OutputCh <- msgBytes
621+ select {
622+ case handler .w .OutputCh <- msgBytes :
623+ case <- handler .ctx .Done ():
624+ }
613625}
614626
615627func (handler * RpcResponseHandler ) SendResponse (data any , done bool ) error {
616628 defer func () {
617629 panichandler .PanicHandler ("SendResponse" , recover ())
618630 }()
619- if handler .reqId == "" {
620- return nil // no response expected
621- }
622631 if handler .done .Load () {
623632 return fmt .Errorf ("request already done, cannot send additional response" )
624633 }
625634 if done {
626635 defer handler .close ()
627636 }
637+ if handler .reqId == "" {
638+ return nil
639+ }
628640 msg := & RpcMessage {
629641 ResId : handler .reqId ,
630642 Data : data ,
@@ -635,25 +647,35 @@ func (handler *RpcResponseHandler) SendResponse(data any, done bool) error {
635647 if err != nil {
636648 return err
637649 }
638- handler .w .OutputCh <- barr
639- return nil
650+ select {
651+ case handler .w .OutputCh <- barr :
652+ return nil
653+ case <- handler .ctx .Done ():
654+ return fmt .Errorf ("timeout sending response" )
655+ }
640656}
641657
642658func (handler * RpcResponseHandler ) SendResponseError (err error ) {
643659 defer func () {
644660 panichandler .PanicHandler ("SendResponseError" , recover ())
645661 }()
646- if handler .reqId == "" || handler . done .Load () {
662+ if handler .done .Load () {
647663 return
648664 }
649665 defer handler .close ()
666+ if handler .reqId == "" {
667+ return
668+ }
650669 msg := & RpcMessage {
651670 ResId : handler .reqId ,
652671 Error : err .Error (),
653672 AuthToken : handler .w .GetAuthToken (),
654673 }
655674 barr , _ := json .Marshal (msg ) // will never fail
656- handler .w .OutputCh <- barr
675+ select {
676+ case handler .w .OutputCh <- barr :
677+ case <- handler .ctx .Done ():
678+ }
657679}
658680
659681func (handler * RpcResponseHandler ) IsCanceled () bool {
@@ -675,11 +697,11 @@ func (handler *RpcResponseHandler) Finalize() {
675697 if handler .reqId != "" {
676698 handler .w .unregisterResponseHandler (handler .reqId )
677699 }
678- if handler .reqId == "" || handler . done .Load () {
700+ if handler .done .Load () {
679701 return
680702 }
703+ // SendResponse with done=true will call close() via defer, even when reqId is empty
681704 handler .SendResponse (nil , true )
682- handler .close ()
683705}
684706
685707func (handler * RpcResponseHandler ) IsDone () bool {
@@ -726,8 +748,13 @@ func (w *WshRpc) SendComplexRequest(command string, data any, opts *wshrpc.RpcOp
726748 return nil , err
727749 }
728750 handler .respCh = w .registerRpc (handler , command , opts .Route , handler .reqId )
729- w .OutputCh <- barr
730- return handler , nil
751+ select {
752+ case w .OutputCh <- barr :
753+ return handler , nil
754+ case <- handler .ctx .Done ():
755+ handler .finalize ()
756+ return nil , fmt .Errorf ("timeout sending request" )
757+ }
731758}
732759
733760func (w * WshRpc ) IsServerDone () bool {
0 commit comments