Skip to main content

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

s_netkit-0.0.5.tar.gz (196.3 kB view details)

Uploaded Source

Built Distribution

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

s_netkit-0.0.5-py3-none-any.whl (138.2 kB view details)

Uploaded Python 3

File details

Details for the file s_netkit-0.0.5.tar.gz.

File metadata

  • Download URL: s_netkit-0.0.5.tar.gz
  • Upload date:
  • Size: 196.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

Hashes for s_netkit-0.0.5.tar.gz
Algorithm Hash digest
SHA256 5059af1153d7ab05198fb992970291de688a6b3e0adb54fed91fccecde3de8f8
MD5 404b6a861995d6f026d7c46585b0637c
BLAKE2b-256 9e09a17a61d93197419140c8d24f9d028475f1a56150eef6fddf213a110b045b

See more details on using hashes here.

File details

Details for the file s_netkit-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: s_netkit-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 138.2 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

Hashes for s_netkit-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7708eae820ab4f014018c69ea43d8aafe68ffb6b78d312a8d7d9deb51c776686
MD5 0b137a8f72817e5dd2991277b2dd93db
BLAKE2b-256 43ceae9d250a3b01812a04c6349fc86522d961223870caef59ffde47380e997b

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

0.0.22

2 files

0.0.21

2 files

0.0.20

2 files

0.0.19

2 files

0.0.18

2 files

0.0.17

2 files

0.0.16

2 files

0.0.15

2 files

0.0.11

2 files

0.0.10

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

This release

0.0.5 This release

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

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