Package: wsrpc-aiohttp
WSRPC aiohttpEasy to use minimal WebSocket Remote Procedure Call library for aiohttp
servers.Seeonline demoanddocumentationwith examples.FeaturesCall server functions from the client side;Call client functions from the server (for example to notify clients
about events);Async connection protocol: both server or client are able to call
several functions and get responses as soon as each response would
be ready in any order.Fully async server-side functions;Transfer any exceptions from a client side to the server side and
vise versa;Ready-to-use frontend-library without dependencies;Thread-based websocket handler for writing fully-synchronous backend
code (for synchronous database drivers etc.)Protected server-side methods (cliens are not able to call methods,
starting with underline directly);Signals for introspectionInstallationInstall via pip:pip install wsrpc-aiohttpYou may want to installoptionalujsonlibrary to speedup message
serialization/deserialization:pip install ujsonPython module provides client js library out of the box. But for pure
javascript applications you can installstandalone js client
libraryusing npm:npm install @wsrpc/clientUsageBackend code:importloggingfromtimeimporttimeimportaiohttp.webfromwsrpc_aiohttpimportRoute,STATIC_DIR,WebSocketRoute,decoratorslog=logging.getLogger(__name__)# This class can be called by client.# Connection object will have this class instance after calling route-alias.classTestRoute(Route):# This method will be executed when client calls route-alias# for the first time.definit(self,**kwargs):# Python __init__ must be return "self".# This method might return anything.returnkwargs# This method named by camelCase because the client can call it.@decorators.proxyasyncdefgetEpoch(self):# You can execute functions on the client sideawaitself.do_notify()returntime()# This method calls function on the client side@decorators.proxyasyncdefdo_notify(self):awesome='Somebody executed test1.getEpoch method!'awaitself.socket.call('notify',result=awesome)app=aiohttp.web.Application()app.router.add_route("*","/ws/",WebSocketAsync)# Websocket routeapp.router.add_static('/js',STATIC_DIR)# WSRPC js libraryapp.router.add_static('/',".")# Your static files# Stateful request# This is the route alias TestRoute as "test1"WebSocketAsync.add_route('test1',TestRoute)# Stateless requestWebSocketAsync.add_route('test2',lambda*a,**kw:True)if__name__=='__main__':logging.basicConfig(level=logging.DEBUG)aiohttp.web.run_app(app,port=8000)Frontend code:<scripttype="text/javascript"src="/js/wsrpc.min.js"></script><script>varurl=(window.location.protocol==="https):"?"wss://":"ws://")+window.location.host+'/ws/';RPC=newWSRPC(url,8000);// Configure client API, that can be called from serverRPC.addRoute('notify',function(data){console.log('Server called client route "notify":',data);returndata.result;});RPC.connect();// Call stateful route// After you call that route, server would execute 'notify' route on the// client, that is registered above.RPC.call('test1.getEpoch').then(function(data){console.log('Result for calling server route "test1.getEpoch": ',data);},function(error){alert(error);});// Call stateless methodRPC.call('test2').then(function(data){console.log('Result for calling server route "test2"',data);});</script>BuildJust run```bash
poetry run nox
```VersioningThis software followsSemantic Versioning