Skip to content

Repository files navigation

hrpc-python

Python code generation for HRPC: emits a typed Python RPC class that drives bare-rpc-python, with type codecs from hyperschema-python. The Python analog of hrpc-swift.

Usage

const Hyperschema = require('hyperschema-python')
const HRPC = require('hrpc-python')

// after registering schema types and rpc commands:
Hyperschema.toDisk(schema, './spec/python')
HRPC.toDisk(hrpc, './spec/python')
// writes ./spec/python/{schema.py, hrpc.json, hrpc.py}

The generated hrpc.py exposes an HRPC class: rpc = HRPC(send, resolve) (pass schema.resolve), then await rpc.<command>(request) for unary calls and rpc.on_<command>(handler) to serve them. Send (fire-and-forget), response-stream, request-stream, and duplex commands are generated too - see Streams below.

Streams

Stream chunks are typed dicts (encoded/decoded through the schema type).

Response-stream - client sends args, reads a stream of responses:

stream = await hrpc.feed({"count": 3})
async for chunk in stream:
    print(chunk["seq"])

# server
async def on_feed(request, outgoing):
    for i in range(request["count"]):
        await outgoing.write({"seq": i})
    await outgoing.end()

hrpc.on_feed(on_feed)

Request-stream - client streams requests, awaits one reply:

outgoing, reply = await hrpc.upload()
await outgoing.write({"seq": 1})
await outgoing.end()
result = await reply

# server
async def on_upload(incoming):
    total = 0
    async for chunk in incoming:
        total += chunk["seq"]
    return {"total": total}

hrpc.on_upload(on_upload)

Duplex - both sides stream:

outgoing, incoming = await hrpc.chat()
await outgoing.write({"n": 1})
await outgoing.end()
async for chunk in incoming:
    print(chunk["label"])

# server
async def on_chat(incoming, outgoing):
    async for chunk in incoming:
        await outgoing.write({"label": "n" + str(chunk["n"])})
    await outgoing.end()

hrpc.on_chat(on_chat)

About

Python code generation for HRPC

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages