@cratis/arc 19.12.0 → 20.1.0

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 (505) hide show
  1. package/Globals.ts +20 -1
  2. package/dist/cjs/Globals.d.ts +4 -0
  3. package/dist/cjs/Globals.d.ts.map +1 -1
  4. package/dist/cjs/Globals.js +6 -1
  5. package/dist/cjs/Globals.js.map +1 -1
  6. package/dist/cjs/queries/HubConnectionKeepAlive.d.ts +11 -0
  7. package/dist/cjs/queries/HubConnectionKeepAlive.d.ts.map +1 -0
  8. package/dist/cjs/queries/HubConnectionKeepAlive.js +33 -0
  9. package/dist/cjs/queries/HubConnectionKeepAlive.js.map +1 -0
  10. package/dist/cjs/queries/IObservableQueryHubConnection.d.ts +11 -0
  11. package/dist/cjs/queries/IObservableQueryHubConnection.d.ts.map +1 -0
  12. package/dist/cjs/queries/IReconnectPolicy.d.ts +8 -0
  13. package/dist/cjs/queries/IReconnectPolicy.d.ts.map +1 -0
  14. package/dist/cjs/queries/ObservableQueryConnection.d.ts +3 -1
  15. package/dist/cjs/queries/ObservableQueryConnection.d.ts.map +1 -1
  16. package/dist/cjs/queries/ObservableQueryConnection.js +8 -21
  17. package/dist/cjs/queries/ObservableQueryConnection.js.map +1 -1
  18. package/dist/cjs/queries/ObservableQueryConnectionFactory.d.ts +13 -0
  19. package/dist/cjs/queries/ObservableQueryConnectionFactory.d.ts.map +1 -0
  20. package/dist/cjs/queries/ObservableQueryConnectionFactory.js +62 -0
  21. package/dist/cjs/queries/ObservableQueryConnectionFactory.js.map +1 -0
  22. package/dist/cjs/queries/ObservableQueryConnectionPool.d.ts +9 -0
  23. package/dist/cjs/queries/ObservableQueryConnectionPool.d.ts.map +1 -0
  24. package/dist/cjs/queries/ObservableQueryConnectionPool.js +23 -0
  25. package/dist/cjs/queries/ObservableQueryConnectionPool.js.map +1 -0
  26. package/dist/cjs/queries/ObservableQueryFor.d.ts +1 -0
  27. package/dist/cjs/queries/ObservableQueryFor.d.ts.map +1 -1
  28. package/dist/cjs/queries/ObservableQueryFor.js +10 -5
  29. package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
  30. package/dist/cjs/queries/ObservableQueryMultiplexer.d.ts +30 -0
  31. package/dist/cjs/queries/ObservableQueryMultiplexer.d.ts.map +1 -0
  32. package/dist/cjs/queries/ObservableQueryMultiplexer.js +120 -0
  33. package/dist/cjs/queries/ObservableQueryMultiplexer.js.map +1 -0
  34. package/dist/cjs/queries/QueryInstanceCache.d.ts +29 -0
  35. package/dist/cjs/queries/QueryInstanceCache.d.ts.map +1 -0
  36. package/dist/cjs/queries/QueryInstanceCache.js +95 -0
  37. package/dist/cjs/queries/QueryInstanceCache.js.map +1 -0
  38. package/dist/cjs/queries/QueryTransportMethod.d.ts +5 -0
  39. package/dist/cjs/queries/QueryTransportMethod.d.ts.map +1 -0
  40. package/dist/cjs/queries/QueryTransportMethod.js +8 -0
  41. package/dist/cjs/queries/QueryTransportMethod.js.map +1 -0
  42. package/dist/cjs/queries/ReconnectPolicy.d.ts +15 -0
  43. package/dist/cjs/queries/ReconnectPolicy.d.ts.map +1 -0
  44. package/dist/cjs/queries/ReconnectPolicy.js +43 -0
  45. package/dist/cjs/queries/ReconnectPolicy.js.map +1 -0
  46. package/dist/cjs/queries/ServerSentEventHubConnection.d.ts +39 -0
  47. package/dist/cjs/queries/ServerSentEventHubConnection.d.ts.map +1 -0
  48. package/dist/cjs/queries/ServerSentEventHubConnection.js +233 -0
  49. package/dist/cjs/queries/ServerSentEventHubConnection.js.map +1 -0
  50. package/dist/cjs/queries/ServerSentEventQueryConnection.d.ts +14 -0
  51. package/dist/cjs/queries/ServerSentEventQueryConnection.d.ts.map +1 -0
  52. package/dist/cjs/queries/ServerSentEventQueryConnection.js +59 -0
  53. package/dist/cjs/queries/ServerSentEventQueryConnection.js.map +1 -0
  54. package/dist/cjs/queries/WebSocketHubConnection.d.ts +55 -0
  55. package/dist/cjs/queries/WebSocketHubConnection.d.ts.map +1 -0
  56. package/dist/cjs/queries/WebSocketHubConnection.js +193 -0
  57. package/dist/cjs/queries/WebSocketHubConnection.js.map +1 -0
  58. package/dist/cjs/queries/for_HubConnectionKeepAlive/behavior.d.ts +2 -0
  59. package/dist/cjs/queries/for_HubConnectionKeepAlive/behavior.d.ts.map +1 -0
  60. package/dist/cjs/queries/for_ObservableQueryConnection/given/an_observable_query_connection.d.ts +1 -2
  61. package/dist/cjs/queries/for_ObservableQueryConnection/given/an_observable_query_connection.d.ts.map +1 -1
  62. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/given/a_descriptor.d.ts +9 -0
  63. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/given/a_descriptor.d.ts.map +1 -0
  64. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_sse_transport.d.ts +2 -0
  65. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_sse_transport.d.ts.map +1 -0
  66. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_websocket_transport.d.ts +2 -0
  67. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_websocket_transport.d.ts.map +1 -0
  68. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_sse_transport.d.ts +2 -0
  69. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_sse_transport.d.ts.map +1 -0
  70. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_websocket_transport.d.ts +2 -0
  71. package/dist/cjs/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_websocket_transport.d.ts.map +1 -0
  72. package/dist/cjs/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_least_loaded_slot_is_chosen.d.ts +2 -0
  73. package/dist/cjs/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_least_loaded_slot_is_chosen.d.ts.map +1 -0
  74. package/dist/cjs/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_size_is_zero.d.ts +2 -0
  75. package/dist/cjs/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_size_is_zero.d.ts.map +1 -0
  76. package/dist/cjs/queries/for_ObservableQueryConnectionPool/when_acquiring/with_single_slot/and_one_subscriber.d.ts +2 -0
  77. package/dist/cjs/queries/for_ObservableQueryConnectionPool/when_acquiring/with_single_slot/and_one_subscriber.d.ts.map +1 -0
  78. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.d.ts +2 -0
  79. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.d.ts.map +1 -0
  80. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.d.ts +2 -0
  81. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.d.ts.map +1 -0
  82. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_enabled.d.ts +2 -0
  83. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_enabled.d.ts.map +1 -0
  84. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/with_arguments.d.ts +2 -0
  85. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/with_arguments.d.ts.map +1 -0
  86. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/with_empty_arguments_object.d.ts +2 -0
  87. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/with_empty_arguments_object.d.ts.map +1 -0
  88. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/with_same_arguments_different_order.d.ts +2 -0
  89. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/with_same_arguments_different_order.d.ts.map +1 -0
  90. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/without_arguments.d.ts +2 -0
  91. package/dist/cjs/queries/for_QueryInstanceCache/when_building_key/without_arguments.d.ts.map +1 -0
  92. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_last_result/with_no_result_stored.d.ts +2 -0
  93. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_last_result/with_no_result_stored.d.ts.map +1 -0
  94. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_last_result/with_stored_result.d.ts +2 -0
  95. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_last_result/with_stored_result.d.ts.map +1 -0
  96. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_or_creating/with_existing_entry.d.ts +2 -0
  97. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_or_creating/with_existing_entry.d.ts.map +1 -0
  98. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_or_creating/with_new_entry.d.ts +2 -0
  99. package/dist/cjs/queries/for_QueryInstanceCache/when_getting_or_creating/with_new_entry.d.ts.map +1 -0
  100. package/dist/cjs/queries/for_QueryInstanceCache/when_releasing/a_key_that_does_not_exist.d.ts +2 -0
  101. package/dist/cjs/queries/for_QueryInstanceCache/when_releasing/a_key_that_does_not_exist.d.ts.map +1 -0
  102. package/dist/cjs/queries/for_QueryInstanceCache/when_releasing/one_of_two_subscribers.d.ts +2 -0
  103. package/dist/cjs/queries/for_QueryInstanceCache/when_releasing/one_of_two_subscribers.d.ts.map +1 -0
  104. package/dist/cjs/queries/for_QueryInstanceCache/when_releasing/the_only_subscriber.d.ts +2 -0
  105. package/dist/cjs/queries/for_QueryInstanceCache/when_releasing/the_only_subscriber.d.ts.map +1 -0
  106. package/dist/cjs/queries/for_QueryInstanceCache/when_setting_last_result/with_a_result.d.ts +2 -0
  107. package/dist/cjs/queries/for_QueryInstanceCache/when_setting_last_result/with_a_result.d.ts.map +1 -0
  108. package/dist/cjs/queries/for_ReconnectPolicy/when_canceling/with_pending_timer.d.ts +2 -0
  109. package/dist/cjs/queries/for_ReconnectPolicy/when_canceling/with_pending_timer.d.ts.map +1 -0
  110. package/dist/cjs/queries/for_ReconnectPolicy/when_cancelling/with_pending_timer.d.ts +2 -0
  111. package/dist/cjs/queries/for_ReconnectPolicy/when_cancelling/with_pending_timer.d.ts.map +1 -0
  112. package/dist/cjs/queries/for_ReconnectPolicy/when_resetting/after_scheduling.d.ts +2 -0
  113. package/dist/cjs/queries/for_ReconnectPolicy/when_resetting/after_scheduling.d.ts.map +1 -0
  114. package/dist/cjs/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/delay_is_capped_at_max.d.ts +2 -0
  115. package/dist/cjs/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/delay_is_capped_at_max.d.ts.map +1 -0
  116. package/dist/cjs/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/first_attempt.d.ts +2 -0
  117. package/dist/cjs/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/first_attempt.d.ts.map +1 -0
  118. package/dist/cjs/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_reached/abandons_reconnect.d.ts +2 -0
  119. package/dist/cjs/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_reached/abandons_reconnect.d.ts.map +1 -0
  120. package/dist/cjs/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.d.ts +21 -0
  121. package/dist/cjs/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.d.ts.map +1 -0
  122. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_connect_timeout_fires/triggers_reconnect.d.ts +2 -0
  123. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_connect_timeout_fires/triggers_reconnect.d.ts.map +1 -0
  124. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.d.ts +2 -0
  125. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.d.ts.map +1 -0
  126. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_keep_alive_is_idle/triggers_reconnect.d.ts +2 -0
  127. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_keep_alive_is_idle/triggers_reconnect.d.ts.map +1 -0
  128. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.d.ts +2 -0
  129. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.d.ts.map +1 -0
  130. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_subscribing/queues_until_connected.d.ts +2 -0
  131. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_subscribing/queues_until_connected.d.ts.map +1 -0
  132. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.d.ts +2 -0
  133. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.d.ts.map +1 -0
  134. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.d.ts +2 -0
  135. package/dist/cjs/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.d.ts.map +1 -0
  136. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_connecting/with_query_arguments.d.ts +2 -0
  137. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_connecting/with_query_arguments.d.ts.map +1 -0
  138. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_connecting/without_event_source_available.d.ts +2 -0
  139. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_connecting/without_event_source_available.d.ts.map +1 -0
  140. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_disconnecting/after_connecting.d.ts +2 -0
  141. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_disconnecting/after_connecting.d.ts.map +1 -0
  142. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_disconnecting/before_message_arrives.d.ts +2 -0
  143. package/dist/cjs/queries/for_ServerSentEventQueryConnection/when_disconnecting/before_message_arrives.d.ts.map +1 -0
  144. package/dist/cjs/queries/for_WebSocketHubConnection/given/a_web_socket_hub_connection.d.ts +23 -0
  145. package/dist/cjs/queries/for_WebSocketHubConnection/given/a_web_socket_hub_connection.d.ts.map +1 -0
  146. package/dist/cjs/queries/for_WebSocketHubConnection/when_disposing/cleans_up_resources.d.ts +2 -0
  147. package/dist/cjs/queries/for_WebSocketHubConnection/when_disposing/cleans_up_resources.d.ts.map +1 -0
  148. package/dist/cjs/queries/for_WebSocketHubConnection/when_keep_alive_is_idle/sends_a_ping.d.ts +2 -0
  149. package/dist/cjs/queries/for_WebSocketHubConnection/when_keep_alive_is_idle/sends_a_ping.d.ts.map +1 -0
  150. package/dist/cjs/queries/for_WebSocketHubConnection/when_receiving_a_message/resets_keep_alive_timer.d.ts +2 -0
  151. package/dist/cjs/queries/for_WebSocketHubConnection/when_receiving_a_message/resets_keep_alive_timer.d.ts.map +1 -0
  152. package/dist/cjs/queries/for_WebSocketHubConnection/when_reconnecting/after_unexpected_close.d.ts +2 -0
  153. package/dist/cjs/queries/for_WebSocketHubConnection/when_reconnecting/after_unexpected_close.d.ts.map +1 -0
  154. package/dist/cjs/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.d.ts +2 -0
  155. package/dist/cjs/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.d.ts.map +1 -0
  156. package/dist/cjs/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.d.ts +2 -0
  157. package/dist/cjs/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.d.ts.map +1 -0
  158. package/dist/cjs/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.d.ts +2 -0
  159. package/dist/cjs/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.d.ts.map +1 -0
  160. package/dist/cjs/queries/index.d.ts +12 -0
  161. package/dist/cjs/queries/index.d.ts.map +1 -1
  162. package/dist/cjs/queries/index.js +34 -0
  163. package/dist/cjs/queries/index.js.map +1 -1
  164. package/dist/esm/Globals.d.ts +4 -0
  165. package/dist/esm/Globals.d.ts.map +1 -1
  166. package/dist/esm/Globals.js +6 -1
  167. package/dist/esm/Globals.js.map +1 -1
  168. package/dist/esm/queries/HubConnectionKeepAlive.d.ts +11 -0
  169. package/dist/esm/queries/HubConnectionKeepAlive.d.ts.map +1 -0
  170. package/dist/esm/queries/HubConnectionKeepAlive.js +31 -0
  171. package/dist/esm/queries/HubConnectionKeepAlive.js.map +1 -0
  172. package/dist/esm/queries/IObservableQueryHubConnection.d.ts +11 -0
  173. package/dist/esm/queries/IObservableQueryHubConnection.d.ts.map +1 -0
  174. package/dist/esm/queries/IObservableQueryHubConnection.js +2 -0
  175. package/dist/esm/queries/IObservableQueryHubConnection.js.map +1 -0
  176. package/dist/esm/queries/IReconnectPolicy.d.ts +8 -0
  177. package/dist/esm/queries/IReconnectPolicy.d.ts.map +1 -0
  178. package/dist/esm/queries/IReconnectPolicy.js +2 -0
  179. package/dist/esm/queries/IReconnectPolicy.js.map +1 -0
  180. package/dist/esm/queries/ObservableQueryConnection.d.ts +3 -1
  181. package/dist/esm/queries/ObservableQueryConnection.d.ts.map +1 -1
  182. package/dist/esm/queries/ObservableQueryConnection.js +8 -21
  183. package/dist/esm/queries/ObservableQueryConnection.js.map +1 -1
  184. package/dist/esm/queries/ObservableQueryConnectionFactory.d.ts +13 -0
  185. package/dist/esm/queries/ObservableQueryConnectionFactory.d.ts.map +1 -0
  186. package/dist/esm/queries/ObservableQueryConnectionFactory.js +58 -0
  187. package/dist/esm/queries/ObservableQueryConnectionFactory.js.map +1 -0
  188. package/dist/esm/queries/ObservableQueryConnectionPool.d.ts +9 -0
  189. package/dist/esm/queries/ObservableQueryConnectionPool.d.ts.map +1 -0
  190. package/dist/esm/queries/ObservableQueryConnectionPool.js +21 -0
  191. package/dist/esm/queries/ObservableQueryConnectionPool.js.map +1 -0
  192. package/dist/esm/queries/ObservableQueryFor.d.ts +1 -0
  193. package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
  194. package/dist/esm/queries/ObservableQueryFor.js +10 -5
  195. package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
  196. package/dist/esm/queries/ObservableQueryMultiplexer.d.ts +30 -0
  197. package/dist/esm/queries/ObservableQueryMultiplexer.d.ts.map +1 -0
  198. package/dist/esm/queries/ObservableQueryMultiplexer.js +114 -0
  199. package/dist/esm/queries/ObservableQueryMultiplexer.js.map +1 -0
  200. package/dist/esm/queries/QueryInstanceCache.d.ts +29 -0
  201. package/dist/esm/queries/QueryInstanceCache.d.ts.map +1 -0
  202. package/dist/esm/queries/QueryInstanceCache.js +93 -0
  203. package/dist/esm/queries/QueryInstanceCache.js.map +1 -0
  204. package/dist/esm/queries/QueryTransportMethod.d.ts +5 -0
  205. package/dist/esm/queries/QueryTransportMethod.d.ts.map +1 -0
  206. package/dist/esm/queries/QueryTransportMethod.js +8 -0
  207. package/dist/esm/queries/QueryTransportMethod.js.map +1 -0
  208. package/dist/esm/queries/ReconnectPolicy.d.ts +15 -0
  209. package/dist/esm/queries/ReconnectPolicy.d.ts.map +1 -0
  210. package/dist/esm/queries/ReconnectPolicy.js +41 -0
  211. package/dist/esm/queries/ReconnectPolicy.js.map +1 -0
  212. package/dist/esm/queries/ServerSentEventHubConnection.d.ts +39 -0
  213. package/dist/esm/queries/ServerSentEventHubConnection.d.ts.map +1 -0
  214. package/dist/esm/queries/ServerSentEventHubConnection.js +231 -0
  215. package/dist/esm/queries/ServerSentEventHubConnection.js.map +1 -0
  216. package/dist/esm/queries/ServerSentEventQueryConnection.d.ts +14 -0
  217. package/dist/esm/queries/ServerSentEventQueryConnection.d.ts.map +1 -0
  218. package/dist/esm/queries/ServerSentEventQueryConnection.js +56 -0
  219. package/dist/esm/queries/ServerSentEventQueryConnection.js.map +1 -0
  220. package/dist/esm/queries/WebSocketHubConnection.d.ts +55 -0
  221. package/dist/esm/queries/WebSocketHubConnection.d.ts.map +1 -0
  222. package/dist/esm/queries/WebSocketHubConnection.js +191 -0
  223. package/dist/esm/queries/WebSocketHubConnection.js.map +1 -0
  224. package/dist/esm/queries/for_HubConnectionKeepAlive/behavior.d.ts +2 -0
  225. package/dist/esm/queries/for_HubConnectionKeepAlive/behavior.d.ts.map +1 -0
  226. package/dist/esm/queries/for_HubConnectionKeepAlive/behavior.js +57 -0
  227. package/dist/esm/queries/for_HubConnectionKeepAlive/behavior.js.map +1 -0
  228. package/dist/esm/queries/for_ObservableQueryConnection/given/an_observable_query_connection.d.ts +1 -2
  229. package/dist/esm/queries/for_ObservableQueryConnection/given/an_observable_query_connection.d.ts.map +1 -1
  230. package/dist/esm/queries/for_ObservableQueryConnection/given/an_observable_query_connection.js +9 -5
  231. package/dist/esm/queries/for_ObservableQueryConnection/given/an_observable_query_connection.js.map +1 -1
  232. package/dist/esm/queries/for_ObservableQueryConnectionFactory/given/a_descriptor.d.ts +9 -0
  233. package/dist/esm/queries/for_ObservableQueryConnectionFactory/given/a_descriptor.d.ts.map +1 -0
  234. package/dist/esm/queries/for_ObservableQueryConnectionFactory/given/a_descriptor.js +19 -0
  235. package/dist/esm/queries/for_ObservableQueryConnectionFactory/given/a_descriptor.js.map +1 -0
  236. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_sse_transport.d.ts +2 -0
  237. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_sse_transport.d.ts.map +1 -0
  238. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_sse_transport.js +49 -0
  239. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_sse_transport.js.map +1 -0
  240. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_websocket_transport.d.ts +2 -0
  241. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_websocket_transport.d.ts.map +1 -0
  242. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_websocket_transport.js +47 -0
  243. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_websocket_transport.js.map +1 -0
  244. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_sse_transport.d.ts +2 -0
  245. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_sse_transport.d.ts.map +1 -0
  246. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_sse_transport.js +54 -0
  247. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_sse_transport.js.map +1 -0
  248. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_websocket_transport.d.ts +2 -0
  249. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_websocket_transport.d.ts.map +1 -0
  250. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_websocket_transport.js +49 -0
  251. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_websocket_transport.js.map +1 -0
  252. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_least_loaded_slot_is_chosen.d.ts +2 -0
  253. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_least_loaded_slot_is_chosen.d.ts.map +1 -0
  254. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_least_loaded_slot_is_chosen.js +34 -0
  255. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_least_loaded_slot_is_chosen.js.map +1 -0
  256. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_size_is_zero.d.ts +2 -0
  257. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_size_is_zero.d.ts.map +1 -0
  258. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_size_is_zero.js +18 -0
  259. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_size_is_zero.js.map +1 -0
  260. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_single_slot/and_one_subscriber.d.ts +2 -0
  261. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_single_slot/and_one_subscriber.d.ts.map +1 -0
  262. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_single_slot/and_one_subscriber.js +32 -0
  263. package/dist/esm/queries/for_ObservableQueryConnectionPool/when_acquiring/with_single_slot/and_one_subscriber.js.map +1 -0
  264. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.d.ts +2 -0
  265. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.d.ts.map +1 -0
  266. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.js +54 -0
  267. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.js.map +1 -0
  268. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.d.ts +2 -0
  269. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.d.ts.map +1 -0
  270. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.js +55 -0
  271. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.js.map +1 -0
  272. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_enabled.d.ts +2 -0
  273. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_enabled.d.ts.map +1 -0
  274. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_enabled.js +45 -0
  275. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_enabled.js.map +1 -0
  276. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_partially_missing_required_arguments.js +18 -11
  277. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_partially_missing_required_arguments.js.map +1 -1
  278. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_route_and_query_args.js +12 -5
  279. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_route_and_query_args.js.map +1 -1
  280. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_arguments.d.ts +2 -0
  281. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_arguments.d.ts.map +1 -0
  282. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_arguments.js +12 -0
  283. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_arguments.js.map +1 -0
  284. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_empty_arguments_object.d.ts +2 -0
  285. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_empty_arguments_object.d.ts.map +1 -0
  286. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_empty_arguments_object.js +11 -0
  287. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_empty_arguments_object.js.map +1 -0
  288. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_same_arguments_different_order.d.ts +2 -0
  289. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_same_arguments_different_order.d.ts.map +1 -0
  290. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_same_arguments_different_order.js +13 -0
  291. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/with_same_arguments_different_order.js.map +1 -0
  292. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/without_arguments.d.ts +2 -0
  293. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/without_arguments.d.ts.map +1 -0
  294. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/without_arguments.js +11 -0
  295. package/dist/esm/queries/for_QueryInstanceCache/when_building_key/without_arguments.js.map +1 -0
  296. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_no_result_stored.d.ts +2 -0
  297. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_no_result_stored.d.ts.map +1 -0
  298. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_no_result_stored.js +12 -0
  299. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_no_result_stored.js.map +1 -0
  300. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_stored_result.d.ts +2 -0
  301. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_stored_result.d.ts.map +1 -0
  302. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_stored_result.js +16 -0
  303. package/dist/esm/queries/for_QueryInstanceCache/when_getting_last_result/with_stored_result.js.map +1 -0
  304. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_existing_entry.d.ts +2 -0
  305. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_existing_entry.d.ts.map +1 -0
  306. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_existing_entry.js +23 -0
  307. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_existing_entry.js.map +1 -0
  308. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_new_entry.d.ts +2 -0
  309. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_new_entry.d.ts.map +1 -0
  310. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_new_entry.js +16 -0
  311. package/dist/esm/queries/for_QueryInstanceCache/when_getting_or_creating/with_new_entry.js.map +1 -0
  312. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/a_key_that_does_not_exist.d.ts +2 -0
  313. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/a_key_that_does_not_exist.d.ts.map +1 -0
  314. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/a_key_that_does_not_exist.js +17 -0
  315. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/a_key_that_does_not_exist.js.map +1 -0
  316. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/one_of_two_subscribers.d.ts +2 -0
  317. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/one_of_two_subscribers.d.ts.map +1 -0
  318. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/one_of_two_subscribers.js +13 -0
  319. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/one_of_two_subscribers.js.map +1 -0
  320. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/the_only_subscriber.d.ts +2 -0
  321. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/the_only_subscriber.d.ts.map +1 -0
  322. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/the_only_subscriber.js +17 -0
  323. package/dist/esm/queries/for_QueryInstanceCache/when_releasing/the_only_subscriber.js.map +1 -0
  324. package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_a_result.d.ts +2 -0
  325. package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_a_result.d.ts.map +1 -0
  326. package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_a_result.js +15 -0
  327. package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_a_result.js.map +1 -0
  328. package/dist/esm/queries/for_ReconnectPolicy/when_canceling/with_pending_timer.d.ts +2 -0
  329. package/dist/esm/queries/for_ReconnectPolicy/when_canceling/with_pending_timer.d.ts.map +1 -0
  330. package/dist/esm/queries/for_ReconnectPolicy/when_canceling/with_pending_timer.js +24 -0
  331. package/dist/esm/queries/for_ReconnectPolicy/when_canceling/with_pending_timer.js.map +1 -0
  332. package/dist/esm/queries/for_ReconnectPolicy/when_cancelling/with_pending_timer.d.ts +2 -0
  333. package/dist/esm/queries/for_ReconnectPolicy/when_cancelling/with_pending_timer.d.ts.map +1 -0
  334. package/dist/esm/queries/for_ReconnectPolicy/when_cancelling/with_pending_timer.js +24 -0
  335. package/dist/esm/queries/for_ReconnectPolicy/when_cancelling/with_pending_timer.js.map +1 -0
  336. package/dist/esm/queries/for_ReconnectPolicy/when_resetting/after_scheduling.d.ts +2 -0
  337. package/dist/esm/queries/for_ReconnectPolicy/when_resetting/after_scheduling.d.ts.map +1 -0
  338. package/dist/esm/queries/for_ReconnectPolicy/when_resetting/after_scheduling.js +29 -0
  339. package/dist/esm/queries/for_ReconnectPolicy/when_resetting/after_scheduling.js.map +1 -0
  340. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/delay_is_capped_at_max.d.ts +2 -0
  341. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/delay_is_capped_at_max.d.ts.map +1 -0
  342. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/delay_is_capped_at_max.js +33 -0
  343. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/delay_is_capped_at_max.js.map +1 -0
  344. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/first_attempt.d.ts +2 -0
  345. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/first_attempt.d.ts.map +1 -0
  346. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/first_attempt.js +28 -0
  347. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/first_attempt.js.map +1 -0
  348. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_reached/abandons_reconnect.d.ts +2 -0
  349. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_reached/abandons_reconnect.d.ts.map +1 -0
  350. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_reached/abandons_reconnect.js +29 -0
  351. package/dist/esm/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_reached/abandons_reconnect.js.map +1 -0
  352. package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.d.ts +21 -0
  353. package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.d.ts.map +1 -0
  354. package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.js +50 -0
  355. package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.js.map +1 -0
  356. package/dist/esm/queries/for_ServerSentEventHubConnection/when_connect_timeout_fires/triggers_reconnect.d.ts +2 -0
  357. package/dist/esm/queries/for_ServerSentEventHubConnection/when_connect_timeout_fires/triggers_reconnect.d.ts.map +1 -0
  358. package/dist/esm/queries/for_ServerSentEventHubConnection/when_connect_timeout_fires/triggers_reconnect.js +24 -0
  359. package/dist/esm/queries/for_ServerSentEventHubConnection/when_connect_timeout_fires/triggers_reconnect.js.map +1 -0
  360. package/dist/esm/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.d.ts +2 -0
  361. package/dist/esm/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.d.ts.map +1 -0
  362. package/dist/esm/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.js +27 -0
  363. package/dist/esm/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.js.map +1 -0
  364. package/dist/esm/queries/for_ServerSentEventHubConnection/when_keep_alive_is_idle/triggers_reconnect.d.ts +2 -0
  365. package/dist/esm/queries/for_ServerSentEventHubConnection/when_keep_alive_is_idle/triggers_reconnect.d.ts.map +1 -0
  366. package/dist/esm/queries/for_ServerSentEventHubConnection/when_keep_alive_is_idle/triggers_reconnect.js +26 -0
  367. package/dist/esm/queries/for_ServerSentEventHubConnection/when_keep_alive_is_idle/triggers_reconnect.js.map +1 -0
  368. package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.d.ts +2 -0
  369. package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.d.ts.map +1 -0
  370. package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.js +46 -0
  371. package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.js.map +1 -0
  372. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/queues_until_connected.d.ts +2 -0
  373. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/queues_until_connected.d.ts.map +1 -0
  374. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/queues_until_connected.js +21 -0
  375. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/queues_until_connected.js.map +1 -0
  376. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.d.ts +2 -0
  377. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.d.ts.map +1 -0
  378. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.js +32 -0
  379. package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.js.map +1 -0
  380. package/dist/esm/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.d.ts +2 -0
  381. package/dist/esm/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.d.ts.map +1 -0
  382. package/dist/esm/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.js +21 -0
  383. package/dist/esm/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.js.map +1 -0
  384. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/with_query_arguments.d.ts +2 -0
  385. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/with_query_arguments.d.ts.map +1 -0
  386. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/with_query_arguments.js +38 -0
  387. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/with_query_arguments.js.map +1 -0
  388. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/without_event_source_available.d.ts +2 -0
  389. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/without_event_source_available.d.ts.map +1 -0
  390. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/without_event_source_available.js +23 -0
  391. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_connecting/without_event_source_available.js.map +1 -0
  392. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/after_connecting.d.ts +2 -0
  393. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/after_connecting.d.ts.map +1 -0
  394. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/after_connecting.js +24 -0
  395. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/after_connecting.js.map +1 -0
  396. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/before_message_arrives.d.ts +2 -0
  397. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/before_message_arrives.d.ts.map +1 -0
  398. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/before_message_arrives.js +24 -0
  399. package/dist/esm/queries/for_ServerSentEventQueryConnection/when_disconnecting/before_message_arrives.js.map +1 -0
  400. package/dist/esm/queries/for_WebSocketHubConnection/given/a_web_socket_hub_connection.d.ts +23 -0
  401. package/dist/esm/queries/for_WebSocketHubConnection/given/a_web_socket_hub_connection.d.ts.map +1 -0
  402. package/dist/esm/queries/for_WebSocketHubConnection/given/a_web_socket_hub_connection.js +47 -0
  403. package/dist/esm/queries/for_WebSocketHubConnection/given/a_web_socket_hub_connection.js.map +1 -0
  404. package/dist/esm/queries/for_WebSocketHubConnection/when_disposing/cleans_up_resources.d.ts +2 -0
  405. package/dist/esm/queries/for_WebSocketHubConnection/when_disposing/cleans_up_resources.d.ts.map +1 -0
  406. package/dist/esm/queries/for_WebSocketHubConnection/when_disposing/cleans_up_resources.js +24 -0
  407. package/dist/esm/queries/for_WebSocketHubConnection/when_disposing/cleans_up_resources.js.map +1 -0
  408. package/dist/esm/queries/for_WebSocketHubConnection/when_keep_alive_is_idle/sends_a_ping.d.ts +2 -0
  409. package/dist/esm/queries/for_WebSocketHubConnection/when_keep_alive_is_idle/sends_a_ping.d.ts.map +1 -0
  410. package/dist/esm/queries/for_WebSocketHubConnection/when_keep_alive_is_idle/sends_a_ping.js +29 -0
  411. package/dist/esm/queries/for_WebSocketHubConnection/when_keep_alive_is_idle/sends_a_ping.js.map +1 -0
  412. package/dist/esm/queries/for_WebSocketHubConnection/when_receiving_a_message/resets_keep_alive_timer.d.ts +2 -0
  413. package/dist/esm/queries/for_WebSocketHubConnection/when_receiving_a_message/resets_keep_alive_timer.d.ts.map +1 -0
  414. package/dist/esm/queries/for_WebSocketHubConnection/when_receiving_a_message/resets_keep_alive_timer.js +31 -0
  415. package/dist/esm/queries/for_WebSocketHubConnection/when_receiving_a_message/resets_keep_alive_timer.js.map +1 -0
  416. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/after_unexpected_close.d.ts +2 -0
  417. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/after_unexpected_close.d.ts.map +1 -0
  418. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/after_unexpected_close.js +30 -0
  419. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/after_unexpected_close.js.map +1 -0
  420. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.d.ts +2 -0
  421. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.d.ts.map +1 -0
  422. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.js +31 -0
  423. package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.js.map +1 -0
  424. package/dist/esm/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.d.ts +2 -0
  425. package/dist/esm/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.d.ts.map +1 -0
  426. package/dist/esm/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.js +32 -0
  427. package/dist/esm/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.js.map +1 -0
  428. package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.d.ts +2 -0
  429. package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.d.ts.map +1 -0
  430. package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.js +23 -0
  431. package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.js.map +1 -0
  432. package/dist/esm/queries/index.d.ts +12 -0
  433. package/dist/esm/queries/index.d.ts.map +1 -1
  434. package/dist/esm/queries/index.js +10 -0
  435. package/dist/esm/queries/index.js.map +1 -1
  436. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  437. package/package.json +1 -1
  438. package/queries/HubConnectionKeepAlive.ts +61 -0
  439. package/queries/IObservableQueryHubConnection.ts +50 -0
  440. package/queries/IReconnectPolicy.ts +39 -0
  441. package/queries/ObservableQueryConnection.ts +8 -24
  442. package/queries/ObservableQueryConnectionFactory.ts +118 -0
  443. package/queries/ObservableQueryConnectionPool.ts +64 -0
  444. package/queries/ObservableQueryFor.ts +11 -5
  445. package/queries/ObservableQueryMultiplexer.ts +214 -0
  446. package/queries/QueryInstanceCache.ts +243 -0
  447. package/queries/QueryTransportMethod.ts +17 -0
  448. package/queries/ReconnectPolicy.ts +68 -0
  449. package/queries/ServerSentEventHubConnection.ts +309 -0
  450. package/queries/ServerSentEventQueryConnection.ts +84 -0
  451. package/queries/WebSocketHubConnection.ts +291 -0
  452. package/queries/for_HubConnectionKeepAlive/behavior.ts +73 -0
  453. package/queries/for_ObservableQueryConnection/given/an_observable_query_connection.ts +13 -9
  454. package/queries/for_ObservableQueryConnectionFactory/given/a_descriptor.ts +26 -0
  455. package/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_sse_transport.ts +62 -0
  456. package/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_websocket_transport.ts +59 -0
  457. package/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_sse_transport.ts +69 -0
  458. package/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_websocket_transport.ts +61 -0
  459. package/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_least_loaded_slot_is_chosen.ts +47 -0
  460. package/queries/for_ObservableQueryConnectionPool/when_acquiring/with_multiple_slots/and_size_is_zero.ts +26 -0
  461. package/queries/for_ObservableQueryConnectionPool/when_acquiring/with_single_slot/and_one_subscriber.ts +44 -0
  462. package/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.ts +69 -0
  463. package/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.ts +70 -0
  464. package/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_enabled.ts +57 -0
  465. package/queries/for_ObservableQueryFor/when_subscribing/with_partially_missing_required_arguments.ts +19 -11
  466. package/queries/for_ObservableQueryFor/when_subscribing/with_route_and_query_args.ts +14 -7
  467. package/queries/for_QueryInstanceCache/when_building_key/with_arguments.ts +17 -0
  468. package/queries/for_QueryInstanceCache/when_building_key/with_empty_arguments_object.ts +16 -0
  469. package/queries/for_QueryInstanceCache/when_building_key/with_same_arguments_different_order.ts +18 -0
  470. package/queries/for_QueryInstanceCache/when_building_key/without_arguments.ts +16 -0
  471. package/queries/for_QueryInstanceCache/when_getting_last_result/with_no_result_stored.ts +17 -0
  472. package/queries/for_QueryInstanceCache/when_getting_last_result/with_stored_result.ts +23 -0
  473. package/queries/for_QueryInstanceCache/when_getting_or_creating/with_existing_entry.ts +29 -0
  474. package/queries/for_QueryInstanceCache/when_getting_or_creating/with_new_entry.ts +21 -0
  475. package/queries/for_QueryInstanceCache/when_releasing/a_key_that_does_not_exist.ts +21 -0
  476. package/queries/for_QueryInstanceCache/when_releasing/one_of_two_subscribers.ts +18 -0
  477. package/queries/for_QueryInstanceCache/when_releasing/the_only_subscriber.ts +23 -0
  478. package/queries/for_QueryInstanceCache/when_setting_last_result/with_a_result.ts +20 -0
  479. package/queries/for_ReconnectPolicy/when_canceling/with_pending_timer.ts +33 -0
  480. package/queries/for_ReconnectPolicy/when_cancelling/with_pending_timer.ts +33 -0
  481. package/queries/for_ReconnectPolicy/when_resetting/after_scheduling.ts +39 -0
  482. package/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/delay_is_capped_at_max.ts +44 -0
  483. package/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_not_reached/first_attempt.ts +38 -0
  484. package/queries/for_ReconnectPolicy/when_scheduling/and_max_attempts_reached/abandons_reconnect.ts +39 -0
  485. package/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.ts +85 -0
  486. package/queries/for_ServerSentEventHubConnection/when_connect_timeout_fires/triggers_reconnect.ts +46 -0
  487. package/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.ts +34 -0
  488. package/queries/for_ServerSentEventHubConnection/when_keep_alive_is_idle/triggers_reconnect.ts +48 -0
  489. package/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.ts +62 -0
  490. package/queries/for_ServerSentEventHubConnection/when_subscribing/queues_until_connected.ts +31 -0
  491. package/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.ts +42 -0
  492. package/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.ts +32 -0
  493. package/queries/for_ServerSentEventQueryConnection/when_connecting/with_query_arguments.ts +63 -0
  494. package/queries/for_ServerSentEventQueryConnection/when_connecting/without_event_source_available.ts +31 -0
  495. package/queries/for_ServerSentEventQueryConnection/when_disconnecting/after_connecting.ts +36 -0
  496. package/queries/for_ServerSentEventQueryConnection/when_disconnecting/before_message_arrives.ts +38 -0
  497. package/queries/for_WebSocketHubConnection/given/a_web_socket_hub_connection.ts +81 -0
  498. package/queries/for_WebSocketHubConnection/when_disposing/cleans_up_resources.ts +31 -0
  499. package/queries/for_WebSocketHubConnection/when_keep_alive_is_idle/sends_a_ping.ts +47 -0
  500. package/queries/for_WebSocketHubConnection/when_receiving_a_message/resets_keep_alive_timer.ts +53 -0
  501. package/queries/for_WebSocketHubConnection/when_reconnecting/after_unexpected_close.ts +41 -0
  502. package/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.ts +43 -0
  503. package/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.ts +42 -0
  504. package/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.ts +30 -0
  505. package/queries/index.ts +12 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/arc",
