@cratis/arc 22.150.0 → 22.152.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 (193) hide show
  1. package/Globals.ts +10 -0
  2. package/dist/cjs/Globals.d.ts +2 -0
  3. package/dist/cjs/Globals.d.ts.map +1 -1
  4. package/dist/cjs/Globals.js +7 -0
  5. package/dist/cjs/Globals.js.map +1 -1
  6. package/dist/cjs/queries/ObservableQueryConnectionFactory.d.ts +5 -0
  7. package/dist/cjs/queries/ObservableQueryConnectionFactory.d.ts.map +1 -1
  8. package/dist/cjs/queries/ObservableQueryConnectionFactory.js +16 -1
  9. package/dist/cjs/queries/ObservableQueryConnectionFactory.js.map +1 -1
  10. package/dist/cjs/queries/ObservableQueryFor.d.ts +3 -0
  11. package/dist/cjs/queries/ObservableQueryFor.d.ts.map +1 -1
  12. package/dist/cjs/queries/ObservableQueryFor.js +12 -3
  13. package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
  14. package/dist/cjs/queries/PollingOptions.d.ts +8 -0
  15. package/dist/cjs/queries/PollingOptions.d.ts.map +1 -0
  16. package/dist/cjs/queries/PollingQueryConnection.d.ts +33 -0
  17. package/dist/cjs/queries/PollingQueryConnection.d.ts.map +1 -0
  18. package/dist/cjs/queries/PollingQueryConnection.js +150 -0
  19. package/dist/cjs/queries/PollingQueryConnection.js.map +1 -0
  20. package/dist/cjs/queries/QueryTransportMethod.d.ts +2 -1
  21. package/dist/cjs/queries/QueryTransportMethod.d.ts.map +1 -1
  22. package/dist/cjs/queries/QueryTransportMethod.js +1 -0
  23. package/dist/cjs/queries/QueryTransportMethod.js.map +1 -1
  24. package/dist/cjs/queries/index.d.ts +2 -0
  25. package/dist/cjs/queries/index.d.ts.map +1 -1
  26. package/dist/cjs/queries/index.js +4 -0
  27. package/dist/cjs/queries/index.js.map +1 -1
  28. package/dist/esm/Globals.d.ts +2 -0
  29. package/dist/esm/Globals.d.ts.map +1 -1
  30. package/dist/esm/Globals.js +7 -0
  31. package/dist/esm/Globals.js.map +1 -1
  32. package/dist/esm/queries/ObservableQueryConnectionFactory.d.ts +5 -0
  33. package/dist/esm/queries/ObservableQueryConnectionFactory.d.ts.map +1 -1
  34. package/dist/esm/queries/ObservableQueryConnectionFactory.js +16 -2
  35. package/dist/esm/queries/ObservableQueryConnectionFactory.js.map +1 -1
  36. package/dist/esm/queries/ObservableQueryFor.d.ts +3 -0
  37. package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
  38. package/dist/esm/queries/ObservableQueryFor.js +13 -4
  39. package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
  40. package/dist/esm/queries/PollingOptions.d.ts +8 -0
  41. package/dist/esm/queries/PollingOptions.d.ts.map +1 -0
  42. package/dist/esm/queries/PollingOptions.js +2 -0
  43. package/dist/esm/queries/PollingOptions.js.map +1 -0
  44. package/dist/esm/queries/PollingQueryConnection.d.ts +33 -0
  45. package/dist/esm/queries/PollingQueryConnection.d.ts.map +1 -0
  46. package/dist/esm/queries/PollingQueryConnection.js +147 -0
  47. package/dist/esm/queries/PollingQueryConnection.js.map +1 -0
  48. package/dist/esm/queries/QueryTransportMethod.d.ts +2 -1
  49. package/dist/esm/queries/QueryTransportMethod.d.ts.map +1 -1
  50. package/dist/esm/queries/QueryTransportMethod.js +1 -0
  51. package/dist/esm/queries/QueryTransportMethod.js.map +1 -1
  52. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_polling_transport.d.ts +2 -0
  53. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_polling_transport.d.ts.map +1 -0
  54. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_polling_transport.js +46 -0
  55. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_polling_transport.js.map +1 -0
  56. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_polling_transport.d.ts +2 -0
  57. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_polling_transport.d.ts.map +1 -0
  58. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_polling_transport.js +46 -0
  59. package/dist/esm/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_polling_transport.js.map +1 -0
  60. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport.d.ts +2 -0
  61. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport.d.ts.map +1 -0
  62. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport.js +108 -0
  63. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport.js.map +1 -0
  64. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport_and_unauthorized_response.d.ts +2 -0
  65. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport_and_unauthorized_response.d.ts.map +1 -0
  66. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport_and_unauthorized_response.js +39 -0
  67. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport_and_unauthorized_response.js.map +1 -0
  68. package/dist/esm/queries/for_PollingQueryConnection/given/a_polling_query_connection.d.ts +31 -0
  69. package/dist/esm/queries/for_PollingQueryConnection/given/a_polling_query_connection.d.ts.map +1 -0
  70. package/dist/esm/queries/for_PollingQueryConnection/given/a_polling_query_connection.js +52 -0
  71. package/dist/esm/queries/for_PollingQueryConnection/given/a_polling_query_connection.js.map +1 -0
  72. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_network_error.d.ts +2 -0
  73. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_network_error.d.ts.map +1 -0
  74. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_network_error.js +16 -0
  75. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_network_error.js.map +1 -0
  76. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_server_error_with_an_envelope.d.ts +2 -0
  77. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_server_error_with_an_envelope.d.ts.map +1 -0
  78. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_server_error_with_an_envelope.js +22 -0
  79. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_a_server_error_with_an_envelope.js.map +1 -0
  80. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_not_ready.d.ts +2 -0
  81. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_not_ready.d.ts.map +1 -0
  82. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_not_ready.js +19 -0
  83. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_not_ready.js.map +1 -0
  84. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_repeated_failures.d.ts +2 -0
  85. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_repeated_failures.d.ts.map +1 -0
  86. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_repeated_failures.js +16 -0
  87. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_repeated_failures.js.map +1 -0
  88. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_request_timeout.d.ts +2 -0
  89. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_request_timeout.d.ts.map +1 -0
  90. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_request_timeout.js +19 -0
  91. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/after_request_timeout.js.map +1 -0
  92. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/with_jitter.d.ts +2 -0
  93. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/with_jitter.d.ts.map +1 -0
  94. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/with_jitter.js +16 -0
  95. package/dist/esm/queries/for_PollingQueryConnection/when_backing_off/with_jitter.js.map +1 -0
  96. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/and_fetch_rejects_on_abort.d.ts +2 -0
  97. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/and_fetch_rejects_on_abort.d.ts.map +1 -0
  98. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/and_fetch_rejects_on_abort.js +16 -0
  99. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/and_fetch_rejects_on_abort.js.map +1 -0
  100. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_a_request_is_in_flight.d.ts +2 -0
  101. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_a_request_is_in_flight.d.ts.map +1 -0
  102. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_a_request_is_in_flight.js +16 -0
  103. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_a_request_is_in_flight.js.map +1 -0
  104. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_waiting_for_the_next_poll.d.ts +2 -0
  105. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_waiting_for_the_next_poll.d.ts.map +1 -0
  106. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_waiting_for_the_next_poll.js +14 -0
  107. package/dist/esm/queries/for_PollingQueryConnection/when_disconnecting/while_waiting_for_the_next_poll.js.map +1 -0
  108. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_a_request_is_still_in_flight.d.ts +2 -0
  109. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_a_request_is_still_in_flight.d.ts.map +1 -0
  110. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_a_request_is_still_in_flight.js +12 -0
  111. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_a_request_is_still_in_flight.js.map +1 -0
  112. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_changes.d.ts +2 -0
  113. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_changes.d.ts.map +1 -0
  114. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_changes.js +47 -0
  115. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_changes.js.map +1 -0
  116. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_is_unchanged.d.ts +2 -0
  117. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_is_unchanged.d.ts.map +1 -0
  118. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_is_unchanged.js +21 -0
  119. package/dist/esm/queries/for_PollingQueryConnection/when_polling/and_data_is_unchanged.js.map +1 -0
  120. package/dist/esm/queries/for_PollingQueryConnection/when_polling/with_global_and_instance_headers.d.ts +2 -0
  121. package/dist/esm/queries/for_PollingQueryConnection/when_polling/with_global_and_instance_headers.d.ts.map +1 -0
  122. package/dist/esm/queries/for_PollingQueryConnection/when_polling/with_global_and_instance_headers.js +25 -0
  123. package/dist/esm/queries/for_PollingQueryConnection/when_polling/with_global_and_instance_headers.js.map +1 -0
  124. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/above_the_maximum.d.ts +2 -0
  125. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/above_the_maximum.d.ts.map +1 -0
  126. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/above_the_maximum.js +16 -0
  127. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/above_the_maximum.js.map +1 -0
  128. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/below_the_minimum.d.ts +2 -0
  129. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/below_the_minimum.d.ts.map +1 -0
  130. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/below_the_minimum.js +18 -0
  131. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/below_the_minimum.js.map +1 -0
  132. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/on_a_not_ready_response.d.ts +2 -0
  133. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/on_a_not_ready_response.d.ts.map +1 -0
  134. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/on_a_not_ready_response.js +16 -0
  135. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/on_a_not_ready_response.js.map +1 -0
  136. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/that_is_invalid.d.ts +2 -0
  137. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/that_is_invalid.d.ts.map +1 -0
  138. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/that_is_invalid.js +18 -0
  139. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/that_is_invalid.js.map +1 -0
  140. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/within_bounds.d.ts +2 -0
  141. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/within_bounds.d.ts.map +1 -0
  142. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/within_bounds.js +16 -0
  143. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/within_bounds.js.map +1 -0
  144. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_invalid_arguments/stops_polling.d.ts +2 -0
  145. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_invalid_arguments/stops_polling.d.ts.map +1 -0
  146. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_invalid_arguments/stops_polling.js +12 -0
  147. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_invalid_arguments/stops_polling.js.map +1 -0
  148. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/stops_polling.d.ts +2 -0
  149. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/stops_polling.d.ts.map +1 -0
  150. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/stops_polling.js +14 -0
  151. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/stops_polling.js.map +1 -0
  152. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/with_a_non_json_body.d.ts +2 -0
  153. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/with_a_non_json_body.d.ts.map +1 -0
  154. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/with_a_non_json_body.js +14 -0
  155. package/dist/esm/queries/for_PollingQueryConnection/when_receiving_unauthorized/with_a_non_json_body.js.map +1 -0
  156. package/dist/esm/queries/index.d.ts +2 -0
  157. package/dist/esm/queries/index.d.ts.map +1 -1
  158. package/dist/esm/queries/index.js +2 -1
  159. package/dist/esm/queries/index.js.map +1 -1
  160. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  161. package/package.json +1 -1
  162. package/queries/ObservableQueryConnectionFactory.ts +24 -1
  163. package/queries/ObservableQueryFor.ts +15 -3
  164. package/queries/PollingOptions.ts +16 -0
  165. package/queries/PollingQueryConnection.ts +149 -0
  166. package/queries/QueryTransportMethod.ts +3 -0
  167. package/queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_polling_transport.ts +47 -0
  168. package/queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_polling_transport.ts +47 -0
  169. package/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport.ts +115 -0
  170. package/queries/for_ObservableQueryFor/when_subscribing/with_polling_transport_and_unauthorized_response.ts +44 -0
  171. package/queries/for_PollingQueryConnection/given/a_polling_query_connection.ts +60 -0
  172. package/queries/for_PollingQueryConnection/when_backing_off/after_a_network_error.ts +19 -0
  173. package/queries/for_PollingQueryConnection/when_backing_off/after_a_server_error_with_an_envelope.ts +25 -0
  174. package/queries/for_PollingQueryConnection/when_backing_off/after_not_ready.ts +22 -0
  175. package/queries/for_PollingQueryConnection/when_backing_off/after_repeated_failures.ts +19 -0
  176. package/queries/for_PollingQueryConnection/when_backing_off/after_request_timeout.ts +22 -0
  177. package/queries/for_PollingQueryConnection/when_backing_off/with_jitter.ts +19 -0
  178. package/queries/for_PollingQueryConnection/when_disconnecting/and_fetch_rejects_on_abort.ts +19 -0
  179. package/queries/for_PollingQueryConnection/when_disconnecting/while_a_request_is_in_flight.ts +19 -0
  180. package/queries/for_PollingQueryConnection/when_disconnecting/while_waiting_for_the_next_poll.ts +17 -0
  181. package/queries/for_PollingQueryConnection/when_polling/and_a_request_is_still_in_flight.ts +15 -0
  182. package/queries/for_PollingQueryConnection/when_polling/and_data_changes.ts +51 -0
  183. package/queries/for_PollingQueryConnection/when_polling/and_data_is_unchanged.ts +24 -0
  184. package/queries/for_PollingQueryConnection/when_polling/with_global_and_instance_headers.ts +28 -0
  185. package/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/above_the_maximum.ts +19 -0
  186. package/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/below_the_minimum.ts +21 -0
  187. package/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/on_a_not_ready_response.ts +19 -0
  188. package/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/that_is_invalid.ts +21 -0
  189. package/queries/for_PollingQueryConnection/when_receiving_a_poll_hint/within_bounds.ts +19 -0
  190. package/queries/for_PollingQueryConnection/when_receiving_invalid_arguments/stops_polling.ts +15 -0
  191. package/queries/for_PollingQueryConnection/when_receiving_unauthorized/stops_polling.ts +17 -0
  192. package/queries/for_PollingQueryConnection/when_receiving_unauthorized/with_a_non_json_body.ts +17 -0
  193. package/queries/index.ts +2 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PollingQueryConnection.js","sources":["../../../queries/PollingQueryConnection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport { Globals } from '../Globals.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport { deepEqual } from '../deepEqual.js';\nimport { DataReceived } from './ObservableQueryConnection.js';\nimport { IObservableQueryConnection } from './IObservableQueryConnection.js';\nimport { PollingOptions } from './PollingOptions.js';\nimport { QueryResult } from './QueryResult.js';\nimport { isAbortError } from './isAbortError.js';\n\n/** Response header specifying the next poll delay in seconds. */\nexport const QUERY_POLL_AFTER_HEADER = 'Cratis-Query-Poll-After';\n\n/** Observes a query using sequential HTTP GET snapshots rather than a persistent connection. */\nexport class PollingQueryConnection<TDataType> implements IObservableQueryConnection<TDataType> {\n private _started = false;\n private _disconnected = false;\n private _unauthorized = false;\n private _timer?: ReturnType<typeof setTimeout>;\n private _controller?: AbortController;\n private _failures = 0;\n private _previousComparable?: object;\n private _lastPingLatency = 0;\n private _totalLatency = 0;\n private _requestCount = 0;\n\n /**\n * Initializes a polling connection.\n * @param _url The per-query HTTP endpoint.\n * @param _httpHeadersCallback Custom headers evaluated for each request.\n * @param _microservice The microservice identifier sent in the configured HTTP header.\n * @param _options The resolved timing policy for this connection.\n */\n constructor(\n private readonly _url: URL,\n private readonly _httpHeadersCallback: GetHttpHeaders,\n private readonly _microservice: string,\n private readonly _options: PollingOptions\n ) {}\n\n /** @inheritdoc */\n get lastPingLatency(): number { return this._lastPingLatency; }\n\n /** @inheritdoc */\n get averageLatency(): number {\n return this._requestCount ? this._totalLatency / this._requestCount : 0;\n }\n\n /** @inheritdoc */\n connect(dataReceived: DataReceived<TDataType>, queryArguments?: object): void {\n if (this._started || this._disconnected || this._unauthorized) return;\n this._started = true;\n const url = new URL(this._url);\n const parameters = UrlHelpers.buildQueryParams(queryArguments ?? {}, { waitForFirstResult: 'true' });\n parameters.forEach((value, key) => url.searchParams.append(key, value));\n void this.poll(url, dataReceived);\n }\n\n /** @inheritdoc */\n disconnect(): void {\n this._disconnected = true;\n clearTimeout(this._timer);\n this._timer = undefined;\n this._controller?.abort();\n }\n\n private async poll(url: URL, dataReceived: DataReceived<TDataType>): Promise<void> {\n this._controller = new AbortController();\n const started = performance.now();\n let delay: number;\n try {\n const headers = new Headers({\n ...Object.fromEntries(new Headers(Globals.httpHeadersCallback?.())),\n ...Object.fromEntries(new Headers(this._httpHeadersCallback()))\n });\n headers.set('Accept', 'application/json');\n headers.set('Content-Type', 'application/json');\n if (this._microservice) headers.set(Globals.microserviceHttpHeader, this._microservice);\n const response = await fetch(url.toString(), { method: 'GET', headers, signal: this._controller.signal });\n if (this._disconnected) return;\n const body = await response.text();\n if (this._disconnected) return;\n this._lastPingLatency = performance.now() - started;\n this._totalLatency += this._lastPingLatency;\n this._requestCount++;\n delay = this.handleResponse(response, body, dataReceived);\n } catch (error) {\n if (this._disconnected || this._unauthorized || isAbortError(error)) return;\n delay = this.backoff();\n }\n if (!this._disconnected && !this._unauthorized) {\n this._timer = setTimeout(() => { void this.poll(url, dataReceived); }, delay);\n }\n }\n\n private handleResponse(response: Response, body: string, dataReceived: DataReceived<TDataType>): number {\n let result = this.parseResult(body);\n if (response.status === 401 || response.status === 403 || result?.isAuthorized === false) {\n console.warn(`Polling: query for '${this._url}' was ended by the server - no longer authorized`);\n this._unauthorized = true;\n result ??= { ...QueryResult.unauthorized<TDataType>() } as QueryResult<TDataType>;\n result = { ...result, isAuthorized: false } as QueryResult<TDataType>;\n this.emitChanged(result, JSON.stringify(result), dataReceived);\n return 0;\n }\n if (result?.isValid === false) {\n this.disconnect();\n this.emitChanged(result, body, dataReceived);\n return 0;\n }\n const success = response.status === 200 && result !== undefined;\n if (result && (success || response.status >= 500)) this.emitChanged(result, body, dataReceived);\n if (success) this._failures = 0;\n const delay = success ? this.clamp(this._options.intervalMs) : this.backoff();\n const hint = response.headers.get(QUERY_POLL_AFTER_HEADER);\n const seconds = hint?.trim() ? Number(hint) : NaN;\n return Number.isFinite(seconds) && seconds >= 0 ? this.clamp(seconds * 1000) : delay;\n }\n\n private parseResult(body: string): QueryResult<TDataType> | undefined {\n try {\n const result = JSON.parse(body) as QueryResult<TDataType>;\n if (result && typeof result === 'object' && typeof result.isAuthorized === 'boolean') return result;\n } catch {\n // Non-JSON responses are transient failures, except for terminal authentication failures.\n }\n return undefined;\n }\n\n private emitChanged(result: QueryResult<TDataType>, body: string, dataReceived: DataReceived<TDataType>): void {\n const comparable = JSON.parse(body) as { correlationId?: string };\n delete comparable.correlationId;\n if (deepEqual(this._previousComparable, comparable)) return;\n this._previousComparable = comparable;\n dataReceived(result);\n }\n\n private backoff(): number {\n const jitter = 1 + this._options.jitterRatio * (2 * Math.random() - 1);\n return this.clamp(this._options.intervalMs * this._options.backoffMultiplier ** ++this._failures * jitter);\n }\n\n private clamp(delay: number): number {\n return Math.min(this._options.maxIntervalMs, Math.max(this._options.minIntervalMs, delay));\n }\n}\n"],"names":["QUERY_POLL_AFTER_HEADER","PollingQueryConnection","_started","_disconnected","_unauthorized","_timer","_controller","_failures","_previousComparable","_lastPingLatency","_totalLatency","_requestCount","_url","_microservice","_httpHeadersCallback","_options","lastPingLatency","averageLatency","connect","dataReceived","queryArguments","url","URL","parameters","UrlHelpers","buildQueryParams","waitForFirstResult","forEach","value","key","searchParams","append","poll","disconnect","clearTimeout","undefined","abort","AbortController","started","performance","now","delay","headers","Headers","Object","fromEntries","Globals","httpHeadersCallback","set","microserviceHttpHeader","response","fetch","toString","method","signal","body","text","handleResponse","error","isAbortError","backoff","setTimeout","result","parseResult","status","isAuthorized","console","warn","QueryResult","unauthorized","emitChanged","JSON","stringify","isValid","success","clamp","intervalMs","hint","get","seconds","trim","Number","NaN","isFinite","parse","comparable","correlationId","deepEqual","jitter","jitterRatio","Math","random","backoffMultiplier","min","maxIntervalMs","max","minIntervalMs"],"mappings":";;;;;;;;AAAA;AACA;AAYA,kEACO,MAAMA,uBAAAA,GAA0B;AAEvC,iGACO,MAAMC,sBAAAA,CAAAA;;;;;AACDC,IAAAA,QAAAA,GAAW,KAAA;AACXC,IAAAA,aAAAA,GAAgB,KAAA;AAChBC,IAAAA,aAAAA,GAAgB,KAAA;IAChBC,MAAAA;IACAC,WAAAA;AACAC,IAAAA,SAAAA,GAAY,CAAA;IACZC,mBAAAA;AACAC,IAAAA,gBAAAA,GAAmB,CAAA;AACnBC,IAAAA,aAAAA,GAAgB,CAAA;AAChBC,IAAAA,aAAAA,GAAgB,CAAA;AAExB;;;;;;AAMC,QACD,WAAA,CACqBC,IAAS,EAC1B,oBAAqD,EACpCC,aAAqB,EACtC,QAAyC,CAC3C;aAJmBD,IAAAA,GAAAA,IAAAA;aACAE,oBAAAA,GAAAA,oBAAAA;aACAD,aAAAA,GAAAA,aAAAA;aACAE,QAAAA,GAAAA,QAAAA;AAClB,IAAA;uBAGH,IAAIC,eAAAA,GAA0B;QAAE,OAAO,IAAI,CAACP,gBAAgB;AAAE,IAAA;uBAG9D,IAAIQ,cAAAA,GAAyB;QACzB,OAAO,IAAI,CAACN,aAAa,GAAG,IAAI,CAACD,aAAa,GAAG,IAAI,CAACC,aAAa,GAAG,CAAA;AAC1E,IAAA;AAEA,uBACAO,OAAAA,CAAQC,YAAqC,EAAEC,cAAuB,EAAQ;QAC1E,IAAI,IAAI,CAAClB,QAAQ,IAAI,IAAI,CAACC,aAAa,IAAI,IAAI,CAACC,aAAa,EAAE;QAC/D,IAAI,CAACF,QAAQ,GAAG,IAAA;AAChB,QAAA,MAAMmB,GAAAA,GAAM,IAAIC,GAAAA,CAAI,IAAI,CAACV,IAAI,CAAA;AAC7B,QAAA,MAAMW,aAAaC,qBAAAA,CAAWC,gBAAgB,CAACL,cAAAA,IAAkB,EAAC,EAAG;YAAEM,kBAAAA,EAAoB;AAAO,SAAA,CAAA;QAClGH,UAAAA,CAAWI,OAAO,CAAC,CAACC,KAAAA,EAAOC,GAAAA,GAAQR,IAAIS,YAAY,CAACC,MAAM,CAACF,GAAAA,EAAKD,KAAAA,CAAAA,CAAAA;AAChE,QAAA,KAAK,IAAI,CAACI,IAAI,CAACX,GAAAA,EAAKF,YAAAA,CAAAA;AACxB,IAAA;AAEA,uBACAc,UAAAA,GAAmB;QACf,IAAI,CAAC9B,aAAa,GAAG,IAAA;QACrB+B,YAAAA,CAAa,IAAI,CAAC7B,MAAM,CAAA;QACxB,IAAI,CAACA,MAAM,GAAG8B,SAAAA;QACd,IAAI,CAAC7B,WAAW,EAAE8B,KAAAA,EAAAA;AACtB,IAAA;AAEA,IAAA,MAAcJ,IAAAA,CAAKX,GAAQ,EAAEF,YAAqC,EAAiB;QAC/E,IAAI,CAACb,WAAW,GAAG,IAAI+B,eAAAA,EAAAA;QACvB,MAAMC,OAAAA,GAAUC,YAAYC,GAAG,EAAA;QAC/B,IAAIC,KAAAA;QACJ,IAAI;YACA,MAAMC,OAAAA,GAAU,IAAIC,OAAAA,CAAQ;AACxB,gBAAA,GAAGC,OAAOC,WAAW,CAAC,IAAIF,OAAAA,CAAQG,eAAAA,CAAQC,mBAAmB,IAAA,CAAA,CAAM;gBACnE,GAAGH,MAAAA,CAAOC,WAAW,CAAC,IAAIF,QAAQ,IAAI,CAAC7B,oBAAoB,EAAA,CAAA;AAC/D,aAAA,CAAA;YACA4B,OAAAA,CAAQM,GAAG,CAAC,QAAA,EAAU,kBAAA,CAAA;YACtBN,OAAAA,CAAQM,GAAG,CAAC,cAAA,EAAgB,kBAAA,CAAA;AAC5B,YAAA,IAAI,IAAI,CAACnC,aAAa,EAAE6B,OAAAA,CAAQM,GAAG,CAACF,eAAAA,CAAQG,sBAAsB,EAAE,IAAI,CAACpC,aAAa,CAAA;AACtF,YAAA,MAAMqC,QAAAA,GAAW,MAAMC,KAAAA,CAAM9B,GAAAA,CAAI+B,QAAQ,EAAA,EAAI;gBAAEC,MAAAA,EAAQ,KAAA;AAAOX,gBAAAA,OAAAA;AAASY,gBAAAA,MAAAA,EAAQ,IAAI,CAAChD,WAAW,CAACgD;AAAO,aAAA,CAAA;YACvG,IAAI,IAAI,CAACnD,aAAa,EAAE;YACxB,MAAMoD,IAAAA,GAAO,MAAML,QAAAA,CAASM,IAAI,EAAA;YAChC,IAAI,IAAI,CAACrD,aAAa,EAAE;AACxB,YAAA,IAAI,CAACM,gBAAgB,GAAG8B,WAAAA,CAAYC,GAAG,EAAA,GAAKF,OAAAA;AAC5C,YAAA,IAAI,CAAC5B,aAAa,IAAI,IAAI,CAACD,gBAAgB;AAC3C,YAAA,IAAI,CAACE,aAAa,EAAA;AAClB8B,YAAAA,KAAAA,GAAQ,IAAI,CAACgB,cAAc,CAACP,UAAUK,IAAAA,EAAMpC,YAAAA,CAAAA;AAChD,QAAA,CAAA,CAAE,OAAOuC,KAAAA,EAAO;YACZ,IAAI,IAAI,CAACvD,aAAa,IAAI,IAAI,CAACC,aAAa,IAAIuD,yBAAAA,CAAaD,KAAAA,CAAAA,EAAQ;YACrEjB,KAAAA,GAAQ,IAAI,CAACmB,OAAO,EAAA;AACxB,QAAA;QACA,IAAI,CAAC,IAAI,CAACzD,aAAa,IAAI,CAAC,IAAI,CAACC,aAAa,EAAE;YAC5C,IAAI,CAACC,MAAM,GAAGwD,UAAAA,CAAW,IAAA;AAAQ,gBAAA,KAAK,IAAI,CAAC7B,IAAI,CAACX,GAAAA,EAAKF,YAAAA,CAAAA;YAAe,CAAA,EAAGsB,KAAAA,CAAAA;AAC3E,QAAA;AACJ,IAAA;AAEQgB,IAAAA,cAAAA,CAAeP,QAAkB,EAAEK,IAAY,EAAEpC,YAAqC,EAAU;AACpG,QAAA,IAAI2C,MAAAA,GAAS,IAAI,CAACC,WAAW,CAACR,IAAAA,CAAAA;QAC9B,IAAIL,QAAAA,CAASc,MAAM,KAAK,GAAA,IAAOd,QAAAA,CAASc,MAAM,KAAK,GAAA,IAAOF,MAAAA,EAAQG,YAAAA,KAAiB,KAAA,EAAO;YACtFC,OAAAA,CAAQC,IAAI,CAAC,CAAC,oBAAoB,EAAE,IAAI,CAACvD,IAAI,CAAC,gDAAgD,CAAC,CAAA;YAC/F,IAAI,CAACR,aAAa,GAAG,IAAA;YACrB0D,MAAAA,KAAW;gBAAE,GAAGM,uBAAAA,CAAYC,YAAY;AAAc,aAAA;YACtDP,MAAAA,GAAS;AAAE,gBAAA,GAAGA,MAAM;gBAAEG,YAAAA,EAAc;AAAM,aAAA;AAC1C,YAAA,IAAI,CAACK,WAAW,CAACR,QAAQS,IAAAA,CAAKC,SAAS,CAACV,MAAAA,CAAAA,EAAS3C,YAAAA,CAAAA;YACjD,OAAO,CAAA;AACX,QAAA;QACA,IAAI2C,MAAAA,EAAQW,YAAY,KAAA,EAAO;AAC3B,YAAA,IAAI,CAACxC,UAAU,EAAA;AACf,YAAA,IAAI,CAACqC,WAAW,CAACR,MAAAA,EAAQP,IAAAA,EAAMpC,YAAAA,CAAAA;YAC/B,OAAO,CAAA;AACX,QAAA;AACA,QAAA,MAAMuD,OAAAA,GAAUxB,QAAAA,CAASc,MAAM,KAAK,OAAOF,MAAAA,KAAW3B,SAAAA;AACtD,QAAA,IAAI2B,MAAAA,KAAWY,OAAAA,IAAWxB,QAAAA,CAASc,MAAM,IAAI,GAAE,CAAA,EAAI,IAAI,CAACM,WAAW,CAACR,QAAQP,IAAAA,EAAMpC,YAAAA,CAAAA;AAClF,QAAA,IAAIuD,OAAAA,EAAS,IAAI,CAACnE,SAAS,GAAG,CAAA;AAC9B,QAAA,MAAMkC,KAAAA,GAAQiC,OAAAA,GAAU,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC5D,QAAQ,CAAC6D,UAAU,CAAA,GAAI,IAAI,CAAChB,OAAO,EAAA;AAC3E,QAAA,MAAMiB,IAAAA,GAAO3B,QAAAA,CAASR,OAAO,CAACoC,GAAG,CAAC9E,uBAAAA,CAAAA;AAClC,QAAA,MAAM+E,OAAAA,GAAUF,IAAAA,EAAMG,IAAAA,EAAAA,GAASC,MAAAA,CAAOJ,IAAAA,CAAAA,GAAQK,GAAAA;QAC9C,OAAOD,MAAAA,CAAOE,QAAQ,CAACJ,OAAAA,CAAAA,IAAYA,OAAAA,IAAW,CAAA,GAAI,IAAI,CAACJ,KAAK,CAACI,OAAAA,GAAU,IAAA,CAAA,GAAQtC,KAAAA;AACnF,IAAA;AAEQsB,IAAAA,WAAAA,CAAYR,IAAY,EAAsC;QAClE,IAAI;YACA,MAAMO,MAAAA,GAASS,IAAAA,CAAKa,KAAK,CAAC7B,IAAAA,CAAAA;YAC1B,IAAIO,MAAAA,IAAU,OAAOA,MAAAA,KAAW,QAAA,IAAY,OAAOA,MAAAA,CAAOG,YAAY,KAAK,SAAA,EAAW,OAAOH,MAAAA;AACjG,QAAA,CAAA,CAAE,OAAM;;AAER,QAAA;QACA,OAAO3B,SAAAA;AACX,IAAA;AAEQmC,IAAAA,WAAAA,CAAYR,MAA8B,EAAEP,IAAY,EAAEpC,YAAqC,EAAQ;QAC3G,MAAMkE,UAAAA,GAAad,IAAAA,CAAKa,KAAK,CAAC7B,IAAAA,CAAAA;AAC9B,QAAA,OAAO8B,WAAWC,aAAa;AAC/B,QAAA,IAAIC,mBAAAA,CAAU,IAAI,CAAC/E,mBAAmB,EAAE6E,UAAAA,CAAAA,EAAa;QACrD,IAAI,CAAC7E,mBAAmB,GAAG6E,UAAAA;QAC3BlE,YAAAA,CAAa2C,MAAAA,CAAAA;AACjB,IAAA;IAEQF,OAAAA,GAAkB;AACtB,QAAA,MAAM4B,MAAAA,GAAS,CAAA,GAAI,IAAI,CAACzE,QAAQ,CAAC0E,WAAW,IAAI,CAAA,GAAIC,IAAAA,CAAKC,MAAM,KAAK,CAAA,CAAA;QACpE,OAAO,IAAI,CAAChB,KAAK,CAAC,IAAI,CAAC5D,QAAQ,CAAC6D,UAAU,GAAG,IAAI,CAAC7D,QAAQ,CAAC6E,iBAAiB,IAAI,EAAE,IAAI,CAACrF,SAAS,GAAGiF,MAAAA,CAAAA;AACvG,IAAA;AAEQb,IAAAA,KAAAA,CAAMlC,KAAa,EAAU;AACjC,QAAA,OAAOiD,KAAKG,GAAG,CAAC,IAAI,CAAC9E,QAAQ,CAAC+E,aAAa,EAAEJ,IAAAA,CAAKK,GAAG,CAAC,IAAI,CAAChF,QAAQ,CAACiF,aAAa,EAAEvD,KAAAA,CAAAA,CAAAA;AACvF,IAAA;AACJ;;;"}
