WSRPC aiohttp
Easy to use minimal WebSocket Remote Procedure Call library for aiohttp servers.
See online demo and documentation with examples.
Features
- Call 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 introspection
Installation
Install via pip:
pip install wsrpc-aiohttp
You may want to install optional ujson library to speedup message serialization/deserialization:
pip install ujson
Python module provides client js library out of the box. But for pure javascript applications you can install standalone js client library using npm:
npm install @wsrpc/client
Usage
Backend code:
import logging
from time import time
import aiohttp.web
from wsrpc_aiohttp import Route, STATIC_DIR, WebSocketRoute, decorators
log = logging.getLogger(__name__)
# This class can be called by client.
# Connection object will have this class instance after calling route-alias.
class TestRoute(Route):
# This method will be executed when client calls route-alias
# for the first time.
def init(self, **kwargs):
# Python __init__ must be return "self".
# This method might return anything.
return kwargs
# This method named by camelCase because the client can call it.
@decorators.proxy
async def getEpoch(self):
# You can execute functions on the client side
await self.do_notify()
return time()
# This method calls function on the client side
@decorators.proxy
async def do_notify(self):
awesome = 'Somebody executed test1.getEpoch method!'
await self.socket.call('notify', result=awesome)
app = aiohttp.web.Application()
app.router.add_route("*", "/ws/", WebSocketAsync) # Websocket route
app.router.add_static('/js', STATIC_DIR) # WSRPC js library
app.router.add_static('/', ".") # Your static files
# Stateful request
# This is the route alias TestRoute as "test1"
WebSocketAsync.add_route('test1', TestRoute)
# Stateless request
WebSocketAsync.add_route('test2', lambda *a, **kw: True)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
aiohttp.web.run_app(app, port=8000)
Frontend code:
<script type="text/javascript" src="/js/wsrpc.min.js"></script>
<script>
var url = (window.location.protocol==="https):"?"wss://":"ws://") + window.location.host + '/ws/';
RPC = new WSRPC(url, 8000);
// Configure client API, that can be called from server
RPC.addRoute('notify', function (data) {
console.log('Server called client route "notify":', data);
return data.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 method
RPC.call('test2').then(function (data) {
console.log('Result for calling server route "test2"', data);
});
</script>
Build
Just run
```bash
poetry run nox
```
Versioning
This software follows Semantic Versioning
Metadata
Release files for wsrpc-aiohttp 4.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wsrpc_aiohttp-4.0.4.tar.gz | 19.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wsrpc_aiohttp-4.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.8 kB
Release files / wsrpc_aiohttp-4.0.4.tar.gz
| Download URL | wsrpc_aiohttp-4.0.4.tar.gz |
|---|---|
| Size | 19.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
10c1364d254bd48b8206b63bb4b40ed285c99a2679664b7ed034526592e11437
|
|
BLAKE2b-256 checksum How to use checksums |
1ea8514ee243a5c206fc5da8a702d64a6cc7c749342df6ce8da9c078796b06d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.2 CPython/3.11.7 Darwin/24.4.0
|
Release files / wsrpc_aiohttp-4.0.4-py3-none-any.whl
| Download URL | wsrpc_aiohttp-4.0.4-py3-none-any.whl |
|---|---|
| Size | 22.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
816a667e592a57d26879ac81d6b1d748c5058592b14f5a60c6a9bb9eaf8ad0a3
|
|
BLAKE2b-256 checksum How to use checksums |
ff9a27f6d918aec00eb77af95eb627f5d988403d55893883f6a28babdb989320
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.2 CPython/3.11.7 Darwin/24.4.0
|