@cratis/arc 20.55.1 → 20.56.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 (149) hide show
  1. package/Globals.ts +15 -0
  2. package/dist/cjs/Globals.js +2 -0
  3. package/dist/cjs/Globals.js.map +1 -1
  4. package/dist/cjs/queries/ObservableQueryFor.js +13 -23
  5. package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
  6. package/dist/cjs/queries/QueryFor.js +13 -25
  7. package/dist/cjs/queries/QueryFor.js.map +1 -1
  8. package/dist/cjs/queries/QueryHttpMethod.js +23 -0
  9. package/dist/cjs/queries/QueryHttpMethod.js.map +1 -0
  10. package/dist/cjs/queries/QueryHttpMethodResolver.js +25 -0
  11. package/dist/cjs/queries/QueryHttpMethodResolver.js.map +1 -0
  12. package/dist/cjs/queries/QueryHttpRequest.js +0 -0
  13. package/dist/cjs/queries/QueryHttpRequest.js.map +1 -0
  14. package/dist/cjs/queries/index.js +9 -0
  15. package/dist/cjs/queries/index.js.map +1 -1
  16. package/dist/esm/Globals.d.ts +4 -0
  17. package/dist/esm/Globals.d.ts.map +1 -1
  18. package/dist/esm/Globals.js +2 -0
  19. package/dist/esm/Globals.js.map +1 -1
  20. package/dist/esm/queries/IQuery.d.ts +2 -0
  21. package/dist/esm/queries/IQuery.d.ts.map +1 -1
  22. package/dist/esm/queries/ObservableQueryFor.d.ts +3 -0
  23. package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
  24. package/dist/esm/queries/ObservableQueryFor.js +13 -23
  25. package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
  26. package/dist/esm/queries/QueryFor.d.ts +3 -0
  27. package/dist/esm/queries/QueryFor.d.ts.map +1 -1
  28. package/dist/esm/queries/QueryFor.js +13 -25
  29. package/dist/esm/queries/QueryFor.js.map +1 -1
  30. package/dist/esm/queries/QueryHttpMethod.d.ts +6 -0
  31. package/dist/esm/queries/QueryHttpMethod.d.ts.map +1 -0
  32. package/dist/esm/queries/QueryHttpMethod.js +21 -0
  33. package/dist/esm/queries/QueryHttpMethod.js.map +1 -0
  34. package/dist/esm/queries/QueryHttpMethodResolver.d.ts +14 -0
  35. package/dist/esm/queries/QueryHttpMethodResolver.d.ts.map +1 -0
  36. package/dist/esm/queries/QueryHttpMethodResolver.js +22 -0
  37. package/dist/esm/queries/QueryHttpMethodResolver.js.map +1 -0
  38. package/dist/esm/queries/QueryHttpRequest.d.ts +21 -0
  39. package/dist/esm/queries/QueryHttpRequest.d.ts.map +1 -0
  40. package/dist/esm/queries/QueryHttpRequest.js +0 -0
  41. package/dist/esm/queries/QueryHttpRequest.js.map +1 -0
  42. package/dist/esm/queries/for_QueryFor/when_performing/with_query_http_method.d.ts +2 -0
  43. package/dist/esm/queries/for_QueryFor/when_performing/with_query_http_method.d.ts.map +1 -0
  44. package/dist/esm/queries/for_QueryFor/when_performing/with_query_http_method.js +51 -0
  45. package/dist/esm/queries/for_QueryFor/when_performing/with_query_http_method.js.map +1 -0
  46. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_get_method.d.ts +2 -0
  47. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_get_method.d.ts.map +1 -0
  48. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_get_method.js +23 -0
  49. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_get_method.js.map +1 -0
  50. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method.d.ts +2 -0
  51. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method.d.ts.map +1 -0
  52. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method.js +28 -0
  53. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method.js.map +1 -0
  54. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method_and_paging_and_sorting.d.ts +2 -0
  55. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method_and_paging_and_sorting.d.ts.map +1 -0
  56. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method_and_paging_and_sorting.js +26 -0
  57. package/dist/esm/queries/for_buildQueryHttpRequest/when_building/with_query_method_and_paging_and_sorting.js.map +1 -0
  58. package/dist/esm/queries/for_executeQueryHttpRequest/options.d.ts +3 -0
  59. package/dist/esm/queries/for_executeQueryHttpRequest/options.d.ts.map +1 -0
  60. package/dist/esm/queries/for_executeQueryHttpRequest/options.js +16 -0
  61. package/dist/esm/queries/for_executeQueryHttpRequest/options.js.map +1 -0
  62. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver.d.ts +2 -0
  63. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver.d.ts.map +1 -0
  64. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver.js +23 -0
  65. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver.js.map +1 -0
  66. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver_and_an_explicit_override.d.ts +2 -0
  67. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver_and_an_explicit_override.d.ts.map +1 -0
  68. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver_and_an_explicit_override.js +23 -0
  69. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver_and_an_explicit_override.js.map +1 -0
  70. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_after_query_was_found_unsupported.d.ts +2 -0
  71. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_after_query_was_found_unsupported.d.ts.map +1 -0
  72. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_after_query_was_found_unsupported.js +21 -0
  73. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_after_query_was_found_unsupported.js.map +1 -0
  74. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_a_network_failure.d.ts +2 -0
  75. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_a_network_failure.d.ts.map +1 -0
  76. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_a_network_failure.js +23 -0
  77. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_a_network_failure.js.map +1 -0
  78. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_aborted_request.d.ts +2 -0
  79. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_aborted_request.d.ts.map +1 -0
  80. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_aborted_request.js +25 -0
  81. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_aborted_request.js.map +1 -0
  82. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_application_error.d.ts +2 -0
  83. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_application_error.d.ts.map +1 -0
  84. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_application_error.js +21 -0
  85. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_application_error.js.map +1 -0
  86. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_multiple_backends.d.ts +2 -0
  87. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_multiple_backends.d.ts.map +1 -0
  88. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_multiple_backends.js +31 -0
  89. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_multiple_backends.js.map +1 -0
  90. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_supported.d.ts +2 -0
  91. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_supported.d.ts.map +1 -0
  92. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_supported.js +19 -0
  93. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_supported.js.map +1 -0
  94. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_unsupported.d.ts +2 -0
  95. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_unsupported.d.ts.map +1 -0
  96. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_unsupported.js +22 -0
  97. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_unsupported.js.map +1 -0
  98. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_get_method.d.ts +2 -0
  99. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_get_method.d.ts.map +1 -0
  100. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_get_method.js +19 -0
  101. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_get_method.js.map +1 -0
  102. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_query_method_and_server_rejecting_the_verb.d.ts +2 -0
  103. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_query_method_and_server_rejecting_the_verb.d.ts.map +1 -0
  104. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_query_method_and_server_rejecting_the_verb.js +19 -0
  105. package/dist/esm/queries/for_executeQueryHttpRequest/when_performing/with_query_method_and_server_rejecting_the_verb.js.map +1 -0
  106. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url.d.ts +2 -0
  107. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url.d.ts.map +1 -0
  108. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url.js +12 -0
  109. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url.js.map +1 -0
  110. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url_and_a_custom_method.d.ts +2 -0
  111. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url_and_a_custom_method.d.ts.map +1 -0
  112. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url_and_a_custom_method.js +12 -0
  113. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url_and_a_custom_method.js.map +1 -0
  114. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_short_url.d.ts +2 -0
  115. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_short_url.d.ts.map +1 -0
  116. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_short_url.js +11 -0
  117. package/dist/esm/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_short_url.js.map +1 -0
  118. package/dist/esm/queries/index.d.ts +3 -0
  119. package/dist/esm/queries/index.d.ts.map +1 -1
  120. package/dist/esm/queries/index.js +3 -0
  121. package/dist/esm/queries/index.js.map +1 -1
  122. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +1 -1
  124. package/queries/IQuery.ts +7 -0
  125. package/queries/ObservableQueryFor.ts +16 -25
  126. package/queries/QueryFor.ts +16 -27
  127. package/queries/QueryHttpMethod.ts +24 -0
  128. package/queries/QueryHttpMethodResolver.ts +51 -0
  129. package/queries/QueryHttpRequest.ts +0 -0
  130. package/queries/for_QueryFor/when_performing/with_query_http_method.ts +63 -0
  131. package/queries/for_buildQueryHttpRequest/when_building/with_get_method.ts +31 -0
  132. package/queries/for_buildQueryHttpRequest/when_building/with_query_method.ts +42 -0
  133. package/queries/for_buildQueryHttpRequest/when_building/with_query_method_and_paging_and_sorting.ts +35 -0
  134. package/queries/for_executeQueryHttpRequest/options.ts +24 -0
  135. package/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver.ts +31 -0
  136. package/queries/for_executeQueryHttpRequest/when_performing/with_a_resolver_and_an_explicit_override.ts +31 -0
  137. package/queries/for_executeQueryHttpRequest/when_performing/with_auto_after_query_was_found_unsupported.ts +33 -0
  138. package/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_a_network_failure.ts +31 -0
  139. package/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_aborted_request.ts +31 -0
  140. package/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_an_application_error.ts +29 -0
  141. package/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_multiple_backends.ts +43 -0
  142. package/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_supported.ts +26 -0
  143. package/queries/for_executeQueryHttpRequest/when_performing/with_auto_and_query_unsupported.ts +30 -0
  144. package/queries/for_executeQueryHttpRequest/when_performing/with_get_method.ts +26 -0
  145. package/queries/for_executeQueryHttpRequest/when_performing/with_query_method_and_server_rejecting_the_verb.ts +26 -0
  146. package/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url.ts +17 -0
  147. package/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_long_url_and_a_custom_method.ts +17 -0
  148. package/queries/for_lengthBasedQueryHttpMethod/when_resolving/with_a_short_url.ts +16 -0
  149. package/queries/index.ts +3 -0
package/Globals.ts CHANGED
@@ -3,6 +3,8 @@
3
3
 
4
4
  import { GetHttpHeaders } from './GetHttpHeaders';
5
5
  import { QueryTransportMethod } from './queries/QueryTransportMethod';
6
+ import { QueryHttpMethod } from './queries/QueryHttpMethod';
7
+ import { QueryHttpMethodResolver } from './queries/QueryHttpMethodResolver';
6
8
 
