From c74f5c82c027149492e1cc3ea46f1e4cc0fe347f Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Fri, 14 Aug 2026 13:25:58 -0700 Subject: [PATCH] server/rpc: fix yielded async generator leak https://github.com/koush/scrypted/issues/2121 --- server/src/rpc.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/server/src/rpc.ts b/server/src/rpc.ts index a5ce1bbb8..fdfd97bbe 100644 --- a/server/src/rpc.ts +++ b/server/src/rpc.ts @@ -357,6 +357,13 @@ export class RpcPeer { return proxyProps?.next || 'next'; } + static getIteratorReturn(target: any): string | undefined { + if (!target[Symbol.asyncIterator]) + return undefined; + const proxyProps = target[this.PROPERTY_PROXY_PROPERTIES]?.[Symbol.asyncIterator.toString()]; + return proxyProps?.return || 'return'; + } + static prepareProxyProperties(value: any) { let props = value?.[RpcPeer.PROPERTY_PROXY_PROPERTIES]; if (!value[Symbol.asyncIterator]) @@ -760,7 +767,8 @@ export class RpcPeer { throw new Error(`target ${target?.constructor?.name} does not have method ${rpcApply.method}`); const isIteratorNext = RpcPeer.getIteratorNext(target) === rpcApply.method; - if (isIteratorNext) + const isIteratorReturn = RpcPeer.getIteratorReturn(target) === rpcApply.method; + if (isIteratorNext || isIteratorReturn) this.yieldedAsyncIterators.delete(target); value = await target[rpcApply.method](...args);