tigrbl-atoms 0.4.4.dev1__tar.gz → 0.4.4.dev8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/PKG-INFO +4 -2
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/README.md +2 -1
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/pyproject.toml +3 -1
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/asgi_send.py +129 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/framing/codec.py +19 -7
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/__init__.py +28 -0
- tigrbl_atoms-0.4.4.dev8/tigrbl_atoms/atoms/sys/handler_close_session.py +30 -0
- tigrbl_atoms-0.4.4.dev8/tigrbl_atoms/atoms/sys/handler_close_stream.py +30 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_custom.py +4 -0
- tigrbl_atoms-0.4.4.dev8/tigrbl_atoms/atoms/sys/handler_open_bidi_stream.py +30 -0
- tigrbl_atoms-0.4.4.dev8/tigrbl_atoms/atoms/sys/handler_open_unidi_stream.py +30 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/runtime_channel.py +6 -3
- tigrbl_atoms-0.4.4.dev1/tigrbl_atoms/fallback.py +0 -12
- tigrbl_atoms-0.4.4.dev1/tigrbl_atoms/rust.py +0 -29
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/LICENSE +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/NOTICE +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/_ctx.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/_opview_helpers.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/_request.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/algebra.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/_temp.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/_scheduler.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/_types.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/abort_group.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/admit.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/await_seal.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/cleanup.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/commit.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/dedupe.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/error_project.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/execute.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/precommit_validate.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/prepare_execute.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/reject_admission.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/result_slots.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/scheduler.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/seal_check.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/tx_begin.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dep/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dep/_param_resolver.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dep/extra.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dep/security.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/binding_match.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/binding_parse.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/input_normalize.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/op_resolve.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/envelope_apply.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/headers_apply.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/http_finalize.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/out_dump.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/result_normalize.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/to_transport_response.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/emit/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/emit/paired_post.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/emit/paired_pre.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/emit/readtime_alias.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/err/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/err/classify.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/err/ctx_build.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/err/rollback.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/err/transport_shape.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/fanout/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/fanout/emit_many.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/fanout/shape.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/framing/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/framing/app_frame.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/hot/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/hot/slots.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/ingress/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/ingress/ctx_init.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/ingress/input_prepare.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/ingress/transport_extract.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/intent/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/intent/build.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/intent/final_group_key.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/intent/prekey.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/out/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/out/masking.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/refresh/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/refresh/demand.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/resolve/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/resolve/assemble.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/resolve/paired_gen.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/error_to_transport.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/headers_from_payload.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/negotiate.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/negotiation.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/render.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/renderer.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/template.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/templates.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/schema/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/schema/collect_in.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/schema/collect_out.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/storage/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/storage/to_stored.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/_db.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/_oltp_context.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/commit_tx.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_aggregate.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_append_chunk.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_create.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_delete.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_merge.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_replace.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_update.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_checkpoint.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_clear.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_count.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_create.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_delete.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_download.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_exists.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_group_by.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_list.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_merge.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_noop.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_persistence.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_publish.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_read.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_replace.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_send_datagram.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_subscribe.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_tail.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_update.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_upload.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_well_known.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/phase_db.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/start_tx.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/asgi_channel.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/completion_fence.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/sink_bind.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/unit_capture.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/websocket_unary.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/wire/__init__.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/wire/build_in.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/wire/build_out.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/wire/dump.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/wire/validate_in.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/client_session_coverage.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/events.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/packed_inputs.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/phases.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/protocol_runtime.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/protocol_scope.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/runtime_callbacks.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/runtime_loop_regions.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/runtime_resume.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/runtime_transactions.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/stages.py +0 -0
- {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/types.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl-atoms
|
|
3
|
-
Version: 0.4.4.
|
|
3
|
+
Version: 0.4.4.dev8
|
|
4
4
|
Summary: Runtime atom package for Tigrbl stages, phases, typed contexts, event anchors, protocol execution, and composable pipeline algebra.
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -236,6 +236,7 @@ Requires-Dist: tigrbl-core
|
|
|
236
236
|
Requires-Dist: tigrbl-ops-olap
|
|
237
237
|
Requires-Dist: tigrbl-ops-oltp
|
|
238
238
|
Requires-Dist: tigrbl-ops-realtime
|
|
239
|
+
Requires-Dist: tigrbl-ops-webtransport
|
|
239
240
|
Requires-Dist: tigrbl-typing
|
|
240
241
|
Requires-Dist: typing-extensions (>=4.0)
|
|
241
242
|
Project-URL: Discord, https://discord.gg/K4YTAPapjR
|
|
@@ -337,7 +338,7 @@ Package catalog:
|
|
|
337
338
|
|
|
338
339
|
- Import roots: `tigrbl_atoms`.
|
|
339
340
|
- Public symbols: `EGRESS_PHASES`, `EdgeTarget`, `ErrorCtx`, `HANDLER_PHASES`, `HookPhase`, `HookPhases`, `HookPredicate`, `INGRESS_PHASES`, `PHASE_SEQUENCE`, `PhaseTreeEdge`, `PhaseTreeNode`, `StepFn`.
|
|
340
|
-
- Workspace dependencies: [`tigrbl-ops-oltp`](https://pypi.org/project/tigrbl-ops-oltp/), [`tigrbl-ops-olap`](https://pypi.org/project/tigrbl-ops-olap/), [`tigrbl-ops-realtime`](https://pypi.org/project/tigrbl-ops-realtime/), [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-typing`](https://pypi.org/project/tigrbl-typing/).
|
|
341
|
+
- Workspace dependencies: [`tigrbl-ops-oltp`](https://pypi.org/project/tigrbl-ops-oltp/), [`tigrbl-ops-olap`](https://pypi.org/project/tigrbl-ops-olap/), [`tigrbl-ops-realtime`](https://pypi.org/project/tigrbl-ops-realtime/), [`tigrbl-ops-webtransport`](https://pypi.org/project/tigrbl-ops-webtransport/), [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-typing`](https://pypi.org/project/tigrbl-typing/).
|
|
341
342
|
- External runtime dependencies: `jinja2>=3.1`, `sqlalchemy>=2.0`, `typing-extensions>=4.0`.
|
|
342
343
|
|
|
343
344
|
## Lifecycle Phases
|
|
@@ -449,6 +450,7 @@ Choose `tigrbl-atoms` when the quick-answer table matches your use case. Choose
|
|
|
449
450
|
- [`tigrbl-ops-oltp`](https://pypi.org/project/tigrbl-ops-oltp/)
|
|
450
451
|
- [`tigrbl-ops-olap`](https://pypi.org/project/tigrbl-ops-olap/)
|
|
451
452
|
- [`tigrbl-ops-realtime`](https://pypi.org/project/tigrbl-ops-realtime/)
|
|
453
|
+
- [`tigrbl-ops-webtransport`](https://pypi.org/project/tigrbl-ops-webtransport/)
|
|
452
454
|
- [`tigrbl-core`](https://pypi.org/project/tigrbl-core/)
|
|
453
455
|
- [`tigrbl-typing`](https://pypi.org/project/tigrbl-typing/)
|
|
454
456
|
- [`tigrbl`](https://pypi.org/project/tigrbl/)
|
|
@@ -90,7 +90,7 @@ Package catalog:
|
|
|
90
90
|
|
|
91
91
|
- Import roots: `tigrbl_atoms`.
|
|
92
92
|
- Public symbols: `EGRESS_PHASES`, `EdgeTarget`, `ErrorCtx`, `HANDLER_PHASES`, `HookPhase`, `HookPhases`, `HookPredicate`, `INGRESS_PHASES`, `PHASE_SEQUENCE`, `PhaseTreeEdge`, `PhaseTreeNode`, `StepFn`.
|
|
93
|
-
- Workspace dependencies: [`tigrbl-ops-oltp`](https://pypi.org/project/tigrbl-ops-oltp/), [`tigrbl-ops-olap`](https://pypi.org/project/tigrbl-ops-olap/), [`tigrbl-ops-realtime`](https://pypi.org/project/tigrbl-ops-realtime/), [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-typing`](https://pypi.org/project/tigrbl-typing/).
|
|
93
|
+
- Workspace dependencies: [`tigrbl-ops-oltp`](https://pypi.org/project/tigrbl-ops-oltp/), [`tigrbl-ops-olap`](https://pypi.org/project/tigrbl-ops-olap/), [`tigrbl-ops-realtime`](https://pypi.org/project/tigrbl-ops-realtime/), [`tigrbl-ops-webtransport`](https://pypi.org/project/tigrbl-ops-webtransport/), [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-typing`](https://pypi.org/project/tigrbl-typing/).
|
|
94
94
|
- External runtime dependencies: `jinja2>=3.1`, `sqlalchemy>=2.0`, `typing-extensions>=4.0`.
|
|
95
95
|
|
|
96
96
|
## Lifecycle Phases
|
|
@@ -202,6 +202,7 @@ Choose `tigrbl-atoms` when the quick-answer table matches your use case. Choose
|
|
|
202
202
|
- [`tigrbl-ops-oltp`](https://pypi.org/project/tigrbl-ops-oltp/)
|
|
203
203
|
- [`tigrbl-ops-olap`](https://pypi.org/project/tigrbl-ops-olap/)
|
|
204
204
|
- [`tigrbl-ops-realtime`](https://pypi.org/project/tigrbl-ops-realtime/)
|
|
205
|
+
- [`tigrbl-ops-webtransport`](https://pypi.org/project/tigrbl-ops-webtransport/)
|
|
205
206
|
- [`tigrbl-core`](https://pypi.org/project/tigrbl-core/)
|
|
206
207
|
- [`tigrbl-typing`](https://pypi.org/project/tigrbl-typing/)
|
|
207
208
|
- [`tigrbl`](https://pypi.org/project/tigrbl/)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tigrbl-atoms"
|
|
3
|
-
version = "0.4.4.
|
|
3
|
+
version = "0.4.4.dev8"
|
|
4
4
|
description = "Runtime atom package for Tigrbl stages, phases, typed contexts, event anchors, protocol execution, and composable pipeline algebra."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
@@ -54,6 +54,7 @@ dependencies = [
|
|
|
54
54
|
"tigrbl-ops-oltp",
|
|
55
55
|
"tigrbl-ops-olap",
|
|
56
56
|
"tigrbl-ops-realtime",
|
|
57
|
+
"tigrbl-ops-webtransport",
|
|
57
58
|
"tigrbl-core",
|
|
58
59
|
"tigrbl-typing",
|
|
59
60
|
"jinja2>=3.1",
|
|
@@ -73,6 +74,7 @@ Issues = "https://github.com/tigrbl/tigrbl/issues"
|
|
|
73
74
|
"tigrbl-ops-oltp" = { workspace = true }
|
|
74
75
|
"tigrbl-ops-olap" = { workspace = true }
|
|
75
76
|
"tigrbl-ops-realtime" = { workspace = true }
|
|
77
|
+
"tigrbl-ops-webtransport" = { workspace = true }
|
|
76
78
|
"tigrbl-core" = { workspace = true }
|
|
77
79
|
"tigrbl-typing" = { workspace = true }
|
|
78
80
|
|
|
@@ -225,6 +225,19 @@ async def _send_transport_response(env: Any, ctx: Any) -> None:
|
|
|
225
225
|
egress["response_sent"] = True
|
|
226
226
|
return
|
|
227
227
|
|
|
228
|
+
stream_binding = _find_http_stream_binding(ctx)
|
|
229
|
+
if stream_binding is not None and body_obj is not None:
|
|
230
|
+
await _send_http_stream_response(
|
|
231
|
+
env,
|
|
232
|
+
ctx,
|
|
233
|
+
status=status,
|
|
234
|
+
headers=headers,
|
|
235
|
+
body_obj=body_obj,
|
|
236
|
+
binding=stream_binding,
|
|
237
|
+
)
|
|
238
|
+
egress["response_sent"] = True
|
|
239
|
+
return
|
|
240
|
+
|
|
228
241
|
if isinstance(body_obj, Mapping) and set(body_obj.keys()) == {"body"}:
|
|
229
242
|
nested = body_obj.get("body")
|
|
230
243
|
if isinstance(nested, (bytes, bytearray)):
|
|
@@ -293,6 +306,109 @@ def _json_bytes(obj: Any) -> bytes:
|
|
|
293
306
|
).encode("utf-8")
|
|
294
307
|
|
|
295
308
|
|
|
309
|
+
def _find_http_stream_binding(ctx: Any) -> Any | None:
|
|
310
|
+
model = getattr(ctx, "model", None)
|
|
311
|
+
alias = getattr(ctx, "op", None) or getattr(ctx, "method", None)
|
|
312
|
+
if model is None or not isinstance(alias, str):
|
|
313
|
+
return None
|
|
314
|
+
|
|
315
|
+
request_path = str(getattr(ctx, "path", "") or "")
|
|
316
|
+
ops = tuple(getattr(getattr(model, "ops", None), "all", ()) or ())
|
|
317
|
+
fallback = None
|
|
318
|
+
for spec in ops:
|
|
319
|
+
if getattr(spec, "alias", None) != alias:
|
|
320
|
+
continue
|
|
321
|
+
for binding in tuple(getattr(spec, "bindings", ()) or ()):
|
|
322
|
+
proto = str(getattr(binding, "proto", "") or "")
|
|
323
|
+
if proto not in {"http.stream", "https.stream"}:
|
|
324
|
+
continue
|
|
325
|
+
if fallback is None:
|
|
326
|
+
fallback = binding
|
|
327
|
+
binding_path = str(getattr(binding, "path", "") or "")
|
|
328
|
+
if request_path and binding_path == request_path:
|
|
329
|
+
return binding
|
|
330
|
+
return fallback
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def _stream_chunk_source(payload: Any) -> Any:
|
|
334
|
+
if isinstance(payload, Mapping):
|
|
335
|
+
chunks = payload.get("chunks")
|
|
336
|
+
if chunks is not None:
|
|
337
|
+
return chunks
|
|
338
|
+
chunk = payload.get("chunk")
|
|
339
|
+
if chunk is not None:
|
|
340
|
+
return (chunk,)
|
|
341
|
+
return (payload,)
|
|
342
|
+
if isinstance(payload, (bytes, bytearray, memoryview, str)):
|
|
343
|
+
return (payload,)
|
|
344
|
+
if isinstance(payload, (list, tuple)):
|
|
345
|
+
return tuple(payload)
|
|
346
|
+
if hasattr(payload, "__aiter__"):
|
|
347
|
+
return payload
|
|
348
|
+
if hasattr(payload, "__iter__"):
|
|
349
|
+
return payload
|
|
350
|
+
return (payload,)
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def _frame_stream_chunk(item: Any, *, framing: str, index: int, ctx: Any) -> bytes:
|
|
354
|
+
if framing in {"bytes", "binary"}:
|
|
355
|
+
return _coerce_body_bytes(item)
|
|
356
|
+
if framing == "text":
|
|
357
|
+
return (item if isinstance(item, str) else str(item)).encode("utf-8")
|
|
358
|
+
if framing == "jsonrpc":
|
|
359
|
+
model = getattr(ctx, "model", None)
|
|
360
|
+
model_name = getattr(model, "__name__", "Stream")
|
|
361
|
+
alias = getattr(ctx, "op", None) or getattr(ctx, "method", None) or "chunk"
|
|
362
|
+
item = {
|
|
363
|
+
"jsonrpc": "2.0",
|
|
364
|
+
"method": f"{model_name}.{alias}.chunk",
|
|
365
|
+
"params": {"index": index, "data": item},
|
|
366
|
+
}
|
|
367
|
+
return _json_bytes(item) + b"\n"
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
async def _send_http_stream_response(
|
|
371
|
+
env: Any,
|
|
372
|
+
ctx: Any,
|
|
373
|
+
*,
|
|
374
|
+
status: int,
|
|
375
|
+
headers: list[tuple[bytes, bytes]],
|
|
376
|
+
body_obj: Any,
|
|
377
|
+
binding: Any,
|
|
378
|
+
) -> None:
|
|
379
|
+
from ...protocol_runtime import iter_items
|
|
380
|
+
|
|
381
|
+
framing = str(getattr(binding, "framing", "stream") or "stream")
|
|
382
|
+
headers = [(k, v) for k, v in headers if k.lower() != b"content-length"]
|
|
383
|
+
if not any(k.lower() == b"content-type" for k, _ in headers):
|
|
384
|
+
media_type = {
|
|
385
|
+
"bytes": "application/octet-stream",
|
|
386
|
+
"binary": "application/octet-stream",
|
|
387
|
+
"text": "text/plain; charset=utf-8",
|
|
388
|
+
"jsonrpc": "application/json",
|
|
389
|
+
}.get(framing, "application/x-ndjson")
|
|
390
|
+
headers.append((b"content-type", media_type.encode("latin-1")))
|
|
391
|
+
await env.send(
|
|
392
|
+
{"type": "http.response.start", "status": status, "headers": headers}
|
|
393
|
+
)
|
|
394
|
+
index = 0
|
|
395
|
+
async for item in iter_items(_stream_chunk_source(body_obj)):
|
|
396
|
+
await env.send(
|
|
397
|
+
{
|
|
398
|
+
"type": "http.response.body",
|
|
399
|
+
"body": _frame_stream_chunk(
|
|
400
|
+
item,
|
|
401
|
+
framing=framing,
|
|
402
|
+
index=index,
|
|
403
|
+
ctx=ctx,
|
|
404
|
+
),
|
|
405
|
+
"more_body": True,
|
|
406
|
+
}
|
|
407
|
+
)
|
|
408
|
+
index += 1
|
|
409
|
+
await env.send({"type": "http.response.body", "body": b"", "more_body": False})
|
|
410
|
+
|
|
411
|
+
|
|
296
412
|
async def _send_response_like(env: Any, resp: Any) -> None:
|
|
297
413
|
status = int(getattr(resp, "status_code", 200) or 200)
|
|
298
414
|
headers = list(getattr(resp, "raw_headers", ()) or ())
|
|
@@ -391,6 +507,19 @@ async def _run(obj: object | None, ctx: Any) -> None:
|
|
|
391
507
|
egress["response_sent"] = True
|
|
392
508
|
return
|
|
393
509
|
|
|
510
|
+
stream_binding = _find_http_stream_binding(ctx)
|
|
511
|
+
if stream_binding is not None and body_obj is not None:
|
|
512
|
+
await _send_http_stream_response(
|
|
513
|
+
raw,
|
|
514
|
+
ctx,
|
|
515
|
+
status=status,
|
|
516
|
+
headers=_headers_to_asgi(_to_headers_mapping(headers)),
|
|
517
|
+
body_obj=body_obj,
|
|
518
|
+
binding=stream_binding,
|
|
519
|
+
)
|
|
520
|
+
egress["response_sent"] = True
|
|
521
|
+
return
|
|
522
|
+
|
|
394
523
|
if isinstance(body_obj, (bytes, bytearray, memoryview)):
|
|
395
524
|
body = _coerce_body_bytes(body_obj)
|
|
396
525
|
elif body_obj is None:
|
|
@@ -7,7 +7,11 @@ from email import policy
|
|
|
7
7
|
from email.parser import BytesParser
|
|
8
8
|
from typing import Any
|
|
9
9
|
|
|
10
|
-
from tigrbl_core._spec.binding_spec import
|
|
10
|
+
from tigrbl_core._spec.binding_spec import (
|
|
11
|
+
framing_kind,
|
|
12
|
+
framing_spec_from_kind,
|
|
13
|
+
validate_webtransport_inner_framing,
|
|
14
|
+
)
|
|
11
15
|
|
|
12
16
|
_BYTES_TYPES = (bytes, bytearray, memoryview)
|
|
13
17
|
_WEBSOCKET_FRAME_TYPES = {"websocket.receive", "websocket.send"}
|
|
@@ -482,10 +486,14 @@ def encode_webtransport_inner_frame(
|
|
|
482
486
|
framing: str | None,
|
|
483
487
|
payload: Any,
|
|
484
488
|
) -> bytes:
|
|
485
|
-
selected = validate_webtransport_inner_framing(
|
|
486
|
-
|
|
489
|
+
selected = validate_webtransport_inner_framing(
|
|
490
|
+
lane=lane,
|
|
491
|
+
inner_framing=framing_spec_from_kind(framing),
|
|
492
|
+
)
|
|
493
|
+
selected_kind = framing_kind(selected)
|
|
494
|
+
if not selected_kind:
|
|
487
495
|
return _as_bytes(payload, "webtransport")
|
|
488
|
-
return encode_frame(
|
|
496
|
+
return encode_frame(selected_kind, payload)
|
|
489
497
|
|
|
490
498
|
|
|
491
499
|
def decode_webtransport_inner_frame(
|
|
@@ -494,10 +502,14 @@ def decode_webtransport_inner_frame(
|
|
|
494
502
|
framing: str | None,
|
|
495
503
|
payload: bytes | bytearray | str,
|
|
496
504
|
) -> Any:
|
|
497
|
-
selected = validate_webtransport_inner_framing(
|
|
498
|
-
|
|
505
|
+
selected = validate_webtransport_inner_framing(
|
|
506
|
+
lane=lane,
|
|
507
|
+
inner_framing=framing_spec_from_kind(framing),
|
|
508
|
+
)
|
|
509
|
+
selected_kind = framing_kind(selected)
|
|
510
|
+
if not selected_kind:
|
|
499
511
|
return _as_bytes(payload, "webtransport")
|
|
500
|
-
return decode_frame(
|
|
512
|
+
return decode_frame(selected_kind, payload)
|
|
501
513
|
|
|
502
514
|
|
|
503
515
|
__all__ = [
|
|
@@ -10,6 +10,8 @@ from . import handler_bulk_replace as _handler_bulk_replace
|
|
|
10
10
|
from . import handler_bulk_update as _handler_bulk_update
|
|
11
11
|
from . import handler_checkpoint as _handler_checkpoint
|
|
12
12
|
from . import handler_clear as _handler_clear
|
|
13
|
+
from . import handler_close_session as _handler_close_session
|
|
14
|
+
from . import handler_close_stream as _handler_close_stream
|
|
13
15
|
from . import handler_count as _handler_count
|
|
14
16
|
from . import handler_create as _handler_create
|
|
15
17
|
from . import handler_delete as _handler_delete
|
|
@@ -20,6 +22,8 @@ from . import handler_group_by as _handler_group_by
|
|
|
20
22
|
from . import handler_list as _handler_list
|
|
21
23
|
from . import handler_merge as _handler_merge
|
|
22
24
|
from . import handler_noop as _handler_noop
|
|
25
|
+
from . import handler_open_bidi_stream as _handler_open_bidi_stream
|
|
26
|
+
from . import handler_open_unidi_stream as _handler_open_unidi_stream
|
|
23
27
|
from . import handler_append_chunk as _handler_append_chunk
|
|
24
28
|
from . import handler_persistence as _handler_persistence
|
|
25
29
|
from . import handler_publish as _handler_publish
|
|
@@ -125,6 +129,30 @@ _ORDERED: Tuple[Tuple[str, str, str, RunFn], ...] = (
|
|
|
125
129
|
_handler_checkpoint.ANCHOR,
|
|
126
130
|
_handler_checkpoint.INSTANCE,
|
|
127
131
|
),
|
|
132
|
+
(
|
|
133
|
+
"sys",
|
|
134
|
+
"handler_open_bidi_stream",
|
|
135
|
+
_handler_open_bidi_stream.ANCHOR,
|
|
136
|
+
_handler_open_bidi_stream.INSTANCE,
|
|
137
|
+
),
|
|
138
|
+
(
|
|
139
|
+
"sys",
|
|
140
|
+
"handler_open_unidi_stream",
|
|
141
|
+
_handler_open_unidi_stream.ANCHOR,
|
|
142
|
+
_handler_open_unidi_stream.INSTANCE,
|
|
143
|
+
),
|
|
144
|
+
(
|
|
145
|
+
"sys",
|
|
146
|
+
"handler_close_stream",
|
|
147
|
+
_handler_close_stream.ANCHOR,
|
|
148
|
+
_handler_close_stream.INSTANCE,
|
|
149
|
+
),
|
|
150
|
+
(
|
|
151
|
+
"sys",
|
|
152
|
+
"handler_close_session",
|
|
153
|
+
_handler_close_session.ANCHOR,
|
|
154
|
+
_handler_close_session.INSTANCE,
|
|
155
|
+
),
|
|
128
156
|
("sys", "commit_tx", _commit_tx.ANCHOR, _commit_tx.INSTANCE),
|
|
129
157
|
)
|
|
130
158
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import tigrbl_ops_webtransport as _core
|
|
6
|
+
|
|
7
|
+
from ... import events as _ev
|
|
8
|
+
from ...stages import Operated, Resolved
|
|
9
|
+
from ...types import Atom, Ctx, OperatedCtx
|
|
10
|
+
from . import _oltp_context as _ctx
|
|
11
|
+
|
|
12
|
+
ANCHOR = _ev.SYS_HANDLER_PERSISTENCE
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def _run(obj: object | None, ctx: Any) -> None:
|
|
16
|
+
setattr(ctx, "result", await _core.close_session(_ctx.payload(ctx)))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AtomImpl(Atom[Resolved, Operated, Exception]):
|
|
20
|
+
name = "sys.handler_close_session"
|
|
21
|
+
anchor = ANCHOR
|
|
22
|
+
|
|
23
|
+
async def __call__(self, obj: object | None, ctx: Ctx[Resolved]) -> Ctx[Operated]:
|
|
24
|
+
await _run(obj, ctx)
|
|
25
|
+
return ctx.promote(OperatedCtx)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
INSTANCE = AtomImpl()
|
|
29
|
+
|
|
30
|
+
__all__ = ["ANCHOR", "INSTANCE"]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import tigrbl_ops_webtransport as _core
|
|
6
|
+
|
|
7
|
+
from ... import events as _ev
|
|
8
|
+
from ...stages import Operated, Resolved
|
|
9
|
+
from ...types import Atom, Ctx, OperatedCtx
|
|
10
|
+
from . import _oltp_context as _ctx
|
|
11
|
+
|
|
12
|
+
ANCHOR = _ev.SYS_HANDLER_PERSISTENCE
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def _run(obj: object | None, ctx: Any) -> None:
|
|
16
|
+
setattr(ctx, "result", await _core.close_stream(_ctx.payload(ctx)))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AtomImpl(Atom[Resolved, Operated, Exception]):
|
|
20
|
+
name = "sys.handler_close_stream"
|
|
21
|
+
anchor = ANCHOR
|
|
22
|
+
|
|
23
|
+
async def __call__(self, obj: object | None, ctx: Ctx[Resolved]) -> Ctx[Operated]:
|
|
24
|
+
await _run(obj, ctx)
|
|
25
|
+
return ctx.promote(OperatedCtx)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
INSTANCE = AtomImpl()
|
|
29
|
+
|
|
30
|
+
__all__ = ["ANCHOR", "INSTANCE"]
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_custom.py
RENAMED
|
@@ -42,6 +42,8 @@ class BoundAtom(Atom[Resolved, Operated, Exception]):
|
|
|
42
42
|
self.name = name
|
|
43
43
|
|
|
44
44
|
async def __call__(self, obj: object | None, ctx: Ctx[Resolved]) -> Ctx[Operated]:
|
|
45
|
+
if getattr(ctx, "result", None) is not None:
|
|
46
|
+
return ctx.promote(OperatedCtx)
|
|
45
47
|
result = self._fn(obj, ctx)
|
|
46
48
|
if inspect.isawaitable(result):
|
|
47
49
|
result = await result
|
|
@@ -58,6 +60,8 @@ class AtomImpl(Atom[Resolved, Operated, Exception]):
|
|
|
58
60
|
anchor = ANCHOR
|
|
59
61
|
|
|
60
62
|
async def __call__(self, obj: object | None, ctx: Ctx[Resolved]) -> Ctx[Operated]:
|
|
63
|
+
if getattr(ctx, "result", None) is not None:
|
|
64
|
+
return ctx.promote(OperatedCtx)
|
|
61
65
|
fn = _resolve_handler(obj, ctx)
|
|
62
66
|
if fn is None:
|
|
63
67
|
return ctx.promote(OperatedCtx)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import tigrbl_ops_webtransport as _core
|
|
6
|
+
|
|
7
|
+
from ... import events as _ev
|
|
8
|
+
from ...stages import Operated, Resolved
|
|
9
|
+
from ...types import Atom, Ctx, OperatedCtx
|
|
10
|
+
from . import _oltp_context as _ctx
|
|
11
|
+
|
|
12
|
+
ANCHOR = _ev.SYS_HANDLER_PERSISTENCE
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def _run(obj: object | None, ctx: Any) -> None:
|
|
16
|
+
setattr(ctx, "result", await _core.open_bidi_stream(_ctx.payload(ctx)))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AtomImpl(Atom[Resolved, Operated, Exception]):
|
|
20
|
+
name = "sys.handler_open_bidi_stream"
|
|
21
|
+
anchor = ANCHOR
|
|
22
|
+
|
|
23
|
+
async def __call__(self, obj: object | None, ctx: Ctx[Resolved]) -> Ctx[Operated]:
|
|
24
|
+
await _run(obj, ctx)
|
|
25
|
+
return ctx.promote(OperatedCtx)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
INSTANCE = AtomImpl()
|
|
29
|
+
|
|
30
|
+
__all__ = ["ANCHOR", "INSTANCE"]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import tigrbl_ops_webtransport as _core
|
|
6
|
+
|
|
7
|
+
from ... import events as _ev
|
|
8
|
+
from ...stages import Operated, Resolved
|
|
9
|
+
from ...types import Atom, Ctx, OperatedCtx
|
|
10
|
+
from . import _oltp_context as _ctx
|
|
11
|
+
|
|
12
|
+
ANCHOR = _ev.SYS_HANDLER_PERSISTENCE
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def _run(obj: object | None, ctx: Any) -> None:
|
|
16
|
+
setattr(ctx, "result", await _core.open_unidi_stream(_ctx.payload(ctx)))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AtomImpl(Atom[Resolved, Operated, Exception]):
|
|
20
|
+
name = "sys.handler_open_unidi_stream"
|
|
21
|
+
anchor = ANCHOR
|
|
22
|
+
|
|
23
|
+
async def __call__(self, obj: object | None, ctx: Ctx[Resolved]) -> Ctx[Operated]:
|
|
24
|
+
await _run(obj, ctx)
|
|
25
|
+
return ctx.promote(OperatedCtx)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
INSTANCE = AtomImpl()
|
|
29
|
+
|
|
30
|
+
__all__ = ["ANCHOR", "INSTANCE"]
|
|
@@ -5,7 +5,10 @@ from collections.abc import Mapping
|
|
|
5
5
|
from enum import IntEnum
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
|
-
from tigrbl_core._spec.binding_spec import
|
|
8
|
+
from tigrbl_core._spec.binding_spec import (
|
|
9
|
+
framing_spec_from_kind,
|
|
10
|
+
validate_webtransport_inner_framing,
|
|
11
|
+
)
|
|
9
12
|
|
|
10
13
|
UINT8_MAX_STREAMS = 256
|
|
11
14
|
UINT16_MAX_STREAMS = 65_536
|
|
@@ -557,7 +560,7 @@ def _validate_stream_payload(
|
|
|
557
560
|
raise ValueError("client_to_server unidirectional streams cannot be send events")
|
|
558
561
|
validate_webtransport_inner_framing(
|
|
559
562
|
lane=lane,
|
|
560
|
-
inner_framing=payload.get("framing"),
|
|
563
|
+
inner_framing=framing_spec_from_kind(payload.get("framing")),
|
|
561
564
|
)
|
|
562
565
|
projection = {
|
|
563
566
|
"family": "stream",
|
|
@@ -591,7 +594,7 @@ def _validate_datagram_payload(
|
|
|
591
594
|
_forbid(payload, "stream_id", "stream_direction", "stream_initiator", "lane_id")
|
|
592
595
|
validate_webtransport_inner_framing(
|
|
593
596
|
lane="datagram",
|
|
594
|
-
inner_framing=payload.get("framing"),
|
|
597
|
+
inner_framing=framing_spec_from_kind(payload.get("framing")),
|
|
595
598
|
)
|
|
596
599
|
return {"family": "datagram", "lane": "datagram", "exchange": "bidirectional_stream"}
|
|
597
600
|
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from collections.abc import Callable
|
|
4
|
-
from typing import Any
|
|
5
|
-
import warnings
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def _raise_deprecated(name: str) -> str:
|
|
9
|
-
warnings.warn(
|
|
10
|
-
"tigrbl_atoms Rust registration is deprecated; atoms are Python-only.",
|
|
11
|
-
DeprecationWarning,
|
|
12
|
-
stacklevel=3,
|
|
13
|
-
)
|
|
14
|
-
raise RuntimeError(f"{name} is unavailable; Tigrbl atoms are Python-only.")
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def register_rust_callback(name: str, callback: Callable[..., Any]) -> str:
|
|
18
|
-
del callback
|
|
19
|
-
return _raise_deprecated(f"register_rust_callback({name!r})")
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def register_rust_atom(name: str, callback: Callable[..., Any]) -> str:
|
|
23
|
-
del callback
|
|
24
|
-
return _raise_deprecated(f"register_rust_atom({name!r})")
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def register_rust_hook(name: str, callback: Callable[..., Any]) -> str:
|
|
28
|
-
del callback
|
|
29
|
-
return _raise_deprecated(f"register_rust_hook({name!r})")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/error_project.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/precommit_validate.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/prepare_execute.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/reject_admission.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/batch/result_slots.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dep/_param_resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/binding_match.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/binding_parse.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/input_normalize.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/dispatch/op_resolve.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/envelope_apply.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/headers_apply.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/http_finalize.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/egress/result_normalize.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/emit/readtime_alias.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/err/transport_shape.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/ingress/input_prepare.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/ingress/transport_extract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/intent/final_group_key.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/resolve/paired_gen.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/negotiate.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/negotiation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/response/templates.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/schema/collect_out.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_aggregate.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_append_chunk.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_create.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_delete.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_merge.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_replace.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_bulk_update.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_checkpoint.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_create.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_delete.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_download.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_exists.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_group_by.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_persistence.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_publish.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_replace.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_send_datagram.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_subscribe.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_update.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_upload.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/sys/handler_well_known.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/__init__.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/asgi_channel.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/completion_fence.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/sink_bind.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/unit_capture.py
RENAMED
|
File without changes
|
{tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev8}/tigrbl_atoms/atoms/transport/websocket_unary.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|