Skip to main content

High-performance Python bindings for nng (nanomsg-next-gen) with built-in TLS support via Mbed TLS

Project description

nng

High-performance Python bindings for nng (nanomsg-next-gen), written in Cython.

Nanomsg-next-gen (NNG) is a messaging library written in C. It provides a small, consistent API for building distributed applications around a set of well-defined communication patterns: request-reply, publish-subscribe, pipeline, pair, survey, and bus. The library handles message framing, back-pressure, reconnection, and transport selection, so application code can focus on the protocol logic.

Table of contents

Why use a library like NNG rather than sockets directly?

The Python standard library has a lot of available functions for communicating with sockets between processes on the same or different computers.

Sockets are essentially data queues managed by the kernel and used to communicate between processes. When connecting to a website via TCP, or when receiving a video stream via UDP, you use sockets.

With the Python standard library, there are essentially two main ways to use sockets:

  • via the socket library.
  • via asyncio.

NNG provides an abstraction on top, enabling shorter and easier-to-read code. It provides a socket-like interface, except that:

  • The socket can listen on or bind to several interfaces at the same time.
  • It is possible to send or wait on a message before a peer has connected
  • Rather than handling individual connections with connected peers, you use a socket type that has implicit handling of peers. For instance a PUB socket will send a copy of any message sent to all connected peers.
  • Message semantics is directly handled (low level sockets are typically configured to receive a bytestream rather than messages). A background thread handles receiving incoming messages and queuing them (you need to quickly handle the reception of incoming messages to prevent blocking reception if the kernel queue is full).
  • Reconnection is handled automatically

Underneath, NNG is similar to a dedicated thread running asyncio. Both use epoll/kqueue/iocp to quickly detect sockets ready for reading/writing. It is programmed in C and fully thread-safe. Because it uses a dedicated thread, you can get asynchronous I/O without asyncio. submit_recv returns a future that resolves when a message is received. However this Python library also integrates NNG to an existing asyncio loop.

Don't use NNG if:

  • You want the lowest latency possible. In terms of latency, asyncio NNG (arecv) > raw asyncio > NNG (recv) > raw socket. If you want below, don't use Python. See PERFORMANCE.md for detailed benchmarks and interpretation.
  • You want to share heavy amount of data. NNG is based on TCP and similar, while for video streaming or remote desktop, UDP with custom handling of lost packets is more appropriate. For inter-process large data sharing, shared memory is preferred over named pipes/unix sockets (which NNG ipc uses), as they avoid kernel copies. If you don't need to maximize performance and can accept some data copies, NNG is appropriate though.
  • You need to integrate with another protocol (HTTP, custom, etc)

Use NNG if:

  • You are building distributed or multi-process applications and want well-defined message semantics without managing low-level socket details.
  • You need multiple communication patterns (request-reply, pub-sub, pipeline, pair, survey, bus) with a consistent, interchangeable API.
  • You want automatic reconnection, back-pressure, and message framing out of the box.
  • You want to mix blocking calls, asyncio coroutines, and concurrent.futures within the same codebase.
  • You need concurrent request handling on a server without the overhead of one thread per client (use contexts).
  • You want the same API for ipc, tcp or inproc endpoints
  • You don't want to manage each connection individually
  • You don't want to require asyncio to get asynchronous server/client connections, send/recv.

Why yet another Python wrapper for NNG?

Two Python wrappers for NNG already existed when this project was started.

My motivation for writing a third one came from practical experience with ZeroMQ. When looking for a first message library to experiment upon, it is quite natural to start with ZeroMQ, which is heavily used. However, what seemed simple on paper, lead to a lot of boilerplate to have things work properly. I was not satisfied and gave up on the topic for some time. After coming back on the topic, I decided to give NNG a try. However, the existing wrappers did not feel as complete as PyZMQ: docstrings were sparse, error handling was inconsistent, and there were no benchmarks to help make informed choices.

A more specific concern was asyncio overhead. The ZeroMQ Python bindings had measurable overhead in async code, which I had partially mitigated with a custom selector backed by zmq_poll. NNG's callback-based completion model seemed more amenable to tight asyncio integration. Achieving that level of integration requires Cython, which the other wrappers did not use.

