Skip to main content
socketapi

GitHub License Tests Codecov PyPI - Python Version PyPI - Version Code style: black Linting: Ruff uv Starlette Pydantic Pytest Material for MkDocs

The main goal of SocketAPI is to provide an easy-to-use and flexible framework for building WebSocket APIs using Python. It leverages the power of Starlette for handling WebSocket connections and Pydantic for data validation and serialization. It uses a single multiplexed WebSocket connection, allowing clients to exchange different types of information through endpoint-like actions and channel subscriptions, defined similarly to routes in FastAPI. The framework is inspired by both FastAPI and Phoenix LiveView, combining familiar declarative endpoints with real-time, channel-oriented communication.

Installation

You can install SocketAPI using pip:

pip install socketapi

Simple example

Server

from socketapi import SocketAPI

app = SocketAPI()

# Define "add_numbers" action - endpoint for performing calculations
@app.action("add_numbers")
async def add_numbers(a: int, b: int) -> int:
    return a + b

# Define "chat" channel - subscription for receiving messages
@app.channel("chat")
async def chat_channel(message: str = "Welcome"):
    return {"message": message}

# Action that sends a message to all "chat" channel subscribers
@app.action("send_message")
async def send_message(message: str):
    await chat_channel(message=message)

Run the server with any ASGI server (e.g., Uvicorn):

uvicorn main:app --reload

Client Usage

Connect to the WebSocket endpoint at ws://localhost:8000/ and exchange JSON messages.

Calling an action (request-response pattern)

Send:

{"type": "action", "channel": "add_numbers", "data": {"a": 5, "b": 3}}

Receive:

{"type": "action", "channel": "add_numbers", "status": "completed", "data": 8}

Subscribing to a channel (pub/sub pattern)

Send:

{"type": "subscribe", "channel": "chat"}

Receive confirmation:

{"type": "subscribed", "channel": "chat"}

Broadcasting to channel subscribers

Send:

{"type": "action", "channel": "send_message", "data": {"message": "Hello everyone!"}}

Receive confirmation:

{"type": "action", "channel": "send_message", "status": "completed"}

All subscribers receive:

{"type": "data", "channel": "chat", "data": {"message": "Hello everyone!"}}

How it works:

  • Actions (@app.action) - endpoint-like, request-response pattern. Client sends a request and receives a response.
  • Channels (@app.channel) - pub/sub pattern. Client subscribes to a channel and automatically receives all data emitted to that channel.
  • Single WebSocket - all operations (actions, channels) work through a single WebSocket connection multiplexed via the channel field.

Documentation

The full documentation is available at spaceshaman.github.io/socketapi/

Features and Roadmap

  • Define actions with request-response pattern
  • Define channels with pub/sub pattern
  • Single multiplexed WebSocket connection
  • Pydantic models for data validation
  • Error handling and validation
  • Dependency injection system (like FastAPI)
  • Router class for splitting API into multiple files similar to FastAPI
  • Broadcasting messages from outside the server context by calling channel-decorated functions
  • Error reporting inside decorated handlers with automatic error messages sent to client

Changelog

Changes for each release are thoroughly documented in release notes

Contributing

Contributions are welcome! Feel free to open an issue or submit a pull request. I would like to keep the library to be safe as possible, so i would appreciate if you cover any new feature with tests to maintain 100% coverage.

Install in a development environment

  1. First, clone the repository:

    git clone git@github.com:SpaceShaman/socketapi.git
    
  2. Install uv if you don't have it:

    curl -LsSf https://astral.sh/uv/install.sh | sh
    
  3. Create a virtual environment and install the dependencies:

    cd socketapi
    uv sync
    

Run tests

You can run the tests with the following command:

uv run pytest

You can also run the tests with coverage:

uv run pytest --cov=socketapi

License

This project is licensed under the terms of the MIT license

Metadata

Release files for socketapi 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for socketapi 0.2.0
File Size Uploaded Provenance
socketapi-0.2.0.tar.gz 7.0 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for socketapi 0.2.0
File Interpreter ABI Platform
socketapi-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 16.5 kB

Release files / socketapi-0.2.0.tar.gz

Download URL socketapi-0.2.0.tar.gz
Size 7.0 kB
Tags Source
SHA-256 checksum
How to use checksums
7a8dbdc48fdf24337f1ab97b671639a79fde753655e603494304968304025e6e
BLAKE2b-256 checksum
How to use checksums
93b133617f336bf3483ce1bdc851ee57a3e806309ffcf6623894fa24abcf854a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / socketapi-0.2.0-py3-none-any.whl

Download URL socketapi-0.2.0-py3-none-any.whl
Size 9.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1f7bf4c43aaf3aa7174249c4c3106a247f67d87289fc09068c3ec164bb7c8315
BLAKE2b-256 checksum
How to use checksums
19a60a7954f0f1ef1fc94b7c382061ac78fa56fdfc18d53bc6f9242a61dfef6b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for socketapi 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page