Skip to main content

Переиспользуемое ядро масштабируемой in-out архитектуры: 3-осевая композиция Transport × Connector × Service поверх s-librarykit. Generic Event + Router + DeliveryBus + Supervisor; белые API (токен/REST) и hidden (сессия/реверс) — единый контракт входящих/исходящих точек.

Project description

s-iokit

Переиспользуемое ядро масштабируемой in-out архитектуры: единая гибкая система входящих/исходящих точек подключения к сервисам. Работает и для белых API (токен/REST), и для hidden API (сессия/реверс/MTProto/антибот). Лёгкое внедрение одной строкой в любой инструмент (gateway, Бубликтор и др.).

Kit уровня adapterkit: тонкий слой поверх КОРНЯ s-librarykit (транспорт/ошибки/ config/sessions — оттуда, не дублируем). import-имя iokit, dist-имя s-iokit.

Три оси (Transport × Connector × Service)

Ось Модуль Отвечает за Реализации
Transport iokit.transport как получаем события PollingTransport, LongPollTransport, WebhookTransport
Connector iokit.connector как подключены + какой сервис TelegramBotConnector, …
Service iokit.service реестр сервисов + Endpoint (композиция) register_service, get_service

Оси развязаны: Transport не знает сервиса (тянет сырьё), Connector не знает механики транспорта (даёт poll()/parse()/send()), Service компонует. Один сервис — разные способы подключения без дублирования транспорта.

Generic Event

Ядро принимает любые события сервиса, не только чат: CRM-события (сделка/звонок/ лид), реакции, callback-кнопки — всё это InboundEvent с разным kind. MessageEvent — частный случай (текст/медиа).

from iokit import InboundEvent, MessageEvent, event_key

ev = MessageEvent(source="telegram", chat_id="100", user_id="7", text="привет")
event_key(ev)                      # "telegram:100:u7"

crm = InboundEvent(source="bitrix", kind="crm", actor="deal:42", payload={"stage": "won"})

Лёгкое встраивание

from iokit import ConnectorConfig, Endpoint, EventRouter, serve

async def handle(event, ctx):
    return f"эхо: {event.text}"

router = EventRouter().add_rule(handle, kind="message")

endpoint = Endpoint(
    service="telegram",
    connection_mode="bot",
    transport="long-poll",   # или "webhook" — ОДИН коннектор, оба транспорта
    config=ConnectorConfig("telegram", credentials={"token": "<BOT_TOKEN>"}),
)

await serve([endpoint], router)   # одна строка
  • EventRouter — правила match(kind/pattern/predicate) → Handler. iokit нейтрален: handler'ы реализует потребитель (агент / инструмент / custom-сценарий).
  • DeliveryBus — единый outbound: адрес name:targetConnector.send.
  • Supervisor / serve — рантайм нескольких endpoint'ов параллельно + один общий webhook-listener (роутинг по path).

Нейтральность к credentials

iokit не знает про пул аккаунтов — потребитель передаёт токен/сессию из СВОЕГО источника через ConnectorConfig(credentials=...). Секреты не попадают в repr/логи.

Установка (co-разработка с librarykit)

uv sync --extra dev              # ядро + тесты (librarykit editable из ../librarykit)
uv sync --extra webhook          # + встроенный ASGI webhook-listener (uvicorn)
uv run python -m pytest -q

Ядро лёгкое: import iokit не требует ни browser/antibot/ws extra librarykit, ни webhook extra iokit. Webhook-сервер (uvicorn) тянется LAZY только при serve/ WebhookTransport.start().

Расширение — новый сервис

from iokit import Capabilities, register_service

class MyConnector:
    name = "myservice"
    service = "myservice"
    connection_mode = "app"
    capabilities = Capabilities(text=True)
    allowed_transports = ("polling",)
    def parse(self, raw): ...
    async def poll(self): ...            # для pull-транспортов
    async def send(self, target, reply, **kw): ...
    async def aclose(self): ...

register_service("myservice", lambda cfg: MyConnector(),
                 allowed_transports=("polling",), connection_modes=("app",))

Также поддержан автодискавери через entry-points группы iokit.services.

Лицензия

MIT © Dmitry

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

s_iokit-0.1.0.tar.gz (55.8 kB view details)

Uploaded Source

Built Distribution

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

s_iokit-0.1.0-py3-none-any.whl (53.6 kB view details)

Uploaded Python 3

File details

Details for the file s_iokit-0.1.0.tar.gz.

File metadata

  • Download URL: s_iokit-0.1.0.tar.gz
  • Upload date:
  • Size: 55.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for s_iokit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 125beb965de52a7c379ebbb078ee7016cdd1e93ce82581a6a2181526746b3745
MD5 26fc1b1e44ab7df29912a93b98511c70
BLAKE2b-256 7572d76771f24527e91e35f13283f6c946e488d3689bf2f97c7fb66bb4887c1c

See more details on using hashes here.

File details

Details for the file s_iokit-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: s_iokit-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 53.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for s_iokit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fbafe4ad6f91293c04edc349786b2e483d69d1abefccf8b65a0dab0094069196
MD5 e592be3e5e36a14662d39e47fa187ca3
BLAKE2b-256 2d5b17d66ba46052b600789551a0da025ca6ef726fdc40b946828a1b02c73c47

See more details on using hashes here.

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