@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,147 @@
1
+ import { Globals } from '../Globals.js';
2
+ import { UrlHelpers } from '../UrlHelpers.js';
3
+ import { deepEqual } from '../deepEqual.js';
4
+ import { QueryResult } from './QueryResult.js';
5
+ import { isAbortError } from './isAbortError.js';
6
+
7
+ // Copyright (c) Cratis. All rights reserved.
8
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
9
+ /** Response header specifying the next poll delay in seconds. */ const QUERY_POLL_AFTER_HEADER = 'Cratis-Query-Poll-After';
10
+ /** Observes a query using sequential HTTP GET snapshots rather than a persistent connection. */ class PollingQueryConnection {
11
+ _url;
12
+ _httpHeadersCallback;
13
+ _microservice;
14
+ _options;
15
+ _started = false;
16
+ _disconnected = false;
17
+ _unauthorized = false;
18
+ _timer;
19
+ _controller;
20
+ _failures = 0;
21
+ _previousComparable;
22
+ _lastPingLatency = 0;
23
+ _totalLatency = 0;
24
+ _requestCount = 0;
25
+ /**
26
+ * Initializes a polling connection.
27
+ * @param _url The per-query HTTP endpoint.
28
+ * @param _httpHeadersCallback Custom headers evaluated for each request.
29
+ * @param _microservice The microservice identifier sent in the configured HTTP header.
30
+ * @param _options The resolved timing policy for this connection.
31
+ */ constructor(_url, _httpHeadersCallback, _microservice, _options){
32
+ this._url = _url;
33
+ this._httpHeadersCallback = _httpHeadersCallback;
34
+ this._microservice = _microservice;
35
+ this._options = _options;
36
+ }
37
+ /** @inheritdoc */ get lastPingLatency() {
38
+ return this._lastPingLatency;
39
+ }
40
+ /** @inheritdoc */ get averageLatency() {
41
+ return this._requestCount ? this._totalLatency / this._requestCount : 0;
42
+ }
43
+ /** @inheritdoc */ connect(dataReceived, queryArguments) {
44
+ if (this._started || this._disconnected || this._unauthorized) return;
45
+ this._started = true;
46
+ const url = new URL(this._url);
47
+ const parameters = UrlHelpers.buildQueryParams(queryArguments ?? {}, {
48
+ waitForFirstResult: 'true'
49
+ });
50
+ parameters.forEach((value, key)=>url.searchParams.append(key, value));
51
+ void this.poll(url, dataReceived);
52
+ }
53
+ /** @inheritdoc */ disconnect() {
54
+ this._disconnected = true;
55
+ clearTimeout(this._timer);
56
+ this._timer = undefined;
57
+ this._controller?.abort();
58
+ }
59
+ async poll(url, dataReceived) {
60
+ this._controller = new AbortController();
61
+ const started = performance.now();
62
+ let delay;
63
+ try {
64
+ const headers = new Headers({
65
+ ...Object.fromEntries(new Headers(Globals.httpHeadersCallback?.())),
66
+ ...Object.fromEntries(new Headers(this._httpHeadersCallback()))
67
+ });
68
+ headers.set('Accept', 'application/json');
69
+ headers.set('Content-Type', 'application/json');
70
+ if (this._microservice) headers.set(Globals.microserviceHttpHeader, this._microservice);
71
+ const response = await fetch(url.toString(), {
72
+ method: 'GET',
73
+ headers,
74
+ signal: this._controller.signal
75
+ });
76
+ if (this._disconnected) return;
77
+ const body = await response.text();
78
+ if (this._disconnected) return;
79
+ this._lastPingLatency = performance.now() - started;
80
+ this._totalLatency += this._lastPingLatency;
81
+ this._requestCount++;
82
+ delay = this.handleResponse(response, body, dataReceived);
83
+ } catch (error) {
84
+ if (this._disconnected || this._unauthorized || isAbortError(error)) return;
85
+ delay = this.backoff();
86
+ }
87
+ if (!this._disconnected && !this._unauthorized) {
88
+ this._timer = setTimeout(()=>{
89
+ void this.poll(url, dataReceived);
90
+ }, delay);
91
+ }
92
+ }
93
+ handleResponse(response, body, dataReceived) {
94
+ let result = this.parseResult(body);
95
+ if (response.status === 401 || response.status === 403 || result?.isAuthorized === false) {
96
+ console.warn(`Polling: query for '${this._url}' was ended by the server - no longer authorized`);
97
+ this._unauthorized = true;
98
+ result ??= {
99
+ ...QueryResult.unauthorized()
100
+ };
101
+ result = {
102
+ ...result,
103
+ isAuthorized: false
104
+ };
105
+ this.emitChanged(result, JSON.stringify(result), dataReceived);
106
+ return 0;
107
+ }
108
+ if (result?.isValid === false) {
109
+ this.disconnect();
110
+ this.emitChanged(result, body, dataReceived);
111
+ return 0;
112
+ }
113
+ const success = response.status === 200 && result !== undefined;
114
+ if (result && (success || response.status >= 500)) this.emitChanged(result, body, dataReceived);
115
+ if (success) this._failures = 0;
116
+ const delay = success ? this.clamp(this._options.intervalMs) : this.backoff();
117
+ const hint = response.headers.get(QUERY_POLL_AFTER_HEADER);
118
+ const seconds = hint?.trim() ? Number(hint) : NaN;
119
+ return Number.isFinite(seconds) && seconds >= 0 ? this.clamp(seconds * 1000) : delay;
120
+ }
121
+ parseResult(body) {
122
+ try {
123
+ const result = JSON.parse(body);
124
+ if (result && typeof result === 'object' && typeof result.isAuthorized === 'boolean') return result;
125
+ } catch {
126
+ // Non-JSON responses are transient failures, except for terminal authentication failures.
127
+ }
128
+ return undefined;
129
+ }
130
+ emitChanged(result, body, dataReceived) {
131
+ const comparable = JSON.parse(body);
132
+ delete comparable.correlationId;
133
+ if (deepEqual(this._previousComparable, comparable)) return;
134
+ this._previousComparable = comparable;
135
+ dataReceived(result);
136
+ }
137
+ backoff() {
138
+ const jitter = 1 + this._options.jitterRatio * (2 * Math.random() - 1);
139
+ return this.clamp(this._options.intervalMs * this._options.backoffMultiplier ** ++this._failures * jitter);
140
+ }
141
+ clamp(delay) {
142
+ return Math.min(this._options.maxIntervalMs, Math.max(this._options.minIntervalMs, delay));
143
+ }
144
+ }
145
+
146
+ export { PollingQueryConnection, QUERY_POLL_AFTER_HEADER };
147
+ //# sourceMappingURL=PollingQueryConnection.js.map
@@ -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":"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"}
@@ -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"}
@@ -9,6 +9,7 @@
9
9
  /**
10
10
  * Use Server-Sent Events (SSE) for real-time data streaming.
11
11
  */ QueryTransportMethod["ServerSentEvents"] = "serverSentEvents";
