Skip to main content

WSRPC is the RPC over WebSocket for aiohttp

Project description

Travis CI Latest Version python wheel Python Versions license

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);

  • If ujson is installed, it would be used for message serialization/deserialization speedup.

Installation

Install via pip:

pip install wsrpc-aiohttp

Install ujson if you want:

pip install ujson

Usage

Backend code:

import logging
from time import time

import aiohttp.web
from wsrpc_aiohttp import WebSocketAsync, STATIC_DIR, WebSocketRoute


log = logging.getLogger(__name__)


# This class can be called by client.
# Connection object will have this class instance after calling route-alias.
class TestRoute(WebSocketRoute):
    # 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.
    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
    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>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wsrpc-aiohttp-2.2.2.tar.gz (28.6 kB view details)

Uploaded Source

Built Distribution

wsrpc_aiohttp-2.2.2-py3-none-any.whl (51.8 kB view details)

Uploaded Python 3

File details

Details for the file wsrpc-aiohttp-2.2.2.tar.gz.

File metadata

  • Download URL: wsrpc-aiohttp-2.2.2.tar.gz
  • Upload date:
  • Size: 28.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3

File hashes

Hashes for wsrpc-aiohttp-2.2.2.tar.gz
Algorithm Hash digest
SHA256 e0a06ec5a163a7bac4fb9620d0a89ed6573c59b03bca635fdd97f98819908d36
MD5 0f361b8b032853d5e396c5440e4226fc
BLAKE2b-256 b49427b5de21e2c784c5e5759a8523f8173c6dded4d9d938e65febccb03dd845

See more details on using hashes here.

File details

Details for the file wsrpc_aiohttp-2.2.2-py3-none-any.whl.

File metadata

  • Download URL: wsrpc_aiohttp-2.2.2-py3-none-any.whl
  • Upload date:
  • Size: 51.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3

File hashes

Hashes for wsrpc_aiohttp-2.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 54a39c3414386497eed890a078c64cdf6a97e100cad4b0370ce2af656d77493c
MD5 fc06f79061769539c6fe86b4af6f9aec
BLAKE2b-256 5f8ed537ce520ae1ea812b45d346bb342aac61c806dc25ef2da7fef23dda8ba0

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page