tigrbl-atoms 0.4.4.dev1__tar.gz → 0.4.4.dev7__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.
Files changed (158) hide show
  1. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/PKG-INFO +4 -2
  2. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/README.md +2 -1
  3. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/pyproject.toml +3 -1
  4. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/asgi_send.py +129 -0
  5. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/framing/codec.py +19 -7
  6. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/__init__.py +28 -0
  7. tigrbl_atoms-0.4.4.dev7/tigrbl_atoms/atoms/sys/handler_close_session.py +30 -0
  8. tigrbl_atoms-0.4.4.dev7/tigrbl_atoms/atoms/sys/handler_close_stream.py +30 -0
  9. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_custom.py +4 -0
  10. tigrbl_atoms-0.4.4.dev7/tigrbl_atoms/atoms/sys/handler_open_bidi_stream.py +30 -0
  11. tigrbl_atoms-0.4.4.dev7/tigrbl_atoms/atoms/sys/handler_open_unidi_stream.py +30 -0
  12. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/runtime_channel.py +6 -3
  13. tigrbl_atoms-0.4.4.dev1/tigrbl_atoms/fallback.py +0 -12
  14. tigrbl_atoms-0.4.4.dev1/tigrbl_atoms/rust.py +0 -29
  15. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/LICENSE +0 -0
  16. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/NOTICE +0 -0
  17. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/__init__.py +0 -0
  18. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/_ctx.py +0 -0
  19. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/_opview_helpers.py +0 -0
  20. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/_request.py +0 -0
  21. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/algebra.py +0 -0
  22. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/__init__.py +0 -0
  23. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/_temp.py +0 -0
  24. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/__init__.py +0 -0
  25. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/_scheduler.py +0 -0
  26. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/_types.py +0 -0
  27. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/abort_group.py +0 -0
  28. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/admit.py +0 -0
  29. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/await_seal.py +0 -0
  30. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/cleanup.py +0 -0
  31. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/commit.py +0 -0
  32. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/dedupe.py +0 -0
  33. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/error_project.py +0 -0
  34. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/execute.py +0 -0
  35. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/precommit_validate.py +0 -0
  36. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/prepare_execute.py +0 -0
  37. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/reject_admission.py +0 -0
  38. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/result_slots.py +0 -0
  39. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/scheduler.py +0 -0
  40. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/seal_check.py +0 -0
  41. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/batch/tx_begin.py +0 -0
  42. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dep/__init__.py +0 -0
  43. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dep/_param_resolver.py +0 -0
  44. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dep/extra.py +0 -0
  45. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dep/security.py +0 -0
  46. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dispatch/__init__.py +0 -0
  47. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dispatch/binding_match.py +0 -0
  48. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dispatch/binding_parse.py +0 -0
  49. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dispatch/input_normalize.py +0 -0
  50. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/dispatch/op_resolve.py +0 -0
  51. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/__init__.py +0 -0
  52. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/envelope_apply.py +0 -0
  53. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/headers_apply.py +0 -0
  54. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/http_finalize.py +0 -0
  55. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/out_dump.py +0 -0
  56. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/result_normalize.py +0 -0
  57. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/egress/to_transport_response.py +0 -0
  58. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/emit/__init__.py +0 -0
  59. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/emit/paired_post.py +0 -0
  60. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/emit/paired_pre.py +0 -0
  61. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/emit/readtime_alias.py +0 -0
  62. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/err/__init__.py +0 -0
  63. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/err/classify.py +0 -0
  64. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/err/ctx_build.py +0 -0
  65. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/err/rollback.py +0 -0
  66. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/err/transport_shape.py +0 -0
  67. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/fanout/__init__.py +0 -0
  68. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/fanout/emit_many.py +0 -0
  69. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/fanout/shape.py +0 -0
  70. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/framing/__init__.py +0 -0
  71. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/framing/app_frame.py +0 -0
  72. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/hot/__init__.py +0 -0
  73. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/hot/slots.py +0 -0
  74. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/ingress/__init__.py +0 -0
  75. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/ingress/ctx_init.py +0 -0
  76. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/ingress/input_prepare.py +0 -0
  77. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/ingress/transport_extract.py +0 -0
  78. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/intent/__init__.py +0 -0
  79. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/intent/build.py +0 -0
  80. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/intent/final_group_key.py +0 -0
  81. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/intent/prekey.py +0 -0
  82. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/out/__init__.py +0 -0
  83. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/out/masking.py +0 -0
  84. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/refresh/__init__.py +0 -0
  85. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/refresh/demand.py +0 -0
  86. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/resolve/__init__.py +0 -0
  87. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/resolve/assemble.py +0 -0
  88. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/resolve/paired_gen.py +0 -0
  89. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/__init__.py +0 -0
  90. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/error_to_transport.py +0 -0
  91. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/headers_from_payload.py +0 -0
  92. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/negotiate.py +0 -0
  93. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/negotiation.py +0 -0
  94. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/render.py +0 -0
  95. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/renderer.py +0 -0
  96. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/template.py +0 -0
  97. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/response/templates.py +0 -0
  98. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/schema/__init__.py +0 -0
  99. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/schema/collect_in.py +0 -0
  100. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/schema/collect_out.py +0 -0
  101. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/storage/__init__.py +0 -0
  102. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/storage/to_stored.py +0 -0
  103. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/_db.py +0 -0
  104. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/_oltp_context.py +0 -0
  105. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/commit_tx.py +0 -0
  106. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_aggregate.py +0 -0
  107. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_append_chunk.py +0 -0
  108. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_bulk_create.py +0 -0
  109. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_bulk_delete.py +0 -0
  110. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_bulk_merge.py +0 -0
  111. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_bulk_replace.py +0 -0
  112. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_bulk_update.py +0 -0
  113. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_checkpoint.py +0 -0
  114. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_clear.py +0 -0
  115. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_count.py +0 -0
  116. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_create.py +0 -0
  117. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_delete.py +0 -0
  118. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_download.py +0 -0
  119. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_exists.py +0 -0
  120. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_group_by.py +0 -0
  121. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_list.py +0 -0
  122. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_merge.py +0 -0
  123. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_noop.py +0 -0
  124. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_persistence.py +0 -0
  125. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_publish.py +0 -0
  126. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_read.py +0 -0
  127. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_replace.py +0 -0
  128. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_send_datagram.py +0 -0
  129. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_subscribe.py +0 -0
  130. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_tail.py +0 -0
  131. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_update.py +0 -0
  132. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_upload.py +0 -0
  133. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/handler_well_known.py +0 -0
  134. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/phase_db.py +0 -0
  135. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/sys/start_tx.py +0 -0
  136. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/transport/__init__.py +0 -0
  137. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/transport/asgi_channel.py +0 -0
  138. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/transport/completion_fence.py +0 -0
  139. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/transport/sink_bind.py +0 -0
  140. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/transport/unit_capture.py +0 -0
  141. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/transport/websocket_unary.py +0 -0
  142. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/wire/__init__.py +0 -0
  143. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/wire/build_in.py +0 -0
  144. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/wire/build_out.py +0 -0
  145. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/wire/dump.py +0 -0
  146. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/atoms/wire/validate_in.py +0 -0
  147. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/client_session_coverage.py +0 -0
  148. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/events.py +0 -0
  149. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/packed_inputs.py +0 -0
  150. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/phases.py +0 -0
  151. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/protocol_runtime.py +0 -0
  152. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/protocol_scope.py +0 -0
  153. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/runtime_callbacks.py +0 -0
  154. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/runtime_loop_regions.py +0 -0
  155. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/runtime_resume.py +0 -0
  156. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/runtime_transactions.py +0 -0
  157. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/tigrbl_atoms/stages.py +0 -0
  158. {tigrbl_atoms-0.4.4.dev1 → tigrbl_atoms-0.4.4.dev7}/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.dev1
3
+ Version: 0.4.4.dev7
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.dev1"
3
+ version = "0.4.4.dev7"
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 validate_webtransport_inner_framing
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(lane=lane, inner_framing=framing)
486
- if selected is None:
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(selected, payload)
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(lane=lane, inner_framing=framing)
498
- if selected is None:
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(selected, payload)
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"]
@@ -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 validate_webtransport_inner_framing
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,12 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import warnings
4
-
5
-
6
- def rust_atoms_enabled() -> bool:
7
- warnings.warn(
8
- "tigrbl_atoms Rust registration is deprecated; atoms are Python-only.",
9
- DeprecationWarning,
10
- stacklevel=2,
11
- )
12
- return False
@@ -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})")