edri 2025.12.3rc2__tar.gz → 2026.2.1__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 (169) hide show
  1. {edri-2025.12.3rc2 → edri-2026.2.1}/PKG-INFO +10 -2
  2. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/handlers/http_handler.py +1 -1
  3. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/handlers/rest_handler.py +2 -1
  4. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/handlers/websocket_handler.py +2 -1
  5. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/listener.py +36 -11
  6. {edri-2025.12.3rc2 → edri-2026.2.1}/edri.egg-info/PKG-INFO +10 -2
  7. {edri-2025.12.3rc2 → edri-2026.2.1}/edri.egg-info/requires.txt +10 -1
  8. {edri-2025.12.3rc2 → edri-2026.2.1}/setup.py +16 -3
  9. {edri-2025.12.3rc2 → edri-2026.2.1}/README.md +0 -0
  10. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/__init__.py +0 -0
  11. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/__init__.py +0 -0
  12. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/manager/__init__.py +0 -0
  13. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/manager/manager_base.py +0 -0
  14. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/manager/manager_priority_base.py +0 -0
  15. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/manager/worker.py +0 -0
  16. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/worker/__init__.py +0 -0
  17. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/worker/worker.py +0 -0
  18. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/worker/worker_process.py +0 -0
  19. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/abstract/worker/worker_thread.py +0 -0
  20. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/__init__.py +0 -0
  21. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/broker.py +0 -0
  22. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/dataclass/__init__.py +0 -0
  23. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/dataclass/api_event.py +0 -0
  24. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/dataclass/client.py +0 -0
  25. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/dataclass/file.py +0 -0
  26. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/dataclass/range.py +0 -0
  27. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/extensions/__init__.py +0 -0
  28. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/extensions/url_extension.py +0 -0
  29. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/extensions/url_prefix.py +0 -0
  30. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/handlers/__init__.py +0 -0
  31. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/handlers/base_handler.py +0 -0
  32. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/handlers/html_handler.py +0 -0
  33. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/middleware.py +0 -0
  34. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/static_pages/documentation.j2 +0 -0
  35. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/static_pages/health_check_status.j2 +0 -0
  36. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/static_pages/status_300.j2 +0 -0
  37. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/static_pages/status_400.j2 +0 -0
  38. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/api/static_pages/status_500.j2 +0 -0
  39. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/config/__init__.py +0 -0
  40. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/config/constant.py +0 -0
  41. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/config/setting.py +0 -0
  42. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/__init__.py +0 -0
  43. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/directive/__init__.py +0 -0
  44. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/directive/base.py +0 -0
  45. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/directive/html.py +0 -0
  46. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/directive/http.py +0 -0
  47. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/event.py +0 -0
  48. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/health_checker.py +0 -0
  49. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/injection.py +0 -0
  50. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/dataclass/response.py +0 -0
  51. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/__init__.py +0 -0
  52. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/__init__.py +0 -0
  53. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/client/__init__.py +0 -0
  54. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/client/documentation.py +0 -0
  55. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/client/register.py +0 -0
  56. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/client/unregister.py +0 -0
  57. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/group/__init__.py +0 -0
  58. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/group/client.py +0 -0
  59. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/group/manage.py +0 -0
  60. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/manage/__init__.py +0 -0
  61. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/manage/list_registered.py +0 -0
  62. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/manage/register.py +0 -0
  63. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/manage/unregister.py +0 -0
  64. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/api/manage/unregister_all.py +0 -0
  65. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/__init__.py +0 -0
  66. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/group/__init__.py +0 -0
  67. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/group/manager.py +0 -0
  68. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/group/router.py +0 -0
  69. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/group/scheduler.py +0 -0
  70. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/group/store.py +0 -0
  71. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/group/switch.py +0 -0
  72. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/group/test.py +0 -0
  73. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/manager/__init__.py +0 -0
  74. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/manager/restart.py +0 -0
  75. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/manager/stream_close.py +0 -0
  76. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/manager/stream_create.py +0 -0
  77. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/manager/stream_message.py +0 -0
  78. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/manager/worker_quit.py +0 -0
  79. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/__init__.py +0 -0
  80. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/demands.py +0 -0
  81. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/health_check.py +0 -0
  82. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/last_events.py +0 -0
  83. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/send_from.py +0 -0
  84. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/subscribe.py +0 -0
  85. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/subscribe_connector.py +0 -0
  86. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/subscribed_external.py +0 -0
  87. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/subscribed_new.py +0 -0
  88. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/unsubscribe.py +0 -0
  89. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/router/unsubscribe_all.py +0 -0
  90. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/scheduler/__init__.py +0 -0
  91. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/scheduler/cancel.py +0 -0
  92. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/scheduler/set.py +0 -0
  93. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/scheduler/set_or_update.py +0 -0
  94. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/scheduler/update.py +0 -0
  95. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/store/__init__.py +0 -0
  96. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/store/delete.py +0 -0
  97. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/store/get.py +0 -0
  98. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/store/get_callback.py +0 -0
  99. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/events/edri/store/set.py +0 -0
  100. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/router/__init__.py +0 -0
  101. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/router/cache.py +0 -0
  102. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/router/connector/__init__.py +0 -0
  103. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/router/connector/connector.py +0 -0
  104. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/router/connector/socket.py +0 -0
  105. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/router/health_checker.py +0 -0
  106. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/router/router.py +0 -0
  107. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/switch/__init__.py +0 -0
  108. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/switch/connection.py +0 -0
  109. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/switch/forwarder.py +0 -0
  110. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/switch/receiver.py +0 -0
  111. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/switch/sender.py +0 -0
  112. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/switch/switch.py +0 -0
  113. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/__init__.py +0 -0
  114. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/cache.py +0 -0
  115. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/function.py +0 -0
  116. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/json_encoder.py +0 -0
  117. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/manager/__init__.py +0 -0
  118. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/manager/scheduler.py +0 -0
  119. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/manager/store.py +0 -0
  120. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/normalized_default_dict.py +0 -0
  121. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/queue.py +0 -0
  122. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/shared_memory_pipe.py +0 -0
  123. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/storage.py +0 -0
  124. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/transformation.py +0 -0
  125. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/validation.py +0 -0
  126. {edri-2025.12.3rc2 → edri-2026.2.1}/edri/utility/watcher.py +0 -0
  127. {edri-2025.12.3rc2 → edri-2026.2.1}/edri.egg-info/SOURCES.txt +0 -0
  128. {edri-2025.12.3rc2 → edri-2026.2.1}/edri.egg-info/dependency_links.txt +0 -0
  129. {edri-2025.12.3rc2 → edri-2026.2.1}/edri.egg-info/top_level.txt +0 -0
  130. {edri-2025.12.3rc2 → edri-2026.2.1}/setup.cfg +0 -0
  131. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/__init__.py +0 -0
  132. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/abstract/__init__.py +0 -0
  133. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/abstract/manager/__init__.py +0 -0
  134. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/abstract/manager/test_manager_base.py +0 -0
  135. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/abstract/manager/test_manager_base_priority.py +0 -0
  136. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/abstract/worker/__init__.py +0 -0
  137. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/abstract/worker/test_worker.py +0 -0
  138. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/api/__init__.py +0 -0
  139. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/api/handlers/__init__.py +0 -0
  140. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/api/handlers/test_base_handler.py +0 -0
  141. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/api/handlers/test_html_handler.py +0 -0
  142. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/api/handlers/test_http_handler.py +0 -0
  143. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/api/test_broker.py +0 -0
  144. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/dataclass/__init__.py +0 -0
  145. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/dataclass/event/__init__.py +0 -0
  146. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/dataclass/event/test_event.py +0 -0
  147. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/dataclass/event/test_event_init.py +0 -0
  148. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/dataclass/event/test_response.py +0 -0
  149. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/events/__init__.py +0 -0
  150. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/events/test/__init__.py +0 -0
  151. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/events/test/event_request.py +0 -0
  152. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/events/test/ping.py +0 -0
  153. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/events/test/ping2.py +0 -0
  154. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/router/__init__.py +0 -0
  155. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/router/test_cache.py +0 -0
  156. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/router/test_health_checker.py +0 -0
  157. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/router/test_router.py +0 -0
  158. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/test_edri_init.py +0 -0
  159. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/__init__.py +0 -0
  160. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/manager/__init__.py +0 -0
  161. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/manager/test_scheduler.py +0 -0
  162. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/manager/test_store.py +0 -0
  163. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/test_function.py +0 -0
  164. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/test_json_encoder.py +0 -0
  165. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/test_normalized_default_dict.py +0 -0
  166. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/test_shared_memory_pipe.py +0 -0
  167. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/test_storage.py +0 -0
  168. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/test_transformation.py +0 -0
  169. {edri-2025.12.3rc2 → edri-2026.2.1}/tests/utility/test_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edri
