Skip to main content

Frame Streams implementation in Python

Project description

Testing Build Pypi

Frame Streams implementation in Python

Frame Streams is a lightweight, binary-clean protocol that allows for the transport of arbitrarily encoded data payload sequences with minimal framing overhead.

This package provides a pure Python implementation based on https://github.com/farsightsec/fstrm/.

Installation

python 3.13.x python 3.12.x python 3.11.x python 3.10.x python 3.9.x python 3.8.x

This module can be installed from pypi website

pip install fstrm

Example

The example shows how to read raw data and decode-it with the fstrsm library.

import fstrm
import asyncio

class FstrmServerProtocol(asyncio.Protocol):
    def __init__(self, handshake, data_recv, content_type=b"plaintext"):
        self.fstrm = fstrm.FstrmCodec()
        self.content_type = content_type
        self.data_recv = data_recv
        self.handshake = handshake
        self.handshake_accept_done = False

    def connection_made(self, transport):
        self.transport = transport

    def data_received(self, data):
        if not self.handshake.done():
            if not self.handshake_accept_done:
                if self.fstrm.is_ctrlready(data):
                    self.transport.write(self.fstrm.encode_ctrlaccept(self.content_type))
                    self.handshake_accept_done = True
            else:
                if self.fstrm.is_ctrlstart(data):
                    self.handshake.set_result(True)
        else:
            payload = self.fstrm.is_data(data)
            # do someting with the payload...
            if payload:
                self.data_recv.set_result(payload)        

class FstrmClientProtocol(asyncio.Protocol):
    def __init__(self, handshake, content_type=b"plaintext"):
        self.fstrm = fstrm.FstrmCodec()
        self.content_type = content_type
        self.handshake = handshake
        self.transport = None

    def connection_made(self, transport):
        self.transport = transport
        self.transport.write(self.fstrm.encode_ctrlready(self.content_type))

    def data_received(self, data):
        if not self.handshake.done():
            if self.fstrm.is_ctrlaccept(data):
                self.transport.write(self.fstrm.encode_ctrlstart(self.content_type))
                self.handshake.set_result(True)

    def send_data(self, data):
        payload = self.fstrm.encode_data(data)
        self.transport.write(payload)

async def run():
    loop = asyncio.get_running_loop()

    # Create server and client
    data_recv = loop.create_future()
    hanshake_server = loop.create_future()
    server = await loop.create_server(lambda: FstrmServerProtocol(hanshake_server, data_recv), 'localhost', 8000)

    hanshake_client = loop.create_future()
    transport, client =  await loop.create_connection(lambda: FstrmClientProtocol(hanshake_client), 'localhost', 8000)

    # check handshake
    try:
        await asyncio.wait_for(hanshake_server, timeout=5)
    except asyncio.TimeoutError:
        raise Exception("handshake server failed")

    try:
        await asyncio.wait_for(hanshake_client, timeout=0.5)
    except asyncio.TimeoutError:
       raise Exception("handshake client failed")

    # ok, the client send some data
    data = b"some data..."
    client.send_data(data)

    # wait data on server side
    try:
        await asyncio.wait_for( data_recv, timeout=0.5)
    except asyncio.TimeoutError:
        raise Exception("data expected but failed")

    # Shut down server and client
    server.close()
    transport.close()

if __name__ == "__main__":
    asyncio.run(run())

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

fstrm-0.6.2.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fstrm-0.6.2-py3-none-any.whl (5.1 kB view details)

Uploaded Python 3

File details

Details for the file fstrm-0.6.2.tar.gz.

File metadata

  • Download URL: fstrm-0.6.2.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for fstrm-0.6.2.tar.gz
Algorithm Hash digest
SHA256 d1d456e9e1f1b9435b2bb2fa1115fafdb829daab61332cc14bf200a70796211e
MD5 0be5d852bc166a09dbb60b83ac18434a
BLAKE2b-256 2b46fd579759ba8f3fd3cf2455bf187d23bfc8372f38ea6e34f6231318e36531

See more details on using hashes here.

Provenance

The following attestation bundles were made for fstrm-0.6.2.tar.gz:

Publisher: pypi.yml on dmachard/python-framestream

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fstrm-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: fstrm-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 5.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for fstrm-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 11e28e00383d2c4b8a9e7b87d6292e4bb6290ed22664972dd4d6ad6575d413a6
MD5 e2dc9659a1294a9bf8a555afa8c19f49
BLAKE2b-256 4391f438953bac75630066141cc5b964ff5b2f40bacb42a0255c6bbb92c0d0ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for fstrm-0.6.2-py3-none-any.whl:

Publisher: pypi.yml on dmachard/python-framestream

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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