7
9
  /**
8
10
  * Defines the transfer mode used for observable query subscriptions.
@@ -29,6 +31,18 @@ export interface IGlobals {
29
31
  microserviceHttpHeader: string;
30
32
  microserviceWSQueryArgument: string;
31
33
  queryTransportMethod: QueryTransportMethod;
34
+ /**
35
+ * The HTTP method used to perform non-streaming queries. Defaults to {@link QueryHttpMethod.Get}.
36
+ * Set to {@link QueryHttpMethod.Query} to carry arguments in a JSON request body (RFC 10008)
37
+ * instead of the URL query string. Individual queries can override this via {@code setHttpMethod}.
38
+ */
39
+ queryHttpMethod: QueryHttpMethod;
40
+ /**
41
+ * Optional per-query policy for choosing the query HTTP method from the request (e.g. by URL length).
42
+ * Consulted only when a query has no explicit method set via {@code setHttpMethod}; it takes
43
+ * precedence over {@link queryHttpMethod}. See {@link lengthBasedQueryHttpMethod} for a built-in.
44
+ */
45
+ queryHttpMethodResolver?: QueryHttpMethodResolver;
32
46
  /**
33
47
  * Number of hub connections maintained for observable queries.
34
48
  * When greater than one, queries are distributed across the pool round-robin.
@@ -74,6 +88,7 @@ export const Globals: IGlobals = {
74
88
  microserviceHttpHeader: 'x-cratis-microservice',
75
89
  microserviceWSQueryArgument: 'x-cratis-microservice',
76
90
  queryTransportMethod: QueryTransportMethod.WebSocket,
91
+ queryHttpMethod: QueryHttpMethod.Get,
77
92
  queryConnectionCount: 1,
78
93
  queryDirectMode: false,
79
94
  observableQueryTransferMode: ObservableQueryTransferMode.Delta,
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var QueryTransportMethod = require('./queries/QueryTransportMethod.js');
4
+ var QueryHttpMethod = require('./queries/QueryHttpMethod.js');
4
5
 
5
6
  // Copyright (c) Cratis. All rights reserved.
6
7
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -26,6 +27,7 @@ const Globals = {
26
27
  microserviceHttpHeader: 'x-cratis-microservice',
27
28
  microserviceWSQueryArgument: 'x-cratis-microservice',
28
29
  queryTransportMethod: QueryTransportMethod.QueryTransportMethod.WebSocket,
30
+ queryHttpMethod: QueryHttpMethod.QueryHttpMethod.Get,
29
31
  queryConnectionCount: 1,
30
32
  queryDirectMode: false,
31
33
  observableQueryTransferMode: "delta",
@@ -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';\nimport { QueryTransportMethod } from './queries/QueryTransportMethod';\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 * 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 * 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 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","queryConnectionCount","queryDirectMode","observableQueryTransferMode","httpHeadersCallback","queryCacheRetentionMs"],"mappings":";;;;AAAA;AACA;AAKA;;;;;;;;;;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;MA+CYC,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,0CAAqBC,SAAS;IACpDC,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';\nimport { QueryTransportMethod } from './queries/QueryTransportMethod';\nimport { QueryHttpMethod } from './queries/QueryHttpMethod';\nimport { QueryHttpMethodResolver } from './queries/QueryHttpMethodResolver';\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 * 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;AAOA;;;;;;;;;;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;MA2DYC,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,0CAAqBC,SAAS;AACpDC,IAAAA,eAAAA,EAAiBC,gCAAgBC,GAAG;IACpCC,oBAAAA,EAAsB,CAAA;IACtBC,eAAAA,EAAiB,KAAA;IACjBC,2BAA2B,EAAA,OAAA;IAC3BC,mBAAAA,EAAqB,KAAO,EAAC,CAAA;IAC7BC,qBAAAA,EAAuB;AAC3B;;;;;"}
@@ -10,9 +10,9 @@ var Sorting = require('./Sorting.js');
10
10
  var Paging = require('./Paging.js');
11
11
  var SortDirection = require('./SortDirection.js');
12
12
  var Globals = require('../Globals.js');
13
- var joinPaths = require('../joinPaths.js');
14
13
  var UrlHelpers = require('../UrlHelpers.js');
15
14
  var ParametersHelper = require('../reflection/ParametersHelper.js');
15
+ var QueryHttpRequest = require('./QueryHttpRequest.js');
16
16
 
17
17
  // Copyright (c) Cratis. All rights reserved.
18
18
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -27,6 +27,7 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
27
27
  _origin;
28
28
  _connection;
29
29
  _httpHeadersCallback;
30
+ _httpMethod;
30
31
  roles = [];
31
32
  /** Backend fully-qualified query name used when subscribing via the SSE hub. Overridden in generated proxies. */ queryName;
32
33
  sorting;
@@ -62,6 +63,9 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
62
63
  /** @inheritdoc */ setHttpHeadersCallback(callback) {
63
64
  this._httpHeadersCallback = callback;
64
65
  }
66
+ /** @inheritdoc */ setHttpMethod(method) {
67
+ this._httpMethod = method;
68
+ }
65
69
  /** @inheritdoc */ subscribe(callback, args) {
66
70
  if (this._connection) {
67
71
  this._connection.disconnect();
@@ -117,28 +121,8 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
117
121
  resolve(noSuccess);
118
122
  });
119
123
  }
120
- const { route, unusedParameters } = UrlHelpers.UrlHelpers.replaceRouteParameters(this.route, args);
121
- let actualRoute = joinPaths.joinPaths(this._apiBasePath, route);
122
- const additionalParams = {};
123
- if (this.paging.hasPaging) {
124
- additionalParams.page = this.paging.page;
125
- additionalParams.pageSize = this.paging.pageSize;
126
- }
127
- if (this.sorting.hasSorting) {
128
- additionalParams.sortBy = this.sorting.field;
129
- additionalParams.sortDirection = this.sorting.direction === SortDirection.SortDirection.descending ? 'desc' : 'asc';
130
- }
131
124
  // Collect parameter values from parameterDescriptors that are set
132
125
  const parameterValues = ParametersHelper.ParametersHelper.collectParameterValues(this);