3
- "version": "19.12.0",
3
+ "version": "20.1.0",
4
4
  "description": "",
5
5
  "author": "Cratis",
6
6
  "license": "MIT",
@@ -0,0 +1,61 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ /**
5
+ * Manages keep-alive behavior for hub connections (both WebSocket and Server-Sent Events).
6
+ *
7
+ * Records connection activity (any message received or sent). An interval fires every
8
+ * {@link intervalMs} milliseconds; if no activity has been recorded since the last tick the
9
+ * provided {@link onIdle} callback is invoked — the caller decides whether to send a ping,
10
+ * trigger a reconnect, or take some other action.
11
+ *
12
+ * Both {@link WebSocketHubConnection} and {@link ServerSentEventHubConnection} own one instance
13
+ * of this class so the keep-alive logic is written once and behaves identically for both
14
+ * transports.
15
+ */
16
+ export class HubConnectionKeepAlive {
17
+ private _lastActivityTime = Date.now();
18
+ private _timer?: ReturnType<typeof setInterval>;
19
+
20
+ /**
21
+ * Initializes a new instance of {@link HubConnectionKeepAlive}.
22
+ * @param {number} intervalMs How often (in milliseconds) to check for idle connections.
23
+ * @param {() => void} onIdle Callback invoked when the interval fires and no activity has
24
+ * been recorded in the last {@link intervalMs} milliseconds.
25
+ */
26
+ constructor(
27
+ private readonly _intervalMs: number,
28
+ private readonly _onIdle: () => void,
29
+ ) {}
30
+
31
+ /**
32
+ * Start the keep-alive timer. Safe to call multiple times — a running timer is stopped first.
33
+ */
34
+ start(): void {
35
+ this.stop();
36
+ this._lastActivityTime = Date.now();
37
+ this._timer = setInterval(() => {
38
+ if (Date.now() - this._lastActivityTime >= this._intervalMs) {
39
+ this._onIdle();
40
+ }
41
+ }, this._intervalMs);
42
+ }
43
+
44
+ /**
45
+ * Stop the keep-alive timer.
46
+ */
47
+ stop(): void {
48
+ if (this._timer !== undefined) {
49
+ clearInterval(this._timer);
50
+ this._timer = undefined;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Record that the connection has been active (message sent or received).
56
+ * Resets the idle timer so that a keep-alive is not sent while data is already flowing.
57
+ */
58
+ recordActivity(): void {
59
+ this._lastActivityTime = Date.now();
60
+ }
61
+ }
@@ -0,0 +1,50 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { DataReceived } from './ObservableQueryConnection';
5
+ import { SubscriptionRequest } from './WebSocketHubConnection';
6
+
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
8
+
9
+ /**
10
+ * Defines a multiplexed hub connection that carries multiple observable query subscriptions
11
+ * over a single transport (WebSocket or SSE + POST).
12
+ *
13
+ * Both {@link WebSocketHubConnection} and {@link ServerSentEventHubConnection} implement this
14
+ * interface, allowing the pool to work with either transport interchangeably.
15
+ */
16
+ export interface IObservableQueryHubConnection {
17
+ /**
18
+ * Gets the number of active query subscriptions on this connection.
19
+ */
20
+ readonly queryCount: number;
21
+
22
+ /**
23
+ * Gets the latency of the last ping/pong sequence in milliseconds.
24
+ */
25
+ readonly lastPingLatency: number;
26
+
27
+ /**
28
+ * Gets the rolling average latency in milliseconds.
29
+ */
30
+ readonly averageLatency: number;
31
+
32
+ /**
33
+ * Subscribe to a query on this hub connection.
34
+ * @param {string} queryId Client-generated unique identifier for this subscription.
35
+ * @param {SubscriptionRequest} request The subscription request payload.
36
+ * @param {DataReceived<any>} callback Callback invoked whenever the server pushes a result for this query.
37
+ */
38
+ subscribe(queryId: string, request: SubscriptionRequest, callback: DataReceived<any>): void;
39
+
40
+ /**
41
+ * Unsubscribe from a query on this hub connection.
42
+ * @param {string} queryId The identifier of the subscription to cancel.
43
+ */
44
+ unsubscribe(queryId: string): void;
45
+
46
+ /**
47
+ * Permanently close this hub connection and clean up all subscriptions.
48
+ */
49
+ dispose(): void;
50
+ }
@@ -0,0 +1,39 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ /**
5
+ * Callback invoked by {@link IReconnectPolicy} when it is time to attempt a reconnect.
6
+ */
7
+ export type ReconnectCallback = () => void;
8
+
9
+ /**
10
+ * Defines the contract for a reconnect policy that controls back-off and retry behavior
11
+ * for observable query connections.
12
+ */
13
+ export interface IReconnectPolicy {
14
+ /**
15
+ * The current number of reconnect attempts made since the last {@link reset}.
16
+ */
17
+ readonly attempt: number;
18
+
19
+ /**
20
+ * Schedule the next reconnect attempt.
21
+ * @param {ReconnectCallback} onReconnect Callback to invoke when the delay elapses.
22
+ * @param {string} label Human-readable label used in log output (e.g. the connection URL).
23
+ * @returns {boolean} {@code true} if the attempt was scheduled; {@code false} if the maximum
24
+ * number of attempts has been reached and the policy has given up.
25
+ */
26
+ schedule(onReconnect: ReconnectCallback, label: string): boolean;
27
+
28
+ /**
29
+ * Reset the attempt counter and cancel any pending timer.
30
+ * Call this when a connection is successfully established.
31
+ */
32
+ reset(): void;
33
+
34
+ /**
35
+ * Cancel any pending reconnect timer without resetting the attempt counter.
36
+ * Call this when the connection is permanently disposed.
37
+ */
38
+ cancel(): void;
39
+ }
@@ -3,6 +3,8 @@
3
3
 
4
4
  import { Globals } from '../Globals';
5
5
  import { IObservableQueryConnection } from './IObservableQueryConnection';
6
+ import { IReconnectPolicy } from './IReconnectPolicy';
7
+ import { ReconnectPolicy } from './ReconnectPolicy';
6
8
  import { QueryResult } from './QueryResult';
7
9
  import { WebSocketMessage, WebSocketMessageType } from './WebSocketMessage';
8
10
 
@@ -28,8 +30,9 @@ export class ObservableQueryConnection<TDataType> implements IObservableQueryCon
28
30
  * @param {Url} url The fully qualified Url.
29
31
  * @param {string} _microservice The microservice name.
30
32
  * @param {number} pingIntervalMs The ping interval in milliseconds (default: 10000).
33
+ * @param {IReconnectPolicy} reconnectPolicy The reconnect policy to use (default: {@link ReconnectPolicy}).
31
34
  */
32
- constructor(url: URL, private readonly _microservice: string, pingIntervalMs: number = 10000) {
35
+ constructor(url: URL, private readonly _microservice: string, pingIntervalMs: number = 10000, private readonly _reconnectPolicy: IReconnectPolicy = new ReconnectPolicy()) {
33
36
  this._pingIntervalMs = pingIntervalMs;
34
37
  const secure = url.protocol?.indexOf('https') === 0 || false;
35
38
 
@@ -82,32 +85,12 @@ export class ObservableQueryConnection<TDataType> implements IObservableQueryCon
82
85
  url = `${url}${query}`;
83
86
  }
84
87
 
85
- let timeToWait = 500;
86
- const timeExponent = 500;
87
- const retries = 100;
88
- let currentAttempt = 0;
89
- const maxTime = 10_000;
90
-
91
88
  const connectSocket = () => {
92
- const retry = () => {
93
- currentAttempt++;
94
- if (currentAttempt > retries) {
95
- console.log(`Attempted ${retries} retries for route '${url}'. Abandoning.`);
96
- return;
97
- }
98
- console.log(`Attempting to reconnect for '${url}' (#${currentAttempt})`);
99
-
100
- setTimeout(connectSocket, timeToWait);
101
- timeToWait += (timeExponent * currentAttempt);
102
- timeToWait = timeToWait > maxTime ? maxTime : timeToWait;
103
- };
104
-
105
89
  this._socket = new WebSocket(url);
106
90
  this._socket.onopen = () => {
107
91
  if (this._disconnected) return;
108
92
  console.log(`Connection for '${url}' established`);
109
- timeToWait = 500;
110
- currentAttempt = 0;
93
+ this._reconnectPolicy.reset();
111
94
  this._connectionStartTime = Date.now();
112
95
  this.startPinging();
113
96
  };
@@ -115,13 +98,13 @@ export class ObservableQueryConnection<TDataType> implements IObservableQueryCon
115
98
  if (this._disconnected) return;
116
99
  console.log(`Unexpected connection closed for route '${url}'`);
117
100
  this.stopPinging();
118
- retry();
101
+ this._reconnectPolicy.schedule(connectSocket, url);
119
102
  };
120
103
  this._socket.onerror = (error) => {
121
104
  if (this._disconnected) return;
122
105
  console.log(`Error with connection for '${url}' - ${error}`);
123
106
  this.stopPinging();
124
- retry();
107
+ this._reconnectPolicy.schedule(connectSocket, url);
125
108
  };
126
109
  this._socket.onmessage = (ev) => {
127
110
  if (this._disconnected) {
@@ -143,6 +126,7 @@ export class ObservableQueryConnection<TDataType> implements IObservableQueryCon
143
126
  }
144
127
  console.log(`Disconnecting '${this._url}'`);
145
128
  this._disconnected = true;
129
+ this._reconnectPolicy.cancel();
146
130
  this.stopPinging();
147
131
  this._socket?.close();
148
132
  console.log(`Connection for '${this._url}' closed`);
@@ -0,0 +1,118 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { Globals } from '../Globals';
5
+ import { joinPaths } from '../joinPaths';
6
+ import { UrlHelpers } from '../UrlHelpers';
7
+ import { IObservableQueryConnection } from './IObservableQueryConnection';
8
+ import { ObservableQueryConnection } from './ObservableQueryConnection';
9
+ import { QueryTransportMethod } from './QueryTransportMethod';
10
+ import { ServerSentEventQueryConnection, SSE_HUB_ROUTE } from './ServerSentEventQueryConnection';
11
+ import { ServerSentEventHubConnection } from './ServerSentEventHubConnection';
12
+ import { WebSocketHubConnection } from './WebSocketHubConnection';
13
+ import { MultiplexedObservableQueryConnection, WS_HUB_ROUTE, getOrCreateMultiplexer } from './ObservableQueryMultiplexer';
14
+
15
+ /**
16
+ * The SSE subscribe POST endpoint route.
17
+ */
18
+ export const SSE_SUBSCRIBE_ROUTE = '/.cratis/queries/sse/subscribe';
19
+
20
+ /**
21
+ * The SSE unsubscribe POST endpoint route.
22
+ */
23
+ export const SSE_UNSUBSCRIBE_ROUTE = '/.cratis/queries/sse/unsubscribe';
24
+
25
+ /**
26
+ * Describes what the factory needs to know about a query in order to create
27
+ * the right connection. Transport details are intentionally absent — the
28
+ * factory reads those from {@link Globals}.
29
+ */
30
+ export interface QueryConnectionDescriptor {
31
+ /** The route template (e.g. `/api/accounts/debit/all-accounts`). */
32
+ route: string;
33
+ /** Fully-qualified backend query name used by hub transports. */
34
+ queryName: string;
35
+ /** Origin base URL (e.g. `http://localhost:5000`). */
36
+ origin: string;
37
+ /** API base path prefix. */
38
+ apiBasePath: string;
39
+ /** Microservice identifier. */
40
+ microservice: string;
41
+ /** Route/query arguments for the current subscription. */
42
+ args?: object;
43
+ }
44
+
45
+ /**
46
+ * Single entry-point for creating observable query connections.
47
+ *
48
+ * The transport is chosen as a 2x2 matrix of (direct | hub) x (WebSocket | SSE):
49
+ *
50
+ * | | Direct (per-query URL) | Hub (centralized endpoint) |
51
+ * |----------------|-------------------------------|-------------------------------|
52
+ * | **WebSocket** | ObservableQueryConnection | MultiplexedObservableQueryConnection |
53
+ * | **SSE** | ServerSentEventQueryConnection | MultiplexedObservableQueryConnection |
54
+ *
55
+ * In multiplexed mode, both transports share the same multiplexer — it creates either
56
+ * WebSocket or SSE connections depending on the transport setting.
57
+ *
58
+ * {@link ObservableQueryFor} never needs to know which transport is in use.
59
+ */
60
+ export function createObservableQueryConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {
61
+ const isSSE = Globals.queryTransportMethod === QueryTransportMethod.ServerSentEvents;
62
+
63
+ if (Globals.queryDirectMode) {
64
+ return isSSE
65
+ ? createDirectSSEConnection<TDataType>(descriptor)
66
+ : createDirectWebSocketConnection<TDataType>(descriptor);
67
+ }
68
+
69
+ return createMultiplexedConnection<TDataType>(descriptor, isSSE);
70
+ }
71
+
72
+ // ---- Direct mode: one connection per query, hitting the query's own URL ----
73
+
74
+ function buildDirectUrl(descriptor: QueryConnectionDescriptor): URL {
75
+ const { route } = UrlHelpers.replaceRouteParameters(descriptor.route, descriptor.args as object);
76
+ const actualRoute = joinPaths(descriptor.apiBasePath, route);
77
+ return UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, actualRoute);
78
+ }
79
+
80
+ function createDirectWebSocketConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {
81
+ return new ObservableQueryConnection<TDataType>(buildDirectUrl(descriptor), descriptor.microservice);
82
+ }
83
+
84
+ function createDirectSSEConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {
85
+ return new ServerSentEventQueryConnection<TDataType>(buildDirectUrl(descriptor));
86
+ }
87
+
88
+ // ---- Multiplexed mode: centralized endpoint, multiple queries share connections ----
89
+
90
+ function createMultiplexedConnection<TDataType>(descriptor: QueryConnectionDescriptor, isSSE: boolean): IObservableQueryConnection<TDataType> {
91
+ const transport = isSSE ? 'sse' : 'ws';
92
+ const cacheKey = `${Globals.queryConnectionCount}|${transport}|${descriptor.origin}|${descriptor.apiBasePath}|${descriptor.microservice}`;
93
+
94
+ const multiplexer = getOrCreateMultiplexer(() => {
95
+ if (isSSE) {
96
+ const sseRoute = joinPaths(descriptor.apiBasePath, SSE_HUB_ROUTE);
97
+ const sseUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, sseRoute);
98
+ const subscribeRoute = joinPaths(descriptor.apiBasePath, SSE_SUBSCRIBE_ROUTE);
99
+ const subscribeUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, subscribeRoute);
100
+ const unsubscribeRoute = joinPaths(descriptor.apiBasePath, SSE_UNSUBSCRIBE_ROUTE);
101
+ const unsubscribeUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, unsubscribeRoute);
102
+ return new ServerSentEventHubConnection(
103
+ sseUrl.toString(),
104
+ subscribeUrl.toString(),
105
+ unsubscribeUrl.toString(),
106
+ descriptor.microservice,
107
+ );
108
+ } else {
109
+ const hubRoute = joinPaths(descriptor.apiBasePath, WS_HUB_ROUTE);
110
+ const hubUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, hubRoute);
111
+ const secure = hubUrl.protocol?.indexOf('https') === 0;
112
+ const wsUrl = `${secure ? 'wss' : 'ws'}://${hubUrl.host}${hubUrl.pathname}${hubUrl.search}`;
113
+ return new WebSocketHubConnection(wsUrl, descriptor.microservice);
114
+ }
115
+ }, cacheKey);
116
+
117
+ return new MultiplexedObservableQueryConnection<TDataType>(multiplexer, descriptor.queryName);
118
+ }
@@ -0,0 +1,64 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { IObservableQueryConnection } from './IObservableQueryConnection';
5
+ import { DataReceived } from './ObservableQueryConnection';
6
+
7
+ /**
8
+ * Tracks the number of active subscribers assigned to each pool slot.
9
+ */
10
+ interface PoolSlot {
11
+ queryCount: number;
12
+ }
13
+
14
+ /**
15
+ * Represents a pool of observable query connection factories distributed round-robin across N slots.
16
+ *
17
+ * Each call to {@link acquire} picks the slot with the fewest active queries (falling back to
18
+ * round-robin when counts are equal) and creates a fresh connection for that subscriber via the
19
+ * provided factory. The connection is a dedicated instance per subscriber; the pool only tracks
20
+ * slot utilization so future multiplexed transports (e.g. WebSocket) can share connections
21
+ * across a fixed number of physical hub connections.
22
+ *
23
+ * When {@link size} is 1 (the default), all queries are counted against a single slot — the
24
+ * natural behavior for a single multiplexed connection.
25
+ *
26
+ * @template TDataType The type of data received from the connections.
27
+ */
28
+ export class ObservableQueryConnectionPool<TDataType> {
29
+ private readonly _slots: PoolSlot[];
30
+
31
+ /**
32
+ * Initializes a new {@link ObservableQueryConnectionPool}.
33
+ * @param {number} size Number of logical slots (hub connections) in the pool.
34
+ * @param {() => IObservableQueryConnection<TDataType>} factory Factory that produces a new connection instance per subscriber.
35
+ */
36
+ constructor(
37
+ size: number,
38
+ private readonly _factory: () => IObservableQueryConnection<TDataType>
39
+ ) {
40
+ this._slots = Array.from({ length: Math.max(1, size) }, () => ({ queryCount: 0 }));
41
+ }
42
+
43
+ /**
44
+ * Picks the least-loaded pool slot, creates a fresh connection via the factory, and starts
45
+ * delivering data to the provided callback.
46
+ * @param {DataReceived<TDataType>} dataReceived Callback invoked for each message.
47
+ * @param {object} queryArguments Arguments forwarded to the connection.
48
+ * @returns A cleanup function that decrements the slot counter and disconnects the connection.
49
+ */
50
+ acquire(dataReceived: DataReceived<TDataType>, queryArguments?: object): () => void {
51
+ // Pick the slot with the fewest active queries.
52
+ const slot = this._slots.reduce((min, current) => current.queryCount < min.queryCount ? current : min, this._slots[0]);
53
+ slot.queryCount++;
54
+
55
+ // Each subscriber gets its own dedicated connection instance.
56
+ const connection = this._factory();
57
+ connection.connect(dataReceived, queryArguments);
58
+
59
+ return () => {
60
+ connection.disconnect();
61
+ slot.queryCount = Math.max(0, slot.queryCount - 1);
62
+ };
63
+ }
64
+ }
@@ -2,11 +2,11 @@
2
2
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
 