3
- Version: 2025.12.3rc2
3
+ Version: 2026.2.1
4
4
  Summary: Event Driven Routing Infrastructure
5
5
  Author: Marek Olšan
6
6
  Author-email: marek.olsan@gmail.com
@@ -27,10 +27,18 @@ Requires-Dist: websockets>=14
27
27
  Requires-Dist: posix-ipc>=1.2.0
28
28
  Requires-Dist: markdown>=3.0
29
29
  Requires-Dist: pytz>=2024.1
30
+ Requires-Dist: orjson>=3.10.0
30
31
  Provides-Extra: uvicorn
31
32
  Requires-Dist: uvicorn[standard]>=0.32.0; extra == "uvicorn"
33
+ Requires-Dist: wsproto>=1.0.0; extra == "uvicorn"
32
34
  Provides-Extra: hypercorn
33
- Requires-Dist: hypercorn>=0.17.0; extra == "hypercorn"
35
+ Requires-Dist: hypercorn[h3]>=0.17.0; extra == "hypercorn"
36
+ Requires-Dist: uvloop>=0.20.0; extra == "hypercorn"
37
+ Provides-Extra: daphne
38
+ Requires-Dist: daphne>=4.2.1; extra == "daphne"
39
+ Requires-Dist: twisted[http2,tls,websocket]>=24.0.0; extra == "daphne"
40
+ Requires-Dist: service-identity>=18.1.0; extra == "daphne"
41
+ Requires-Dist: idna>=2.5; extra == "daphne"
34
42
  Provides-Extra: dev