133
- const queryParams = UrlHelpers.UrlHelpers.buildQueryParams({
134
- ...unusedParameters,
135
- ...parameterValues
136
- }, additionalParams);
137
- const queryString = queryParams.toString();
138
- if (queryString) {
139
- actualRoute += (actualRoute.includes('?') ? '&' : '?') + queryString;
140
- }
141
- const url = UrlHelpers.UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);
142
126
  const headers = {
143
127
  ...this._httpHeadersCallback?.() || {},
144
128
  'Accept': 'application/json',
@@ -147,8 +131,14 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
147
131
  if (this._microservice?.length > 0) {
148
132
  headers[Globals.Globals.microserviceHttpHeader] = this._microservice;
149
133
  }
150
- const response = await fetch(url, {
151
- method: 'GET',
134
+ const response = await QueryHttpRequest.executeQueryHttpRequest(this._httpMethod, {
135
+ route: this.route,
136
+ apiBasePath: this._apiBasePath,
137
+ origin: this._origin,
138
+ args: args ?? {},
139
+ parameterValues,
140
+ paging: this.paging,
141
+ sorting: this.sorting,
152
142
  headers
153
143
  });
154
144
  try {
@@ -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 { IObservableQueryFor, OnNextResult } from './IObservableQueryFor';\nimport { ObservableQuerySubscription } from './ObservableQuerySubscription';\nimport { ValidateRequestArguments } from './ValidateRequestArguments';\nimport { IObservableQueryConnection } from './IObservableQueryConnection';\nimport { NullObservableQueryConnection } from './NullObservableQueryConnection';\nimport { createObservableQueryConnection } from './ObservableQueryConnectionFactory';\nimport { Constructor } from '@cratis/fundamentals';\nimport { JsonSerializer } from '@cratis/fundamentals';\nimport { QueryResult } from './QueryResult';\nimport { Sorting } from './Sorting';\nimport { Paging } from './Paging';\nimport { SortDirection } from './SortDirection';\nimport { Globals } from '../Globals';\nimport { joinPaths } from '../joinPaths';\nimport { UrlHelpers } from '../UrlHelpers';\nimport { GetHttpHeaders } from '../GetHttpHeaders';\nimport { ParameterDescriptor } from '../reflection/ParameterDescriptor';\nimport { ParametersHelper } from '../reflection/ParametersHelper';\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<TDataType, TParameters = object> implements IObservableQueryFor<TDataType, TParameters> {\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _connection?: IObservableQueryConnection<TDataType>;\n private _httpHeadersCallback: GetHttpHeaders;\n\n abstract readonly route: string;\n abstract readonly defaultValue: TDataType;\n readonly roles: string[] = [];\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(readonly modelType: Constructor, readonly enumerable: boolean) {\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 subscribe(callback: OnNextResult<QueryResult<TDataType>>, args?: TParameters): ObservableQuerySubscription<TDataType> {\n if (this._connection) {\n this._connection.disconnect();\n }\n\n if (!this.validateArguments(args)) {\n this._connection = new NullObservableQueryConnection(this.defaultValue);\n } else {\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 }\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(this.route, args as object);\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 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 = { ...QueryResult.noSuccess, ...{ data: this.defaultValue } } as QueryResult<TDataType>;\n\n if (!this.validateArguments(args)) {\n return new Promise<QueryResult<TDataType>>((resolve) => {\n resolve(noSuccess);\n });\n }\n\n const { route, unusedParameters } = UrlHelpers.replaceRouteParameters(this.route, args as object);\n let actualRoute = joinPaths(this._apiBasePath, route);\n \n const additionalParams: Record<string, string | number> = {};\n if (this.paging.hasPaging) {\n additionalParams.page = this.paging.page;\n additionalParams.pageSize = this.paging.pageSize;\n }\n\n if (this.sorting.hasSorting) {\n additionalParams.sortBy = this.sorting.field;\n additionalParams.sortDirection = (this.sorting.direction === SortDirection.descending) ? 'desc' : 'asc';\n }\n\n // Collect parameter values from parameterDescriptors that are set\n const parameterValues = ParametersHelper.collectParameterValues(this);\n\n const queryParams = UrlHelpers.buildQueryParams({ ...unusedParameters, ...parameterValues }, additionalParams);\n const queryString = queryParams.toString();\n if (queryString) {\n actualRoute += (actualRoute.includes('?') ? '&' : '?') + queryString;\n }\n\n const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);\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 fetch(url, {\n method: 'GET',\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(this.constructor.name, this.requiredRequestParameters, combinedArgs as object);\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 = (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 if (Array.isArray(result.data)) {\n result.data = JsonSerializer.deserializeArrayFromInstance(this.modelType, result.data);\n } else {\n result.data = [];\n }\n } else if (result.data) {\n result.data = JsonSerializer.deserializeFromInstance(this.modelType, result.data);\n }\n }\n}\n"],"names":["ObservableQueryFor","_microservice","_apiBasePath","_origin","_connection","_httpHeadersCallback","roles","queryName","sorting","paging","enumerable","modelType","Sorting","none","Paging","noPaging","Globals","microservice","apiBasePath","origin","dispose","disconnect","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","subscribe","args","validateArguments","NullObservableQueryConnection","defaultValue","createObservableQueryConnection","route","name","parameterValues","ParametersHelper","collectParameterValues","unusedParameters","UrlHelpers","replaceRouteParameters","connectionQueryArguments","queryDirectMode","buildQueryArguments","subscriber","ObservableQuerySubscription","connect","data","result","deserializeResult","ex","console","log","perform","noSuccess","QueryResult","Promise","resolve","actualRoute","joinPaths","additionalParams","hasPaging","page","pageSize","hasSorting","sortBy","field","sortDirection","direction","SortDirection","descending","queryParams","buildQueryParams","queryString","toString","includes","url","createUrlFrom","headers","length","microserviceHttpHeader","response","fetch","method","json","combinedArgs","ValidateRequestArguments","requiredRequestParameters","queryArguments","Array","isArray","JsonSerializer","deserializeArrayFromInstance","deserializeFromInstance"],"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 { IObservableQueryFor, OnNextResult } from './IObservableQueryFor';\nimport { ObservableQuerySubscription } from './ObservableQuerySubscription';\nimport { ValidateRequestArguments } from './ValidateRequestArguments';\nimport { IObservableQueryConnection } from './IObservableQueryConnection';\nimport { NullObservableQueryConnection } from './NullObservableQueryConnection';\nimport { createObservableQueryConnection } from './ObservableQueryConnectionFactory';\nimport { Constructor } from '@cratis/fundamentals';\nimport { JsonSerializer } from '@cratis/fundamentals';\nimport { QueryResult } from './QueryResult';\nimport { Sorting } from './Sorting';\nimport { Paging } from './Paging';\nimport { SortDirection } from './SortDirection';\nimport { Globals } from '../Globals';\nimport { UrlHelpers } from '../UrlHelpers';\nimport { GetHttpHeaders } from '../GetHttpHeaders';\nimport { ParameterDescriptor } from '../reflection/ParameterDescriptor';\nimport { ParametersHelper } from '../reflection/ParametersHelper';\nimport { QueryHttpMethod } from './QueryHttpMethod';\nimport { executeQueryHttpRequest } from './QueryHttpRequest';\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<TDataType, TParameters = object> implements IObservableQueryFor<TDataType, TParameters> {\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 /** 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(readonly modelType: Constructor, readonly enumerable: boolean) {\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(callback: OnNextResult<QueryResult<TDataType>>, args?: TParameters): ObservableQuerySubscription<TDataType> {\n if (this._connection) {\n this._connection.disconnect();\n }\n\n if (!this.validateArguments(args)) {\n this._connection = new NullObservableQueryConnection(this.defaultValue);\n } else {\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 }\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(this.route, args as object);\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 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 = { ...QueryResult.noSuccess, ...{ data: this.defaultValue } } as QueryResult<TDataType>;\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(this.constructor.name, this.requiredRequestParameters, combinedArgs as object);\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 = (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 if (Array.isArray(result.data)) {\n result.data = JsonSerializer.deserializeArrayFromInstance(this.modelType, result.data);\n } else {\n result.data = [];\n }\n } else if (result.data) {\n result.data = JsonSerializer.deserializeFromInstance(this.modelType, result.data);\n }\n }\n}\n"],"names":["ObservableQueryFor","_microservice","_apiBasePath","_origin","_connection","_httpHeadersCallback","_httpMethod","roles","queryName","sorting","paging","enumerable","modelType","Sorting","none","Paging","noPaging","Globals","microservice","apiBasePath","origin","dispose","disconnect","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","setHttpMethod","method","subscribe","args","validateArguments","NullObservableQueryConnection","defaultValue","createObservableQueryConnection","route","name","parameterValues","ParametersHelper","collectParameterValues","unusedParameters","UrlHelpers","replaceRouteParameters","connectionQueryArguments","queryDirectMode","buildQueryArguments","subscriber","ObservableQuerySubscription","connect","data","result","deserializeResult","ex","console","log","perform","noSuccess","QueryResult","Promise","resolve","headers","length","microserviceHttpHeader","response","executeQueryHttpRequest","json","combinedArgs","ValidateRequestArguments","requiredRequestParameters","queryArguments","pageSize","page","hasSorting","sortBy","field","sortDirection","direction","SortDirection","descending","Array","isArray","JsonSerializer","deserializeArrayFromInstance","deserializeFromInstance"],"mappings":";;;;;;;;;;;;;;;;AAAA;AACA;AAsBA;;;AAKC,IACM,MAAeA,kBAAAA,CAAAA;;;IACVC,aAAAA;IACAC,YAAAA;IACAC,OAAAA;IACAC,WAAAA;IACAC,oBAAAA;IACAC,WAAAA;AAICC,IAAAA,KAAAA,GAAkB,EAAE;sHAE7B,SAASC;IAGTC,OAAAA;IACAC,MAAAA;AAEA;;;;AAIC,QACD,YAAY,SAA+B,EAAWC,UAAmB,CAAE;aAAtDC,SAAAA,GAAAA,SAAAA;aAAiCD,UAAAA,GAAAA,UAAAA;AAClD,QAAA,IAAI,CAACF,OAAO,GAAGI,eAAAA,CAAQC,IAAI;AAC3B,QAAA,IAAI,CAACJ,MAAM,GAAGK,aAAAA,CAAOC,QAAQ;AAC7B,QAAA,IAAI,CAACf,aAAa,GAAGgB,eAAAA,CAAQC,YAAY,IAAI,EAAA;AAC7C,QAAA,IAAI,CAAChB,YAAY,GAAGe,eAAAA,CAAQE,WAAW,IAAI,EAAA;AAC3C,QAAA,IAAI,CAAChB,OAAO,GAAGc,eAAAA,CAAQG,MAAM,IAAI,EAAA;AACjC,QAAA,IAAI,CAACf,oBAAoB,GAAG,KAAO,EAAC,CAAA;AACxC,IAAA;AAEA;;AAEC,QACDgB,OAAAA,GAAU;QACN,IAAI,CAACjB,WAAW,EAAEkB,UAAAA,EAAAA;AACtB,IAAA;uBAGAC,eAAAA,CAAgBL,YAAoB,EAAE;QAClC,IAAI,CAACjB,aAAa,GAAGiB,YAAAA;AACzB,IAAA;uBAGAM,cAAAA,CAAeL,WAAmB,EAAQ;QACtC,IAAI,CAACjB,YAAY,GAAGiB,WAAAA;AACxB,IAAA;uBAGAM,SAAAA,CAAUL,MAAc,EAAQ;QAC5B,IAAI,CAACjB,OAAO,GAAGiB,MAAAA;AACnB,IAAA;uBAGAM,sBAAAA,CAAuBC,QAAwB,EAAQ;QACnD,IAAI,CAACtB,oBAAoB,GAAGsB,QAAAA;AAChC,IAAA;uBAGAC,aAAAA,CAAcC,MAAuB,EAAQ;QACzC,IAAI,CAACvB,WAAW,GAAGuB,MAAAA;AACvB,IAAA;AAEA,uBACAC,SAAAA,CAAUH,QAA8C,EAAEI,IAAkB,EAA0C;QAClH,IAAI,IAAI,CAAC3B,WAAW,EAAE;YAClB,IAAI,CAACA,WAAW,CAACkB,UAAU,EAAA;AAC/B,QAAA;AAEA,QAAA,IAAI,CAAC,IAAI,CAACU,iBAAiB,CAACD,IAAAA,CAAAA,EAAO;AAC/B,YAAA,IAAI,CAAC3B,WAAW,GAAG,IAAI6B,2DAAAA,CAA8B,IAAI,CAACC,YAAY,CAAA;QAC1E,CAAA,MAAO;YACH,IAAI,CAAC9B,WAAW,GAAG+B,gEAAAA,CAAgC;gBAC/CC,KAAAA,EAAO,IAAI,CAACA,KAAK;gBACjB5B,SAAAA,EAAW,IAAI,CAACA,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC6B,IAAI;gBAClDjB,MAAAA,EAAQ,IAAI,CAACjB,OAAO;gBACpBgB,WAAAA,EAAa,IAAI,CAACjB,YAAY;gBAC9BgB,YAAAA,EAAc,IAAI,CAACjB,aAAa;gBAChC8B,IAAAA,EAAMA;AACV,aAAA,CAAA;AACJ,QAAA;;;;;;;;;AAUA,QAAA,MAAMO,eAAAA,GAAkBC,iCAAAA,CAAiBC,sBAAsB,CAAC,IAAI,CAAA;QACpE,MAAM,EAAEC,gBAAgB,EAAE,GAAGC,qBAAAA,CAAWC,sBAAsB,CAAC,IAAI,CAACP,KAAK,EAAEL,IAAAA,CAAAA;AAC3E,QAAA,MAAMa,wBAAAA,GAAgC;AAClC,YAAA,GAAGN,eAAe;AAClB,YAAA,GAAIrB,gBAAQ4B,eAAe,GAAGJ,mBAAmB,IAACV,IAAmB,EAAE;YACvE,GAAG,IAAI,CAACe,mBAAmB;AAC/B,SAAA;AAEA,QAAA,MAAMC,UAAAA,GAAa,IAAIC,uDAAAA,CAA4B,IAAI,CAAC5C,WAAW,CAAA;AACnE,QAAA,IAAI,CAACA,WAAW,CAAC6C,OAAO,CAACC,CAAAA,IAAAA,GAAAA;AACrB,YAAA,MAAMC,MAAAA,GAAcD,IAAAA;YACpB,IAAI;gBACA,IAAI,CAACE,iBAAiB,CAACD,MAAAA,CAAAA;gBACvBxB,QAAAA,CAASwB,MAAAA,CAAAA;AACb,YAAA,CAAA,CAAE,OAAOE,EAAAA,EAAI;AACTC,gBAAAA,OAAAA,CAAQC,GAAG,CAACF,EAAAA,CAAAA;AAChB,YAAA;QACJ,CAAA,EAAGT,wBAAAA,CAAAA;QACH,OAAOG,UAAAA;AACX,IAAA;AAEA,uBACA,MAAMS,OAAAA,CAAQzB,IAAkB,EAAmC;AAC/D,QAAA,MAAM0B,SAAAA,GAAY;AAAE,YAAA,GAAGC,wBAAYD,SAAS;YAAE,GAAG;gBAAEP,IAAAA,EAAM,IAAI,CAAChB;;AAAe,SAAA;AAE7E,QAAA,IAAI,CAAC,IAAI,CAACF,iBAAiB,CAACD,IAAAA,CAAAA,EAAO;YAC/B,OAAO,IAAI4B,QAAgC,CAACC,OAAAA,GAAAA;gBACxCA,OAAAA,CAAQH,SAAAA,CAAAA;AACZ,YAAA,CAAA,CAAA;AACJ,QAAA;;AAGA,QAAA,MAAMnB,eAAAA,GAAkBC,iCAAAA,CAAiBC,sBAAsB,CAAC,IAAI,CAAA;AAEpE,QAAA,MAAMqB,OAAAA,GAAU;AACZ,YAAA,GAAI,IAAI,CAACxD,oBAAoB,IAAA,IAAQ,EAAE;YACvC,QAAA,EAAU,kBAAA;YACV,cAAA,EAAgB;AACpB,SAAA;AAEA,QAAA,IAAI,IAAI,CAACJ,aAAa,EAAE6D,SAAS,CAAA,EAAG;AAChCD,YAAAA,OAAO,CAAC5C,eAAAA,CAAQ8C,sBAAsB,CAAC,GAAG,IAAI,CAAC9D,aAAa;AAChE,QAAA;AAEA,QAAA,MAAM+D,WAAW,MAAMC,wCAAAA,CAAwB,IAAI,CAAC3D,WAAW,EAAE;YAC7D8B,KAAAA,EAAO,IAAI,CAACA,KAAK;YACjBjB,WAAAA,EAAa,IAAI,CAACjB,YAAY;YAC9BkB,MAAAA,EAAQ,IAAI,CAACjB,OAAO;YACpB4B,IAAAA,EAAOA,QAAmB,EAAC;AAC3BO,YAAAA,eAAAA;YACA5B,MAAAA,EAAQ,IAAI,CAACA,MAAM;YACnBD,OAAAA,EAAS,IAAI,CAACA,OAAO;AACrBoD,YAAAA;AACJ,SAAA,CAAA;QAEA,IAAI;YACA,MAAMV,MAAAA,GAAS,MAAMa,QAAAA,CAASE,IAAI,EAAA;YAClC,OAAO,IAAIR,wBAAYP,MAAAA,EAAQ,IAAI,CAACvC,SAAS,EAAE,IAAI,CAACD,UAAU,CAAA;AAClE,QAAA,CAAA,CAAE,OAAM;YACJ,OAAO8C,SAAAA;AACX,QAAA;AACJ,IAAA;AAEQzB,IAAAA,iBAAAA,CAAkBD,IAAkB,EAAW;AACnD,QAAA,MAAMO,eAAAA,GAAkBC,iCAAAA,CAAiBC,sBAAsB,CAAC,IAAI,CAAA;AACpE,QAAA,MAAM2B,YAAAA,GAAe;YAAE,GAAIpC,IAAAA,IAAkB,EAAE;AAAG,YAAA,GAAGO;AAAgB,SAAA;QACrE,OAAO8B,iDAAAA,CAAyB,IAAI,CAAC,WAAW,CAAC/B,IAAI,EAAE,IAAI,CAACgC,yBAAyB,EAAEF,YAAAA,CAAAA;AAC3F,IAAA;IAEQrB,mBAAAA,GAA2B;AAC/B,QAAA,MAAMwB,iBAAsB,EAAC;QAE7B,IAAI,IAAI,CAAC5D,MAAM,IAAI,IAAI,CAACA,MAAM,CAAC6D,QAAQ,GAAG,CAAA,EAAG;AACzCD,YAAAA,cAAAA,CAAeC,QAAQ,GAAG,IAAI,CAAC7D,MAAM,CAAC6D,QAAQ;AAC9CD,YAAAA,cAAAA,CAAeE,IAAI,GAAG,IAAI,CAAC9D,MAAM,CAAC8D,IAAI;AAC1C,QAAA;AAEA,QAAA,IAAI,IAAI,CAAC/D,OAAO,CAACgE,UAAU,EAAE;AACzBH,YAAAA,cAAAA,CAAeI,MAAM,GAAG,IAAI,CAACjE,OAAO,CAACkE,KAAK;AAC1CL,YAAAA,cAAAA,CAAeM,aAAa,GAAG,IAAK,CAACnE,OAAO,CAACoE,SAAS,KAAKC,2BAAAA,CAAcC,UAAU,GAAI,MAAA,GAAS,KAAA;AACpG,QAAA;QAEA,OAAOT,cAAAA;AACX,IAAA;AAEQlB,IAAAA,iBAAAA,CAAkBD,MAAW,EAAQ;QACzC,IAAI,IAAI,CAACxC,UAAU,EAAE;AACjB,YAAA,IAAIqE,KAAAA,CAAMC,OAAO,CAAC9B,MAAAA,CAAOD,IAAI,CAAA,EAAG;gBAC5BC,MAAAA,CAAOD,IAAI,GAAGgC,2BAAAA,CAAeC,4BAA4B,CAAC,IAAI,CAACvE,SAAS,EAAEuC,MAAAA,CAAOD,IAAI,CAAA;YACzF,CAAA,MAAO;gBACHC,MAAAA,CAAOD,IAAI,GAAG,EAAE;AACpB,YAAA;QACJ,CAAA,MAAO,IAAIC,MAAAA,CAAOD,IAAI,EAAE;YACpBC,MAAAA,CAAOD,IAAI,GAAGgC,2BAAAA,CAAeE,uBAAuB,CAAC,IAAI,CAACxE,SAAS,EAAEuC,MAAAA,CAAOD,IAAI,CAAA;AACpF,QAAA;AACJ,IAAA;AACJ;;;;"}
@@ -5,10 +5,8 @@ var ValidateRequestArguments = require('./ValidateRequestArguments.js');
5
5
  var Paging = require('./Paging.js');
6
6
  var Globals = require('../Globals.js');
7
7
  var Sorting = require('./Sorting.js');
8
- var SortDirection = require('./SortDirection.js');
9
- var joinPaths = require('../joinPaths.js');
10
- var UrlHelpers = require('../UrlHelpers.js');
11
8
  var ParametersHelper = require('../reflection/ParametersHelper.js');
9
+ var QueryHttpRequest = require('./QueryHttpRequest.js');
12
10
 
13
11
  // Copyright (c) Cratis. All rights reserved.
14
12
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -22,6 +20,7 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
22
20
  _apiBasePath;
23
21
  _origin;
24
22
  _httpHeadersCallback;
23
+ _httpMethod;
25
24
  /** Backend fully-qualified query name used as cache key. Overridden in generated proxies. */ queryName;
26
25
  /* eslint-disable @typescript-eslint/no-explicit-any */ validation;
27
26
  /* eslint-enable @typescript-eslint/no-explicit-any */ roles = [];
@@ -55,6 +54,9 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
55
54
  /** @inheritdoc */ setHttpHeadersCallback(callback) {
56
55
  this._httpHeadersCallback = callback;
57
56
  }
57
+ /** @inheritdoc */ setHttpMethod(method) {
58
+ this._httpMethod = method;
59
+ }
58
60
  /** @inheritdoc */ async perform(args) {
59
61
  const noSuccess = {
60
62
  ...QueryResult.QueryResult.noSuccess,
@@ -96,28 +98,8 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
96
98
  this.abortController.abort();
97
99
  }
98
100
  this.abortController = new AbortController();
99
- const { route, unusedParameters } = UrlHelpers.UrlHelpers.replaceRouteParameters(this.route, args);
100
- let actualRoute = joinPaths.joinPaths(this._apiBasePath, route);
101
- const additionalParams = {};
102
- if (this.paging.hasPaging) {
103
- additionalParams.page = this.paging.page;
104
- additionalParams.pageSize = this.paging.pageSize;
105
- }
106
- if (this.sorting.hasSorting) {
107
- additionalParams.sortBy = this.sorting.field;
108
- additionalParams.sortDirection = this.sorting.direction === SortDirection.SortDirection.descending ? 'desc' : 'asc';
109
- }
110
101
  // Collect parameter values from parameterDescriptors that are set
111
102
  const parameterValues = ParametersHelper.ParametersHelper.collectParameterValues(this);
112
- const queryParams = UrlHelpers.UrlHelpers.buildQueryParams({
113
- ...unusedParameters,
114
- ...parameterValues
115
- }, additionalParams);
116
- const queryString = queryParams.toString();
117
- if (queryString) {
118
- actualRoute += (actualRoute.includes('?') ? '&' : '?') + queryString;
119
- }
120
- const url = UrlHelpers.UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);
121
103
  const headers = {
122
104
  ...this._httpHeadersCallback?.(),
123
105
  ...{
@@ -128,8 +110,14 @@ var ParametersHelper = require('../reflection/ParametersHelper.js');
128
110
  if (this._microservice?.length > 0) {
129
111
  headers[Globals.Globals.microserviceHttpHeader] = this._microservice;
130
112
  }
131
- const response = await fetch(url, {
132
- method: 'GET',
113
+ const response = await QueryHttpRequest.executeQueryHttpRequest(this._httpMethod, {
114
+ route: this.route,
115
+ apiBasePath: this._apiBasePath,
116
+ origin: this._origin,
117
+ args: args ?? {},
118
+ parameterValues,
119
+ paging: this.paging,
120
+ sorting: this.sorting,
133
121
  headers,
134
122
  signal: this.abortController.signal
135
123
  });
@@ -1 +1 @@
1
- {"version":3,"file":"QueryFor.js","sources":["../../../queries/QueryFor.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 { IQueryFor } from './IQueryFor';\nimport { QueryResult } from \"./QueryResult\";\nimport { QueryValidator } from './QueryValidator';\nimport { ValidateRequestArguments } from './ValidateRequestArguments';\nimport { Constructor } from '@cratis/fundamentals';\nimport { Paging } from './Paging';\nimport { Globals } from '../Globals';\nimport { Sorting } from './Sorting';\nimport { SortDirection } from './SortDirection';\nimport { joinPaths } from '../joinPaths';\nimport { UrlHelpers } from '../UrlHelpers';\nimport { GetHttpHeaders } from '../GetHttpHeaders';\nimport { ParameterDescriptor } from '../reflection/ParameterDescriptor';\nimport { ParametersHelper } from '../reflection/ParametersHelper';\n\n/**\n * Represents an implementation of {@link IQueryFor}.\n * @template TDataType Type of data returned by the query.\n */\nexport abstract class QueryFor<TDataType, TParameters = object> implements IQueryFor<TDataType, TParameters> {\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _httpHeadersCallback: GetHttpHeaders;\n abstract readonly route: string;\n /** Backend fully-qualified query name used as cache key. Overridden in generated proxies. */\n readonly queryName?: string;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n readonly validation?: QueryValidator<any>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n readonly roles: string[] = [];\n abstract readonly parameterDescriptors: ParameterDescriptor[];\n abstract get requiredRequestParameters(): string[];\n abstract defaultValue: TDataType;\n abortController?: AbortController;\n sorting: Sorting;\n paging: Paging;\n parameters: TParameters | undefined;\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(readonly modelType: Constructor, readonly enumerable: boolean) {\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 /** @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 async perform(args?: TParameters): Promise<QueryResult<TDataType>> {\n const noSuccess = { ...QueryResult.noSuccess, ...{ data: this.defaultValue } } as QueryResult<TDataType>;\n\n args = args || this.parameters;\n\n const clientValidationErrors = this.validation?.validate(args as object || {}) || [];\n if (clientValidationErrors.length > 0) {\n return new QueryResult({\n data: this.defaultValue as object,\n isSuccess: false,\n isAuthorized: true,\n isValid: false,\n hasExceptions: false,\n validationResults: clientValidationErrors.map(_ => ({\n severity: _.severity,\n message: _.message,\n members: _.members,\n state: _.state\n })),\n exceptionMessages: [],\n exceptionStackTrace: '',\n paging: {\n totalItems: 0,\n totalPages: 0,\n page: 0,\n size: 0\n }\n }, this.modelType, this.enumerable) as QueryResult<TDataType>;\n }\n\n if (!ValidateRequestArguments(this.constructor.name, this.requiredRequestParameters, args as object)) {\n return new Promise<QueryResult<TDataType>>((resolve) => {\n resolve(noSuccess);\n });\n }\n\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.abortController = new AbortController();\n\n const { route, unusedParameters } = UrlHelpers.replaceRouteParameters(this.route, args as object);\n let actualRoute = joinPaths(this._apiBasePath, route);\n \n const additionalParams: Record<string, string | number> = {};\n if (this.paging.hasPaging) {\n additionalParams.page = this.paging.page;\n additionalParams.pageSize = this.paging.pageSize;\n }\n\n if (this.sorting.hasSorting) {\n additionalParams.sortBy = this.sorting.field;\n additionalParams.sortDirection = (this.sorting.direction === SortDirection.descending) ? 'desc' : 'asc';\n }\n\n // Collect parameter values from parameterDescriptors that are set\n const parameterValues = ParametersHelper.collectParameterValues(this);\n\n const queryParams = UrlHelpers.buildQueryParams({ ...unusedParameters, ...parameterValues }, additionalParams);\n const queryString = queryParams.toString();\n if (queryString) {\n actualRoute += (actualRoute.includes('?') ? '&' : '?') + queryString;\n }\n \n const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);\n\n const headers = {\n ... this._httpHeadersCallback?.(), ...\n {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }\n };\n\n if (this._microservice?.length > 0) {\n headers[Globals.microserviceHttpHeader] = this._microservice;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: this.abortController.signal\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"],"names":["QueryFor","_microservice","_apiBasePath","_origin","_httpHeadersCallback","queryName","validation","roles","abortController","sorting","paging","parameters","enumerable","modelType","Sorting","none","Paging","noPaging","Globals","microservice","apiBasePath","origin","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","perform","args","noSuccess","QueryResult","data","defaultValue","clientValidationErrors","validate","length","isSuccess","isAuthorized","isValid","hasExceptions","validationResults","map","_","severity","message","members","state","exceptionMessages","exceptionStackTrace","totalItems","totalPages","page","size","ValidateRequestArguments","name","requiredRequestParameters","Promise","resolve","abort","AbortController","route","unusedParameters","UrlHelpers","replaceRouteParameters","actualRoute","joinPaths","additionalParams","hasPaging","pageSize","hasSorting","sortBy","field","sortDirection","direction","SortDirection","descending","parameterValues","ParametersHelper","collectParameterValues","queryParams","buildQueryParams","queryString","toString","includes","url","createUrlFrom","headers","microserviceHttpHeader","response","fetch","method","signal","result","json"],"mappings":"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"}
1
+ {"version":3,"file":"QueryFor.js","sources":["../../../queries/QueryFor.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 { IQueryFor } from './IQueryFor';\nimport { QueryResult } from \"./QueryResult\";\nimport { QueryValidator } from './QueryValidator';\nimport { ValidateRequestArguments } from './ValidateRequestArguments';\nimport { Constructor } from '@cratis/fundamentals';\nimport { Paging } from './Paging';\nimport { Globals } from '../Globals';\nimport { Sorting } from './Sorting';\nimport { GetHttpHeaders } from '../GetHttpHeaders';\nimport { ParameterDescriptor } from '../reflection/ParameterDescriptor';\nimport { ParametersHelper } from '../reflection/ParametersHelper';\nimport { QueryHttpMethod } from './QueryHttpMethod';\nimport { executeQueryHttpRequest } from './QueryHttpRequest';\n\n/**\n * Represents an implementation of {@link IQueryFor}.\n * @template TDataType Type of data returned by the query.\n */\nexport abstract class QueryFor<TDataType, TParameters = object> implements IQueryFor<TDataType, TParameters> {\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _httpHeadersCallback: GetHttpHeaders;\n private _httpMethod?: QueryHttpMethod;\n abstract readonly route: string;\n /** Backend fully-qualified query name used as cache key. Overridden in generated proxies. */\n readonly queryName?: string;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n readonly validation?: QueryValidator<any>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n readonly roles: string[] = [];\n abstract readonly parameterDescriptors: ParameterDescriptor[];\n abstract get requiredRequestParameters(): string[];\n abstract defaultValue: TDataType;\n abortController?: AbortController;\n sorting: Sorting;\n paging: Paging;\n parameters: TParameters | undefined;\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(readonly modelType: Constructor, readonly enumerable: boolean) {\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 /** @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 async perform(args?: TParameters): Promise<QueryResult<TDataType>> {\n const noSuccess = { ...QueryResult.noSuccess, ...{ data: this.defaultValue } } as QueryResult<TDataType>;\n\n args = args || this.parameters;\n\n const clientValidationErrors = this.validation?.validate(args as object || {}) || [];\n if (clientValidationErrors.length > 0) {\n return new QueryResult({\n data: this.defaultValue as object,\n isSuccess: false,\n isAuthorized: true,\n isValid: false,\n hasExceptions: false,\n validationResults: clientValidationErrors.map(_ => ({\n severity: _.severity,\n message: _.message,\n members: _.members,\n state: _.state\n })),\n exceptionMessages: [],\n exceptionStackTrace: '',\n paging: {\n totalItems: 0,\n totalPages: 0,\n page: 0,\n size: 0\n }\n }, this.modelType, this.enumerable) as QueryResult<TDataType>;\n }\n\n if (!ValidateRequestArguments(this.constructor.name, this.requiredRequestParameters, args as object)) {\n return new Promise<QueryResult<TDataType>>((resolve) => {\n resolve(noSuccess);\n });\n }\n\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.abortController = new AbortController();\n\n // Collect parameter values from parameterDescriptors that are set\n const parameterValues = ParametersHelper.collectParameterValues(this);\n\n const headers = {\n ... this._httpHeadersCallback?.(), ...\n {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }\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 signal: this.abortController.signal\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"],"names":["QueryFor","_microservice","_apiBasePath","_origin","_httpHeadersCallback","_httpMethod","queryName","validation","roles","abortController","sorting","paging","parameters","enumerable","modelType","Sorting","none","Paging","noPaging","Globals","microservice","apiBasePath","origin","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","setHttpMethod","method","perform","args","noSuccess","QueryResult","data","defaultValue","clientValidationErrors","validate","length","isSuccess","isAuthorized","isValid","hasExceptions","validationResults","map","_","severity","message","members","state","exceptionMessages","exceptionStackTrace","totalItems","totalPages","page","size","ValidateRequestArguments","name","requiredRequestParameters","Promise","resolve","abort","AbortController","parameterValues","ParametersHelper","collectParameterValues","headers","microserviceHttpHeader","response","executeQueryHttpRequest","route","signal","result","json"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * Defines the HTTP method used to perform a query over HTTP.
7
+ */ var QueryHttpMethod = /*#__PURE__*/ function(QueryHttpMethod) {
8
+ /**
9
+ * Use the GET method, carrying arguments in the URL query string (default).
10
+ */ QueryHttpMethod["Get"] = "GET";
11
+ /**
12
+ * Use the QUERY method (RFC 10008), carrying arguments in a JSON request body.
13
+ */ QueryHttpMethod["Query"] = "QUERY";
14
+ /**
15
+ * Prefer the QUERY method and automatically fall back to GET when the server or network path
16
+ * does not support it. The outcome is remembered for the rest of the session so subsequent
17
+ * queries go straight to the working transport.
18
+ */ QueryHttpMethod["Auto"] = "AUTO";
19
+ return QueryHttpMethod;
20
+ }({});
21
+
22
+ exports.QueryHttpMethod = QueryHttpMethod;
23
+ //# sourceMappingURL=QueryHttpMethod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryHttpMethod.js","sources":["../../../queries/QueryHttpMethod.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 HTTP method used to perform a query over HTTP.\n */\nexport enum QueryHttpMethod {\n /**\n * Use the GET method, carrying arguments in the URL query string (default).\n */\n Get = 'GET',\n\n /**\n * Use the QUERY method (RFC 10008), carrying arguments in a JSON request body.\n */\n Query = 'QUERY',\n\n /**\n * Prefer the QUERY method and automatically fall back to GET when the server or network path\n * does not support it. The outcome is remembered for the rest of the session so subsequent\n * queries go straight to the working transport.\n */\n Auto = 'AUTO',\n}\n"],"names":["QueryHttpMethod"],"mappings":";;AAAA;AACA;AAEA;;IAGO,IAAKA,eAAAA,iBAAAA,SAAAA,eAAAA,EAAAA;AACR;;AAEC,QAAA,eAAA,CAAA,KAAA,CAAA,GAAA,KAAA;AAGD;;AAEC,QAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAA;AAGD;;;;AAIC,QAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAA;AAfOA,IAAAA,OAAAA,eAAAA;AAiBX,CAAA,CAAA,EAAA;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ var QueryHttpMethod = require('./QueryHttpMethod.js');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ /**
8
+ * The default URL length, in characters, above which {@link lengthBasedQueryHttpMethod} prefers QUERY.
9
+ * 2000 is the widely-safe URL length across browsers, servers and proxies.
10
+ */ const defaultQueryHttpMethodUrlThreshold = 2000;
11
+ /**
12
+ * Creates a {@link QueryHttpMethodResolver} that keeps short queries on GET and prefers QUERY only when
13
+ * the GET URL would exceed a threshold — targeting the arguments-too-large-for-a-URL case while leaving
14
+ * small, cacheable queries on GET.
15
+ * @param options Optional {@link LengthBasedQueryHttpMethodOptions}.
16
+ * @returns A {@link QueryHttpMethodResolver}.
17
+ */ function lengthBasedQueryHttpMethod(options) {
18
+ const threshold = options?.threshold ?? defaultQueryHttpMethodUrlThreshold;
19
+ const whenLong = options?.whenLong ?? QueryHttpMethod.QueryHttpMethod.Auto;
20
+ return (context)=>context.url.href.length > threshold ? whenLong : QueryHttpMethod.QueryHttpMethod.Get;
21
+ }
22
+
23
+ exports.defaultQueryHttpMethodUrlThreshold = defaultQueryHttpMethodUrlThreshold;
24
+ exports.lengthBasedQueryHttpMethod = lengthBasedQueryHttpMethod;
25
+ //# sourceMappingURL=QueryHttpMethodResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryHttpMethodResolver.js","sources":["../../../queries/QueryHttpMethodResolver.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 { QueryHttpMethod } from './QueryHttpMethod';\n\n/**\n * The information a {@link QueryHttpMethodResolver} uses to decide the HTTP method for a query.\n */\nexport interface QueryHttpMethodResolverContext {\n /** The URL the query would use as a GET request (arguments in the query string). */\n readonly url: URL;\n /** The route template for the query. */\n readonly route: string;\n /** The arguments for the query. */\n readonly args: object;\n}\n\n/**\n * A policy that decides, per query, which {@link QueryHttpMethod} to use.\n * Consulted only when the query has no explicit method set via {@code setHttpMethod}.\n */\nexport type QueryHttpMethodResolver = (context: QueryHttpMethodResolverContext) => QueryHttpMethod;\n\n/**\n * The default URL length, in characters, above which {@link lengthBasedQueryHttpMethod} prefers QUERY.\n * 2000 is the widely-safe URL length across browsers, servers and proxies.\n */\nexport const defaultQueryHttpMethodUrlThreshold = 2000;\n\n/**\n * Options for {@link lengthBasedQueryHttpMethod}.\n */\nexport interface LengthBasedQueryHttpMethodOptions {\n /** URL length (in characters) above which QUERY is preferred. Defaults to {@link defaultQueryHttpMethodUrlThreshold}. */\n threshold?: number;\n /** The method to use when the URL exceeds the threshold. Defaults to {@link QueryHttpMethod.Auto} so it still falls back to GET. */\n whenLong?: QueryHttpMethod;\n}\n\n/**\n * Creates a {@link QueryHttpMethodResolver} that keeps short queries on GET and prefers QUERY only when\n * the GET URL would exceed a threshold — targeting the arguments-too-large-for-a-URL case while leaving\n * small, cacheable queries on GET.\n * @param options Optional {@link LengthBasedQueryHttpMethodOptions}.\n * @returns A {@link QueryHttpMethodResolver}.\n */\nexport function lengthBasedQueryHttpMethod(options?: LengthBasedQueryHttpMethodOptions): QueryHttpMethodResolver {\n const threshold = options?.threshold ?? defaultQueryHttpMethodUrlThreshold;\n const whenLong = options?.whenLong ?? QueryHttpMethod.Auto;\n return context => (context.url.href.length > threshold ? whenLong : QueryHttpMethod.Get);\n}\n"],"names":["defaultQueryHttpMethodUrlThreshold","lengthBasedQueryHttpMethod","options","threshold","whenLong","QueryHttpMethod","Auto","context","url","href","length","Get"],"mappings":";;;;AAAA;AACA;AAsBA;;;IAIO,MAAMA,kCAAAA,GAAqC;AAYlD;;;;;;IAOO,SAASC,0BAAAA,CAA2BC,OAA2C,EAAA;IAClF,MAAMC,SAAAA,GAAYD,SAASC,SAAAA,IAAaH,kCAAAA;AACxC,IAAA,MAAMI,QAAAA,GAAWF,OAAAA,EAASE,QAAAA,IAAYC,+BAAAA,CAAgBC,IAAI;AAC1D,IAAA,OAAOC,CAAAA,OAAAA,GAAYA,OAAAA,CAAQC,GAAG,CAACC,IAAI,CAACC,MAAM,GAAGP,SAAAA,GAAYC,QAAAA,GAAWC,+BAAAA,CAAgBM,GAAG;AAC3F;;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryHttpRequest.js","sources":["../../../queries/QueryHttpRequest.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 { Paging } from './Paging';\nimport { Sorting } from './Sorting';\nimport { SortDirection } from './SortDirection';\nimport { QueryHttpMethod } from './QueryHttpMethod';\nimport { joinPaths } from '../joinPaths';\nimport { UrlHelpers } from '../UrlHelpers';\nimport { Globals } from '../Globals';\n\n/**\n * Options for building an HTTP request for a query.\n */\nexport interface BuildQueryHttpRequestOptions {\n /** The route template for the query, possibly containing route parameters. */\n route: string;\n /** The base path for the API. */\n apiBasePath: string;\n /** The origin for the API. */\n origin: string;\n /** The arguments used for route-parameter substitution and as query arguments. */\n args: object;\n /** Descriptor-collected parameter values that also form query arguments. */\n parameterValues: object;\n /** The paging for the query. */\n paging: Paging;\n /** The sorting for the query. */\n sorting: Sorting;\n /** The HTTP headers to include. */\n headers: HeadersInit;\n /** Optional abort signal for the request. */\n signal?: AbortSignal;\n}\n\ninterface QueryRequestPayload {\n arguments: object;\n paging?: { page: number; pageSize: number };\n sorting?: { field: string; direction: string };\n}\n\nfunction directionToString(sorting: Sorting): string {\n return sorting.direction === SortDirection.descending ? 'desc' : 'asc';\n}\n\n/**\n * Builds the URL and {@link RequestInit} for performing a query with the given HTTP method.\n *\n * For {@link QueryHttpMethod.Get}, arguments, paging and sorting are placed in the URL query string.\n * For {@link QueryHttpMethod.Query}, route parameters remain in the path while the arguments, paging\n * and sorting are carried in a JSON body envelope.\n * @param method The {@link QueryHttpMethod} to use.\n * @param options The {@link BuildQueryHttpRequestOptions} describing the request.\n * @returns The URL and {@link RequestInit} to pass to {@link fetch}.\n */\nexport function buildQueryHttpRequest(method: QueryHttpMethod, options: BuildQueryHttpRequestOptions): { url: URL; init: RequestInit } {\n const { route, apiBasePath, origin, args, parameterValues, paging, sorting, headers, signal } = options;\n\n const { route: replacedRoute, unusedParameters } = UrlHelpers.replaceRouteParameters(route, args);\n const argumentValues = { ...unusedParameters, ...parameterValues };\n let actualRoute = joinPaths(apiBasePath, replacedRoute);\n\n if (method === QueryHttpMethod.Query) {\n const url = UrlHelpers.createUrlFrom(origin, apiBasePath, actualRoute);\n const payload: QueryRequestPayload = { arguments: argumentValues };\n if (paging.hasPaging) {\n payload.paging = { page: paging.page, pageSize: paging.pageSize };\n }\n if (sorting.hasSorting) {\n payload.sorting = { field: sorting.field, direction: directionToString(sorting) };\n }\n\n const requestHeaders = new Headers(headers);\n if (!requestHeaders.has('Content-Type')) {\n requestHeaders.set('Content-Type', 'application/json');\n }\n\n const init: RequestInit = {\n method: QueryHttpMethod.Query,\n headers: requestHeaders,\n body: JSON.stringify(payload),\n signal\n };\n return { url, init };\n }\n\n const additionalParams: Record<string, string | number> = {};\n if (paging.hasPaging) {\n additionalParams.page = paging.page;\n additionalParams.pageSize = paging.pageSize;\n }\n if (sorting.hasSorting) {\n additionalParams.sortBy = sorting.field;\n additionalParams.sortDirection = directionToString(sorting);\n }\n\n const queryParams = UrlHelpers.buildQueryParams(argumentValues, additionalParams);\n const queryString = queryParams.toString();\n if (queryString) {\n actualRoute += (actualRoute.includes('?') ? '&' : '?') + queryString;\n }\n\n const url = UrlHelpers.createUrlFrom(origin, apiBasePath, actualRoute);\n const init: RequestInit = {\n method: QueryHttpMethod.Get,\n headers,\n signal\n };\n return { url, init };\n}\n\n/**\n * The transport learned for {@link QueryHttpMethod.Auto}, keyed by backend (origin + API base path).\n * Once QUERY is found to be unsupported for a backend it is pinned to GET for the rest of the session;\n * while QUERY works the backend stays absent so each attempt keeps verifying cheaply. Keying by backend\n * means one backend rejecting QUERY does not downgrade queries to other backends.\n */\nconst autoResolvedMethods = new Map<string, QueryHttpMethod>();\n\nfunction backendKey(options: BuildQueryHttpRequestOptions): string {\n return `${options.origin}\u0000${options.apiBasePath}`;\n}\n\n/**\n * Resets the transport learned for {@link QueryHttpMethod.Auto} for every backend, so the next Auto\n * query re-probes for QUERY support. Useful after a network change, or between tests.\n */\nexport function resetQueryHttpMethodResolution(): void {\n autoResolvedMethods.clear();\n}\n\nfunction isMethodUnsupported(status: number): boolean {\n // 405 Method Not Allowed / 501 Not Implemented — the server received the request but will not\n // handle the verb (e.g. QUERY disabled). A missing intermediary surfaces as a thrown TypeError.\n return status === 405 || status === 501;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (error as { name?: string })?.name === 'AbortError';\n}\n\n/**\n * Performs the query HTTP request for the given method, resolving {@link QueryHttpMethod.Auto} by\n * preferring QUERY and falling back to GET when the server or network path does not support it.\n *\n * Explicit {@link QueryHttpMethod.Get} and {@link QueryHttpMethod.Query} are honored exactly, with no\n * fallback. For Auto, a transport-level failure — a `405`/`501` response, or a network/CORS error from\n * {@link fetch} — falls back to GET and pins the session to GET. Application-level errors (any other\n * status, returned as a normal {@link Response}) are never treated as a fallback signal.\n *\n * The method is resolved in order of precedence: an explicit per-query {@code override}, then\n * {@link Globals.queryHttpMethodResolver} (given the built GET URL), then {@link Globals.queryHttpMethod}.\n * @param override The explicit per-query {@link QueryHttpMethod}, or `undefined` to resolve from globals.\n * @param options The {@link BuildQueryHttpRequestOptions} describing the request.\n * @returns The {@link Response} from the request that was ultimately sent.\n */\nexport async function executeQueryHttpRequest(override: QueryHttpMethod | undefined, options: BuildQueryHttpRequestOptions): Promise<Response> {\n // The GET request is built up front when a resolver needs the URL, and reused if GET is chosen.\n let getRequest: { url: URL; init: RequestInit } | undefined;\n let method: QueryHttpMethod;\n if (override !== undefined) {\n method = override;\n } else if (Globals.queryHttpMethodResolver) {\n getRequest = buildQueryHttpRequest(QueryHttpMethod.Get, options);\n method = Globals.queryHttpMethodResolver({ url: getRequest.url, route: options.route, args: options.args });\n } else {\n method = Globals.queryHttpMethod;\n }\n\n const send = (httpMethod: QueryHttpMethod): Promise<Response> => {\n if (httpMethod === QueryHttpMethod.Get && getRequest) {\n return fetch(getRequest.url, getRequest.init);\n }\n const { url, init } = buildQueryHttpRequest(httpMethod, options);\n return fetch(url, init);\n };\n\n if (method !== QueryHttpMethod.Auto) {\n return send(method);\n }\n\n const key = backendKey(options);\n if (autoResolvedMethods.get(key) === QueryHttpMethod.Get) {\n return send(QueryHttpMethod.Get);\n }\n\n try {\n const response = await send(QueryHttpMethod.Query);\n if (isMethodUnsupported(response.status)) {\n autoResolvedMethods.set(key, QueryHttpMethod.Get);\n return send(QueryHttpMethod.Get);\n }\n autoResolvedMethods.set(key, QueryHttpMethod.Query);\n return response;\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n autoResolvedMethods.set(key, QueryHttpMethod.Get);\n return send(QueryHttpMethod.Get);\n }\n}\n"],"names":["directionToString","sorting","direction","SortDirection","descending","buildQueryHttpRequest","method","options","route","apiBasePath","origin","args","parameterValues","paging","headers","signal","replacedRoute","unusedParameters","UrlHelpers","replaceRouteParameters","argumentValues","actualRoute","joinPaths","QueryHttpMethod","Query","url","createUrlFrom","payload","arguments","hasPaging","page","pageSize","hasSorting","field","requestHeaders","Headers","has","set","init","body","JSON","stringify","additionalParams","sortBy","sortDirection","queryParams","buildQueryParams","queryString","toString","includes","Get","autoResolvedMethods","Map","backendKey","resetQueryHttpMethodResolution","clear","isMethodUnsupported","status","isAbortError","error","name","executeQueryHttpRequest","override","getRequest","undefined","Globals","queryHttpMethodResolver","queryHttpMethod","send","httpMethod","fetch","Auto","key","get","response"],"mappings":";;;;;;;;AAAA;AACA;AAwCA,SAASA,kBAAkBC,OAAgB,EAAA;AACvC,IAAA,OAAOA,QAAQC,SAAS,KAAKC,2BAAAA,CAAcC,UAAU,GAAG,MAAA,GAAS,KAAA;AACrE;AAEA;;;;;;;;;AASC,IACM,SAASC,qBAAAA,CAAsBC,MAAuB,EAAEC,OAAqC,EAAA;AAChG,IAAA,MAAM,EAAEC,KAAK,EAAEC,WAAW,EAAEC,MAAM,EAAEC,IAAI,EAAEC,eAAe,EAAEC,MAAM,EAAEZ,OAAO,EAAEa,OAAO,EAAEC,MAAM,EAAE,GAAGR,OAAAA;IAEhG,MAAM,EAAEC,KAAAA,EAAOQ,aAAa,EAAEC,gBAAgB,EAAE,GAAGC,qBAAAA,CAAWC,sBAAsB,CAACX,KAAAA,EAAOG,IAAAA,CAAAA;AAC5F,IAAA,MAAMS,cAAAA,GAAiB;AAAE,QAAA,GAAGH,gBAAgB;AAAE,QAAA,GAAGL;AAAgB,KAAA;IACjE,IAAIS,WAAAA,GAAcC,oBAAUb,WAAAA,EAAaO,aAAAA,CAAAA;IAEzC,IAAIV,MAAAA,KAAWiB,+BAAAA,CAAgBC,KAAK,EAAE;AAClC,QAAA,MAAMC,GAAAA,GAAMP,qBAAAA,CAAWQ,aAAa,CAAChB,QAAQD,WAAAA,EAAaY,WAAAA,CAAAA;AAC1D,QAAA,MAAMM,OAAAA,GAA+B;YAAEC,SAAAA,EAAWR;AAAe,SAAA;QACjE,IAAIP,MAAAA,CAAOgB,SAAS,EAAE;AAClBF,YAAAA,OAAAA,CAAQd,MAAM,GAAG;AAAEiB,gBAAAA,IAAAA,EAAMjB,OAAOiB,IAAI;AAAEC,gBAAAA,QAAAA,EAAUlB,OAAOkB;AAAS,aAAA;AACpE,QAAA;QACA,IAAI9B,OAAAA,CAAQ+B,UAAU,EAAE;AACpBL,YAAAA,OAAAA,CAAQ1B,OAAO,GAAG;AAAEgC,gBAAAA,KAAAA,EAAOhC,QAAQgC,KAAK;AAAE/B,gBAAAA,SAAAA,EAAWF,iBAAAA,CAAkBC,OAAAA;AAAS,aAAA;AACpF,QAAA;QAEA,MAAMiC,cAAAA,GAAiB,IAAIC,OAAAA,CAAQrB,OAAAA,CAAAA;AACnC,QAAA,IAAI,CAACoB,cAAAA,CAAeE,GAAG,CAAC,cAAA,CAAA,EAAiB;YACrCF,cAAAA,CAAeG,GAAG,CAAC,cAAA,EAAgB,kBAAA,CAAA;AACvC,QAAA;AAEA,QAAA,MAAMC,IAAAA,GAAoB;AACtBhC,YAAAA,MAAAA,EAAQiB,gCAAgBC,KAAK;YAC7BV,OAAAA,EAASoB,cAAAA;YACTK,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACd,OAAAA,CAAAA;AACrBZ,YAAAA;AACJ,SAAA;QACA,OAAO;AAAEU,YAAAA,GAAAA;AAAKa,YAAAA;AAAK,SAAA;AACvB,IAAA;AAEA,IAAA,MAAMI,mBAAoD,EAAC;IAC3D,IAAI7B,MAAAA,CAAOgB,SAAS,EAAE;QAClBa,gBAAAA,CAAiBZ,IAAI,GAAGjB,MAAAA,CAAOiB,IAAI;QACnCY,gBAAAA,CAAiBX,QAAQ,GAAGlB,MAAAA,CAAOkB,QAAQ;AAC/C,IAAA;IACA,IAAI9B,OAAAA,CAAQ+B,UAAU,EAAE;QACpBU,gBAAAA,CAAiBC,MAAM,GAAG1C,OAAAA,CAAQgC,KAAK;QACvCS,gBAAAA,CAAiBE,aAAa,GAAG5C,iBAAAA,CAAkBC,OAAAA,CAAAA;AACvD,IAAA;AAEA,IAAA,MAAM4C,WAAAA,GAAc3B,qBAAAA,CAAW4B,gBAAgB,CAAC1B,cAAAA,EAAgBsB,gBAAAA,CAAAA;IAChE,MAAMK,WAAAA,GAAcF,YAAYG,QAAQ,EAAA;AACxC,IAAA,IAAID,WAAAA,EAAa;QACb1B,WAAAA,IAAgBA,CAAAA,WAAAA,CAAY4B,QAAQ,CAAC,GAAA,CAAA,GAAO,GAAA,GAAM,GAAE,IAAKF,WAAAA;AAC7D,IAAA;AAEA,IAAA,MAAMtB,GAAAA,GAAMP,qBAAAA,CAAWQ,aAAa,CAAChB,QAAQD,WAAAA,EAAaY,WAAAA,CAAAA;AAC1D,IAAA,MAAMiB,IAAAA,GAAoB;AACtBhC,QAAAA,MAAAA,EAAQiB,gCAAgB2B,GAAG;AAC3BpC,QAAAA,OAAAA;AACAC,QAAAA;AACJ,KAAA;IACA,OAAO;AAAEU,QAAAA,GAAAA;AAAKa,QAAAA;AAAK,KAAA;AACvB;AAEA;;;;;IAMA,MAAMa,sBAAsB,IAAIC,GAAAA,EAAAA;AAEhC,SAASC,WAAW9C,OAAqC,EAAA;IACrD,OAAO,CAAA,EAAGA,QAAQG,MAAM,CAAC,CAAC,EAAEH,OAAAA,CAAQE,WAAW,CAAA,CAAE;AACrD;AAEA;;;AAGC,IACM,SAAS6C,8BAAAA,GAAAA;AACZH,IAAAA,mBAAAA,CAAoBI,KAAK,EAAA;AAC7B;AAEA,SAASC,oBAAoBC,MAAc,EAAA;;;IAGvC,OAAOA,MAAAA,KAAW,OAAOA,MAAAA,KAAW,GAAA;AACxC;AAEA,SAASC,aAAaC,KAAc,EAAA;IAChC,OAAQA,OAA6BC,IAAAA,KAAS,YAAA;AAClD;AAEA;;;;;;;;;;;;;;AAcC,IACM,eAAeC,uBAAAA,CAAwBC,QAAqC,EAAEvD,OAAqC,EAAA;;IAEtH,IAAIwD,UAAAA;IACJ,IAAIzD,MAAAA;AACJ,IAAA,IAAIwD,aAAaE,SAAAA,EAAW;QACxB1D,MAAAA,GAASwD,QAAAA;IACb,CAAA,MAAO,IAAIG,eAAAA,CAAQC,uBAAuB,EAAE;QACxCH,UAAAA,GAAa1D,qBAAAA,CAAsBkB,+BAAAA,CAAgB2B,GAAG,EAAE3C,OAAAA,CAAAA;QACxDD,MAAAA,GAAS2D,eAAAA,CAAQC,uBAAuB,CAAC;AAAEzC,YAAAA,GAAAA,EAAKsC,WAAWtC,GAAG;AAAEjB,YAAAA,KAAAA,EAAOD,QAAQC,KAAK;AAAEG,YAAAA,IAAAA,EAAMJ,QAAQI;AAAK,SAAA,CAAA;IAC7G,CAAA,MAAO;AACHL,QAAAA,MAAAA,GAAS2D,gBAAQE,eAAe;AACpC,IAAA;AAEA,IAAA,MAAMC,OAAO,CAACC,UAAAA,GAAAA;AACV,QAAA,IAAIA,UAAAA,KAAe9C,+BAAAA,CAAgB2B,GAAG,IAAIa,UAAAA,EAAY;AAClD,YAAA,OAAOO,KAAAA,CAAMP,UAAAA,CAAWtC,GAAG,EAAEsC,WAAWzB,IAAI,CAAA;AAChD,QAAA;AACA,QAAA,MAAM,EAAEb,GAAG,EAAEa,IAAI,EAAE,GAAGjC,sBAAsBgE,UAAAA,EAAY9D,OAAAA,CAAAA;AACxD,QAAA,OAAO+D,MAAM7C,GAAAA,EAAKa,IAAAA,CAAAA;AACtB,IAAA,CAAA;IAEA,IAAIhC,MAAAA,KAAWiB,+BAAAA,CAAgBgD,IAAI,EAAE;AACjC,QAAA,OAAOH,IAAAA,CAAK9D,MAAAA,CAAAA;AAChB,IAAA;AAEA,IAAA,MAAMkE,MAAMnB,UAAAA,CAAW9C,OAAAA,CAAAA;AACvB,IAAA,IAAI4C,oBAAoBsB,GAAG,CAACD,GAAAA,CAAAA,KAASjD,+BAAAA,CAAgB2B,GAAG,EAAE;QACtD,OAAOkB,IAAAA,CAAK7C,gCAAgB2B,GAAG,CAAA;AACnC,IAAA;IAEA,IAAI;AACA,QAAA,MAAMwB,QAAAA,GAAW,MAAMN,IAAAA,CAAK7C,+BAAAA,CAAgBC,KAAK,CAAA;QACjD,IAAIgC,mBAAAA,CAAoBkB,QAAAA,CAASjB,MAAM,CAAA,EAAG;AACtCN,YAAAA,mBAAAA,CAAoBd,GAAG,CAACmC,GAAAA,EAAKjD,+BAAAA,CAAgB2B,GAAG,CAAA;YAChD,OAAOkB,IAAAA,CAAK7C,gCAAgB2B,GAAG,CAAA;AACnC,QAAA;AACAC,QAAAA,mBAAAA,CAAoBd,GAAG,CAACmC,GAAAA,EAAKjD,+BAAAA,CAAgBC,KAAK,CAAA;QAClD,OAAOkD,QAAAA;AACX,IAAA,CAAA,CAAE,OAAOf,KAAAA,EAAO;AACZ,QAAA,IAAID,aAAaC,KAAAA,CAAAA,EAAQ;YACrB,MAAMA,KAAAA;AACV,QAAA;AACAR,QAAAA,mBAAAA,CAAoBd,GAAG,CAACmC,GAAAA,EAAKjD,+BAAAA,CAAgB2B,GAAG,CAAA;QAChD,OAAOkB,IAAAA,CAAK7C,gCAAgB2B,GAAG,CAAA;AACnC,IAAA;AACJ;;;;;;"}
@@ -7,6 +7,9 @@ var SortingActions = require('./SortingActions.js');
7
7
  var SortingActionsForQuery = require('./SortingActionsForQuery.js');
8
8
  var SortingActionsForObservableQuery = require('./SortingActionsForObservableQuery.js');
9
9
  var QueryFor = require('./QueryFor.js');
10
+ var QueryHttpMethod = require('./QueryHttpMethod.js');
11
+ var QueryHttpMethodResolver = require('./QueryHttpMethodResolver.js');
12
+ var QueryHttpRequest = require('./QueryHttpRequest.js');
10
13
  var QueryResult = require('./QueryResult.js');
11
14
  var QueryResultWithState = require('./QueryResultWithState.js');
12
15
  var ObservableQueryFor = require('./ObservableQueryFor.js');
@@ -39,6 +42,12 @@ exports.SortingActions = SortingActions.SortingActions;
39
42
  exports.SortingActionsForQuery = SortingActionsForQuery.SortingActionsForQuery;
40
43
  exports.SortingActionsForObservableQuery = SortingActionsForObservableQuery.SortingActionsForObservableQuery;
41
44
  exports.QueryFor = QueryFor.QueryFor;
45
+ exports.QueryHttpMethod = QueryHttpMethod.QueryHttpMethod;
46
+ exports.defaultQueryHttpMethodUrlThreshold = QueryHttpMethodResolver.defaultQueryHttpMethodUrlThreshold;
47
+ exports.lengthBasedQueryHttpMethod = QueryHttpMethodResolver.lengthBasedQueryHttpMethod;
48
+ exports.buildQueryHttpRequest = QueryHttpRequest.buildQueryHttpRequest;
49
+ exports.executeQueryHttpRequest = QueryHttpRequest.executeQueryHttpRequest;
50
+ exports.resetQueryHttpMethodResolution = QueryHttpRequest.resetQueryHttpMethodResolution;
42
51
  exports.QueryResult = QueryResult.QueryResult;
43
52
  exports.QueryResultWithState = QueryResultWithState.QueryResultWithState;
44
53
  exports.ObservableQueryFor = ObservableQueryFor.ObservableQueryFor;
@@ -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';\nexport * from './IChangeStreamFor';\nexport * from './IQuery';\nexport * from './IQueryFor';\nexport * from './Paging';\nexport * from './Sorting';\nexport * from './SortDirection';\nexport * from './SortingActions';\nexport * from './SortingActionsForQuery';\nexport * from './SortingActionsForObservableQuery';\nexport * from './QueryFor';\nexport * from './QueryResult';\nexport * from './QueryResultWithState';\nexport * from './IObservableQueryFor';\nexport * from './ObservableQueryFor';\nexport * from './IObservableQueryConnection';\nexport * from './IObservableQueryHubConnection';\nexport * from './IReconnectPolicy';\nexport * from './ReconnectPolicy';\nexport * from './HubConnectionKeepAlive';\nexport * from './ObservableQueryConnection';\nexport * from './ObservableQueryConnectionFactory';\nexport * from './ObservableQueryConnectionPool';\nexport * from './ServerSentEventQueryConnection';\nexport * from './ServerSentEventHubConnection';\nexport * from './WebSocketHubConnection';\nexport * from './ObservableQueryMultiplexer';\nexport * from './ObservableQuerySubscription';\nexport * from './WebSocketMessage';\nexport * from './QueryTransportMethod';\nexport * from './QueryInstanceCache';\nexport * from './IQueryProvider';\nexport * from './QueryProvider';\nexport * from './QueryValidator';\nexport * from './IObservableQueryDiagnostics';\nexport * from './ObservableQueryDiagnostics';\nexport * from './ObservableQueryDiagnosticsSnapshot';\nimport '../validation';"],"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';\nexport * from './IChangeStreamFor';\nexport * from './IQuery';\nexport * from './IQueryFor';\nexport * from './Paging';\nexport * from './Sorting';\nexport * from './SortDirection';\nexport * from './SortingActions';\nexport * from './SortingActionsForQuery';\nexport * from './SortingActionsForObservableQuery';\nexport * from './QueryFor';\nexport * from './QueryHttpMethod';\nexport * from './QueryHttpMethodResolver';\nexport * from './QueryHttpRequest';\nexport * from './QueryResult';\nexport * from './QueryResultWithState';\nexport * from './IObservableQueryFor';\nexport * from './ObservableQueryFor';\nexport * from './IObservableQueryConnection';\nexport * from './IObservableQueryHubConnection';\nexport * from './IReconnectPolicy';\nexport * from './ReconnectPolicy';\nexport * from './HubConnectionKeepAlive';\nexport * from './ObservableQueryConnection';\nexport * from './ObservableQueryConnectionFactory';\nexport * from './ObservableQueryConnectionPool';\nexport * from './ServerSentEventQueryConnection';\nexport * from './ServerSentEventHubConnection';\nexport * from './WebSocketHubConnection';\nexport * from './ObservableQueryMultiplexer';\nexport * from './ObservableQuerySubscription';\nexport * from './WebSocketMessage';\nexport * from './QueryTransportMethod';\nexport * from './QueryInstanceCache';\nexport * from './IQueryProvider';\nexport * from './QueryProvider';\nexport * from './QueryValidator';\nexport * from './IObservableQueryDiagnostics';\nexport * from './ObservableQueryDiagnostics';\nexport * from './ObservableQueryDiagnosticsSnapshot';\nimport '../validation';"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,7 @@
1
1
  import { GetHttpHeaders } from './GetHttpHeaders';
2
2
  import { QueryTransportMethod } from './queries/QueryTransportMethod';
3
+ import { QueryHttpMethod } from './queries/QueryHttpMethod';
4
+ import { QueryHttpMethodResolver } from './queries/QueryHttpMethodResolver';
3
5
  export declare enum ObservableQueryTransferMode {
4
6
  Delta = "delta",
5
7
  Full = "full"
@@ -11,6 +13,8 @@ export interface IGlobals {
11
13
  microserviceHttpHeader: string;
12
14
  microserviceWSQueryArgument: string;
13
15
  queryTransportMethod: QueryTransportMethod;
16
+ queryHttpMethod: QueryHttpMethod;
17
+ queryHttpMethodResolver?: QueryHttpMethodResolver;
14
18
  queryConnectionCount: number;
15
19
  queryDirectMode: boolean;
16
20
  observableQueryTransferMode: ObservableQueryTransferMode;
@@ -1 +1 @@
1
- {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../Globals.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAatE,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;IAO3C,oBAAoB,EAAE,MAAM,CAAC;IAM7B,eAAe,EAAE,OAAO,CAAC;IAMzB,2BAA2B,EAAE,2BAA2B,CAAC;IAKzD,mBAAmB,EAAE,cAAc,CAAC;IAYpC,qBAAqB,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,OAAO,EAAE,QAYrB,CAAC"}
1
+ {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../Globals.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAa5E,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;IAYpC,qBAAqB,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,OAAO,EAAE,QAarB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { QueryTransportMethod } from './queries/QueryTransportMethod.js';
2
+ import { QueryHttpMethod } from './queries/QueryHttpMethod.js';
2
3
 
3
4
  // Copyright (c) Cratis. All rights reserved.
4
5
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -24,6 +25,7 @@ const Globals = {
24
25
  microserviceHttpHeader: 'x-cratis-microservice',
25
26
  microserviceWSQueryArgument: 'x-cratis-microservice',
26
27
  queryTransportMethod: QueryTransportMethod.WebSocket,
28
+ queryHttpMethod: QueryHttpMethod.Get,
27
29
  queryConnectionCount: 1,
28
30
  queryDirectMode: false,
29
31
  observableQueryTransferMode: "delta",
@@ -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';\nimport { QueryTransportMethod } from './queries/QueryTransportMethod';\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 * 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 * 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 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","queryConnectionCount","queryDirectMode","observableQueryTransferMode","httpHeadersCallback","queryCacheRetentionMs"],"mappings":";;AAAA;AACA;AAKA;;;;;;;;;;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;MA+CYC,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,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';\nimport { QueryTransportMethod } from './queries/QueryTransportMethod';\nimport { QueryHttpMethod } from './queries/QueryHttpMethod';\nimport { QueryHttpMethodResolver } from './queries/QueryHttpMethodResolver';\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 * 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;AAOA;;;;;;;;;;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;MA2DYC,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,7 +1,9 @@
1
1
  import { ICanBeConfigured } from '../ICanBeConfigured';
2
2
  import { Paging } from './Paging';
3
3
  import { Sorting } from './Sorting';
4
+ import { QueryHttpMethod } from './QueryHttpMethod';
4
5
  export interface IQuery extends ICanBeConfigured {
6
+ setHttpMethod(method: QueryHttpMethod): void;
5
7
  get sorting(): Sorting;
6
8
  set sorting(value: Sorting);
7
9
  get paging(): Paging;
@@ -1 +1 @@
1
- {"version":3,"file":"IQuery.d.ts","sourceRoot":"","sources":["../../../queries/IQuery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,MAAM,WAAW,MAAO,SAAQ,gBAAgB;IAI5C,IAAI,OAAO,IAAI,OAAO,CAAC;IAKvB,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE;IAK5B,IAAI,MAAM,IAAI,MAAM,CAAC;IAKrB,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;CAC7B"}
1
+ {"version":3,"file":"IQuery.d.ts","sourceRoot":"","sources":["../../../queries/IQuery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKpD,MAAM,WAAW,MAAO,SAAQ,gBAAgB;IAK5C,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAK7C,IAAI,OAAO,IAAI,OAAO,CAAC;IAKvB,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE;IAK5B,IAAI,MAAM,IAAI,MAAM,CAAC;IAKrB,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;CAC7B"}