4
4
  import { IObservableQueryFor, OnNextResult } from './IObservableQueryFor';
5
- import { ObservableQueryConnection } from './ObservableQueryConnection';
6
5
  import { ObservableQuerySubscription } from './ObservableQuerySubscription';
7
6
  import { ValidateRequestArguments } from './ValidateRequestArguments';
8
7
  import { IObservableQueryConnection } from './IObservableQueryConnection';
9
8
  import { NullObservableQueryConnection } from './NullObservableQueryConnection';
9
+ import { createObservableQueryConnection } from './ObservableQueryConnectionFactory';
10
10
  import { Constructor } from '@cratis/fundamentals';
11
11
  import { JsonSerializer } from '@cratis/fundamentals';
12
12
  import { QueryResult } from './QueryResult';
@@ -36,6 +36,8 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
36
36
  abstract readonly route: string;
37
37
  abstract readonly defaultValue: TDataType;
38
38
  readonly roles: string[] = [];
39
+ /** Backend fully-qualified query name used when subscribing via the SSE hub. Overridden in generated proxies. */
40
+ readonly queryName?: string;
39
41
  abstract readonly parameterDescriptors: ParameterDescriptor[];
40
42
  abstract get requiredRequestParameters(): string[];
41
43
  sorting: Sorting;
