Переиспользуемое ядро масштабируемой 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:target→Connector.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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
125beb965de52a7c379ebbb078ee7016cdd1e93ce82581a6a2181526746b3745
|
|
| MD5 |
26fc1b1e44ab7df29912a93b98511c70
|
|
| BLAKE2b-256 |
7572d76771f24527e91e35f13283f6c946e488d3689bf2f97c7fb66bb4887c1c
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbafe4ad6f91293c04edc349786b2e483d69d1abefccf8b65a0dab0094069196
|
|
| MD5 |
e592be3e5e36a14662d39e47fa187ca3
|
|
| BLAKE2b-256 |
2d5b17d66ba46052b600789551a0da025ca6ef726fdc40b946828a1b02c73c47
|