35
43
  Requires-Dist: uvicorn>=0.32.0; extra == "dev"
36
44
  Requires-Dist: hypercorn>=0.17.0; extra == "dev"
@@ -5,7 +5,7 @@ from enum import Enum
5
5
  from http import HTTPStatus, HTTPMethod
6
6
  from http.cookies import SimpleCookie, Morsel
7
7
  from io import BytesIO
8
- from json import loads, JSONDecodeError
8
+ from orjson import loads, JSONDecodeError
9
9
  from logging import warning
10
10
  from mimetypes import guess_type
11
11
  from pathlib import Path
@@ -1,5 +1,5 @@
1
1
  from http import HTTPStatus
2
- from json import dumps, JSONEncoder
2
+ from json import JSONEncoder
3
3
  from typing import Callable, Unpack, TypedDict, Type
4
4
 
5
5
  from edri.api import Headers
@@ -10,6 +10,7 @@ from edri.config.setting import API_RESPONSE_TIMING
10
10
  from edri.dataclass.directive import HTTPResponseDirective
11
11
  from edri.dataclass.event import Event
12
12
  from edri.utility import NormalizedDefaultDict
13
+ from orjson import dumps
13
14
 
14
15
 
15
16
  class ResponseKW(TypedDict):
@@ -1,4 +1,4 @@
1
- from json import loads, JSONDecodeError, JSONEncoder, dumps
1
+ from json import JSONDecodeError, JSONEncoder
2
2
  from typing import Callable, Type, Unpack, TypedDict, NotRequired, get_type_hints