@@ -91,10 +93,14 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
91
93
  if (!this.validateArguments(args)) {
92
94
  this._connection = new NullObservableQueryConnection(this.defaultValue);
93
95
  } else {
94
- const { route } = UrlHelpers.replaceRouteParameters(this.route, args as object);
95
- const actualRoute = joinPaths(this._apiBasePath, route);
96
- const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);
97
- this._connection = new ObservableQueryConnection<TDataType>(url, this._microservice);
96
+ this._connection = createObservableQueryConnection({
97
+ route: this.route,
98
+ queryName: this.queryName ?? this.constructor.name,
99
+ origin: this._origin,
100
+ apiBasePath: this._apiBasePath,
101
+ microservice: this._microservice,
102
+ args: args as object,
103
+ });
98
104
  }
99
105
 
100
106
  // Build query arguments including unused args parameters, parameter descriptor values, and paging/sorting
@@ -0,0 +1,214 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { IObservableQueryConnection } from './IObservableQueryConnection';
5
+ import { IObservableQueryHubConnection } from './IObservableQueryHubConnection';
6
+ import { DataReceived } from './ObservableQueryConnection';
7
+ import { SubscriptionRequest } from './WebSocketHubConnection';
8
+ import { Globals } from '../Globals';
9
+
10
+ /* eslint-disable @typescript-eslint/no-explicit-any */
11
+
12
+ /**
13
+ * The WebSocket demultiplexer route used when connecting through the multiplexed observable query endpoint.
14
+ */
15
+ export const WS_HUB_ROUTE = '/.cratis/queries/ws';
16
+
17
+ /**
18
+ * Multiplexes multiple observable query subscriptions across a bounded pool of physical
19
+ * connections (WebSocket or SSE) to the backend demultiplexer.
20
+ *
21
+ * Each pool slot is a single multiplexed connection. When a new subscription is requested,
22
+ * the slot with the fewest active queries is chosen. This balances load across N physical
23
+ * connections while keeping the total connection count bounded.
24
+ */
25
+ export class ObservableQueryMultiplexer {
26
+ private readonly _connections: IObservableQueryHubConnection[];
27
+ private readonly _size: number;
28
+
29
+ /**
30
+ * Initializes a new {@link ObservableQueryMultiplexer}.
31
+ * @param {number} size Number of physical connections (pool slots).
32
+ * @param {() => IObservableQueryHubConnection} connectionFactory Factory function to create each connection.
33
+ */
34
+ constructor(size: number, connectionFactory: () => IObservableQueryHubConnection) {
35
+ this._size = Math.max(1, size);
36
+ this._connections = Array.from({ length: this._size }, () => connectionFactory());
37
+ }
38
+
39
+ /**
40
+ * Gets the pool size.
41
+ */
42
+ get size(): number {
43
+ return this._size;
44
+ }
45
+
46
+ /**
47
+ * Gets the best available ping latency across all connections.
48
+ */
49
+ get lastPingLatency(): number {
50
+ return this._connections.reduce((min, c) =>
51
+ c.lastPingLatency > 0 && c.lastPingLatency < min ? c.lastPingLatency : min,
52
+ Number.MAX_SAFE_INTEGER
53
+ );
54
+ }
55
+
56
+ /**
57
+ * Gets the average latency across all connections.
58
+ */
59
+ get averageLatency(): number {
60
+ const active = this._connections.filter(c => c.averageLatency > 0);
61
+ if (active.length === 0) return 0;
62
+ return active.reduce((sum, c) => sum + c.averageLatency, 0) / active.length;
63
+ }
64
+
65
+ /**
66
+ * Subscribe to a query through the multiplexer. Picks the least-loaded connection
67
+ * and sends a Subscribe message on it.
68
+ * @param {string} queryName Fully qualified backend query name.
69
+ * @param {object} queryArguments Flat query arguments (incl. page, pageSize, sortBy, sortDirection).
70
+ * @param {DataReceived<any>} callback Callback invoked for each result.
71
+ * @returns A cleanup function that unsubscribes from the query.
72
+ */
73
+ subscribe(queryName: string, queryArguments: object | undefined, callback: DataReceived<any>): () => void {
74
+ const request = this.buildSubscriptionRequest(queryName, queryArguments);
75
+ const conn = this.leastLoaded();
76
+ const queryId = this.generateQueryId();
77
+
78
+ conn.subscribe(queryId, request, callback);
79
+
80
+ return () => {
81
+ conn.unsubscribe(queryId);
82
+ };
83
+ }
84
+
85
+ /**
86
+ * Dispose all connections in the multiplexer.
87
+ */
88
+ dispose(): void {
89
+ for (const conn of this._connections) {
90
+ conn.dispose();
91
+ }
92
+ }
93
+
94
+ private leastLoaded(): IObservableQueryHubConnection {
95
+ return this._connections.reduce((min, c) =>
96
+ c.queryCount < min.queryCount ? c : min, this._connections[0]);
97
+ }
98
+
99
+ private generateQueryId(): string {
100
+ // Use crypto.randomUUID when available, fall back to timestamp + random
101
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
102
+ return crypto.randomUUID();
103
+ }
104
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
105
+ }
106
+
107
+ private buildSubscriptionRequest(queryName: string, args?: object): SubscriptionRequest {
108
+ const request: SubscriptionRequest = { queryName };
109
+
110
+ if (!args) return request;
111
+
112
+ const a = args as Record<string, any>;
113
+ const pagingAndSortingKeys = new Set(['page', 'pageSize', 'sortBy', 'sortDirection']);
114
+
115
+ if (a.page !== undefined && a.page !== null) request.page = Number(a.page);
116
+ if (a.pageSize !== undefined && a.pageSize !== null) request.pageSize = Number(a.pageSize);
117
+ if (a.sortBy !== undefined && a.sortBy !== null) request.sortBy = String(a.sortBy);
118
+ if (a.sortDirection !== undefined && a.sortDirection !== null) request.sortDirection = String(a.sortDirection);
119
+
120
+ // Everything else goes into arguments as string key-value pairs
121
+ const remaining: Record<string, string | null> = {};
122
+ let hasRemaining = false;
123
+
124
+ for (const [key, value] of Object.entries(a)) {
125
+ if (pagingAndSortingKeys.has(key)) continue;
126
+ remaining[key] = value !== undefined && value !== null ? String(value) : null;
127
+ hasRemaining = true;
128
+ }
129
+
130
+ if (hasRemaining) {
131
+ request.arguments = remaining;
132
+ }
133
+
134
+ return request;
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Wraps an {@link ObservableQueryMultiplexer} subscription as an {@link IObservableQueryConnection},
140
+ * allowing the multiplexed transport to plug into the existing query subscription pipeline
141
+ * without changes to callers.
142
+ */
143
+ export class MultiplexedObservableQueryConnection<TDataType> implements IObservableQueryConnection<TDataType> {
144
+ private _cleanup?: () => void;
145
+
146
+ /**
147
+ * Initializes a new {@link MultiplexedObservableQueryConnection}.
148
+ * @param {ObservableQueryMultiplexer} multiplexer The shared multiplexer.
149
+ * @param {string} queryName The fully qualified backend query name.
150
+ */
151
+ constructor(
152
+ private readonly _pool: ObservableQueryMultiplexer,
153
+ private readonly _queryName: string,
154
+ ) {
155
+ }
156
+
157
+ /** @inheritdoc */
158
+ get lastPingLatency(): number {
159
+ return this._pool.lastPingLatency;
160
+ }
161
+
162
+ /** @inheritdoc */
163
+ get averageLatency(): number {
164
+ return this._pool.averageLatency;
165
+ }
166
+
167
+ /** @inheritdoc */
168
+ connect(dataReceived: DataReceived<TDataType>, queryArguments?: object): void {
169
+ this._cleanup = this._pool.subscribe(
170
+ this._queryName,
171
+ queryArguments,
172
+ dataReceived as DataReceived<any>,
173
+ );
174
+ }
175
+
176
+ /** @inheritdoc */
177
+ disconnect(): void {
178
+ this._cleanup?.();
179
+ this._cleanup = undefined;
180
+ }
181
+ }
182
+
183
+ // ----- Shared pool singleton management -----
184
+
185
+ let _sharedMultiplexer: ObservableQueryMultiplexer | undefined;
186
+ let _sharedMultiplexerKey = '';
187
+
188
+ /**
189
+ * Returns the shared {@link ObservableQueryMultiplexer}, creating or re-creating it when the
190
+ * configuration (connection count, origin, base path, microservice, transport) changes.
191
+ * @param {() => IObservableQueryHubConnection} connectionFactory Factory to create individual connections.
192
+ * @param {string} cacheKey A string that identifies the current configuration for invalidation.
193
+ * @returns The shared multiplexer instance.
194
+ */
195
+ export function getOrCreateMultiplexer(connectionFactory: () => IObservableQueryHubConnection, cacheKey: string): ObservableQueryMultiplexer {
196
+ if (_sharedMultiplexer && _sharedMultiplexerKey === cacheKey) {
197
+ return _sharedMultiplexer;
198
+ }
199
+
200
+ _sharedMultiplexer?.dispose();
201
+ _sharedMultiplexer = new ObservableQueryMultiplexer(Globals.queryConnectionCount, connectionFactory);
202
+ _sharedMultiplexerKey = cacheKey;
203
+ return _sharedMultiplexer;
204
+ }
205
+
206
+ /**
207
+ * Disposes and clears the shared multiplexer singleton.
208
+ * Intended for use in test teardown to prevent state leakage across tests.
209
+ */
210
+ export function resetSharedMultiplexer(): void {
211
+ _sharedMultiplexer?.dispose();
212
+ _sharedMultiplexer = undefined;
213
+ _sharedMultiplexerKey = '';
214
+ }