12
+ /** Use HTTP GET snapshots for observable queries. */ QueryTransportMethod["Polling"] = "polling";
12
13
  return QueryTransportMethod;
13
14
  }({});
14
15
 
@@ -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;;"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_direct_mode_and_polling_transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_direct_mode_and_polling_transport.d.ts","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_polling_transport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import sinon from 'sinon';
2
+ import { given } from '../../../given.js';
3
+ import { Globals } from '../../../Globals.js';
4
+ import { a_descriptor } from '../given/a_descriptor.js';
5
+ import { QueryTransportMethod } from '../../QueryTransportMethod.js';
6
+ import { PollingQueryConnection } from '../../PollingQueryConnection.js';
7
+ import { createObservableQueryConnection } from '../../ObservableQueryConnectionFactory.js';
8
+ import { getSharedMultiplexer, resetSharedMultiplexer } from '../../ObservableQueryMultiplexer.js';
9
+ describe('when creating with direct mode and polling transport', given(a_descriptor, context => {
10
+ let connection;
11
+ let eventSource;
12
+ let webSocket;
13
+ const originalEventSource = Object.getOwnPropertyDescriptor(globalThis, 'EventSource');
14
+ const originalWebSocket = Object.getOwnPropertyDescriptor(globalThis, 'WebSocket');
15
+ beforeEach(() => {
16
+ resetSharedMultiplexer();
17
+ Globals.queryDirectMode = true;
18
+ Globals.queryTransportMethod = QueryTransportMethod.Polling;
19
+ eventSource = sinon.stub().throws('EventSource must not be used');
20
+ webSocket = sinon.stub().throws('WebSocket must not be used');
21
+ Object.defineProperty(globalThis, 'EventSource', { configurable: true, value: eventSource });
22
+ Object.defineProperty(globalThis, 'WebSocket', { configurable: true, value: webSocket });
23
+ connection = createObservableQueryConnection(context.descriptor);
24
+ });
25
+ afterEach(() => {
26
+ connection?.disconnect();
27
+ Globals.queryDirectMode = context.originalDirectMode;
28
+ Globals.queryTransportMethod = context.originalTransportMethod;
29
+ if (originalEventSource)
30
+ Object.defineProperty(globalThis, 'EventSource', originalEventSource);
31
+ else
32
+ delete globalThis.EventSource;
33
+ if (originalWebSocket)
34
+ Object.defineProperty(globalThis, 'WebSocket', originalWebSocket);
35
+ else
36
+ delete globalThis.WebSocket;
37
+ resetSharedMultiplexer();
38
+ });
39
+ it('should return a polling connection', () => connection.should.be.instanceOf(PollingQueryConnection));
40
+ it('should not create persistent transports', () => {
41
+ eventSource.called.should.be.false;
42
+ webSocket.called.should.be.false;
43
+ });
44
+ it('should not create a multiplexer', () => (getSharedMultiplexer() === undefined).should.be.true);
45
+ }));
46
+ //# sourceMappingURL=with_direct_mode_and_polling_transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_direct_mode_and_polling_transport.js","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryConnectionFactory/when_creating/with_direct_mode_and_polling_transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_hub_mode_and_polling_transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_hub_mode_and_polling_transport.d.ts","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_polling_transport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import sinon from 'sinon';
2
+ import { given } from '../../../given.js';
3
+ import { Globals } from '../../../Globals.js';
4
+ import { a_descriptor } from '../given/a_descriptor.js';
5
+ import { QueryTransportMethod } from '../../QueryTransportMethod.js';
6
+ import { PollingQueryConnection } from '../../PollingQueryConnection.js';
7
+ import { createObservableQueryConnection } from '../../ObservableQueryConnectionFactory.js';
8
+ import { getSharedMultiplexer, resetSharedMultiplexer } from '../../ObservableQueryMultiplexer.js';
9
+ describe('when creating with hub mode and polling transport', given(a_descriptor, context => {
10
+ let connection;
11
+ let eventSource;
12
+ let webSocket;
13
+ const originalEventSource = Object.getOwnPropertyDescriptor(globalThis, 'EventSource');
14
+ const originalWebSocket = Object.getOwnPropertyDescriptor(globalThis, 'WebSocket');
15
+ beforeEach(() => {
16
+ resetSharedMultiplexer();
17
+ Globals.queryDirectMode = false;
18
+ Globals.queryTransportMethod = QueryTransportMethod.Polling;
19
+ eventSource = sinon.stub().throws('EventSource must not be used');
20
+ webSocket = sinon.stub().throws('WebSocket must not be used');
21
+ Object.defineProperty(globalThis, 'EventSource', { configurable: true, value: eventSource });
22
+ Object.defineProperty(globalThis, 'WebSocket', { configurable: true, value: webSocket });
23
+ connection = createObservableQueryConnection(context.descriptor);
24
+ });
25
+ afterEach(() => {
26
+ connection?.disconnect();
27
+ Globals.queryDirectMode = context.originalDirectMode;
28
+ Globals.queryTransportMethod = context.originalTransportMethod;
29
+ if (originalEventSource)
30
+ Object.defineProperty(globalThis, 'EventSource', originalEventSource);
31
+ else
32
+ delete globalThis.EventSource;
33
+ if (originalWebSocket)
34
+ Object.defineProperty(globalThis, 'WebSocket', originalWebSocket);
35
+ else
36
+ delete globalThis.WebSocket;
37
+ resetSharedMultiplexer();
38
+ });
39
+ it('should return a polling connection', () => connection.should.be.instanceOf(PollingQueryConnection));
40
+ it('should not create persistent transports', () => {
41
+ eventSource.called.should.be.false;
42
+ webSocket.called.should.be.false;
43
+ });
44
+ it('should not create a multiplexer', () => (getSharedMultiplexer() === undefined).should.be.true);
45
+ }));
46
+ //# sourceMappingURL=with_hub_mode_and_polling_transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_hub_mode_and_polling_transport.js","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryConnectionFactory/when_creating/with_hub_mode_and_polling_transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_polling_transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_polling_transport.d.ts","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryFor/when_subscribing/with_polling_transport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,108 @@
1
+ import sinon from 'sinon';
2
+ import { given } from '../../../given.js';
3
+ import { Globals } from '../../../Globals.js';
4
+ import { createFetchHelper } from '../../../helpers/fetchHelper.js';
5
+ import { an_observable_query_for } from '../given/an_observable_query_for.js';
6
+ import { QueryTransportMethod } from '../../QueryTransportMethod.js';
7
+ import { Paging } from '../../Paging.js';
8
+ import { Sorting } from '../../Sorting.js';
9
+ import { SortDirection } from '../../SortDirection.js';
10
+ describe('when subscribing with polling transport', given(an_observable_query_for, context => {
11
+ const fetchHelper = createFetchHelper();
12
+ let originals;
13
+ let subscription;
14
+ let clock;
15
+ let fetchStub;
16
+ let callback;
17
+ let callsBeforeInterval;
18
+ let callsAtInterval;
19
+ beforeEach(async () => {
20
+ originals = { queryDirectMode: Globals.queryDirectMode, queryTransportMethod: Globals.queryTransportMethod, queryPollingOptions: Globals.queryPollingOptions };
21
+ Globals.queryDirectMode = false;
22
+ Globals.queryTransportMethod = QueryTransportMethod.Polling;
23
+ Globals.queryPollingOptions = { ...Globals.queryPollingOptions, minIntervalMs: 100 };
24
+ clock = sinon.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout', 'performance'] });
25
+ fetchStub = fetchHelper.stubFetch();
26
+ fetchStub.callsFake(async () => new Response(JSON.stringify({
27
+ data: 'value', isSuccess: true, isAuthorized: true, isValid: true,
28
+ hasExceptions: false, validationResults: [], exceptionMessages: [], exceptionStackTrace: '',
29
+ paging: { page: 2, size: 10, totalItems: 35, totalPages: 4 }
30
+ })));
31
+ callback = sinon.stub();
32
+ const query = context.queryWithRouteAndQueryArgs;
33
+ query.setOrigin('https://example.com');
34
+ query.setMicroservice('svc');
35
+ query.setHttpHeadersCallback(() => ({ Authorization: 'Bearer test' }));
36
+ query.setPollingOptions({ intervalMs: 250 });
37
+ query.paging = new Paging(2, 10);
38
+ query.sorting = new Sorting('name', SortDirection.descending);
39
+ subscription = query.subscribe(callback, { id: 'item-42', filter: 'active', limit: 50 });
40
+ await clock.tickAsync(0);
41
+ await clock.tickAsync(249);
42
+ callsBeforeInterval = fetchStub.callCount;
43
+ await clock.tickAsync(1);
44
+ callsAtInterval = fetchStub.callCount;
45
+ subscription.unsubscribe();
46
+ await clock.tickAsync(2000);
47
+ });
48
+ afterEach(() => {
49
+ subscription?.unsubscribe();
50
+ clock.restore();
51
+ fetchHelper.restore();
52
+ Object.assign(Globals, originals);
53
+ });
54
+ it('should embed route arguments and append only HTTP query arguments', () => {
55
+ const url = new URL(fetchStub.firstCall.args[0]);
56
+ url.pathname.should.equal('/api/items/item-42');
57
+ Object.fromEntries(url.searchParams).should.deep.equal({ filter: 'active', limit: '50', page: '2', pageSize: '10', sortBy: 'name', sortDirection: 'desc', waitForFirstResult: 'true' });
58
+ });
59
+ it('should use per-query headers', () => fetchStub.firstCall.args[1].headers.get('Authorization').should.equal('Bearer test'));
60
+ it('should deliver a ready deserialized result with paging metadata', () => {
61
+ callback.firstCall.args[0].data.should.equal('value');
62
+ callback.firstCall.args[0].isReady.should.be.true;
63
+ callback.firstCall.args[0].paging.totalItems.should.equal(35);
64
+ });
65
+ it('should apply the per-query polling interval', () => {
66
+ callsBeforeInterval.should.equal(1);
67
+ callsAtInterval.should.equal(2);
68
+ });
69
+ it('should suppress unchanged snapshots after deserialization', () => callback.callCount.should.equal(1));
70
+ it('should stop after unsubscribe', () => fetchStub.callCount.should.equal(callsAtInterval));
71
+ }));
72
+ describe('when subscribing with polling transport and invalid arguments', given(an_observable_query_for, context => {
73
+ const fetchHelper = createFetchHelper();
74
+ let originalTransport;
75
+ let subscription;
76
+ let clock;
77
+ let fetchStub;
78
+ let callback;
79
+ beforeEach(async () => {
80
+ originalTransport = Globals.queryTransportMethod;
81
+ Globals.queryTransportMethod = QueryTransportMethod.Polling;
82
+ clock = sinon.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout', 'performance'] });
83
+ fetchStub = fetchHelper.stubFetch();
84
+ fetchStub.callsFake(async () => new Response(JSON.stringify({
85
+ data: '', isSuccess: false, isAuthorized: true, isValid: false,
86
+ hasExceptions: false, validationResults: [{ message: 'Invalid filter' }],
87
+ exceptionMessages: [], exceptionStackTrace: '',
88
+ paging: { page: 0, size: 0, totalItems: 0, totalPages: 0 }
89
+ }), { status: 400 }));
90
+ callback = sinon.stub();
91
+ context.queryWithRouteAndQueryArgs.setOrigin('https://example.com');
92
+ subscription = context.queryWithRouteAndQueryArgs.subscribe(callback, { id: 'item', filter: 'invalid', limit: 10 });
93
+ await clock.tickAsync(60000);
94
+ });
95
+ afterEach(() => {
96
+ subscription?.unsubscribe();
97
+ clock.restore();
98
+ fetchHelper.restore();
99
+ Globals.queryTransportMethod = originalTransport;
100
+ });
101
+ it('should deliver ready validation results', () => {
102
+ callback.firstCall.args[0].isReady.should.be.true;
103
+ callback.firstCall.args[0].isValid.should.be.false;
104
+ callback.firstCall.args[0].validationResults[0].message.should.equal('Invalid filter');
105
+ });
106
+ it('should stop polling', () => fetchStub.callCount.should.equal(1));
107
+ }));
108
+ //# sourceMappingURL=with_polling_transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_polling_transport.js","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryFor/when_subscribing/with_polling_transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_polling_transport_and_unauthorized_response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_polling_transport_and_unauthorized_response.d.ts","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryFor/when_subscribing/with_polling_transport_and_unauthorized_response.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import sinon from 'sinon';
2
+ import { given } from '../../../given.js';
3
+ import { Globals } from '../../../Globals.js';
4
+ import { createFetchHelper } from '../../../helpers/fetchHelper.js';
5
+ import { an_observable_query_for } from '../given/an_observable_query_for.js';
6
+ import { QueryTransportMethod } from '../../QueryTransportMethod.js';
7
+ describe('when subscribing with polling transport and unauthorized response', given(an_observable_query_for, context => {
8
+ const fetchHelper = createFetchHelper();
9
+ let originalTransport;
10
+ let clock;
11
+ let fetchStub;
12
+ let callback;
13
+ let subscription;
14
+ beforeEach(async () => {
15
+ originalTransport = Globals.queryTransportMethod;
16
+ Globals.queryTransportMethod = QueryTransportMethod.Polling;
17
+ clock = sinon.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout', 'performance'] });
18
+ sinon.stub(console, 'warn');
19
+ fetchStub = fetchHelper.stubFetch();
20
+ fetchStub.callsFake(async () => new Response('Unauthorized', { status: 401 }));
21
+ callback = sinon.stub();
22
+ context.queryWithRouteAndQueryArgs.setOrigin('https://example.com');
23
+ subscription = context.queryWithRouteAndQueryArgs.subscribe(callback, { id: 'item', filter: 'active', limit: 10 });
24
+ await clock.tickAsync(60000);
25
+ });
26
+ afterEach(() => {
27
+ subscription?.unsubscribe();
28
+ clock.restore();
29
+ fetchHelper.restore();
30
+ sinon.restore();
31
+ Globals.queryTransportMethod = originalTransport;
32
+ });
33
+ it('should deliver a ready unauthorized result', () => {
34
+ callback.firstCall.args[0].isAuthorized.should.be.false;
35
+ callback.firstCall.args[0].isReady.should.be.true;
36
+ });
37
+ it('should stop polling', () => fetchStub.callCount.should.equal(1));
38
+ }));
39
+ //# sourceMappingURL=with_polling_transport_and_unauthorized_response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_polling_transport_and_unauthorized_response.js","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryFor/when_subscribing/with_polling_transport_and_unauthorized_response.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,QAAQ,CAAC,mEAAmE,EAAE,KAAK,CAAC,uBAAuB,EAAE,OAAO,CAAC,EAAE;IACnH,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IACxC,IAAI,iBAAuC,CAAC;IAC5C,IAAI,KAA4B,CAAC;IACjC,IAAI,SAA0B,CAAC;IAC/B,IAAI,QAAyB,CAAC;IAC9B,IAAI,YAAiD,CAAC;IACtD,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;QACjD,OAAO,CAAC,oBAAoB,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAE5D,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,SAAS,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;QACpC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/E,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,0BAA0B,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACpE,YAAY,GAAG,OAAO,CAAC,0BAA0B,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACnH,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACX,YAAY,EAAE,WAAW,EAAE,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,CAAC,oBAAoB,GAAG,iBAAiB,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;QACxD,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import sinon from 'sinon';
2
+ import { PollingQueryConnection } from '../../PollingQueryConnection.js';
3
+ export declare class a_polling_query_connection {
4
+ connection: PollingQueryConnection<unknown>;
5
+ dataReceived: sinon.SinonStub;
6
+ fetchStub: sinon.SinonStub;
7
+ clock: sinon.SinonFakeTimers;
8
+ random: sinon.SinonStub;
9
+ responses: Response[];
10
+ private _correlationId;
11
+ constructor();
12
+ envelope(data: unknown, overrides?: Record<string, unknown>): {
13
+ data: unknown;
14
+ correlationId: string;
15
+ isSuccess: boolean;
16
+ isAuthorized: boolean;
17
+ isValid: boolean;
18
+ hasExceptions: boolean;
19
+ validationResults: never[];
20
+ exceptionMessages: never[];
21
+ exceptionStackTrace: string;
22
+ paging: {
23
+ page: number;
24
+ size: number;
25
+ totalItems: number;
26
+ totalPages: number;
27
+ };
28
+ };
29
+ respond(status: number, headers?: Record<string, string>, overrides?: Record<string, unknown>): void;
30
+ }
31
+ //# sourceMappingURL=a_polling_query_connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a_polling_query_connection.d.ts","sourceRoot":"","sources":["../../../../../queries/for_PollingQueryConnection/given/a_polling_query_connection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,qBAAa,0BAA0B;IACnC,UAAU,EAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC7C,YAAY,EAAG,KAAK,CAAC,SAAS,CAAC;IAC/B,SAAS,EAAG,KAAK,CAAC,SAAS,CAAC;IAC5B,KAAK,EAAG,KAAK,CAAC,eAAe,CAAC;IAC9B,MAAM,EAAG,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,OAAO,CAAC,cAAc,CAAK;IAE3B,cA4BC;IAED,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;YAK7C,IAAI;YAAK,IAAI;YAAM,UAAU;YAAM,UAAU;;MAE9D;IAED,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,QAEpG;CACJ"}
@@ -0,0 +1,52 @@
1
+ import sinon from 'sinon';
2
+ import { Globals } from '../../../Globals.js';
3
+ import { createFetchHelper } from '../../../helpers/fetchHelper.js';
4
+ import { PollingQueryConnection } from '../../PollingQueryConnection.js';
5
+ export class a_polling_query_connection {
6
+ connection;
7
+ dataReceived;
8
+ fetchStub;
9
+ clock;
10
+ random;
11
+ responses = [];
12
+ _correlationId = 0;
13
+ constructor() {
14
+ const fetchHelper = createFetchHelper();
15
+ const originalOptions = Globals.queryPollingOptions;
16
+ beforeEach(() => {
17
+ this.clock = sinon.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout', 'performance'] });
18
+ this.random = sinon.stub(Math, 'random').returns(0.5);
19
+ sinon.stub(console, 'warn');
20
+ this.responses = [
21
+ new Response(JSON.stringify(this.envelope('same'))),
22
+ new Response(JSON.stringify(this.envelope('same')))
23
+ ];
24
+ this.fetchStub = fetchHelper.stubFetch();
25
+ this.fetchStub.callsFake(async () => this.responses.shift() ?? new Response(JSON.stringify(this.envelope('same'))));
26
+ this.dataReceived = sinon.stub();
27
+ this.connection = new PollingQueryConnection(new URL('https://example.com/api/items/42'), () => ({ Authorization: 'Bearer x' }), 'svc', {
28
+ intervalMs: 1000, minIntervalMs: 500, maxIntervalMs: 8000,
29
+ backoffMultiplier: 2, jitterRatio: 0.2
30
+ });
31
+ });
32
+ afterEach(() => {
33
+ this.connection.disconnect();
34
+ this.clock.restore();
35
+ fetchHelper.restore();
36
+ sinon.restore();
37
+ Globals.queryPollingOptions = originalOptions;
38
+ });
39
+ }
40
+ envelope(data, overrides = {}) {
41
+ return {
42
+ data, correlationId: String(++this._correlationId), isSuccess: true,
43
+ isAuthorized: true, isValid: true, hasExceptions: false,
44
+ validationResults: [], exceptionMessages: [], exceptionStackTrace: '',
45
+ paging: { page: 1, size: 10, totalItems: 25, totalPages: 3 }, ...overrides
46
+ };
47
+ }
48
+ respond(status, headers = {}, overrides = {}) {
49
+ this.fetchStub.onFirstCall().resolves(new Response(JSON.stringify(this.envelope('same', overrides)), { status, headers }));
50
+ }
51
+ }
52
+ //# sourceMappingURL=a_polling_query_connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a_polling_query_connection.js","sourceRoot":"","sources":["../../../../../queries/for_PollingQueryConnection/given/a_polling_query_connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=after_a_network_error.d.ts.map