@@ -1,5 +1,6 @@
1
1
  export declare enum QueryTransportMethod {
2
2
  WebSocket = "webSocket",
3
- ServerSentEvents = "serverSentEvents"
3
+ ServerSentEvents = "serverSentEvents",
4
+ Polling = "polling"
4
5
  }
5
6
  //# sourceMappingURL=QueryTransportMethod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueryTransportMethod.d.ts","sourceRoot":"","sources":["../../../queries/QueryTransportMethod.ts"],"names":[],"mappings":"AAMA,oBAAY,oBAAoB;IAI5B,SAAS,cAAc;IAKvB,gBAAgB,qBAAqB;CACxC"}
1
+ {"version":3,"file":"QueryTransportMethod.d.ts","sourceRoot":"","sources":["../../../queries/QueryTransportMethod.ts"],"names":[],"mappings":"AAMA,oBAAY,oBAAoB;IAI5B,SAAS,cAAc;IAKvB,gBAAgB,qBAAqB;IAGrC,OAAO,YAAY;CACtB"}
@@ -11,6 +11,7 @@
11
11
  /**
12
12
  * Use Server-Sent Events (SSE) for real-time data streaming.
13
13
  */ QueryTransportMethod["ServerSentEvents"] = "serverSentEvents";
14
+ /** Use HTTP GET snapshots for observable queries. */ QueryTransportMethod["Polling"] = "polling";
14
15
  return QueryTransportMethod;