3
3
 
4
4
  from edri.api import Headers
@@ -13,6 +13,7 @@ from edri.dataclass.event import Event
13
13
  from edri.dataclass.response import ResponseStatus
14
14
  from edri.utility import NormalizedDefaultDict
15
15
  from edri.utility.function import camel2snake
16
+ from orjson import dumps, loads
16
17
 
17
18
 
18
19
  class ResponseKW(TypedDict):
@@ -38,30 +38,34 @@ class Listener(Process):
38
38
  makedirs(UPLOAD_FILES_PATH, exist_ok=True)
39
39
 
40
40
  def run(self) -> None:
41
+ app = self.App(self.api_broker_queue, self.middlewares, self.json_encoder)
42
+
41
43
  if self.is_installed("uvicorn"):
42
44
  from uvicorn import Config, Server
45
+
43
46
  if SSL_KEY and SSL_CERTIFICATE:
44
47
  config = Config(
45
- self.App(self.api_broker_queue, self.middlewares, self.json_encoder),
48
+ app,
46
49
  host=HOST,
47
50
  port=PORT,
48
51
  log_level="debug",
49
52
  log_config=None,
50
53
  ssl_keyfile=SSL_KEY,
51
- ssl_certfile=SSL_CERTIFICATE
54
+ ssl_certfile=SSL_CERTIFICATE,
52
55
  )
53
56
  else:
54
57
  config = Config(
55
- self.App(self.api_broker_queue, self.middlewares, self.json_encoder),
58
+ app,
56
59
  host=HOST,
57
60
  port=PORT,
58
61
  log_level="debug",
59
- log_config=None
62
+ log_config=None,
60
63
  )
61
- server = Server(config)
62
- server.run()
64
+
65
+ Server(config).run()
63
66
 
64
67
  elif self.is_installed("hypercorn"):
68
+ from asyncio import run
65
69
  from hypercorn.config import Config
66
70
  from hypercorn.asyncio import serve
67
71
 
@@ -69,15 +73,36 @@ class Listener(Process):
69
73
  config.bind = [f"{HOST}:{PORT}"]
70
74
  config.certfile = SSL_CERTIFICATE
71
75
  config.keyfile = SSL_KEY
76
+ config.quic_bind = [f"{HOST}:{PORT}"]
77
+
78
+ config.alt_svc_headers = [f'h3=":{PORT}"; ma=86400']
79
+
72
80
  config.use_reloader = False
73
81
  config.loglevel = "debug"
74
82
 
75
- run(serve(
76
- self.App(self.api_broker_queue, self.middlewares, self.json_encoder),
77
- config
78
- ))
83
+ run(serve(app, config))
84
+
85
+ elif self.is_installed("daphne"):
86
+ from daphne.server import Server
87
+
88
+ interface = HOST.strip("[]").replace(":", r"\:")
89
+
90
+ if SSL_KEY and SSL_CERTIFICATE:
91
+ endpoints = [
92
+ f"ssl:port={int(PORT)}:interface={interface}:privateKey={SSL_KEY}:certKey={SSL_CERTIFICATE}"
93
+ ]
94
+ else:
95
+ endpoints = [f"tcp:port={int(PORT)}:interface={interface}"]
96
+
97
+ Server(
98
+ application=app,
99
+ endpoints=endpoints,
100
+ signal_handlers=True,
101
+ verbosity=2, # roughly like `-v2`
102
+ ).run()
103
+
79
104
  else:
80
- raise RuntimeError("No supported ASGI server installed (uvicorn or hypercorn).")
105
+ raise RuntimeError("No supported ASGI server installed (uvicorn or hypercorn or daphne).")
81
106
 
82
107
  @staticmethod
83
108
  def is_installed(package_name: str) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edri
3
- Version: 2025.12.3rc2
3
+ Version: 2026.2.1
4
4
  Summary: Event Driven Routing Infrastructure
5
5
  Author: Marek Olšan
