diff --git a/src/client/services/rpc-client.ts b/src/client/services/rpc-client.ts index d7e668e4bed..d2d2779936d 100644 --- a/src/client/services/rpc-client.ts +++ b/src/client/services/rpc-client.ts @@ -176,12 +176,19 @@ export class RpcClient implements IRpcMethodRegistrar { } async unregisterMethod(methodName: string): Promise { - if (!this.jsonRpcServer.hasMethod(methodName)) return false; + if (!this.jsonRpcServer.hasMethod(methodName)) { + logger.warn(`Cannot unregister RPC method ${methodName}: not locally registered`); + return false; + } const mutex = this.registrationMutexMap.get(methodName); return mutex.runExclusive(async () => { - if (!this.jsonRpcServer.hasMethod(methodName)) return false; + if (!this.jsonRpcServer.hasMethod(methodName)) { + logger.warn(`Cannot unregister RPC method ${methodName}: not locally registered`); + return false; + } const successful = await this.jsonRpcClient.request(UNREGISTER_METHOD, [methodName]); if (successful) this.jsonRpcServer.removeMethod(methodName); + else logger.warn(`Remote failed to unregister RPC method ${methodName}`); return successful; }); } diff --git a/src/shared/services/network.service.ts b/src/shared/services/network.service.ts index 7b4cd188195..6c8a916ae86 100644 --- a/src/shared/services/network.service.ts +++ b/src/shared/services/network.service.ts @@ -317,9 +317,20 @@ export async function registerRequestHandler( if (requestHandlerOptions?.timeoutMilliseconds !== undefined) setTimeoutMsForRequestType(requestType, requestHandlerOptions.timeoutMilliseconds); return async () => { - if (!jsonRpc) return false; + if (!jsonRpc) { + // Expected on graceful shutdown: shutdown() clears jsonRpc before disposing emitters so their + // disposers skip this now-pointless unregister, so this fires on every normal quit — debug, + // not warn, to avoid spurious teardown noise (mirrors disposeNetworkEventEmitter's quiet + // !jsonRpc return). The genuine failure to warn about is the unregistered === false case below. + logger.debug( + `Skipping unregister of request handler for "${requestType}": jsonRpc is not set`, + ); + return false; + } removeTimeoutMsForRequestType(requestType); - return jsonRpc.unregisterMethod(requestType); + const unregistered = await jsonRpc.unregisterMethod(requestType); + if (!unregistered) logger.warn(`Failed to unregister request handler for "${requestType}"`); + return unregistered; }; }