15
16
  }({});
16
17
 
@@ -1 +1 @@
1
- {"version":3,"file":"QueryTransportMethod.js","sources":["../../../queries/QueryTransportMethod.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/**\n * Defines the transport method used for observable query connections.\n */\nexport enum QueryTransportMethod {\n /**\n * Use WebSocket for real-time data streaming.\n */\n WebSocket = 'webSocket',\n\n /**\n * Use Server-Sent Events (SSE) for real-time data streaming.\n */\n ServerSentEvents = 'serverSentEvents',\n}\n"],"names":["QueryTransportMethod"],"mappings":";;AAAA;AACA;AAEA;;IAGO,IAAKA,oBAAAA,iBAAAA,SAAAA,oBAAAA,EAAAA;AACR;;AAEC,QAAA,oBAAA,CAAA,WAAA,CAAA,GAAA,WAAA;AAGD;;AAEC,QAAA,oBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAA;AAROA,IAAAA,OAAAA,oBAAAA;AAUX,CAAA,CAAA,EAAA;;"}
1
+ {"version":3,"file":"QueryTransportMethod.js","sources":["../../../queries/QueryTransportMethod.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/**\n * Defines the transport method used for observable query connections.\n */\nexport enum QueryTransportMethod {\n /**\n * Use WebSocket for real-time data streaming.\n */\n WebSocket = 'webSocket',\n\n /**\n * Use Server-Sent Events (SSE) for real-time data streaming.\n */\n ServerSentEvents = 'serverSentEvents',\n\n /** Use HTTP GET snapshots for observable queries. */\n Polling = 'polling',\n}\n"],"names":["QueryTransportMethod"],"mappings":";;AAAA;AACA;AAEA;;IAGO,IAAKA,oBAAAA,iBAAAA,SAAAA,oBAAAA,EAAAA;AACR;;AAEC,QAAA,oBAAA,CAAA,WAAA,CAAA,GAAA,WAAA;AAGD;;AAEC,QAAA,oBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAA;0DAGkD,oBAAA,CAAA,SAAA,CAAA,GAAA,SAAA;AAX3CA,IAAAA,OAAAA,oBAAAA;AAaX,CAAA,CAAA,EAAA;;"}
@@ -31,6 +31,8 @@ export * from './ObservableQueryMultiplexer.js';
31
31
  export * from './ObservableQuerySubscription.js';
32
32
  export * from './WebSocketMessage.js';
33
33
  export * from './QueryTransportMethod.js';
34
+ export * from './PollingOptions.js';
35
+ export * from './PollingQueryConnection.js';
34
36
  export * from './QueryInstanceCache.js';
35
37
  export * from './reconcileQueryData.js';
36
38
  export * from './deserializeQueryModel.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../queries/index.ts"],"names":[],"mappings":"AAGA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,OAAO,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../queries/index.ts"],"names":[],"mappings":"AAGA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,OAAO,wBAAwB,CAAC"}
@@ -25,6 +25,7 @@ var ObservableQueryMultiplexer = require('./ObservableQueryMultiplexer.js');
25
25
  var ObservableQuerySubscription = require('./ObservableQuerySubscription.js');
26
26
  var WebSocketMessage = require('./WebSocketMessage.js');
27
27
  var QueryTransportMethod = require('./QueryTransportMethod.js');
28
+ var PollingQueryConnection = require('./PollingQueryConnection.js');
28
29
  var QueryInstanceCache = require('./QueryInstanceCache.js');
29
30
  var reconcileQueryData = require('./reconcileQueryData.js');
30
31
  var deserializeQueryModel = require('./deserializeQueryModel.js');
@@ -58,6 +59,7 @@ exports.HubConnectionKeepAlive = HubConnectionKeepAlive.HubConnectionKeepAlive;
58
59
  exports.ObservableQueryConnection = ObservableQueryConnection.ObservableQueryConnection;
59
60
  exports.SSE_SUBSCRIBE_ROUTE = ObservableQueryConnectionFactory.SSE_SUBSCRIBE_ROUTE;
60
61
  exports.SSE_UNSUBSCRIBE_ROUTE = ObservableQueryConnectionFactory.SSE_UNSUBSCRIBE_ROUTE;
62
+ exports.connectsToQueryRoute = ObservableQueryConnectionFactory.connectsToQueryRoute;
61
63
  exports.createObservableQueryConnection = ObservableQueryConnectionFactory.createObservableQueryConnection;
62
64
  exports.ObservableQueryConnectionPool = ObservableQueryConnectionPool.ObservableQueryConnectionPool;
63
65
  exports.SSE_HUB_ROUTE = ServerSentEventQueryConnection.SSE_HUB_ROUTE;
@@ -74,6 +76,8 @@ exports.resetSharedMultiplexer = ObservableQueryMultiplexer.resetSharedMultiplex
74
76
  exports.ObservableQuerySubscription = ObservableQuerySubscription.ObservableQuerySubscription;
75
77
  exports.WebSocketMessageType = WebSocketMessage.WebSocketMessageType;
76
78
  exports.QueryTransportMethod = QueryTransportMethod.QueryTransportMethod;
79
+ exports.PollingQueryConnection = PollingQueryConnection.PollingQueryConnection;
80
+ exports.QUERY_POLL_AFTER_HEADER = PollingQueryConnection.QUERY_POLL_AFTER_HEADER;
77
81
  exports.QueryInstanceCache = QueryInstanceCache.QueryInstanceCache;
78
82
  exports.reconcileQueryData = reconcileQueryData.reconcileQueryData;
79
83
  exports.deserializeQueryModel = deserializeQueryModel.deserializeQueryModel;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../queries/index.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nexport * from './ChangeSet.js';\nexport * from './IChangeStreamFor.js';\nexport * from './IQuery.js';\nexport * from './IQueryFor.js';\nexport * from './Paging.js';\nexport * from './Sorting.js';\nexport * from './SortDirection.js';\nexport * from './SortingActions.js';\nexport * from './SortingActionsForQuery.js';\nexport * from './SortingActionsForObservableQuery.js';\nexport * from './QueryFor.js';\nexport * from './QueryHttpMethod.js';\nexport * from './QueryHttpMethodResolver.js';\nexport * from './QueryHttpRequest.js';\nexport * from './QueryResult.js';\nexport * from './QueryResultWithState.js';\nexport * from './IObservableQueryFor.js';\nexport * from './ObservableQueryFor.js';\nexport * from './IObservableQueryConnection.js';\nexport * from './IObservableQueryHubConnection.js';\nexport * from './IReconnectPolicy.js';\nexport * from './ReconnectPolicy.js';\nexport * from './HubConnectionKeepAlive.js';\nexport * from './ObservableQueryConnection.js';\nexport * from './ObservableQueryConnectionFactory.js';\nexport * from './ObservableQueryConnectionPool.js';\nexport * from './ServerSentEventQueryConnection.js';\nexport * from './ServerSentEventHubConnection.js';\nexport * from './WebSocketHubConnection.js';\nexport * from './ObservableQueryMultiplexer.js';\nexport * from './ObservableQuerySubscription.js';\nexport * from './WebSocketMessage.js';\nexport * from './QueryTransportMethod.js';\nexport * from './QueryInstanceCache.js';\nexport * from './reconcileQueryData.js';\nexport * from './deserializeQueryModel.js';\nexport * from './IQueryProvider.js';\nexport * from './QueryProvider.js';\nexport * from './QueryValidator.js';\nexport * from './IObservableQueryDiagnostics.js';\nexport * from './ObservableQueryDiagnostics.js';\nexport * from './ObservableQueryDiagnosticsSnapshot.js';\nimport '../validation/index.js';"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../queries/index.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nexport * from './ChangeSet.js';\nexport * from './IChangeStreamFor.js';\nexport * from './IQuery.js';\nexport * from './IQueryFor.js';\nexport * from './Paging.js';\nexport * from './Sorting.js';\nexport * from './SortDirection.js';\nexport * from './SortingActions.js';\nexport * from './SortingActionsForQuery.js';\nexport * from './SortingActionsForObservableQuery.js';\nexport * from './QueryFor.js';\nexport * from './QueryHttpMethod.js';\nexport * from './QueryHttpMethodResolver.js';\nexport * from './QueryHttpRequest.js';\nexport * from './QueryResult.js';\nexport * from './QueryResultWithState.js';\nexport * from './IObservableQueryFor.js';\nexport * from './ObservableQueryFor.js';\nexport * from './IObservableQueryConnection.js';\nexport * from './IObservableQueryHubConnection.js';\nexport * from './IReconnectPolicy.js';\nexport * from './ReconnectPolicy.js';\nexport * from './HubConnectionKeepAlive.js';\nexport * from './ObservableQueryConnection.js';\nexport * from './ObservableQueryConnectionFactory.js';\nexport * from './ObservableQueryConnectionPool.js';\nexport * from './ServerSentEventQueryConnection.js';\nexport * from './ServerSentEventHubConnection.js';\nexport * from './WebSocketHubConnection.js';\nexport * from './ObservableQueryMultiplexer.js';\nexport * from './ObservableQuerySubscription.js';\nexport * from './WebSocketMessage.js';\nexport * from './QueryTransportMethod.js';\nexport * from './PollingOptions.js';\nexport * from './PollingQueryConnection.js';\nexport * from './QueryInstanceCache.js';\nexport * from './reconcileQueryData.js';\nexport * from './deserializeQueryModel.js';\nexport * from './IQueryProvider.js';\nexport * from './QueryProvider.js';\nexport * from './QueryValidator.js';\nexport * from './IObservableQueryDiagnostics.js';\nexport * from './ObservableQueryDiagnostics.js';\nexport * from './ObservableQueryDiagnosticsSnapshot.js';\nimport '../validation/index.js';"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { GetHttpHeaders } from './GetHttpHeaders.js';