6
6
  Author-email: marek.olsan@gmail.com
@@ -27,10 +27,18 @@ Requires-Dist: websockets>=14
27
27
  Requires-Dist: posix-ipc>=1.2.0
28
28
  Requires-Dist: markdown>=3.0
29
29
  Requires-Dist: pytz>=2024.1
30
+ Requires-Dist: orjson>=3.10.0
30
31
  Provides-Extra: uvicorn
31
32
  Requires-Dist: uvicorn[standard]>=0.32.0; extra == "uvicorn"
33
+ Requires-Dist: wsproto>=1.0.0; extra == "uvicorn"
32
34
  Provides-Extra: hypercorn
33
- Requires-Dist: hypercorn>=0.17.0; extra == "hypercorn"
35
+ Requires-Dist: hypercorn[h3]>=0.17.0; extra == "hypercorn"
36
+ Requires-Dist: uvloop>=0.20.0; extra == "hypercorn"
37
+ Provides-Extra: daphne
38
+ Requires-Dist: daphne>=4.2.1; extra == "daphne"
39
+ Requires-Dist: twisted[http2,tls,websocket]>=24.0.0; extra == "daphne"
40
+ Requires-Dist: service-identity>=18.1.0; extra == "daphne"
41
+ Requires-Dist: idna>=2.5; extra == "daphne"
34
42
  Provides-Extra: dev
35
43
  Requires-Dist: uvicorn>=0.32.0; extra == "dev"
36
44
  Requires-Dist: hypercorn>=0.17.0; extra == "dev"
@@ -9,6 +9,13 @@ websockets>=14
9
9
  posix-ipc>=1.2.0
10
10
  markdown>=3.0
11
11
  pytz>=2024.1
12
+ orjson>=3.10.0
13
+
14
+ [daphne]
15
+ daphne>=4.2.1
16
+ twisted[http2,tls,websocket]>=24.0.0
17
+ service-identity>=18.1.0
18
+ idna>=2.5
12
19
 
13
20
  [dev]
14
21
  uvicorn>=0.32.0
@@ -22,7 +29,9 @@ setuptools
22
29
  twine
23
30
 
24
31
  [hypercorn]
25
- hypercorn>=0.17.0
32
+ hypercorn[h3]>=0.17.0
33
+ uvloop>=0.20.0
26
34
 
27
35
  [uvicorn]
28
36
  uvicorn[standard]>=0.32.0
37
+ wsproto>=1.0.0
@@ -122,7 +122,7 @@ Whether you're building a real-time data processing system, a distributed servic
122
122
 
123
123
  setup(
124
124
  name='edri',
125
- version='2025.12.03rc2',
125
+ version='2026.02.01',
126
126
  packages=find_packages(),
127
127
  description='Event Driven Routing Infrastructure',
128
128
  long_description=long_description,
@@ -142,10 +142,23 @@ setup(
142
142
  "posix-ipc>=1.2.0",
143
143
  "markdown>=3.0",
144
144
  "pytz>=2024.1",
145
+ "orjson>=3.10.0"
145
146
  ],
146
147
  extras_require={
147
- "uvicorn": ["uvicorn[standard]>=0.32.0"],
148
- "hypercorn": ["hypercorn>=0.17.0"],
148
+ "uvicorn": [
149
+ "uvicorn[standard]>=0.32.0",
150
+ "wsproto>=1.0.0",
151
+ ],
152
+ "hypercorn": [
153
+ "hypercorn[h3]>=0.17.0",
154
+ "uvloop>=0.20.0",
155
+ ],
156
+ "daphne": [
157
+ "daphne>=4.2.1",
158
+ "twisted[tls,http2,websocket]>=24.0.0",
159
+ "service-identity>=18.1.0",
160
+ "idna>=2.5",
161
+ ],
149
162
  "dev": [
150
163
  "uvicorn>=0.32.0",
151
164
  "hypercorn>=0.17.0",
File without changes
File without changes
File without changes
File without changes
File without changes