
Research
Security News
Lazarus Strikes npm Again with New Wave of Malicious Packages
The Socket Research Team has discovered six new malicious npm packages linked to North Korea’s Lazarus Group, designed to steal credentials and deploy backdoors.
fastapi-websocket-rpc
Advanced tools
A fast and durable bidirectional JSON RPC channel over Websockets and FastApi.
RPC over Websockets made easy, robust, and production ready
A fast and durable bidirectional JSON RPC channel over Websockets. The easiest way to create a live async channel between two nodes via Python (or other clients).
Both server and clients can easily expose Python methods that can be called by the other side. Method return values are sent back as RPC responses, which the other side can wait on.
Remote methods are easily called via the .other.method()
wrapper
Connections are kept alive with a configurable retry mechanism (using Tenacity)
As seen at PyCon IL 2021 and EuroPython 2021
Supports and tested on Python >= 3.9
pip install fastapi_websocket_rpc
Say the server exposes an "add" method, e.g. :
class RpcCalculator(RpcMethodsBase):
async def add(self, a, b):
return a + b
Calling it is as easy as calling the method under the client's "other" property:
response = await client.other.add(a=1,b=2)
print(response.result) # 3
getting the response with the return value.
import uvicorn
from fastapi import FastAPI
from fastapi_websocket_rpc import RpcMethodsBase, WebsocketRPCEndpoint
# Methods to expose to the clients
class ConcatServer(RpcMethodsBase):
async def concat(self, a="", b=""):
return a + b
# Init the FAST-API app
app = FastAPI()
# Create an endpoint and load it with the methods to expose
endpoint = WebsocketRPCEndpoint(ConcatServer())
# add the endpoint to the app
endpoint.register_route(app, "/ws")
# Start the server itself
uvicorn.run(app, host="0.0.0.0", port=9000)
import asyncio
from fastapi_websocket_rpc import RpcMethodsBase, WebSocketRpcClient
async def run_client(uri):
async with WebSocketRpcClient(uri, RpcMethodsBase()) as client:
# call concat on the other side
response = await client.other.concat(a="hello", b=" world")
# print result
print(response.result) # will print "hello world"
# run the client until it completes interaction with server
asyncio.get_event_loop().run_until_complete(
run_client("ws://localhost:9000/ws")
)
See the examples and tests folders for more server and client examples
client.other.method()
channel.other.method()
channel.other.method()
on_connect
).Websockets are ideal to create bi-directional realtime connections over the web.
RpcChannel - implements the RPC-protocol over the websocket
RpcMethods - classes passed to both client and server-endpoint inits to expose callable methods to the other side.
Foundations:
Based on asyncio for the power of Python coroutines
Server Endpoint:
Based on FAST-API: enjoy all the benefits of a full ASGI platform, including Async-io and dependency injections (for example to authenticate connections)
Based on Pydantic: easily serialize structured data as part of RPC requests and responses (see 'tests/basic_rpc_test.py :: test_structured_response' for an example)
Client :
fastapi-websocket-rpc provides a helper logging module to control how it produces logs for you.
See fastapi_websocket_rpc/logger.py.
Use logging_config.set_mode
or the 'WS_RPC_LOGGING' environment variable to choose the logging method you prefer or override completely via default logging config.
example:
# set RPC to log like UVICORN
from fastapi_websocket_rpc.logger import logging_config, LoggingModes
logging_config.set_mode(LoggingModes.UVICORN)
By default, fastapi-websocket-rpc uses websockets module as websocket client handler. This does not support HTTP(S) Proxy, see https://github.com/python-websockets/websockets/issues/364 . If the ability to use a proxy is important to, another websocket client implementation can be used, e.g. websocket-client (https://websocket-client.readthedocs.io). Here is how to use it. Installation:
pip install fastapi_websocket_rpc[websocket-client]
Then use websocket_client_handler_cls parameter:
import asyncio
from fastapi_websocket_rpc import RpcMethodsBase, WebSocketRpcClient, ProxyEnabledWebSocketClientHandler
async def run_client(uri):
async with WebSocketRpcClient(uri, RpcMethodsBase(), websocket_client_handler_cls = ProxyEnabledWebSocketClientHandler) as client:
Just set standard environment variables (lowercase and uppercase works): http_proxy, https_proxy, and no_proxy before running python script.
FAQs
A fast and durable bidirectional JSON RPC channel over Websockets and FastApi.
We found that fastapi-websocket-rpc demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
The Socket Research Team has discovered six new malicious npm packages linked to North Korea’s Lazarus Group, designed to steal credentials and deploy backdoors.
Security News
Socket CEO Feross Aboukhadijeh discusses the open web, open source security, and how Socket tackles software supply chain attacks on The Pair Program podcast.
Security News
Opengrep continues building momentum with the alpha release of its Playground tool, demonstrating the project's rapid evolution just two months after its initial launch.