2
2
  import { EventSourceFactory } from './EventSourceFactory.js';
3
+ import { PollingOptions } from './queries/PollingOptions.js';
3
4
  import { QueryTransportMethod } from './queries/QueryTransportMethod.js';
4
5
  import { QueryHttpMethod } from './queries/QueryHttpMethod.js';
5
6
  import { QueryHttpMethodResolver } from './queries/QueryHttpMethodResolver.js';
@@ -14,6 +15,7 @@ export interface IGlobals {
14
15
  microserviceHttpHeader: string;
15
16
  microserviceWSQueryArgument: string;
16
17
  queryTransportMethod: QueryTransportMethod;
18
+ queryPollingOptions: PollingOptions;
17
19
  queryHttpMethod: QueryHttpMethod;
18
20
  queryHttpMethodResolver?: QueryHttpMethodResolver;
19
21
  queryConnectionCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../Globals.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAa/E,oBAAY,2BAA2B;IAEnC,KAAK,UAAU;IAEf,IAAI,SAAS;CAChB;AAED,MAAM,WAAW,QAAQ;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,2BAA2B,EAAE,MAAM,CAAC;IACpC,oBAAoB,EAAE,oBAAoB,CAAC;IAM3C,eAAe,EAAE,eAAe,CAAC;IAMjC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAOlD,oBAAoB,EAAE,MAAM,CAAC;IAM7B,eAAe,EAAE,OAAO,CAAC;IAMzB,2BAA2B,EAAE,2BAA2B,CAAC;IAKzD,mBAAmB,EAAE,cAAc,CAAC;IAOpC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAYxC,qBAAqB,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,OAAO,EAAE,QAarB,CAAC"}
1
+ {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../Globals.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAa/E,oBAAY,2BAA2B;IAEnC,KAAK,UAAU;IAEf,IAAI,SAAS;CAChB;AAED,MAAM,WAAW,QAAQ;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,2BAA2B,EAAE,MAAM,CAAC;IACpC,oBAAoB,EAAE,oBAAoB,CAAC;IAE3C,mBAAmB,EAAE,cAAc,CAAC;IAMpC,eAAe,EAAE,eAAe,CAAC;IAMjC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAOlD,oBAAoB,EAAE,MAAM,CAAC;IAM7B,eAAe,EAAE,OAAO,CAAC;IAMzB,2BAA2B,EAAE,2BAA2B,CAAC;IAKzD,mBAAmB,EAAE,cAAc,CAAC;IAOpC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAYxC,qBAAqB,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,OAAO,EAAE,QAoBrB,CAAC"}
@@ -25,6 +25,13 @@ const Globals = {
25
25
  microserviceHttpHeader: 'x-cratis-microservice',
26
26
  microserviceWSQueryArgument: 'x-cratis-microservice',
27
27
  queryTransportMethod: QueryTransportMethod.WebSocket,
28
+ queryPollingOptions: {
29
+ intervalMs: 5_000,
30
+ minIntervalMs: 1_000,
31
+ maxIntervalMs: 60_000,
32
+ backoffMultiplier: 2,
33
+ jitterRatio: 0.2
34
+ },
28
35
  queryHttpMethod: QueryHttpMethod.Get,
29
36
  queryConnectionCount: 1,
30
37
  queryDirectMode: false,
@@ -1 +1 @@
1
- {"version":3,"file":"Globals.js","sources":["../../Globals.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { GetHttpHeaders } from './GetHttpHeaders.js';\nimport { EventSourceFactory } from './EventSourceFactory.js';\nimport { QueryTransportMethod } from './queries/QueryTransportMethod.js';\nimport { QueryHttpMethod } from './queries/QueryHttpMethod.js';\nimport { QueryHttpMethodResolver } from './queries/QueryHttpMethodResolver.js';\n\n/**\n * Defines the transfer mode used for observable query subscriptions.\n *\n * - {@link ObservableQueryTransferMode.Delta} (default): Only the items that changed since\n * the previous update (added, replaced, removed) are exposed via {@code useChangeStream}.\n * The full collection state is still maintained internally by {@code useObservableQuery}.\n *\n * - {@link ObservableQueryTransferMode.Full}: Every update delivers the complete current\n * collection. The change set returned by {@code useChangeStream} treats the entire new\n * collection as {@code added} and the previous collection as {@code removed}.\n */\nexport enum ObservableQueryTransferMode {\n /** Compute and expose only the items that changed since the previous update (default). */\n Delta = 'delta',\n /** Expose the full collection on every update. */\n Full = 'full',\n}\n\nexport interface IGlobals {\n microservice: string;\n apiBasePath: string;\n origin: string;\n microserviceHttpHeader: string;\n microserviceWSQueryArgument: string;\n queryTransportMethod: QueryTransportMethod;\n /**\n * The HTTP method used to perform non-streaming queries. Defaults to {@link QueryHttpMethod.Get}.\n * Set to {@link QueryHttpMethod.Query} to carry arguments in a JSON request body (RFC 10008)\n * instead of the URL query string. Individual queries can override this via {@code setHttpMethod}.\n */\n queryHttpMethod: QueryHttpMethod;\n /**\n * Optional per-query policy for choosing the query HTTP method from the request (e.g. by URL length).\n * Consulted only when a query has no explicit method set via {@code setHttpMethod}; it takes\n * precedence over {@link queryHttpMethod}. See {@link lengthBasedQueryHttpMethod} for a built-in.\n */\n queryHttpMethodResolver?: QueryHttpMethodResolver;\n /**\n * Number of hub connections maintained for observable queries.\n * When greater than one, queries are distributed across the pool round-robin.\n * Only applies when {@link queryTransportMethod} is a centralized hub transport.\n * Defaults to 1.\n */\n queryConnectionCount: number;\n /**\n * When true, observable queries connect directly to the per-query WebSocket URL\n * instead of routing through the centralized hub endpoint.\n * Defaults to false (use the centralized hub).\n */\n queryDirectMode: boolean;\n /**\n * Controls how observable query updates are transferred and exposed.\n * {@link ObservableQueryTransferMode.Delta} (default) computes per-update deltas;\n * {@link ObservableQueryTransferMode.Full} delivers the whole collection on every update.\n */\n observableQueryTransferMode: ObservableQueryTransferMode;\n /**\n * Callback that returns custom HTTP headers to include in hub transport requests\n * (e.g. SSE subscribe/unsubscribe POST calls).\n */\n httpHeadersCallback: GetHttpHeaders;\n /**\n * Optional factory used to create the {@link EventSource} instances that back SSE\n * observable query connections. Falls back to the global {@link EventSource}\n * constructor when not set — override it to supply a custom SSE client (e.g. a\n * native implementation on React Native, where the global constructor is unavailable).\n */\n eventSourceFactory?: EventSourceFactory;\n /**\n * How long in milliseconds to retain a query cache entry after the last subscriber\n * releases it before evicting the subscription and the cached data.\n *\n * A non-zero value allows a user navigating away and back quickly to see cached\n * data immediately instead of waiting for a fresh server round-trip. The entry is\n * still evicted once the window expires, so memory is eventually reclaimed.\n *\n * Defaults to 30 000 ms (30 seconds). Set to 0 to restore the previous\n * immediate-eviction behaviour.\n */\n queryCacheRetentionMs: number;\n}\n\nexport const Globals: IGlobals = {\n microservice: '',\n apiBasePath: '',\n origin: '',\n microserviceHttpHeader: 'x-cratis-microservice',\n microserviceWSQueryArgument: 'x-cratis-microservice',\n queryTransportMethod: QueryTransportMethod.WebSocket,\n queryHttpMethod: QueryHttpMethod.Get,\n queryConnectionCount: 1,\n queryDirectMode: false,\n observableQueryTransferMode: ObservableQueryTransferMode.Delta,\n httpHeadersCallback: () => ({}),\n queryCacheRetentionMs: 30_000,\n};"],"names":["ObservableQueryTransferMode","Globals","microservice","apiBasePath","origin","microserviceHttpHeader","microserviceWSQueryArgument","queryTransportMethod","QueryTransportMethod","WebSocket","queryHttpMethod","QueryHttpMethod","Get","queryConnectionCount","queryDirectMode","observableQueryTransferMode","httpHeadersCallback","queryCacheRetentionMs"],"mappings":";;;AAAA;AACA;AAQA;;;;;;;;;;IAWO,IAAKA,2BAAAA,iBAAAA,SAAAA,2BAAAA,EAAAA;+FACgF,2BAAA,CAAA,OAAA,CAAA,GAAA,OAAA;uDAExC,2BAAA,CAAA,MAAA,CAAA,GAAA,MAAA;AAHxCA,IAAAA,OAAAA,2BAAAA;AAKX,CAAA,CAAA,EAAA;MAkEYC,OAAAA,GAAoB;IAC7BC,YAAAA,EAAc,EAAA;IACdC,WAAAA,EAAa,EAAA;IACbC,MAAAA,EAAQ,EAAA;IACRC,sBAAAA,EAAwB,uBAAA;IACxBC,2BAAAA,EAA6B,uBAAA;AAC7BC,IAAAA,oBAAAA,EAAsBC,qBAAqBC,SAAS;AACpDC,IAAAA,eAAAA,EAAiBC,gBAAgBC,GAAG;IACpCC,oBAAAA,EAAsB,CAAA;IACtBC,eAAAA,EAAiB,KAAA;IACjBC,2BAA2B,EAAA,OAAA;IAC3BC,mBAAAA,EAAqB,KAAO,EAAC,CAAA;IAC7BC,qBAAAA,EAAuB;AAC3B;;"}
1
+ {"version":3,"file":"Globals.js","sources":["../../Globals.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { GetHttpHeaders } from './GetHttpHeaders.js';\nimport { EventSourceFactory } from './EventSourceFactory.js';\nimport { PollingOptions } from './queries/PollingOptions.js';\nimport { QueryTransportMethod } from './queries/QueryTransportMethod.js';\nimport { QueryHttpMethod } from './queries/QueryHttpMethod.js';\nimport { QueryHttpMethodResolver } from './queries/QueryHttpMethodResolver.js';\n\n/**\n * Defines the transfer mode used for observable query subscriptions.\n *\n * - {@link ObservableQueryTransferMode.Delta} (default): Only the items that changed since\n * the previous update (added, replaced, removed) are exposed via {@code useChangeStream}.\n * The full collection state is still maintained internally by {@code useObservableQuery}.\n *\n * - {@link ObservableQueryTransferMode.Full}: Every update delivers the complete current\n * collection. The change set returned by {@code useChangeStream} treats the entire new\n * collection as {@code added} and the previous collection as {@code removed}.\n */\nexport enum ObservableQueryTransferMode {\n /** Compute and expose only the items that changed since the previous update (default). */\n Delta = 'delta',\n /** Expose the full collection on every update. */\n Full = 'full',\n}\n\nexport interface IGlobals {\n microservice: string;\n apiBasePath: string;\n origin: string;\n microserviceHttpHeader: string;\n microserviceWSQueryArgument: string;\n queryTransportMethod: QueryTransportMethod;\n /** Optional timing overrides for HTTP polling. Resolved when a connection is created. */\n queryPollingOptions: PollingOptions;\n /**\n * The HTTP method used to perform non-streaming queries. Defaults to {@link QueryHttpMethod.Get}.\n * Set to {@link QueryHttpMethod.Query} to carry arguments in a JSON request body (RFC 10008)\n * instead of the URL query string. Individual queries can override this via {@code setHttpMethod}.\n */\n queryHttpMethod: QueryHttpMethod;\n /**\n * Optional per-query policy for choosing the query HTTP method from the request (e.g. by URL length).\n * Consulted only when a query has no explicit method set via {@code setHttpMethod}; it takes\n * precedence over {@link queryHttpMethod}. See {@link lengthBasedQueryHttpMethod} for a built-in.\n */\n queryHttpMethodResolver?: QueryHttpMethodResolver;\n /**\n * Number of hub connections maintained for observable queries.\n * When greater than one, queries are distributed across the pool round-robin.\n * Only applies when {@link queryTransportMethod} is a centralized hub transport.\n * Defaults to 1.\n */\n queryConnectionCount: number;\n /**\n * When true, observable queries connect directly to the per-query WebSocket URL\n * instead of routing through the centralized hub endpoint.\n * Defaults to false (use the centralized hub).\n */\n queryDirectMode: boolean;\n /**\n * Controls how observable query updates are transferred and exposed.\n * {@link ObservableQueryTransferMode.Delta} (default) computes per-update deltas;\n * {@link ObservableQueryTransferMode.Full} delivers the whole collection on every update.\n */\n observableQueryTransferMode: ObservableQueryTransferMode;\n /**\n * Callback that returns custom HTTP headers to include in hub transport requests\n * (e.g. SSE subscribe/unsubscribe POST calls).\n */\n httpHeadersCallback: GetHttpHeaders;\n /**\n * Optional factory used to create the {@link EventSource} instances that back SSE\n * observable query connections. Falls back to the global {@link EventSource}\n * constructor when not set — override it to supply a custom SSE client (e.g. a\n * native implementation on React Native, where the global constructor is unavailable).\n */\n eventSourceFactory?: EventSourceFactory;\n /**\n * How long in milliseconds to retain a query cache entry after the last subscriber\n * releases it before evicting the subscription and the cached data.\n *\n * A non-zero value allows a user navigating away and back quickly to see cached\n * data immediately instead of waiting for a fresh server round-trip. The entry is\n * still evicted once the window expires, so memory is eventually reclaimed.\n *\n * Defaults to 30 000 ms (30 seconds). Set to 0 to restore the previous\n * immediate-eviction behaviour.\n */\n queryCacheRetentionMs: number;\n}\n\nexport const Globals: IGlobals = {\n microservice: '',\n apiBasePath: '',\n origin: '',\n microserviceHttpHeader: 'x-cratis-microservice',\n microserviceWSQueryArgument: 'x-cratis-microservice',\n queryTransportMethod: QueryTransportMethod.WebSocket,\n queryPollingOptions: {\n intervalMs: 5_000,\n minIntervalMs: 1_000,\n maxIntervalMs: 60_000,\n backoffMultiplier: 2,\n jitterRatio: 0.2,\n },\n queryHttpMethod: QueryHttpMethod.Get,\n queryConnectionCount: 1,\n queryDirectMode: false,\n observableQueryTransferMode: ObservableQueryTransferMode.Delta,\n httpHeadersCallback: () => ({}),\n queryCacheRetentionMs: 30_000,\n};"],"names":["ObservableQueryTransferMode","Globals","microservice","apiBasePath","origin","microserviceHttpHeader","microserviceWSQueryArgument","queryTransportMethod","QueryTransportMethod","WebSocket","queryPollingOptions","intervalMs","minIntervalMs","maxIntervalMs","backoffMultiplier","jitterRatio","queryHttpMethod","QueryHttpMethod","Get","queryConnectionCount","queryDirectMode","observableQueryTransferMode","httpHeadersCallback","queryCacheRetentionMs"],"mappings":";;;AAAA;AACA;AASA;;;;;;;;;;IAWO,IAAKA,2BAAAA,iBAAAA,SAAAA,2BAAAA,EAAAA;+FACgF,2BAAA,CAAA,OAAA,CAAA,GAAA,OAAA;uDAExC,2BAAA,CAAA,MAAA,CAAA,GAAA,MAAA;AAHxCA,IAAAA,OAAAA,2BAAAA;AAKX,CAAA,CAAA,EAAA;MAoEYC,OAAAA,GAAoB;IAC7BC,YAAAA,EAAc,EAAA;IACdC,WAAAA,EAAa,EAAA;IACbC,MAAAA,EAAQ,EAAA;IACRC,sBAAAA,EAAwB,uBAAA;IACxBC,2BAAAA,EAA6B,uBAAA;AAC7BC,IAAAA,oBAAAA,EAAsBC,qBAAqBC,SAAS;IACpDC,mBAAAA,EAAqB;QACjBC,UAAAA,EAAY,KAAA;QACZC,aAAAA,EAAe,KAAA;QACfC,aAAAA,EAAe,MAAA;QACfC,iBAAAA,EAAmB,CAAA;QACnBC,WAAAA,EAAa;AACjB,KAAA;AACAC,IAAAA,eAAAA,EAAiBC,gBAAgBC,GAAG;IACpCC,oBAAAA,EAAsB,CAAA;IACtBC,eAAAA,EAAiB,KAAA;IACjBC,2BAA2B,EAAA,OAAA;IAC3BC,mBAAAA,EAAqB,KAAO,EAAC,CAAA;IAC7BC,qBAAAA,EAAuB;AAC3B;;"}
@@ -1,3 +1,5 @@
1
+ import { GetHttpHeaders } from '../GetHttpHeaders.js';
2
+ import { PollingOptions } from './PollingOptions.js';
1
3
  import { IObservableQueryConnection } from './IObservableQueryConnection.js';
2
4
  export declare const SSE_SUBSCRIBE_ROUTE = "/.cratis/queries/sse/subscribe";
3
5
  export declare const SSE_UNSUBSCRIBE_ROUTE = "/.cratis/queries/sse/unsubscribe";
@@ -8,6 +10,9 @@ export interface QueryConnectionDescriptor {
8
10
  apiBasePath: string;
9
11
  microservice: string;
10
12
  args?: object;
13
+ httpHeadersCallback?: GetHttpHeaders;
14
+ pollingOptions?: Partial<PollingOptions>;
11
15
  }
12
16
  export declare function createObservableQueryConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType>;
17
+ export declare function connectsToQueryRoute(): boolean;
13
18
  //# sourceMappingURL=ObservableQueryConnectionFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableQueryConnectionFactory.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryConnectionFactory.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAW7E,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AAKpE,eAAO,MAAM,qBAAqB,qCAAqC,CAAC;AAOxE,MAAM,WAAW,yBAAyB;IAEtC,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,MAAM,CAAC;IAElB,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,YAAY,EAAE,MAAM,CAAC;IAErB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAiBD,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,UAAU,EAAE,yBAAyB,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAUvI"}
1
+ {"version":3,"file":"ObservableQueryConnectionFactory.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryConnectionFactory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAW7E,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AAKpE,eAAO,MAAM,qBAAqB,qCAAqC,CAAC;AAOxE,MAAM,WAAW,yBAAyB;IAEtC,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,MAAM,CAAC;IAElB,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,YAAY,EAAE,MAAM,CAAC;IAErB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,mBAAmB,CAAC,EAAE,cAAc,CAAC;IAErC,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5C;AAkBD,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,UAAU,EAAE,yBAAyB,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAiBvI;AAMD,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C"}
@@ -1,3 +1,4 @@
1
+ import { PollingQueryConnection } from './PollingQueryConnection.js';
1
2
  import { Globals } from '../Globals.js';
2
3
  import { joinPaths } from '../joinPaths.js';
3
4
  import { UrlHelpers } from '../UrlHelpers.js';
@@ -19,7 +20,8 @@ import { getOrCreateMultiplexer, WS_HUB_ROUTE, MultiplexedObservableQueryConnect
19
20
  /**
20
21
  * Single entry-point for creating observable query connections.
21
22
  *
22
- * The transport is chosen as a 2x2 matrix of (direct | hub) x (WebSocket | SSE):
23
+ * Polling always uses each query's HTTP route. Persistent transports use a
24
+ * 2x2 matrix of (direct | hub) x (WebSocket | SSE):
23
25
  *
24
26
  * | | Direct (per-query URL) | Hub (centralized endpoint) |
25
27
  * |----------------|-------------------------------|-------------------------------|
@@ -31,12 +33,24 @@ import { getOrCreateMultiplexer, WS_HUB_ROUTE, MultiplexedObservableQueryConnect
31
33
  *
32
34
  * {@link ObservableQueryFor} never needs to know which transport is in use.
33
35
  */ function createObservableQueryConnection(descriptor) {
36
+ if (Globals.queryTransportMethod === QueryTransportMethod.Polling) {
37
+ return new PollingQueryConnection(buildDirectUrl(descriptor), descriptor.httpHeadersCallback ?? (()=>({})), descriptor.microservice, {
38
+ ...Globals.queryPollingOptions,
39
+ ...descriptor.pollingOptions
40
+ });
41
+ }
34
42
  const isSSE = Globals.queryTransportMethod === QueryTransportMethod.ServerSentEvents;
35
43
  if (Globals.queryDirectMode) {
36
44
  return isSSE ? createDirectSSEConnection(descriptor) : createDirectWebSocketConnection(descriptor);
37
45
  }
38
46
  return createMultiplexedConnection(descriptor, isSSE);
39
47
  }
48
+ /**
49
+ * Determines whether the selected transport connects to each query's own route rather than a hub.
50
+ * @returns True for direct mode or HTTP polling.
51
+ */ function connectsToQueryRoute() {
52
+ return Globals.queryDirectMode || Globals.queryTransportMethod === QueryTransportMethod.Polling;
53
+ }
40
54
  // ---- Direct mode: one connection per query, hitting the query's own URL ----
41
55
  function buildDirectUrl(descriptor) {
42
56
  const { route } = UrlHelpers.replaceRouteParameters(descriptor.route, descriptor.args);
@@ -85,5 +99,5 @@ function createMultiplexedConnection(descriptor, isSSE) {
85
99
  return new MultiplexedObservableQueryConnection(multiplexer, descriptor.queryName);
86
100
  }
87
101
 
88
- export { SSE_SUBSCRIBE_ROUTE, SSE_UNSUBSCRIBE_ROUTE, createObservableQueryConnection };
102
+ export { SSE_SUBSCRIBE_ROUTE, SSE_UNSUBSCRIBE_ROUTE, connectsToQueryRoute, createObservableQueryConnection };
89
103
  //# sourceMappingURL=ObservableQueryConnectionFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableQueryConnectionFactory.js","sources":["../../../queries/ObservableQueryConnectionFactory.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Globals } from '../Globals.js';\nimport { joinPaths } from '../joinPaths.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport { IObservableQueryConnection } from './IObservableQueryConnection.js';\nimport { ObservableQueryConnection } from './ObservableQueryConnection.js';\nimport { QueryTransportMethod } from './QueryTransportMethod.js';\nimport { ServerSentEventQueryConnection, SSE_HUB_ROUTE } from './ServerSentEventQueryConnection.js';\nimport { ServerSentEventHubConnection } from './ServerSentEventHubConnection.js';\nimport { WebSocketHubConnection } from './WebSocketHubConnection.js';\nimport { MultiplexedObservableQueryConnection, WS_HUB_ROUTE, getOrCreateMultiplexer } from './ObservableQueryMultiplexer.js';\n\n/**\n * The SSE subscribe POST endpoint route.\n */\nexport const SSE_SUBSCRIBE_ROUTE = '/.cratis/queries/sse/subscribe';\n\n/**\n * The SSE unsubscribe POST endpoint route.\n */\nexport const SSE_UNSUBSCRIBE_ROUTE = '/.cratis/queries/sse/unsubscribe';\n\n/**\n * Describes what the factory needs to know about a query in order to create\n * the right connection. Transport details are intentionally absent — the\n * factory reads those from {@link Globals}.\n */\nexport interface QueryConnectionDescriptor {\n /** The route template (e.g. `/api/accounts/debit/all-accounts`). */\n route: string;\n /** Fully-qualified backend query name used by hub transports. */\n queryName: string;\n /** Origin base URL (e.g. `http://localhost:5000`). */\n origin: string;\n /** API base path prefix. */\n apiBasePath: string;\n /** Microservice identifier. */\n microservice: string;\n /** Route/query arguments for the current subscription. */\n args?: object;\n}\n\n/**\n * Single entry-point for creating observable query connections.\n *\n * The transport is chosen as a 2x2 matrix of (direct | hub) x (WebSocket | SSE):\n *\n * | | Direct (per-query URL) | Hub (centralized endpoint) |\n * |----------------|-------------------------------|-------------------------------|\n * | **WebSocket** | ObservableQueryConnection | MultiplexedObservableQueryConnection |\n * | **SSE** | ServerSentEventQueryConnection | MultiplexedObservableQueryConnection |\n *\n * In multiplexed mode, both transports share the same multiplexer — it creates either\n * WebSocket or SSE connections depending on the transport setting.\n *\n * {@link ObservableQueryFor} never needs to know which transport is in use.\n */\nexport function createObservableQueryConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {\n const isSSE = Globals.queryTransportMethod === QueryTransportMethod.ServerSentEvents;\n\n if (Globals.queryDirectMode) {\n return isSSE\n ? createDirectSSEConnection<TDataType>(descriptor)\n : createDirectWebSocketConnection<TDataType>(descriptor);\n }\n\n return createMultiplexedConnection<TDataType>(descriptor, isSSE);\n}\n\n// ---- Direct mode: one connection per query, hitting the query's own URL ----\n\nfunction buildDirectUrl(descriptor: QueryConnectionDescriptor): URL {\n const { route } = UrlHelpers.replaceRouteParameters(descriptor.route, descriptor.args as object);\n const actualRoute = joinPaths(descriptor.apiBasePath, route);\n return UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, actualRoute);\n}\n\nfunction createDirectWebSocketConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {\n return new ObservableQueryConnection<TDataType>(buildDirectUrl(descriptor), descriptor.microservice);\n}\n\nfunction createDirectSSEConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {\n return new ServerSentEventQueryConnection<TDataType>(buildDirectUrl(descriptor));\n}\n\n// ---- Multiplexed mode: centralized endpoint, multiple queries share connections ----\n\n/**\n * Maximum number of SSE hub connections that fits safely within the HTTP/1.1 browser\n * per-origin connection limit (typically 6 for Chrome/Firefox). Each SSE EventSource\n * occupies one persistent connection slot indefinitely. Exceeding this cap blocks the\n * subscribe/unsubscribe POST requests that share the same pool, causing queries to hang.\n * Servers configured for HTTP/2 do not have this restriction.\n */\nconst MAX_SAFE_SSE_CONNECTIONS = 4;\n\nfunction createMultiplexedConnection<TDataType>(descriptor: QueryConnectionDescriptor, isSSE: boolean): IObservableQueryConnection<TDataType> {\n const transport = isSSE ? 'sse' : 'ws';\n const requestedCount = Globals.queryConnectionCount;\n const effectiveCount = isSSE ? Math.min(requestedCount, MAX_SAFE_SSE_CONNECTIONS) : requestedCount;\n\n if (isSSE && requestedCount > MAX_SAFE_SSE_CONNECTIONS) {\n console.warn(\n `[Arc] queryConnectionCount (${requestedCount}) exceeds the safe limit for SSE transport (${MAX_SAFE_SSE_CONNECTIONS}). ` +\n `HTTP/1.1 browsers allow at most 6 concurrent connections per origin; ` +\n `using more SSE connections blocks subscribe/unsubscribe requests, causing queries to hang. ` +\n `Capping at ${MAX_SAFE_SSE_CONNECTIONS}. Enable HTTP/2 on your server to use a higher connection count.`\n );\n }\n\n const cacheKey = `${requestedCount}|${transport}|${descriptor.origin}|${descriptor.apiBasePath}|${descriptor.microservice}`;\n\n const multiplexer = getOrCreateMultiplexer(() => {\n if (isSSE) {\n const sseRoute = joinPaths(descriptor.apiBasePath, SSE_HUB_ROUTE);\n const sseUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, sseRoute);\n const subscribeRoute = joinPaths(descriptor.apiBasePath, SSE_SUBSCRIBE_ROUTE);\n const subscribeUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, subscribeRoute);\n const unsubscribeRoute = joinPaths(descriptor.apiBasePath, SSE_UNSUBSCRIBE_ROUTE);\n const unsubscribeUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, unsubscribeRoute);\n return new ServerSentEventHubConnection(\n sseUrl.toString(),\n subscribeUrl.toString(),\n unsubscribeUrl.toString(),\n descriptor.microservice,\n );\n } else {\n const hubRoute = joinPaths(descriptor.apiBasePath, WS_HUB_ROUTE);\n const hubUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, hubRoute);\n const secure = hubUrl.protocol?.indexOf('https') === 0;\n const wsUrl = `${secure ? 'wss' : 'ws'}://${hubUrl.host}${hubUrl.pathname}${hubUrl.search}`;\n return new WebSocketHubConnection(wsUrl, descriptor.microservice);\n }\n }, cacheKey, effectiveCount);\n\n return new MultiplexedObservableQueryConnection<TDataType>(multiplexer, descriptor.queryName);\n}\n"],"names":["SSE_SUBSCRIBE_ROUTE","SSE_UNSUBSCRIBE_ROUTE","createObservableQueryConnection","descriptor","isSSE","Globals","queryTransportMethod","QueryTransportMethod","ServerSentEvents","queryDirectMode","createDirectSSEConnection","createDirectWebSocketConnection","createMultiplexedConnection","buildDirectUrl","route","UrlHelpers","replaceRouteParameters","args","actualRoute","joinPaths","apiBasePath","createUrlFrom","origin","ObservableQueryConnection","microservice","ServerSentEventQueryConnection","MAX_SAFE_SSE_CONNECTIONS","transport","requestedCount","queryConnectionCount","effectiveCount","Math","min","console","warn","cacheKey","multiplexer","getOrCreateMultiplexer","sseRoute","SSE_HUB_ROUTE","sseUrl","subscribeRoute","subscribeUrl","unsubscribeRoute","unsubscribeUrl","ServerSentEventHubConnection","toString","hubRoute","WS_HUB_ROUTE","hubUrl","secure","protocol","indexOf","wsUrl","host","pathname","search","WebSocketHubConnection","MultiplexedObservableQueryConnection","queryName"],"mappings":"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"}
1
+ {"version":3,"file":"ObservableQueryConnectionFactory.js","sources":["../../../queries/ObservableQueryConnectionFactory.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport { PollingOptions } from './PollingOptions.js';\nimport { PollingQueryConnection } from './PollingQueryConnection.js';\nimport { Globals } from '../Globals.js';\nimport { joinPaths } from '../joinPaths.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport { IObservableQueryConnection } from './IObservableQueryConnection.js';\nimport { ObservableQueryConnection } from './ObservableQueryConnection.js';\nimport { QueryTransportMethod } from './QueryTransportMethod.js';\nimport { ServerSentEventQueryConnection, SSE_HUB_ROUTE } from './ServerSentEventQueryConnection.js';\nimport { ServerSentEventHubConnection } from './ServerSentEventHubConnection.js';\nimport { WebSocketHubConnection } from './WebSocketHubConnection.js';\nimport { MultiplexedObservableQueryConnection, WS_HUB_ROUTE, getOrCreateMultiplexer } from './ObservableQueryMultiplexer.js';\n\n/**\n * The SSE subscribe POST endpoint route.\n */\nexport const SSE_SUBSCRIBE_ROUTE = '/.cratis/queries/sse/subscribe';\n\n/**\n * The SSE unsubscribe POST endpoint route.\n */\nexport const SSE_UNSUBSCRIBE_ROUTE = '/.cratis/queries/sse/unsubscribe';\n\n/**\n * Describes what the factory needs to know about a query in order to create\n * the right connection. Transport details are intentionally absent — the\n * factory reads those from {@link Globals}.\n */\nexport interface QueryConnectionDescriptor {\n /** The route template (e.g. `/api/accounts/debit/all-accounts`). */\n route: string;\n /** Fully-qualified backend query name used by hub transports. */\n queryName: string;\n /** Origin base URL (e.g. `http://localhost:5000`). */\n origin: string;\n /** API base path prefix. */\n apiBasePath: string;\n /** Microservice identifier. */\n microservice: string;\n /** Route/query arguments for the current subscription. */\n args?: object;\n /** Per-query custom headers used by HTTP polling. */\n httpHeadersCallback?: GetHttpHeaders;\n /** Per-query timing overrides for HTTP polling. */\n pollingOptions?: Partial<PollingOptions>;\n}\n\n/**\n * Single entry-point for creating observable query connections.\n *\n * Polling always uses each query's HTTP route. Persistent transports use a\n * 2x2 matrix of (direct | hub) x (WebSocket | SSE):\n *\n * | | Direct (per-query URL) | Hub (centralized endpoint) |\n * |----------------|-------------------------------|-------------------------------|\n * | **WebSocket** | ObservableQueryConnection | MultiplexedObservableQueryConnection |\n * | **SSE** | ServerSentEventQueryConnection | MultiplexedObservableQueryConnection |\n *\n * In multiplexed mode, both transports share the same multiplexer — it creates either\n * WebSocket or SSE connections depending on the transport setting.\n *\n * {@link ObservableQueryFor} never needs to know which transport is in use.\n */\nexport function createObservableQueryConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {\n if (Globals.queryTransportMethod === QueryTransportMethod.Polling) {\n return new PollingQueryConnection<TDataType>(\n buildDirectUrl(descriptor), descriptor.httpHeadersCallback ?? (() => ({})),\n descriptor.microservice, { ...Globals.queryPollingOptions, ...descriptor.pollingOptions }\n );\n }\n\n const isSSE = Globals.queryTransportMethod === QueryTransportMethod.ServerSentEvents;\n\n if (Globals.queryDirectMode) {\n return isSSE\n ? createDirectSSEConnection<TDataType>(descriptor)\n : createDirectWebSocketConnection<TDataType>(descriptor);\n }\n\n return createMultiplexedConnection<TDataType>(descriptor, isSSE);\n}\n\n/**\n * Determines whether the selected transport connects to each query's own route rather than a hub.\n * @returns True for direct mode or HTTP polling.\n */\nexport function connectsToQueryRoute(): boolean {\n return Globals.queryDirectMode || Globals.queryTransportMethod === QueryTransportMethod.Polling;\n}\n\n// ---- Direct mode: one connection per query, hitting the query's own URL ----\n\nfunction buildDirectUrl(descriptor: QueryConnectionDescriptor): URL {\n const { route } = UrlHelpers.replaceRouteParameters(descriptor.route, descriptor.args as object);\n const actualRoute = joinPaths(descriptor.apiBasePath, route);\n return UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, actualRoute);\n}\n\nfunction createDirectWebSocketConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {\n return new ObservableQueryConnection<TDataType>(buildDirectUrl(descriptor), descriptor.microservice);\n}\n\nfunction createDirectSSEConnection<TDataType>(descriptor: QueryConnectionDescriptor): IObservableQueryConnection<TDataType> {\n return new ServerSentEventQueryConnection<TDataType>(buildDirectUrl(descriptor));\n}\n\n// ---- Multiplexed mode: centralized endpoint, multiple queries share connections ----\n\n/**\n * Maximum number of SSE hub connections that fits safely within the HTTP/1.1 browser\n * per-origin connection limit (typically 6 for Chrome/Firefox). Each SSE EventSource\n * occupies one persistent connection slot indefinitely. Exceeding this cap blocks the\n * subscribe/unsubscribe POST requests that share the same pool, causing queries to hang.\n * Servers configured for HTTP/2 do not have this restriction.\n */\nconst MAX_SAFE_SSE_CONNECTIONS = 4;\n\nfunction createMultiplexedConnection<TDataType>(descriptor: QueryConnectionDescriptor, isSSE: boolean): IObservableQueryConnection<TDataType> {\n const transport = isSSE ? 'sse' : 'ws';\n const requestedCount = Globals.queryConnectionCount;\n const effectiveCount = isSSE ? Math.min(requestedCount, MAX_SAFE_SSE_CONNECTIONS) : requestedCount;\n\n if (isSSE && requestedCount > MAX_SAFE_SSE_CONNECTIONS) {\n console.warn(\n `[Arc] queryConnectionCount (${requestedCount}) exceeds the safe limit for SSE transport (${MAX_SAFE_SSE_CONNECTIONS}). ` +\n `HTTP/1.1 browsers allow at most 6 concurrent connections per origin; ` +\n `using more SSE connections blocks subscribe/unsubscribe requests, causing queries to hang. ` +\n `Capping at ${MAX_SAFE_SSE_CONNECTIONS}. Enable HTTP/2 on your server to use a higher connection count.`\n );\n }\n\n const cacheKey = `${requestedCount}|${transport}|${descriptor.origin}|${descriptor.apiBasePath}|${descriptor.microservice}`;\n\n const multiplexer = getOrCreateMultiplexer(() => {\n if (isSSE) {\n const sseRoute = joinPaths(descriptor.apiBasePath, SSE_HUB_ROUTE);\n const sseUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, sseRoute);\n const subscribeRoute = joinPaths(descriptor.apiBasePath, SSE_SUBSCRIBE_ROUTE);\n const subscribeUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, subscribeRoute);\n const unsubscribeRoute = joinPaths(descriptor.apiBasePath, SSE_UNSUBSCRIBE_ROUTE);\n const unsubscribeUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, unsubscribeRoute);\n return new ServerSentEventHubConnection(\n sseUrl.toString(),\n subscribeUrl.toString(),\n unsubscribeUrl.toString(),\n descriptor.microservice,\n );\n } else {\n const hubRoute = joinPaths(descriptor.apiBasePath, WS_HUB_ROUTE);\n const hubUrl = UrlHelpers.createUrlFrom(descriptor.origin, descriptor.apiBasePath, hubRoute);\n const secure = hubUrl.protocol?.indexOf('https') === 0;\n const wsUrl = `${secure ? 'wss' : 'ws'}://${hubUrl.host}${hubUrl.pathname}${hubUrl.search}`;\n return new WebSocketHubConnection(wsUrl, descriptor.microservice);\n }\n }, cacheKey, effectiveCount);\n\n return new MultiplexedObservableQueryConnection<TDataType>(multiplexer, descriptor.queryName);\n}\n"],"names":["SSE_SUBSCRIBE_ROUTE","SSE_UNSUBSCRIBE_ROUTE","createObservableQueryConnection","descriptor","Globals","queryTransportMethod","QueryTransportMethod","Polling","PollingQueryConnection","buildDirectUrl","httpHeadersCallback","microservice","queryPollingOptions","pollingOptions","isSSE","ServerSentEvents","queryDirectMode","createDirectSSEConnection","createDirectWebSocketConnection","createMultiplexedConnection","connectsToQueryRoute","route","UrlHelpers","replaceRouteParameters","args","actualRoute","joinPaths","apiBasePath","createUrlFrom","origin","ObservableQueryConnection","ServerSentEventQueryConnection","MAX_SAFE_SSE_CONNECTIONS","transport","requestedCount","queryConnectionCount","effectiveCount","Math","min","console","warn","cacheKey","multiplexer","getOrCreateMultiplexer","sseRoute","SSE_HUB_ROUTE","sseUrl","subscribeRoute","subscribeUrl","unsubscribeRoute","unsubscribeUrl","ServerSentEventHubConnection","toString","hubRoute","WS_HUB_ROUTE","hubUrl","secure","protocol","indexOf","wsUrl","host","pathname","search","WebSocketHubConnection","MultiplexedObservableQueryConnection","queryName"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { IObservableQueryFor, OnNextResult } from './IObservableQueryFor.js';
2
2
  import { ObservableQuerySubscription } from './ObservableQuerySubscription.js';
3
3
  import type { QueryValidator } from './QueryValidator.js';
4
+ import { PollingOptions } from './PollingOptions.js';
4
5
  import type { Constructor } from '@cratis/fundamentals';
5
6
  import { QueryResult } from './QueryResult.js';
6
7
  import { Sorting } from './Sorting.js';
@@ -19,6 +20,7 @@ export declare abstract class ObservableQueryFor<TDataType, TParameters = object
19
20
  private _connection?;
20
21
  private _httpHeadersCallback;
21
22
  private _httpMethod?;
23
+ private _pollingOptions?;
22
24
  abstract readonly route: string;
23
25
  abstract readonly defaultValue: TDataType;
24
26
  readonly roles: string[];
@@ -34,6 +36,7 @@ export declare abstract class ObservableQueryFor<TDataType, TParameters = object
34
36
  setApiBasePath(apiBasePath: string): void;
35
37
  setOrigin(origin: string): void;
36
38
  setHttpHeadersCallback(callback: GetHttpHeaders): void;
39
+ setPollingOptions(options: Partial<PollingOptions>): void;
37
40
  setHttpMethod(method: QueryHttpMethod): void;
38
41
  subscribe(callback: OnNextResult<QueryResult<TDataType>>, args?: TParameters): ObservableQuerySubscription<TDataType>;
39
42
  perform(args?: TParameters): Promise<QueryResult<TDataType>>;
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableQueryFor.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryFor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAS5D,8BAAsB,kBAAkB,CACpC,SAAS,EACT,WAAW,GAAG,MAAM,CACtB,YAAW,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC;IA8BhD,QAAQ,CAAC,SAAS,EAAE,WAAW;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO;IA3BhC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAuB;IAEnE,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAwC;IAC5D,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,WAAW,CAAC,CAAkB;IAEtC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAE1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC9D,QAAQ,KAAK,yBAAyB,IAAI,MAAM,EAAE,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAOf,YACa,SAAS,EAAE,WAAW,EACtB,UAAU,EAAE,OAAO,EAQ/B;IAKD,OAAO,SAEN;IAGD,eAAe,CAAC,YAAY,EAAE,MAAM,QAEnC;IAGD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAGD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9B;IAGD,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAErD;IAGD,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAE3C;IAGD,SAAS,CACL,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC9C,IAAI,CAAC,EAAE,WAAW,GACnB,2BAA2B,CAAC,SAAS,CAAC,CA8DxC;IAGK,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAgDjE;IAED,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,iBAAiB;CAO5B"}
1
+ {"version":3,"file":"ObservableQueryFor.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryFor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAS5D,8BAAsB,kBAAkB,CACpC,SAAS,EACT,WAAW,GAAG,MAAM,CACtB,YAAW,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC;IA+BhD,QAAQ,CAAC,SAAS,EAAE,WAAW;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO;IA5BhC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAuB;IAEnE,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAwC;IAC5D,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,eAAe,CAAC,CAA0B;IAElD,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAE1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC9D,QAAQ,KAAK,yBAAyB,IAAI,MAAM,EAAE,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAOf,YACa,SAAS,EAAE,WAAW,EACtB,UAAU,EAAE,OAAO,EAQ/B;IAKD,OAAO,SAEN;IAGD,eAAe,CAAC,YAAY,EAAE,MAAM,QAEnC;IAGD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAGD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9B;IAGD,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAErD;IAMD,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAExD;IAGD,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAE3C;IAGD,SAAS,CACL,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC9C,IAAI,CAAC,EAAE,WAAW,GACnB,2BAA2B,CAAC,SAAS,CAAC,CAgExC;IAGK,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAgDjE;IAED,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,iBAAiB;CAO5B"}
@@ -1,7 +1,7 @@
1
1
  import { ObservableQuerySubscription } from './ObservableQuerySubscription.js';
2
2
  import { ValidateRequestArguments } from './ValidateRequestArguments.js';
3
3
  import { NullObservableQueryConnection } from './NullObservableQueryConnection.js';
4
- import { createObservableQueryConnection } from './ObservableQueryConnectionFactory.js';
4
+ import { createObservableQueryConnection, connectsToQueryRoute } from './ObservableQueryConnectionFactory.js';
5
5
  import { deserializeQueryModels, deserializeQueryModel } from './deserializeQueryModel.js';
6
6
  import { QueryResult } from './QueryResult.js';
7
7
  import { Sorting } from './Sorting.js';
@@ -30,6 +30,7 @@ import { executeQueryHttpRequest } from './QueryHttpRequest.js';
30
30
  _connection;
31
31
  _httpHeadersCallback;
32
32
  _httpMethod;
33
+ _pollingOptions;
33
34
  roles = [];
34
35
  validation;
35
36
  /** Backend fully-qualified query name used when subscribing via the SSE hub. Overridden in generated proxies. */ queryName;
@@ -66,6 +67,12 @@ import { executeQueryHttpRequest } from './QueryHttpRequest.js';
66
67
  /** @inheritdoc */ setHttpHeadersCallback(callback) {
67
68
  this._httpHeadersCallback = callback;
68
69
  }
70
+ /**
71
+ * Overrides {@link Globals.queryPollingOptions} for this query instance on its next subscription.
72
+ * @param options The polling timing overrides to apply on the next subscribe.
73
+ */ setPollingOptions(options) {
74
+ this._pollingOptions = options;
75
+ }
69
76
  /** @inheritdoc */ setHttpMethod(method) {
70
77
  this._httpMethod = method;
71
78
  }
@@ -85,7 +92,9 @@ import { executeQueryHttpRequest } from './QueryHttpRequest.js';
85
92
  origin: this._origin,
86
93
  apiBasePath: this._apiBasePath,
87
94
  microservice: this._microservice,
88
- args: args
95
+ args: args,
96
+ httpHeadersCallback: this._httpHeadersCallback,
97
+ pollingOptions: this._pollingOptions
89
98
  });
90
99
  } else {
91
100
  this._connection = new NullObservableQueryConnection(this.defaultValue);
@@ -94,7 +103,7 @@ import { executeQueryHttpRequest } from './QueryHttpRequest.js';
94
103
  // must take precedence over any stale instance property values. Spread parameterValues
95
104
  // first so that the caller-supplied args can override them.
96
105
  //
97
- // In direct mode the route arguments are already embedded in the URL path, so only
106
+ // In direct mode or polling the route arguments are already embedded in the URL path, so only
98
107
  // the unused (non-route) parameters are appended as additional query arguments.
99
108
  // In multiplexed mode ALL arguments — including route-derived ones — must be included
100
109
  // in the subscribe payload so the server can execute the query correctly.
@@ -102,7 +111,7 @@ import { executeQueryHttpRequest } from './QueryHttpRequest.js';
102
111
  const { unusedParameters } = UrlHelpers.replaceRouteParameters(this.route, args);
103
112
  const connectionQueryArguments = {
104
113
  ...parameterValues,
105
- ...Globals.queryDirectMode ? unusedParameters : args || {},
114
+ ...connectsToQueryRoute() ? unusedParameters : args || {},
106
115
  ...this.buildQueryArguments()
107
116
  };
108
117
  const subscriber = new ObservableQuerySubscription(this._connection);
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableQueryFor.js","sources":["../../../queries/ObservableQueryFor.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IObservableQueryFor, OnNextResult } from './IObservableQueryFor.js';\nimport { ObservableQuerySubscription } from './ObservableQuerySubscription.js';\nimport { ValidateRequestArguments } from './ValidateRequestArguments.js';\nimport type { QueryValidator } from './QueryValidator.js';\nimport type { IObservableQueryConnection } from './IObservableQueryConnection.js';\nimport { NullObservableQueryConnection } from './NullObservableQueryConnection.js';\nimport { createObservableQueryConnection } from './ObservableQueryConnectionFactory.js';\nimport type { Constructor } from '@cratis/fundamentals';\nimport { deserializeQueryModel, deserializeQueryModels } from './deserializeQueryModel.js';\nimport { QueryResult } from './QueryResult.js';\nimport { Sorting } from './Sorting.js';\nimport { Paging } from './Paging.js';\nimport { SortDirection } from './SortDirection.js';\nimport { Globals } from '../Globals.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport type { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport type { ParameterDescriptor } from '../reflection/ParameterDescriptor.js';\nimport { ParametersHelper } from '../reflection/ParametersHelper.js';\nimport { SliceLocation } from '../reflection/SliceLocation.js';\nimport type { QueryHttpMethod } from './QueryHttpMethod.js';\nimport { executeQueryHttpRequest } from './QueryHttpRequest.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Represents an implementation of {@link IQueryFor}.\n * @template TDataType Type of data returned by the query.\n */\nexport abstract class ObservableQueryFor<\n TDataType,\n TParameters = object,\n> implements IObservableQueryFor<TDataType, TParameters> {\n /**\n * Gets the {@link SliceLocation} of the query. Generated proxies override it with the location resolved from the backend namespace.\n */\n static readonly sliceLocation: SliceLocation = SliceLocation.empty;\n\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _connection?: IObservableQueryConnection<TDataType>;\n private _httpHeadersCallback: GetHttpHeaders;\n private _httpMethod?: QueryHttpMethod;\n\n abstract readonly route: string;\n abstract readonly defaultValue: TDataType;\n readonly roles: string[] = [];\n readonly validation?: QueryValidator<any>;\n /** Backend fully-qualified query name used when subscribing via the SSE hub. Overridden in generated proxies. */\n readonly queryName?: string;\n abstract readonly parameterDescriptors: ParameterDescriptor[];\n abstract get requiredRequestParameters(): string[];\n sorting: Sorting;\n paging: Paging;\n\n /**\n * Initializes a new instance of the {@link ObservableQueryFor<,>}} class.\n * @param modelType Type of model, if an enumerable, this is the instance type.\n * @param enumerable Whether or not it is an enumerable.\n */\n constructor(\n readonly modelType: Constructor,\n readonly enumerable: boolean,\n ) {\n this.sorting = Sorting.none;\n this.paging = Paging.noPaging;\n this._microservice = Globals.microservice ?? '';\n this._apiBasePath = Globals.apiBasePath ?? '';\n this._origin = Globals.origin ?? '';\n this._httpHeadersCallback = () => ({});\n }\n\n /**\n * Disposes the query.\n */\n dispose() {\n this._connection?.disconnect();\n }\n\n /** @inheritdoc */\n setMicroservice(microservice: string) {\n this._microservice = microservice;\n }\n\n /** @inheritdoc */\n setApiBasePath(apiBasePath: string): void {\n this._apiBasePath = apiBasePath;\n }\n\n /** @inheritdoc */\n setOrigin(origin: string): void {\n this._origin = origin;\n }\n\n /** @inheritdoc */\n setHttpHeadersCallback(callback: GetHttpHeaders): void {\n this._httpHeadersCallback = callback;\n }\n\n /** @inheritdoc */\n setHttpMethod(method: QueryHttpMethod): void {\n this._httpMethod = method;\n }\n\n /** @inheritdoc */\n subscribe(\n callback: OnNextResult<QueryResult<TDataType>>,\n args?: TParameters,\n ): ObservableQuerySubscription<TDataType> {\n if (this._connection) {\n this._connection.disconnect();\n }\n\n const clientValidationErrors =\n this.validation?.validate((args as object) || {}) || [];\n if (clientValidationErrors.length > 0) {\n // Serve the failure through the connection rather than throwing, so a subscriber sees an invalid result\n // on its normal callback path instead of the empty result an unestablished connection would emit.\n this._connection = new NullObservableQueryConnection(\n this.defaultValue,\n QueryResult.validationFailed(clientValidationErrors, this),\n );\n } else if (this.validateArguments(args)) {\n this._connection = createObservableQueryConnection({\n route: this.route,\n queryName: this.queryName ?? this.constructor.name,\n origin: this._origin,\n apiBasePath: this._apiBasePath,\n microservice: this._microservice,\n args: args as object,\n });\n } else {\n this._connection = new NullObservableQueryConnection(this.defaultValue);\n }\n\n // Descriptor-backed instance properties provide defaults; fresh args passed to subscribe()\n // must take precedence over any stale instance property values. Spread parameterValues\n // first so that the caller-supplied args can override them.\n //\n // In direct mode the route arguments are already embedded in the URL path, so only\n // the unused (non-route) parameters are appended as additional query arguments.\n // In multiplexed mode ALL arguments — including route-derived ones — must be included\n // in the subscribe payload so the server can execute the query correctly.\n const parameterValues = ParametersHelper.collectParameterValues(this);\n const { unusedParameters } = UrlHelpers.replaceRouteParameters(\n this.route,\n args as object,\n );\n const connectionQueryArguments: any = {\n ...parameterValues,\n ...(Globals.queryDirectMode ? unusedParameters : (args as object) || {}),\n ...this.buildQueryArguments(),\n };\n\n const subscriber = new ObservableQuerySubscription(this._connection);\n this._connection.connect((data) => {\n const result: any = data;\n try {\n // Observable transports deliver structural query-result envelopes directly instead of\n // constructing QueryResult. Servers predating readiness therefore omit the member;\n // those results are complete by definition and must be normalized before subscribers\n // observe them. Preserve an explicit false transient state from newer servers.\n result.isReady ??= true;\n this.deserializeResult(result);\n callback(result);\n } catch (ex) {\n console.log(ex);\n }\n }, connectionQueryArguments);\n return subscriber;\n }\n\n /** @inheritdoc */\n async perform(args?: TParameters): Promise<QueryResult<TDataType>> {\n const noSuccess = {\n ...QueryResult.noSuccess,\n ...{ data: this.defaultValue },\n } as QueryResult<TDataType>;\n\n const clientValidationErrors =\n this.validation?.validate((args as object) || {}) || [];\n if (clientValidationErrors.length > 0) {\n return QueryResult.validationFailed(clientValidationErrors, this);\n }\n\n if (!this.validateArguments(args)) {\n return new Promise<QueryResult<TDataType>>((resolve) => {\n resolve(noSuccess);\n });\n }\n\n // Collect parameter values from parameterDescriptors that are set\n const parameterValues = ParametersHelper.collectParameterValues(this);\n\n const headers = {\n ...(this._httpHeadersCallback?.() || {}),\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n\n if (this._microservice?.length > 0) {\n headers[Globals.microserviceHttpHeader] = this._microservice;\n }\n\n const response = await executeQueryHttpRequest(this._httpMethod, {\n route: this.route,\n apiBasePath: this._apiBasePath,\n origin: this._origin,\n args: (args as object) ?? {},\n parameterValues,\n paging: this.paging,\n sorting: this.sorting,\n headers,\n });\n\n try {\n const result = await response.json();\n return new QueryResult(result, this.modelType, this.enumerable);\n } catch {\n return noSuccess;\n }\n }\n\n private validateArguments(args?: TParameters): boolean {\n const parameterValues = ParametersHelper.collectParameterValues(this);\n const combinedArgs = { ...((args as object) || {}), ...parameterValues };\n return ValidateRequestArguments(\n this.constructor.name,\n this.requiredRequestParameters,\n combinedArgs as object,\n );\n }\n\n private buildQueryArguments(): any {\n const queryArguments: any = {};\n\n if (this.paging && this.paging.pageSize > 0) {\n queryArguments.pageSize = this.paging.pageSize;\n queryArguments.page = this.paging.page;\n }\n\n if (this.sorting.hasSorting) {\n queryArguments.sortBy = this.sorting.field;\n queryArguments.sortDirection =\n this.sorting.direction === SortDirection.descending ? 'desc' : 'asc';\n }\n\n return queryArguments;\n }\n\n private deserializeResult(result: any): void {\n if (this.enumerable) {\n result.data = deserializeQueryModels(this.modelType, result.data);\n } else if (result.data) {\n result.data = deserializeQueryModel(this.modelType, result.data);\n }\n }\n}\n"],"names":["ObservableQueryFor","sliceLocation","SliceLocation","empty","_microservice","_apiBasePath","_origin","_connection","_httpHeadersCallback","_httpMethod","roles","validation","queryName","sorting","paging","enumerable","modelType","Sorting","none","Paging","noPaging","Globals","microservice","apiBasePath","origin","dispose","disconnect","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","setHttpMethod","method","subscribe","args","clientValidationErrors","validate","length","NullObservableQueryConnection","defaultValue","QueryResult","validationFailed","validateArguments","createObservableQueryConnection","route","name","parameterValues","ParametersHelper","collectParameterValues","unusedParameters","UrlHelpers","replaceRouteParameters","connectionQueryArguments","queryDirectMode","buildQueryArguments","subscriber","ObservableQuerySubscription","connect","data","result","isReady","deserializeResult","ex","console","log","perform","noSuccess","Promise","resolve","headers","Accept","microserviceHttpHeader","response","executeQueryHttpRequest","json","combinedArgs","ValidateRequestArguments","requiredRequestParameters","queryArguments","pageSize","page","hasSorting","sortBy","field","sortDirection","direction","SortDirection","descending","deserializeQueryModels","deserializeQueryModel"],"mappings":"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"}
1
+ {"version":3,"file":"ObservableQueryFor.js","sources":["../../../queries/ObservableQueryFor.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IObservableQueryFor, OnNextResult } from './IObservableQueryFor.js';\nimport { ObservableQuerySubscription } from './ObservableQuerySubscription.js';\nimport { ValidateRequestArguments } from './ValidateRequestArguments.js';\nimport type { QueryValidator } from './QueryValidator.js';\nimport type { IObservableQueryConnection } from './IObservableQueryConnection.js';\nimport { NullObservableQueryConnection } from './NullObservableQueryConnection.js';\nimport { PollingOptions } from './PollingOptions.js';\nimport { createObservableQueryConnection, connectsToQueryRoute } from './ObservableQueryConnectionFactory.js';\nimport type { Constructor } from '@cratis/fundamentals';\nimport { deserializeQueryModel, deserializeQueryModels } from './deserializeQueryModel.js';\nimport { QueryResult } from './QueryResult.js';\nimport { Sorting } from './Sorting.js';\nimport { Paging } from './Paging.js';\nimport { SortDirection } from './SortDirection.js';\nimport { Globals } from '../Globals.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport type { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport type { ParameterDescriptor } from '../reflection/ParameterDescriptor.js';\nimport { ParametersHelper } from '../reflection/ParametersHelper.js';\nimport { SliceLocation } from '../reflection/SliceLocation.js';\nimport type { QueryHttpMethod } from './QueryHttpMethod.js';\nimport { executeQueryHttpRequest } from './QueryHttpRequest.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Represents an implementation of {@link IQueryFor}.\n * @template TDataType Type of data returned by the query.\n */\nexport abstract class ObservableQueryFor<\n TDataType,\n TParameters = object,\n> implements IObservableQueryFor<TDataType, TParameters> {\n /**\n * Gets the {@link SliceLocation} of the query. Generated proxies override it with the location resolved from the backend namespace.\n */\n static readonly sliceLocation: SliceLocation = SliceLocation.empty;\n\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _connection?: IObservableQueryConnection<TDataType>;\n private _httpHeadersCallback: GetHttpHeaders;\n private _httpMethod?: QueryHttpMethod;\n private _pollingOptions?: Partial<PollingOptions>;\n\n abstract readonly route: string;\n abstract readonly defaultValue: TDataType;\n readonly roles: string[] = [];\n readonly validation?: QueryValidator<any>;\n /** Backend fully-qualified query name used when subscribing via the SSE hub. Overridden in generated proxies. */\n readonly queryName?: string;\n abstract readonly parameterDescriptors: ParameterDescriptor[];\n abstract get requiredRequestParameters(): string[];\n sorting: Sorting;\n paging: Paging;\n\n /**\n * Initializes a new instance of the {@link ObservableQueryFor<,>}} class.\n * @param modelType Type of model, if an enumerable, this is the instance type.\n * @param enumerable Whether or not it is an enumerable.\n */\n constructor(\n readonly modelType: Constructor,\n readonly enumerable: boolean,\n ) {\n this.sorting = Sorting.none;\n this.paging = Paging.noPaging;\n this._microservice = Globals.microservice ?? '';\n this._apiBasePath = Globals.apiBasePath ?? '';\n this._origin = Globals.origin ?? '';\n this._httpHeadersCallback = () => ({});\n }\n\n /**\n * Disposes the query.\n */\n dispose() {\n this._connection?.disconnect();\n }\n\n /** @inheritdoc */\n setMicroservice(microservice: string) {\n this._microservice = microservice;\n }\n\n /** @inheritdoc */\n setApiBasePath(apiBasePath: string): void {\n this._apiBasePath = apiBasePath;\n }\n\n /** @inheritdoc */\n setOrigin(origin: string): void {\n this._origin = origin;\n }\n\n /** @inheritdoc */\n setHttpHeadersCallback(callback: GetHttpHeaders): void {\n this._httpHeadersCallback = callback;\n }\n\n /**\n * Overrides {@link Globals.queryPollingOptions} for this query instance on its next subscription.\n * @param options The polling timing overrides to apply on the next subscribe.\n */\n setPollingOptions(options: Partial<PollingOptions>): void {\n this._pollingOptions = options;\n }\n\n /** @inheritdoc */\n setHttpMethod(method: QueryHttpMethod): void {\n this._httpMethod = method;\n }\n\n /** @inheritdoc */\n subscribe(\n callback: OnNextResult<QueryResult<TDataType>>,\n args?: TParameters,\n ): ObservableQuerySubscription<TDataType> {\n if (this._connection) {\n this._connection.disconnect();\n }\n\n const clientValidationErrors =\n this.validation?.validate((args as object) || {}) || [];\n if (clientValidationErrors.length > 0) {\n // Serve the failure through the connection rather than throwing, so a subscriber sees an invalid result\n // on its normal callback path instead of the empty result an unestablished connection would emit.\n this._connection = new NullObservableQueryConnection(\n this.defaultValue,\n QueryResult.validationFailed(clientValidationErrors, this),\n );\n } else if (this.validateArguments(args)) {\n this._connection = createObservableQueryConnection({\n route: this.route,\n queryName: this.queryName ?? this.constructor.name,\n origin: this._origin,\n apiBasePath: this._apiBasePath,\n microservice: this._microservice,\n args: args as object,\n httpHeadersCallback: this._httpHeadersCallback,\n pollingOptions: this._pollingOptions,\n });\n } else {\n this._connection = new NullObservableQueryConnection(this.defaultValue);\n }\n\n // Descriptor-backed instance properties provide defaults; fresh args passed to subscribe()\n // must take precedence over any stale instance property values. Spread parameterValues\n // first so that the caller-supplied args can override them.\n //\n // In direct mode or polling the route arguments are already embedded in the URL path, so only\n // the unused (non-route) parameters are appended as additional query arguments.\n // In multiplexed mode ALL arguments — including route-derived ones — must be included\n // in the subscribe payload so the server can execute the query correctly.\n const parameterValues = ParametersHelper.collectParameterValues(this);\n const { unusedParameters } = UrlHelpers.replaceRouteParameters(\n this.route,\n args as object,\n );\n const connectionQueryArguments: any = {\n ...parameterValues,\n ...(connectsToQueryRoute() ? unusedParameters : (args as object) || {}),\n ...this.buildQueryArguments(),\n };\n\n const subscriber = new ObservableQuerySubscription(this._connection);\n this._connection.connect((data) => {\n const result: any = data;\n try {\n // Observable transports deliver structural query-result envelopes directly instead of\n // constructing QueryResult. Servers predating readiness therefore omit the member;\n // those results are complete by definition and must be normalized before subscribers\n // observe them. Preserve an explicit false transient state from newer servers.\n result.isReady ??= true;\n this.deserializeResult(result);\n callback(result);\n } catch (ex) {\n console.log(ex);\n }\n }, connectionQueryArguments);\n return subscriber;\n }\n\n /** @inheritdoc */\n async perform(args?: TParameters): Promise<QueryResult<TDataType>> {\n const noSuccess = {\n ...QueryResult.noSuccess,\n ...{ data: this.defaultValue },\n } as QueryResult<TDataType>;\n\n const clientValidationErrors =\n this.validation?.validate((args as object) || {}) || [];\n if (clientValidationErrors.length > 0) {\n return QueryResult.validationFailed(clientValidationErrors, this);\n }\n\n if (!this.validateArguments(args)) {\n return new Promise<QueryResult<TDataType>>((resolve) => {\n resolve(noSuccess);\n });\n }\n\n // Collect parameter values from parameterDescriptors that are set\n const parameterValues = ParametersHelper.collectParameterValues(this);\n\n const headers = {\n ...(this._httpHeadersCallback?.() || {}),\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n\n if (this._microservice?.length > 0) {\n headers[Globals.microserviceHttpHeader] = this._microservice;\n }\n\n const response = await executeQueryHttpRequest(this._httpMethod, {\n route: this.route,\n apiBasePath: this._apiBasePath,\n origin: this._origin,\n args: (args as object) ?? {},\n parameterValues,\n paging: this.paging,\n sorting: this.sorting,\n headers,\n });\n\n try {\n const result = await response.json();\n return new QueryResult(result, this.modelType, this.enumerable);\n } catch {\n return noSuccess;\n }\n }\n\n private validateArguments(args?: TParameters): boolean {\n const parameterValues = ParametersHelper.collectParameterValues(this);\n const combinedArgs = { ...((args as object) || {}), ...parameterValues };\n return ValidateRequestArguments(\n this.constructor.name,\n this.requiredRequestParameters,\n combinedArgs as object,\n );\n }\n\n private buildQueryArguments(): any {\n const queryArguments: any = {};\n\n if (this.paging && this.paging.pageSize > 0) {\n queryArguments.pageSize = this.paging.pageSize;\n queryArguments.page = this.paging.page;\n }\n\n if (this.sorting.hasSorting) {\n queryArguments.sortBy = this.sorting.field;\n queryArguments.sortDirection =\n this.sorting.direction === SortDirection.descending ? 'desc' : 'asc';\n }\n\n return queryArguments;\n }\n\n private deserializeResult(result: any): void {\n if (this.enumerable) {\n result.data = deserializeQueryModels(this.modelType, result.data);\n } else if (result.data) {\n result.data = deserializeQueryModel(this.modelType, result.data);\n }\n }\n}\n"],"names":["ObservableQueryFor","sliceLocation","SliceLocation","empty","_microservice","_apiBasePath","_origin","_connection","_httpHeadersCallback","_httpMethod","_pollingOptions","roles","validation","queryName","sorting","paging","enumerable","modelType","Sorting","none","Paging","noPaging","Globals","microservice","apiBasePath","origin","dispose","disconnect","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","setPollingOptions","options","setHttpMethod","method","subscribe","args","clientValidationErrors","validate","length","NullObservableQueryConnection","defaultValue","QueryResult","validationFailed","validateArguments","createObservableQueryConnection","route","name","httpHeadersCallback","pollingOptions","parameterValues","ParametersHelper","collectParameterValues","unusedParameters","UrlHelpers","replaceRouteParameters","connectionQueryArguments","connectsToQueryRoute","buildQueryArguments","subscriber","ObservableQuerySubscription","connect","data","result","isReady","deserializeResult","ex","console","log","perform","noSuccess","Promise","resolve","headers","Accept","microserviceHttpHeader","response","executeQueryHttpRequest","json","combinedArgs","ValidateRequestArguments","requiredRequestParameters","queryArguments","pageSize","page","hasSorting","sortBy","field","sortDirection","direction","SortDirection","descending","deserializeQueryModels","deserializeQueryModel"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface PollingOptions {
2
+ intervalMs: number;
3
+ minIntervalMs: number;
4
+ maxIntervalMs: number;
5
+ backoffMultiplier: number;
6
+ jitterRatio: number;
7
+ }
8
+ //# sourceMappingURL=PollingOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PollingOptions.d.ts","sourceRoot":"","sources":["../../../queries/PollingOptions.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAE3B,UAAU,EAAE,MAAM,CAAC;IAEnB,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;IAEtB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,WAAW,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PollingOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PollingOptions.js","sourceRoot":"","sources":["../../../queries/PollingOptions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { GetHttpHeaders } from '../GetHttpHeaders.js';
2
+ import { DataReceived } from './ObservableQueryConnection.js';
3
+ import { IObservableQueryConnection } from './IObservableQueryConnection.js';
4
+ import { PollingOptions } from './PollingOptions.js';
5
+ export declare const QUERY_POLL_AFTER_HEADER = "Cratis-Query-Poll-After";
6
+ export declare class PollingQueryConnection<TDataType> implements IObservableQueryConnection<TDataType> {
7
+ private readonly _url;
8
+ private readonly _httpHeadersCallback;
9
+ private readonly _microservice;
10
+ private readonly _options;
11
+ private _started;
12
+ private _disconnected;
13
+ private _unauthorized;
14
+ private _timer?;
15
+ private _controller?;
16
+ private _failures;
17
+ private _previousComparable?;
18
+ private _lastPingLatency;
19
+ private _totalLatency;
20
+ private _requestCount;
21
+ constructor(_url: URL, _httpHeadersCallback: GetHttpHeaders, _microservice: string, _options: PollingOptions);
22
+ get lastPingLatency(): number;
23
+ get averageLatency(): number;
24
+ connect(dataReceived: DataReceived<TDataType>, queryArguments?: object): void;
25
+ disconnect(): void;
26
+ private poll;
27
+ private handleResponse;
28
+ private parseResult;
29
+ private emitChanged;
30
+ private backoff;
31
+ private clamp;
32
+ }
33
+ //# sourceMappingURL=PollingQueryConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PollingQueryConnection.d.ts","sourceRoot":"","sources":["../../../queries/PollingQueryConnection.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAGjE,qBAAa,sBAAsB,CAAC,SAAS,CAAE,YAAW,0BAA0B,CAAC,SAAS,CAAC;IAoBvF,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAtB7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAgC;IAC/C,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,mBAAmB,CAAC,CAAS;IACrC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAS1B,YACqB,IAAI,EAAE,GAAG,EACT,oBAAoB,EAAE,cAAc,EACpC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,cAAc,EACzC;IAGJ,IAAI,eAAe,IAAI,MAAM,CAAkC;IAG/D,IAAI,cAAc,IAAI,MAAM,CAE3B;IAGD,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAO5E;IAGD,UAAU,IAAI,IAAI,CAKjB;YAEa,IAAI;IA6BlB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;CAGhB"}