The result is a library with:

  • Full type annotations and docstrings on all public symbols.
  • A .pyi stub file automatically generated from the compiled extension.
  • Synchronous send/recv, async (await), and thread-safe concurrent.futures variants on every socket and context.
  • Explicit error hierarchy: every nng error code maps to a typed Python exception.
  • Benchmarks of the various send/recv alternatives, with and without encryption.
  • Examples covering every communication pattern.

What I like about NNG

Having used both ZeroMQ and NNG, I found that ZeroMQ quickly pushes you toward ROUTER sockets everywhere, which removes constraints but adds significant complexity that is easy to get wrong (client failure handling, heartbeats, etc). NNG, by contrast, provides richer built-in socket behaviour and more flexibility. Need to handle several clients concurrently? Just open several contexts on the same socket. The context system is powerful and lightweight, and was well-designed to keep application logic simple.

Another key difference is that NNG is designed to be fully thread-safe. Closing a socket from another thread is safe and will simply cause pending operations to fail with NngClosed, making it much easier to write clean shutdown code without worrying about synchronization or cancellation. NNG also has built-in TLS support.

Installation

The package requires Python 3.11 or later and a C++ compiler. NNG is bundled as a submodule and compiled automatically.

pip install nng

For TLS support (tls+tcp://, wss://), install the pre-built package that bundles Mbed TLS:

pip install nng-ssl

The nng-ssl wheel is drop-in compatible with nng; the same import nng works for both. Install one or the other, not both.

To build from source:

git clone --recurse-submodules https://github.com/axeldavy/python-nng.git
cd python-nng
pip install .

See TLS support for instructions on enabling TLS at build time.

Quick start

REP / REQ

The REQ/REP pattern implements synchronous request-reply. The requester sends a message and blocks until a reply arrives. The replier receives one request at a time and must send exactly one reply before receiving the next.

import nng

# Server side (in a thread or separate process)
rep = nng.RepSocket()
rep.add_listener("tcp://127.0.0.1:5555").start()
while True:
    msg = rep.recv()
    rep.send(b"pong")

# Client side
req = nng.ReqSocket()
req.add_dialer("tcp://127.0.0.1:5555").start()
req.send(b"ping")
reply = req.recv()
print(reply)  # "pong"

To handle multiple clients concurrently on the server side without threads, open independent contexts. Each context maintains its own request-reply state machine:

import asyncio
import nng

async def handle(ctx: nng.Context) -> None:
    while True:
        msg = await ctx.arecv()
        await ctx.asend(b"pong")

async def main() -> None:
    rep = nng.RepSocket()
    rep.add_listener("tcp://127.0.0.1:5555").start()
    workers = [rep.open_context() for _ in range(8)]
    await asyncio.gather(*(handle(ctx) for ctx in workers))

PUB / SUB

The PUB/SUB pattern distributes messages from one publisher to any number of subscribers. Subscribers receive only messages whose body starts with a registered prefix.

import nng

# Publisher
pub = nng.PubSocket()
pub.add_listener("tcp://127.0.0.1:5556").start()
pub.send(b"news.sports result of the match")
pub.send(b"news.weather it will rain")

# Subscriber
sub = nng.SubSocket()
sub.add_dialer("tcp://127.0.0.1:5556").start()
sub.subscribe(b"news.sports")   # receive only sports messages
# sub.subscribe(b"")            # or subscribe to everything
msg = sub.recv()

There is no acknowledgment: if a subscriber cannot consume messages fast enough, the oldest messages in its buffer are dropped by default. The publisher is never blocked by a slow subscriber.

PUSH / PULL

The PUSH/PULL pattern distributes work items across a pool of workers. Each message goes to exactly one worker, chosen by load-balancing.

import nng

# Work distributor
push = nng.PushSocket()
push.add_listener("tcp://127.0.0.1:5557").start()
for i in range(100):
    push.send(f"task-{i}")

# Worker (run several of these in parallel)
pull = nng.PullSocket()
pull.add_dialer("tcp://127.0.0.1:5557").start()
while True:
    task = pull.recv()
    print("processing", task)

PAIR

The PAIR pattern connects exactly two sockets in a bidirectional channel. It is the simplest pattern: each side can send and receive freely. Once a peer has connected, no other peer can connect (even after a disconnect). This makes it ideal for in-process communication between threads, or for one-to-one protocols between processes.

import nng

srv = nng.PairSocket()
srv.add_listener("inproc://myapp").start()

cli = nng.PairSocket()
cli.add_dialer("inproc://myapp").start()

cli.send(b"hello")
print(srv.recv())  # "hello"

Async support

Every socket and context exposes three ways to send and receive:

Method Description
send / recv Blocking call. Releases the GIL while waiting.
asend / arecv Coroutines. Use with await inside an asyncio event loop.
submit_send / submit_recv Returns a concurrent.futures.Future, which resolves upon completion.

Note that it is possible to mix them, or call them concurrently from multiple threads. In addition it is worth noting that Ctrl-C is fully supported (unlike in some other libraries), even with send and recv.

import asyncio
import nng

async def main() -> None:
    rep = nng.RepSocket()
    rep.add_listener("tcp://127.0.0.1:5558").start()

    req = nng.ReqSocket()
    req.add_dialer("tcp://127.0.0.1:5558").start()

    await req.asend(b"hello")
    msg = await rep.arecv()
    await rep.asend(msg.to_bytes().upper())
    reply = await req.arecv()
    print(reply)  # "HELLO"

asyncio.run(main())

The library also provides async generators arecv_ready and asend_ready for advanced use; each yields once every time the socket transitions from not-ready to ready.

Transports

All transports are selected by URL scheme and are otherwise interchangeable from application code.

Scheme Description
tcp://host:port TCP/IP. Accepts both IPv4 and IPv6. Use tcp4:// or tcp6:// to force one version.
ipc:///path Unix domain sockets (POSIX) or named pipes (Windows).
inproc://name In-process communication within the same Python process. Zero-copy where possible.
abstract://name Linux abstract namespace sockets. Not persisted to the filesystem.
tls+tcp://host:port TCP with TLS. Requires a TLS-enabled build (see below).
ws://host:port/path WebSocket.
wss://host:port/path WebSocket over TLS.

Listeners bind to an address; dialers connect to one. The distinction is orthogonal to the protocol role: a REP socket can dial and a REQ socket can listen.

To bind to an ephemeral TCP port, pass port 0 in the listener URL. The assigned port can be retrieved from listener.port after start() returns.

Communication patterns

Socket pair Pattern Use case
ReqSocket / RepSocket Request-reply RPC, command-response
PubSocket / SubSocket Publish-subscribe Event fan-out, topic feeds
PushSocket / PullSocket Pipeline Task queues, stream processing
PairSocket / PairSocket Pair Bidirectional point-to-point channel
SurveyorSocket / RespondentSocket Survey Voting, service discovery
BusSocket / BusSocket Bus All-to-all broadcast mesh

Each pattern has well-defined send/recv semantics. Violating them — for instance calling send twice on a ReqSocket without an intervening recv — raises NngState.

TLS support

By default, nng is built without TLS support to keep the package pure MIT.

Pre-built wheel with TLS

The easiest way to get TLS support is the nng-ssl package on PyPI. It bundles Mbed TLS 4.1.0 (Apache-2.0 license) compiled as a static library and requires no extra system dependencies:

pip install nng-ssl

nng-ssl installs as the nng Python package, so existing code is unchanged. Do not install both nng and nng-ssl in the same environment.

Build from source with Mbed TLS (auto-fetched)

To build nng-ssl locally, Mbed TLS is downloaded and compiled automatically during the cmake configure step (internet access required at build time):

git clone --recurse-submodules https://github.com/axeldavy/python-nng.git
cd python-nng
cp builtin_tls/pyproject.toml pyproject.toml
pip install .

Build from source with a system TLS library

You can also build nng (not nng-ssl) against an independently installed TLS library:

# Mbed TLS (system-installed)
pip install . --config-settings "cmake.define.NNG_ENABLE_TLS=ON" --config-settings "cmake.define.NNG_TLS_ENGINE=mbed"

# OpenSSL
pip install . --config-settings "cmake.define.NNG_ENABLE_TLS=ON" --config-settings "cmake.define.NNG_TLS_ENGINE=openssl"

# wolfSSL
pip install . --config-settings "cmake.define.NNG_ENABLE_TLS=ON" --config-settings "cmake.define.NNG_TLS_ENGINE=wolf"

Once built, TLS connections use the tls+tcp:// scheme. Configuration is handled through TlsConfig:

import nng

srv_cfg = nng.TlsConfig.for_server(
    cert_pem=open("server.crt").read(),
    key_pem=open("server.key").read(),
    ca_pem=open("ca.crt").read(),       # required for mutual TLS
    auth_mode=nng.TLS_AUTH_REQUIRED,
    min_version=nng.TLS_VERSION_1_3,
)

rep = nng.RepSocket()
lst = rep.add_listener("tls+tcp://0.0.0.0:0", tls=srv_cfg)
lst.start()
print(f"listening on port {lst.port}")

Three authentication modes are available:

Constant Meaning
TLS_AUTH_NONE No peer certificate is requested.
TLS_AUTH_OPTIONAL A peer certificate is verified if presented.
TLS_AUTH_REQUIRED A peer certificate is required (mutual TLS). This is the default for clients.

TLS 1.2 and 1.3 are supported. The minimum and maximum protocol versions can be set via min_version and max_version using the TLS_VERSION_1_2 and TLS_VERSION_1_3 constants.

A comparison of plain, libsodium-encrypted, and TLS-encrypted throughput at various payload sizes is available in examples/PAIR/secure_subscriber/bench_overhead.py.

Performance

See PERFORMANCE.md for detailed benchmarks and interpretation.

In brief: on a local machine the async round-trip overhead (excluding cipher cost) is on the order of a few microseconds for inproc, and grows with transport cost for IPC and TCP. TLS throughput depends heavily on whether the TLS backend was compiled with hardware AES acceleration.

On the use of AI

Much of the writing has been assisted by AI (Claude Sonnet 4.6), in particular the benchmark code and the unit tests. I have 12 years of Python experience, and more in C/C++. I have written another Cython-based library DearCyGui. Thus while AI has been a great help, I have extensively reviewed, extended, and modified the code and documentation, and I am confident that the code is of good quality. If you find any issue, please open an issue or a PR.

License

python-nng is licensed under the MIT License. See LICENSE for more details.

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

nng_ssl-0.2.0.tar.gz (968.9 kB view details)

Uploaded Source

Built Distributions

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

nng_ssl-0.2.0-cp314-cp314t-win_amd64.whl (3.6 MB view details)

Uploaded CPython 3.14tWindows x86-64

nng_ssl-0.2.0-cp314-cp314t-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

nng_ssl-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

nng_ssl-0.2.0-cp314-cp314t-macosx_10_15_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

nng_ssl-0.2.0-cp314-cp314-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.14Windows x86-64

nng_ssl-0.2.0-cp314-cp314-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

nng_ssl-0.2.0-cp314-cp314-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

nng_ssl-0.2.0-cp314-cp314-macosx_10_15_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

nng_ssl-0.2.0-cp313-cp313t-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.13tWindows x86-64

nng_ssl-0.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ x86-64

nng_ssl-0.2.0-cp313-cp313t-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

nng_ssl-0.2.0-cp313-cp313t-macosx_10_15_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13tmacOS 10.15+ x86-64

nng_ssl-0.2.0-cp313-cp313-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.13Windows x86-64

nng_ssl-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

nng_ssl-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

nng_ssl-0.2.0-cp313-cp313-macosx_10_15_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13macOS 10.15+ x86-64

nng_ssl-0.2.0-cp312-cp312-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.12Windows x86-64

nng_ssl-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

nng_ssl-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

nng_ssl-0.2.0-cp312-cp312-macosx_10_15_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12macOS 10.15+ x86-64

nng_ssl-0.2.0-cp311-cp311-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.11Windows x86-64

nng_ssl-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

nng_ssl-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

nng_ssl-0.2.0-cp311-cp311-macosx_10_15_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11macOS 10.15+ x86-64

File details

Details for the file nng_ssl-0.2.0.tar.gz.

File metadata

  • Download URL: nng_ssl-0.2.0.tar.gz
  • Upload date:
  • Size: 968.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for nng_ssl-0.2.0.tar.gz
Algorithm Hash digest
SHA256 95268a50cd5db47aa8c3957acf59d6ff1fde6833d3abd661df296d99fe413228
MD5 3aaa99e03d779f1eaec36f5c51b061df
BLAKE2b-256 eb3b00c8a41338e952e959fd38e8356184c02beb2a4a11a9b017bc17f2a5c707

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: nng_ssl-0.2.0-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 3.6 MB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 c91b636d3407454dd9082d51a5b843562f270bb3f7a2a29daa6872651871ac76
MD5 0b359f2cf16064823dc96f40fb671a7f
BLAKE2b-256 20b1e9f158354547e794e6dd52ef9b3cc4c2886e66c612a8323fb837ce03bd8e

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 687a129d7134f3f6932abd42823fdfd8607b562dde545bc2833621aece825e93
MD5 74200fa8ee5d85627555e0c3821da2ee
BLAKE2b-256 3bc7ae6c24b5bfcd14196ed1f2d3bcb1be21d75c83d15acd2a6b3d450f1a927b

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 298e32a2f9106b8c1666670f8f492819f54bd83f3965911be14874135a790713
MD5 938993265007f50b485340592cc70d9d
BLAKE2b-256 a818c171181769229401e6fd8c2e571380b63a8e49070f4418d1e0f66b5989d7

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 9daf65e377570f37b8665642cd8b758ad95430e76179b44ce58ad32fcb94b38a
MD5 4b8d7c4e9edaba8e474777382779a15a
BLAKE2b-256 86a8baad3b29fbd45239221189d42376e499185c64e9a5570154a67b66da13ef

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: nng_ssl-0.2.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 16843ea70e00f8218d834837c7d446bdb53540bb99a46a0e69c77227dc6c4ac8
MD5 ea82a5c48f83e8c2e64dcd96a78a8abf
BLAKE2b-256 708e8886af459e6713ee2518393b115693698b8e1fbb539da1c89449560b9cb8

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3773b26f80bb327102e4e6a8581fb9de0a5bc74467dacb1ceb5883c9430db2af
MD5 b2148c919493c6f6f50021d4c81443c9
BLAKE2b-256 bb448b35dc36f1b2e8aab7e713884766a42b047e28caa3f608a214525a78e86c

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 068d1f76e0d0f9958db0e48c64fea876bef25a1d9d6149206402fd08572126ad
MD5 fd45d43583e46ab391969a7b6666c9f9
BLAKE2b-256 2a487fc0836c414690c373a5aa3b18237dd66349a238c3b882d9f2764338fc04

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 37fdfd855883873ebcfbcee1a746e08788c2f215b0c9e0ff0a71b1e3eeee5ac3
MD5 ea4985b494f97e4aa7468c99fa49bd82
BLAKE2b-256 01c72d5f2c47a89e26622a8d64ce87057333e2c273a2e1aa33c419f720761795

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: nng_ssl-0.2.0-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 5ba207cf6d681b9c064a582ba03d9be050ca215b5922aabba388f0d1f547cb5a
MD5 48fe81398f5243b2bef2050f32349700
BLAKE2b-256 f1464abf25104eb67bf6e9aad603a8f9607d60dae2eac5bc3ca7870c5649891a

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2b7d4821dcefa4515e84e566c33075d8610802222714a08899747cebe1896760
MD5 907fc0c5e69f6924882edf395b72cb0f
BLAKE2b-256 3c0d974c4e6b02ea7a34535b74083e6833671850589c1b802a0846807c900cd0

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 52e2632dcf8b141222875a158046188c6371393978517c59555f620203bb4d68
MD5 01b24dbd63ebdcbbbe9da212588d999e
BLAKE2b-256 9ce5507541cc13cba56424d7e61481971bc1b814a39a66968720214c77537b89

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6960b7904290e0a127d792df0d1b1949ea2cb10e21128493f9e8fe4c1f2cfb26
MD5 74e360aa61bff38fe88fa99f1c6663d6
BLAKE2b-256 9b0c1d719d3d410ac695120dc9d306cd1dc0e0fc4e380b1c993681dd073ffd35

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: nng_ssl-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 627971a75119c3a24e68742636dad8765abd60601e590e407e1e3baf3c7ef0e2
MD5 19fa16a71e7cf8318ca7d1bff323cf71
BLAKE2b-256 9c7d4029c607adba53a96035b79b56b37f833d2dc87b0af19a6daf703f683860

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ae94b5bca75d21f8eccc091b34989025b93855c5d3aac9154a4d508b67888d51
MD5 91648b68790f898a06bd41b62e1ecf7e
BLAKE2b-256 f07deae9d48c5f0504c19a1fe904aa3f590c053f3b0a674266d61cfa24e691bf

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 23fbafb078fa7951c1c6119527ae47435e61d1f4d0f9765465e7e1ea1ba47d16
MD5 03c8a5ceff9da7184f25c63c1162dac1
BLAKE2b-256 0ad7ec0926c4c90c0fe42cbb9fa5478b6804b33c58cbf9864fc8c39de39b8439

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f6f0f25b35a3f56454ae18ce937979bfb20d1f9434900d55c027cdac1545cc45
MD5 d539dc57741eb722f1c6a5b0973d52a7
BLAKE2b-256 3322a850fc8d30dc16b99d2c4e7e3ec4899465a3a99e956166e2b89bf12e4adb

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: nng_ssl-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for nng_ssl-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4b1ffdcecf47efeb902523f906c3ef4370acc4e7255cfc4bc1c9dde611fa60ea
MD5 d81963710cafcf0ddc139d53770ce189
BLAKE2b-256 9d000df59b7bb0b22f59bb0c64565eeb0d2b4bd23aa1168924c85f25bada7e88

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3c6e84c7a2d7f31cdf549e18cbb5a3c872907c83799af818fcc1cc05f31e4c3c
MD5 73718a241c5d1bbb8cf00783b79be979
BLAKE2b-256 56da08891eb766e8d0404fe1bfb7e67d6f858ec16c8b65eb8a41577256d22a49

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6ed2fa1e0efb11a9311e2af35508e88d82224575d5f2a5660c54435acfd6950
MD5 de9359d7deac19cd5838398380cbebae
BLAKE2b-256 c7c9f6e23914a888bc95d4f4548f568b275bca79679e7eb6faf45837d2f26902

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 2e2d437b3862cdd31562d900acaed513f43b20f7a281282028f0dca60ca93fd5
MD5 de1e2927af8aa92adf0d018703248284
BLAKE2b-256 9e8a61a5c20c9231694cd87d439b97a8222d8201b931f2727dfc7ee215dfec93

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: nng_ssl-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for nng_ssl-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c1d16063228dbbb4f784f1e609b08d8e0f66157e42637c0ee53c3b04f21e1a15
MD5 5903fdd758071992b30f8970c37b25af
BLAKE2b-256 5cb93d7b17d01ce237c1dffe9ff683c1fd7931d88a8b596b2df4bc3a586d3f20

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 026687c6f024125ec505b9292a3106245d79cb7aad6f534508cfd9e8fd978113
MD5 4a18dfd3e452a9df93f919f34650a15c
BLAKE2b-256 a7cd657cb6cea37d445f72fec704a68c26e8c5d479504ec34af9cbe2d9f7c84a

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 16cdc7694bafdb98898446c91aa7e034bda07b5c1158bcf7616b65e1be06e326
MD5 0f00f80c803e6ced529887062bbdd2cd
BLAKE2b-256 dc5369be6c9b0ccdef8a39307879e5d5836c3d277fe958aa1305876447b89673

See more details on using hashes here.

File details

Details for the file nng_ssl-0.2.0-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nng_ssl-0.2.0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 51dd80c9ac308a4e65f7e68e350a4d53e0dd4b9c046ca96786357f4e24ab62d8
MD5 c99c652fa2de662621cb42176faf362a
BLAKE2b-256 45c26698e8b25a1f659dc4f1ecfebd06d300650998987f38febde31104e9af69

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