netkit (s-netkit)
Сетевой слой китов. Всё, чем интеграция разговаривает с чужим сервером:
транспорт, темп, живучесть, деградация. Ставится и работает без оркестратора —
зависимости идут строго вниз: netkit → corekit.
clikit adapterkit <- ветки-оболочки
\ /
librarykit <- ОРКЕСТРАТОР (сессии, браузер, склад)
|
netkit <- СЕТЬ (этот пакет)
|
corekit <- ОСНОВАНИЕ (значения и правила)
Что внутри
| модуль | ответственность |
|---|---|
netkit.transport |
исполнители запроса поверх httpx (async + sync близнец), choke-point HttpClient/SyncHttpClient, RestHttpClient к своему backend, permissive-рецепты |
netkit.stream |
persistent-каналы: StreamTransport, WS-реализация (extra [ws]) |
netkit.rpc |
codec-слой RPC: JsonCodec / PrefixedJsonCodec / RpcClient |
netkit.graphql |
GraphQL-клиент поверх транспорта кита |
netkit.limit |
RateLimiter + token-bucket: ПРОАКТИВНЫЙ темп, а не «поймал 429 — поспал» |
netkit.retry |
политики повторов: header-driven (RetryPolicy) и фиксированная (SimpleRetryPolicy) |
netkit.ladder |
лестница деградации: чем выполнять запросы и чем добывать состояние, память ступени, события спуска |
netkit.pagination / netkit.upload / netkit.forms |
листание ресурса, resumable-догрузка, form-urlencoded кодек |
netkit.errmap |
ответ сервера → доменная ошибка (декларативная таблица) |
netkit.declare |
объявление транспорта (http/ws/rpc/graphql) с ЕДИНЫМ поведением лимитов и повторов |
netkit.providers |
СЛОТЫ верхнего слоя: браузерный минт, склад состояния, диагностика, egress |
Объявить транспорт декларативно
Один и тот же лимит и одна и та же политика повторов — на любом виде транспорта. Интеграция объявляет, а не пишет обвязку:
from netkit.declare import KIND_HTTP, KIND_WS, TransportSpec, declare
from netkit.limit import LimitPolicy, LimitScope
from netkit.retry import SimpleRetryPolicy
limit = LimitPolicy(rate=5, per=1.0) # 5 обменов в секунду
retry = SimpleRetryPolicy(backoff=(0.0, 0.0)) # 2 повтора без пауз
scope = LimitScope(service="acme")
api = declare(TransportSpec(kind=KIND_HTTP, url="https://api.acme.io",
limit=limit, scope=scope, retry=retry))
live = declare(TransportSpec(kind=KIND_WS, channel=my_ws_channel,
limit=limit, scope=scope, retry=retry))
await api.call("GET", "/v1/items") # ждёт квоту, повторяет 429/5xx и сбои
await live.call('{"op":"ping"}') # ТОТ ЖЕ темп и ТЕ ЖЕ повторы — без своего кода
Свой вид (grpc, sse, …) добавляется register_kind(kind, builder) и сразу
получает то же поведение.
Слоты: как netkit зовёт то, что живёт выше
Последняя ступень лестницы поднимает браузер, а браузер — чужой кит, который сам зависит от сети. Прямой импорт дал бы цикл, поэтому направление разворачивается: netkit объявляет слот, верхний слой заполняет его на своём импорте.
from netkit.providers import SLOT_BROWSER_MINT, register_provider
register_provider(SLOT_BROWSER_MINT, my_mint_session)
Слоты со своим дефолтом (json_store, file_lock, state_root, path_slug,
transport_factory, diagnose, egress_proxy) никогда не роняют вызов — netkit
умеет их сам, верхний слой лишь уточняет. Слоты без дефолта (браузерные) при
обращении поднимают ProviderMissing с инструкцией: молчаливой деградации
«ступень тихо ничего не сделала» здесь нет.
Если в окружении стоит librarykit, его импорт заполняет все слоты сам —
отдельная регистрация не нужна.
Совместимость
librarykit остаётся фасадом: librarykit.transport, librarykit.ladder,
librarykit.limit, librarykit.retry, librarykit.pagination,
librarykit.upload, librarykit.forms, librarykit.rpc, librarykit.stream,
librarykit.graphql, librarykit.errmap реэкспортируют ТЕ ЖЕ объекты (не
копии) — isinstance / except / is работают через любой из путей.
Стоимость импорта
import netkit не исполняет ни одного подмодуля: ни httpx, ни stamina, ни
asyncio. Имена резолвятся по PEP 562 при первом обращении — платит тот, кому
нужно.
Установка
pip install s-netkit # ядро: corekit + httpx + stamina
pip install s-netkit[ws] # + websockets для WS-транспорта
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_netkit-0.0.6.tar.gz.
File metadata
- Download URL: s_netkit-0.0.6.tar.gz
- Upload date:
- Size: 199.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5275e6f650cf98a9463f60b2d8e09115df73c93b7b24b0ff48925dff600f7970
|
|
| MD5 |
11eb622cd2bb89552f0763bf758b15cf
|
|
| BLAKE2b-256 |
bb881f9881bb5718c772ca4939fd8fbf91369cb97cb86fdfaf3bb3a663f377b9
|
File details
Details for the file s_netkit-0.0.6-py3-none-any.whl.
File metadata
- Download URL: s_netkit-0.0.6-py3-none-any.whl
- Upload date:
- Size: 140.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ce953d302fcf19dac851ae7eabf29969ec95813268cf2bb9b1607bd87c91dac
|
|
| MD5 |
cb9aff811c34bd29b22eb3ef4dc9dec0
|
|
| BLAKE2b-256 |
0665e3dbda6bf8d05a734ab225f49ba33378e3cc0d73238c25456669c6366e59
|