You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.1 KiB
Python

import asyncio
import functools
import os
import random
import threading
from .asyncio.client import Client as AClient
from .asyncio.rpc import Rpc as ARpc
from .client import Client
from .rpc import Rpc
class RpcEndpoint:
def __init__(self, rpc, endpoints, get_endpoints, target):
self.__rpc = rpc
self.__endpoints = list(endpoints)
self.__get_endpoints = get_endpoints
self.__target = target
def refresh_endpoint(self):
return self.__get_endpoints(self.__target)
def __getattr__(self, name):
return functools.partial(getattr(self.__rpc, name), target=random.choice(self.__endpoints))
def set_endpoints(self, endpoints):
self.__endpoints = list(endpoints)
class AsyncHelper:
def __init__(self, uri):
self.bus = AClient(uri, f'python.dynamic.caller.{os.urandom(3).hex()}')
self.rpc = ARpc(self.bus)
self.locker = asyncio.Lock()
async def get_endpoints(self, target):
async with self.locker:
endpoints = {await self.rpc.get_worker(f'js.{target}.api') for _ in range(10)}
return endpoints
async def enter(self, target):
if not self.bus.connected:
async with self.locker:
if not self.bus.connected:
await self.bus.connect()
return RpcEndpoint(self.rpc, await self.get_endpoints(target), self.get_endpoints, target)
async def close(self):
await self.bus.disconnect()
class Helper:
def __init__(self, uri):
self.bus = Client(uri, f'python.dynamic.caller.{os.urandom(3).hex()}')
self.rpc = Rpc(self.bus)
self.locker = threading.Lock()
def get_endpoints(self, target):
with self.locker:
endpoints = {self.rpc.get_worker(f'js.{target}.api') for _ in range(10)}
return endpoints
def enter(self, target):
if not self.bus.connected:
with self.locker:
if not self.bus.connected:
self.bus.connect()
return RpcEndpoint(self.rpc, self.get_endpoints(target), self.get_endpoints, target)
def close(self):
self.bus.disconnect()