server: fix bug where python async generator aclose is not called on rpc objects

This commit is contained in:
Koushik Dutta
2023-03-21 21:16:08 -07:00
parent b119e5ee00
commit 59008fb964
4 changed files with 27 additions and 11 deletions

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/server",
"version": "0.7.22",
"version": "0.7.23",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/server",
"version": "0.7.22",
"version": "0.7.23",
"license": "ISC",
"dependencies": {
"@mapbox/node-pre-gyp": "^1.0.10",

View File

@@ -1,13 +1,13 @@
import asyncio
import rpc
from rpc_reader import prepare_peer_readloop
from rpc_reader import prepare_peer_readloop, RpcFileTransport
import traceback
class Bar:
pass
async def main():
peer, peerReadLoop = await prepare_peer_readloop(loop, 4, 3)
peer, peerReadLoop = await prepare_peer_readloop(loop, RpcFileTransport(4, 3))
peer.params['foo'] = 3
jsoncopy = {}
jsoncopy[rpc.RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN] = True
@@ -35,8 +35,12 @@ async def main():
test = await peer.getParam('test')
print(test)
try:
async for c in test:
i = 0
async for c in await test():
print(c)
if i == 5:
break
i = i + 1
except:
traceback.print_exc()
print('all done iterating')

View File

@@ -79,6 +79,14 @@ class RpcProxy(object):
raise
raise Exception('RpcProxy is not an async iterable')
async def aclose(self):
if self.__dict__[RpcPeer.PROPERTY_PROXY_PROPERTIES] and 'Symbol(Symbol.asyncIterator)' in self.__dict__[RpcPeer.PROPERTY_PROXY_PROPERTIES]:
try:
return await RpcProxyMethod(self, self.__dict__[RpcPeer.PROPERTY_PROXY_PROPERTIES]['Symbol(Symbol.asyncIterator)']['return'])()
except RPCResultError as e:
pass
raise Exception('RpcProxy is not an async iterable')
def __getattr__(self, name):
if name == '__proxy_finalizer_id':
return self.dict['__proxy_entry']['finalizerId']

View File

@@ -1,9 +1,8 @@
import child_process from 'child_process';
import net from 'net';
import path from 'path';
import type { Readable, Writable } from "stream";
import { createDuplexRpcPeer } from '../src/rpc-serializer';
import assert from 'assert';
import net from 'net';
async function main() {
const server = net.createServer(client => {
@@ -21,12 +20,17 @@ async function main() {
const rpcPeer = createDuplexRpcPeer('node', 'python', cp.stdio[3] as Readable, cp.stdio[4] as Writable);
async function* test() {
yield 1;
yield 2;
yield 3;
try {
for (let i = 0; ; i++) {
yield i;
}
}
finally {
console.log('closed');
}
}
rpcPeer.params['test'] = test();
rpcPeer.params['test'] = test;
// const foo = await rpcPeer.getParam('foo');
// assert.equal(foo, 3);