@cratis/arc 22.0.2 → 22.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/queries/ObservableQueryFor.js +6 -1
- package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
- package/dist/cjs/queries/QueryInstanceCache.js +6 -6
- package/dist/cjs/queries/QueryInstanceCache.js.map +1 -1
- package/dist/cjs/queries/QueryResult.js +23 -4
- package/dist/cjs/queries/QueryResult.js.map +1 -1
- package/dist/cjs/queries/QueryResultWithState.js +20 -7
- package/dist/cjs/queries/QueryResultWithState.js.map +1 -1
- package/dist/cjs/queries/ServerSentEventHubConnection.js +120 -58
- package/dist/cjs/queries/ServerSentEventHubConnection.js.map +1 -1
- package/dist/cjs/queries/WebSocketHubConnection.js +121 -51
- package/dist/cjs/queries/WebSocketHubConnection.js.map +1 -1
- package/dist/esm/queries/IQueryResult.d.ts +1 -0
- package/dist/esm/queries/IQueryResult.d.ts.map +1 -1
- package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
- package/dist/esm/queries/ObservableQueryFor.js +6 -1
- package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
- package/dist/esm/queries/QueryInstanceCache.d.ts +1 -1
- package/dist/esm/queries/QueryInstanceCache.d.ts.map +1 -1
- package/dist/esm/queries/QueryInstanceCache.js +6 -6
- package/dist/esm/queries/QueryInstanceCache.js.map +1 -1
- package/dist/esm/queries/QueryResult.d.ts +2 -0
- package/dist/esm/queries/QueryResult.d.ts.map +1 -1
- package/dist/esm/queries/QueryResult.js +23 -4
- package/dist/esm/queries/QueryResult.js.map +1 -1
- package/dist/esm/queries/QueryResultWithState.d.ts +3 -3
- package/dist/esm/queries/QueryResultWithState.d.ts.map +1 -1
- package/dist/esm/queries/QueryResultWithState.js +20 -7
- package/dist/esm/queries/QueryResultWithState.js.map +1 -1
- package/dist/esm/queries/ServerSentEventHubConnection.d.ts +11 -4
- package/dist/esm/queries/ServerSentEventHubConnection.d.ts.map +1 -1
- package/dist/esm/queries/ServerSentEventHubConnection.js +120 -58
- package/dist/esm/queries/ServerSentEventHubConnection.js.map +1 -1
- package/dist/esm/queries/WebSocketHubConnection.d.ts +13 -2
- package/dist/esm/queries/WebSocketHubConnection.d.ts.map +1 -1
- package/dist/esm/queries/WebSocketHubConnection.js +121 -51
- package/dist/esm/queries/WebSocketHubConnection.js.map +1 -1
- package/dist/esm/queries/for_ObservableQueryFor/when_performing/with_a_not_ready_result.d.ts +2 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_performing/with_a_not_ready_result.d.ts.map +1 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_performing/with_a_not_ready_result.js +34 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_performing/with_a_not_ready_result.js.map +1 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.js +26 -2
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.js.map +1 -1
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.js +60 -3
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.js.map +1 -1
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_web_socket_hub_payload_without_readiness.d.ts +2 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_web_socket_hub_payload_without_readiness.d.ts.map +1 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_web_socket_hub_payload_without_readiness.js +83 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_web_socket_hub_payload_without_readiness.js.map +1 -0
- package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_only_readiness_changed.d.ts +2 -0
- package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_only_readiness_changed.d.ts.map +1 -0
- package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_only_readiness_changed.js +22 -0
- package/dist/esm/queries/for_QueryInstanceCache/when_setting_last_result/with_only_readiness_changed.js.map +1 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/with_readiness_false.d.ts +2 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/with_readiness_false.d.ts.map +1 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/with_readiness_false.js +17 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/with_readiness_false.js.map +1 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/without_readiness.d.ts +2 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/without_readiness.d.ts.map +1 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/without_readiness.js +16 -0
- package/dist/esm/queries/for_QueryResult/when_constructing_from_a_server_result/without_readiness.js.map +1 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/with_readiness_false.d.ts +2 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/with_readiness_false.d.ts.map +1 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/with_readiness_false.js +19 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/with_readiness_false.js.map +1 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/without_readiness.d.ts +2 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/without_readiness.d.ts.map +1 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/without_readiness.js +19 -0
- package/dist/esm/queries/for_QueryResultWithState/when_creating_from_query_result/without_readiness.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_deferred_promise.d.ts +7 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_deferred_promise.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_deferred_promise.js +12 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_deferred_promise.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.d.ts +2 -1
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.d.ts.map +1 -1
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.js +15 -4
- package/dist/esm/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.js.map +1 -1
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_a_retired_event_source_fires/ignores_connected_and_error_callbacks.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_a_retired_event_source_fires/ignores_connected_and_error_callbacks.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_a_retired_event_source_fires/ignores_connected_and_error_callbacks.js +44 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_a_retired_event_source_fires/ignores_connected_and_error_callbacks.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_replaced.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_replaced.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_replaced.js +74 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_replaced.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_unsubscribed.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_unsubscribed.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_unsubscribed.js +74 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_unsubscribed.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_is_rejected.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_is_rejected.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_is_rejected.js +59 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_is_rejected.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_returns_non_ok.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_returns_non_ok.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_returns_non_ok.js +58 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_returns_non_ok.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.js +6 -3
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.js.map +1 -1
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_receiving_unauthorized/notifies_subscriber_and_removes_subscription.js +23 -6
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_receiving_unauthorized/notifies_subscriber_and_removes_subscription.js.map +1 -1
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.js +20 -5
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.js.map +1 -1
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/and_an_immediate_open_wins_the_backoff_race.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/and_an_immediate_open_wins_the_backoff_race.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/and_an_immediate_open_wins_the_backoff_race.js +20 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_reconnecting/and_an_immediate_open_wins_the_backoff_race.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_replacing_a_subscription/ignores_messages_from_the_retired_generation.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_replacing_a_subscription/ignores_messages_from_the_retired_generation.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_replacing_a_subscription/ignores_messages_from_the_retired_generation.js +68 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_replacing_a_subscription/ignores_messages_from_the_retired_generation.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.js +38 -13
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.js.map +1 -1
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscription_revisions_are_not_advertised/uses_legacy_protocol.d.ts +2 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscription_revisions_are_not_advertised/uses_legacy_protocol.d.ts.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscription_revisions_are_not_advertised/uses_legacy_protocol.js +54 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_subscription_revisions_are_not_advertised/uses_legacy_protocol.js.map +1 -0
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.js +18 -4
- package/dist/esm/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.js.map +1 -1
- package/dist/esm/queries/for_WebSocketHubConnection/when_receiving_unauthorized/notifies_subscriber_and_removes_subscription.js +22 -5
- package/dist/esm/queries/for_WebSocketHubConnection/when_receiving_unauthorized/notifies_subscriber_and_removes_subscription.js.map +1 -1
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/ignores_a_pending_reconnect_and_stale_socket_callbacks.d.ts +2 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/ignores_a_pending_reconnect_and_stale_socket_callbacks.d.ts.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/ignores_a_pending_reconnect_and_stale_socket_callbacks.js +108 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/ignores_a_pending_reconnect_and_stale_socket_callbacks.js.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/replaces_a_closing_socket_safely.d.ts +2 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/replaces_a_closing_socket_safely.d.ts.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/replaces_a_closing_socket_safely.js +33 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/replaces_a_closing_socket_safely.js.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.js +26 -4
- package/dist/esm/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.js.map +1 -1
- package/dist/esm/queries/for_WebSocketHubConnection/when_replacing_a_subscription/ignores_stale_result_unauthorized_and_error.d.ts +2 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_replacing_a_subscription/ignores_stale_result_unauthorized_and_error.d.ts.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_replacing_a_subscription/ignores_stale_result_unauthorized_and_error.js +62 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_replacing_a_subscription/ignores_stale_result_unauthorized_and_error.js.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.js +18 -5
- package/dist/esm/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.js.map +1 -1
- package/dist/esm/queries/for_WebSocketHubConnection/when_subscription_revisions_are_supported/upgrades_active_subscriptions_to_strict_mode.d.ts +2 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_subscription_revisions_are_supported/upgrades_active_subscriptions_to_strict_mode.d.ts.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_subscription_revisions_are_supported/upgrades_active_subscriptions_to_strict_mode.js +56 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_subscription_revisions_are_supported/upgrades_active_subscriptions_to_strict_mode.js.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.js +16 -3
- package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.js.map +1 -1
- package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/with_revision_support_not_advertised.d.ts +2 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/with_revision_support_not_advertised.d.ts.map +1 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/with_revision_support_not_advertised.js +33 -0
- package/dist/esm/queries/for_WebSocketHubConnection/when_unsubscribing/with_revision_support_not_advertised.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/queries/IQueryResult.ts +10 -0
- package/queries/ObservableQueryFor.ts +44 -16
- package/queries/QueryInstanceCache.ts +42 -19
- package/queries/QueryResult.ts +145 -79
- package/queries/QueryResultWithState.ts +32 -9
- package/queries/ServerSentEventHubConnection.ts +270 -83
- package/queries/WebSocketHubConnection.ts +188 -56
- package/queries/for_ObservableQueryFor/when_performing/with_a_not_ready_result.ts +46 -0
- package/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_and_sse_transport.ts +91 -57
- package/queries/for_ObservableQueryFor/when_subscribing/with_direct_mode_disabled_and_sse_transport.ts +125 -53
- package/queries/for_ObservableQueryFor/when_subscribing/with_web_socket_hub_payload_without_readiness.ts +107 -0
- package/queries/for_QueryInstanceCache/when_setting_last_result/with_only_readiness_changed.ts +63 -0
- package/queries/for_QueryResult/when_constructing_from_a_server_result/with_readiness_false.ts +25 -0
- package/queries/for_QueryResult/when_constructing_from_a_server_result/without_readiness.ts +24 -0
- package/queries/for_QueryResultWithState/when_creating_from_query_result/with_readiness_false.ts +28 -0
- package/queries/for_QueryResultWithState/when_creating_from_query_result/without_readiness.ts +25 -0
- package/queries/for_ServerSentEventHubConnection/given/a_deferred_promise.ts +15 -0
- package/queries/for_ServerSentEventHubConnection/given/a_server_sent_event_hub_connection.ts +18 -7
- package/queries/for_ServerSentEventHubConnection/when_a_retired_event_source_fires/ignores_connected_and_error_callbacks.ts +59 -0
- package/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_replaced.ts +113 -0
- package/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_query_is_unsubscribed.ts +109 -0
- package/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_is_rejected.ts +81 -0
- package/queries/for_ServerSentEventHubConnection/when_connection_changes_while_subscribe_is_in_flight/and_the_stale_request_returns_non_ok.ts +83 -0
- package/queries/for_ServerSentEventHubConnection/when_disposing/cleans_up_resources.ts +30 -21
- package/queries/for_ServerSentEventHubConnection/when_receiving_unauthorized/notifies_subscriber_and_removes_subscription.ts +56 -32
- package/queries/for_ServerSentEventHubConnection/when_reconnecting/after_error.ts +23 -6
- package/queries/for_ServerSentEventHubConnection/when_reconnecting/and_an_immediate_open_wins_the_backoff_race.ts +41 -0
- package/queries/for_ServerSentEventHubConnection/when_replacing_a_subscription/ignores_messages_from_the_retired_generation.ts +92 -0
- package/queries/for_ServerSentEventHubConnection/when_subscribing/sends_subscribe_post.ts +69 -30
- package/queries/for_ServerSentEventHubConnection/when_subscription_revisions_are_not_advertised/uses_legacy_protocol.ts +69 -0
- package/queries/for_ServerSentEventHubConnection/when_unsubscribing/the_only_query.ts +43 -24
- package/queries/for_WebSocketHubConnection/when_receiving_unauthorized/notifies_subscriber_and_removes_subscription.ts +53 -29
- package/queries/for_WebSocketHubConnection/when_reconnecting/ignores_a_pending_reconnect_and_stale_socket_callbacks.ts +131 -0
- package/queries/for_WebSocketHubConnection/when_reconnecting/replaces_a_closing_socket_safely.ts +39 -0
- package/queries/for_WebSocketHubConnection/when_reconnecting/resubscribes_all_queries.ts +72 -36
- package/queries/for_WebSocketHubConnection/when_replacing_a_subscription/ignores_stale_result_unauthorized_and_error.ts +88 -0
- package/queries/for_WebSocketHubConnection/when_subscribing/to_a_query.ts +54 -27
- package/queries/for_WebSocketHubConnection/when_subscription_revisions_are_supported/upgrades_active_subscriptions_to_strict_mode.ts +72 -0
- package/queries/for_WebSocketHubConnection/when_unsubscribing/the_only_query.ts +43 -18
- package/queries/for_WebSocketHubConnection/when_unsubscribing/with_revision_support_not_advertised.ts +44 -0
package/package.json
CHANGED
package/queries/IQueryResult.ts
CHANGED
|
@@ -24,6 +24,16 @@ export interface IQueryResult<TDataType> {
|
|
|
24
24
|
*/
|
|
25
25
|
readonly isSuccess: boolean;
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Gets whether the query has produced a result.
|
|
29
|
+
* A false value is a transient observable-query state, not a failure.
|
|
30
|
+
*
|
|
31
|
+
* Optional for source compatibility with older servers and third-party structural results that
|
|
32
|
+
* predate readiness. Arc normalizes transport results that omit it to true, while SDK-produced
|
|
33
|
+
* result classes always expose a concrete boolean.
|
|
34
|
+
*/
|
|
35
|
+
readonly isReady?: boolean;
|
|
36
|
+
|
|
27
37
|
/**
|
|
28
38
|
* Gets whether or not the query was authorized to execute.
|
|
29
39
|
*/
|
|
@@ -28,7 +28,10 @@ import { executeQueryHttpRequest } from './QueryHttpRequest';
|
|
|
28
28
|
* Represents an implementation of {@link IQueryFor}.
|
|
29
29
|
* @template TDataType Type of data returned by the query.
|
|
30
30
|
*/
|
|
31
|
-
export abstract class ObservableQueryFor<
|
|
31
|
+
export abstract class ObservableQueryFor<
|
|
32
|
+
TDataType,
|
|
33
|
+
TParameters = object,
|
|
34
|
+
> implements IObservableQueryFor<TDataType, TParameters> {
|
|
32
35
|
private _microservice: string;
|
|
33
36
|
private _apiBasePath: string;
|
|
34
37
|
private _origin: string;
|
|
@@ -52,7 +55,10 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
52
55
|
* @param modelType Type of model, if an enumerable, this is the instance type.
|
|
53
56
|
* @param enumerable Whether or not it is an enumerable.
|
|
54
57
|
*/
|
|
55
|
-
constructor(
|
|
58
|
+
constructor(
|
|
59
|
+
readonly modelType: Constructor,
|
|
60
|
+
readonly enumerable: boolean,
|
|
61
|
+
) {
|
|
56
62
|
this.sorting = Sorting.none;
|
|
57
63
|
this.paging = Paging.noPaging;
|
|
58
64
|
this._microservice = Globals.microservice ?? '';
|
|
@@ -94,18 +100,23 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
94
100
|
}
|
|
95
101
|
|
|
96
102
|
/** @inheritdoc */
|
|
97
|
-
subscribe(
|
|
103
|
+
subscribe(
|
|
104
|
+
callback: OnNextResult<QueryResult<TDataType>>,
|
|
105
|
+
args?: TParameters,
|
|
106
|
+
): ObservableQuerySubscription<TDataType> {
|
|
98
107
|
if (this._connection) {
|
|
99
108
|
this._connection.disconnect();
|
|
100
109
|
}
|
|
101
110
|
|
|
102
|
-
const clientValidationErrors =
|
|
111
|
+
const clientValidationErrors =
|
|
112
|
+
this.validation?.validate((args as object) || {}) || [];
|
|
103
113
|
if (clientValidationErrors.length > 0) {
|
|
104
114
|
// Serve the failure through the connection rather than throwing, so a subscriber sees an invalid result
|
|
105
115
|
// on its normal callback path instead of the empty result an unestablished connection would emit.
|
|
106
116
|
this._connection = new NullObservableQueryConnection(
|
|
107
117
|
this.defaultValue,
|
|
108
|
-
QueryResult.validationFailed(clientValidationErrors, this)
|
|
118
|
+
QueryResult.validationFailed(clientValidationErrors, this),
|
|
119
|
+
);
|
|
109
120
|
} else if (this.validateArguments(args)) {
|
|
110
121
|
this._connection = createObservableQueryConnection({
|
|
111
122
|
route: this.route,
|
|
@@ -128,17 +139,25 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
128
139
|
// In multiplexed mode ALL arguments — including route-derived ones — must be included
|
|
129
140
|
// in the subscribe payload so the server can execute the query correctly.
|
|
130
141
|
const parameterValues = ParametersHelper.collectParameterValues(this);
|
|
131
|
-
const { unusedParameters } = UrlHelpers.replaceRouteParameters(
|
|
142
|
+
const { unusedParameters } = UrlHelpers.replaceRouteParameters(
|
|
143
|
+
this.route,
|
|
144
|
+
args as object,
|
|
145
|
+
);
|
|
132
146
|
const connectionQueryArguments: any = {
|
|
133
147
|
...parameterValues,
|
|
134
148
|
...(Globals.queryDirectMode ? unusedParameters : (args as object) || {}),
|
|
135
|
-
...this.buildQueryArguments()
|
|
149
|
+
...this.buildQueryArguments(),
|
|
136
150
|
};
|
|
137
151
|
|
|
138
152
|
const subscriber = new ObservableQuerySubscription(this._connection);
|
|
139
|
-
this._connection.connect(data => {
|
|
153
|
+
this._connection.connect((data) => {
|
|
140
154
|
const result: any = data;
|
|
141
155
|
try {
|
|
156
|
+
// Observable transports deliver structural query-result envelopes directly instead of
|
|
157
|
+
// constructing QueryResult. Servers predating readiness therefore omit the member;
|
|
158
|
+
// those results are complete by definition and must be normalized before subscribers
|
|
159
|
+
// observe them. Preserve an explicit false transient state from newer servers.
|
|
160
|
+
result.isReady ??= true;
|
|
142
161
|
this.deserializeResult(result);
|
|
143
162
|
callback(result);
|
|
144
163
|
} catch (ex) {
|
|
@@ -150,9 +169,13 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
150
169
|
|
|
151
170
|
/** @inheritdoc */
|
|
152
171
|
async perform(args?: TParameters): Promise<QueryResult<TDataType>> {
|
|
153
|
-
const noSuccess = {
|
|
172
|
+
const noSuccess = {
|
|
173
|
+
...QueryResult.noSuccess,
|
|
174
|
+
...{ data: this.defaultValue },
|
|
175
|
+
} as QueryResult<TDataType>;
|
|
154
176
|
|
|
155
|
-
const clientValidationErrors =
|
|
177
|
+
const clientValidationErrors =
|
|
178
|
+
this.validation?.validate((args as object) || {}) || [];
|
|
156
179
|
if (clientValidationErrors.length > 0) {
|
|
157
180
|
return QueryResult.validationFailed(clientValidationErrors, this);
|
|
158
181
|
}
|
|
@@ -168,8 +191,8 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
168
191
|
|
|
169
192
|
const headers = {
|
|
170
193
|
...(this._httpHeadersCallback?.() || {}),
|
|
171
|
-
|
|
172
|
-
'Content-Type': 'application/json'
|
|
194
|
+
Accept: 'application/json',
|
|
195
|
+
'Content-Type': 'application/json',
|
|
173
196
|
};
|
|
174
197
|
|
|
175
198
|
if (this._microservice?.length > 0) {
|
|
@@ -184,7 +207,7 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
184
207
|
parameterValues,
|
|
185
208
|
paging: this.paging,
|
|
186
209
|
sorting: this.sorting,
|
|
187
|
-
headers
|
|
210
|
+
headers,
|
|
188
211
|
});
|
|
189
212
|
|
|
190
213
|
try {
|
|
@@ -197,8 +220,12 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
197
220
|
|
|
198
221
|
private validateArguments(args?: TParameters): boolean {
|
|
199
222
|
const parameterValues = ParametersHelper.collectParameterValues(this);
|
|
200
|
-
const combinedArgs = { ...(args as object || {}), ...parameterValues };
|
|
201
|
-
return ValidateRequestArguments(
|
|
223
|
+
const combinedArgs = { ...((args as object) || {}), ...parameterValues };
|
|
224
|
+
return ValidateRequestArguments(
|
|
225
|
+
this.constructor.name,
|
|
226
|
+
this.requiredRequestParameters,
|
|
227
|
+
combinedArgs as object,
|
|
228
|
+
);
|
|
202
229
|
}
|
|
203
230
|
|
|
204
231
|
private buildQueryArguments(): any {
|
|
@@ -211,7 +238,8 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
211
238
|
|
|
212
239
|
if (this.sorting.hasSorting) {
|
|
213
240
|
queryArguments.sortBy = this.sorting.field;
|
|
214
|
-
queryArguments.sortDirection =
|
|
241
|
+
queryArguments.sortDirection =
|
|
242
|
+
this.sorting.direction === SortDirection.descending ? 'desc' : 'asc';
|
|
215
243
|
}
|
|
216
244
|
|
|
217
245
|
return queryArguments;
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
3
|
|
|
4
4
|
import { QueryResultWithState } from './QueryResultWithState';
|
|
5
|
-
import {
|
|
5
|
+
import type {
|
|
6
|
+
CacheDiagnostics,
|
|
7
|
+
CacheEntryDiagnostics,
|
|
8
|
+
} from './ObservableQueryDiagnosticsSnapshot';
|
|
6
9
|
import { reconcileQueryData } from './reconcileQueryData';
|
|
7
10
|
|
|
8
11
|
/**
|
|
@@ -13,7 +16,9 @@ export type QueryCacheKey = string;
|
|
|
13
16
|
/**
|
|
14
17
|
* Callback invoked when the cached result for an entry changes.
|
|
15
18
|
*/
|
|
16
|
-
export type QueryCacheListener<TDataType> = (
|
|
19
|
+
export type QueryCacheListener<TDataType> = (
|
|
20
|
+
result: QueryResultWithState<TDataType>,
|
|
21
|
+
) => void;
|
|
17
22
|
|
|
18
23
|
/**
|
|
19
24
|
* Represents a single entry in the {@link QueryInstanceCache}.
|
|
@@ -78,12 +83,11 @@ export class QueryInstanceCache {
|
|
|
78
83
|
* value lets users navigate away and back without losing cached data. Defaults to
|
|
79
84
|
* 30 000 ms. Pass 0 for immediate eviction.
|
|
80
85
|
*/
|
|
81
|
-
constructor(private readonly _retentionMs: number = 30_000) {
|
|
82
|
-
}
|
|
86
|
+
constructor(private readonly _retentionMs: number = 30_000) {}
|
|
83
87
|
|
|
84
88
|
/**
|
|
85
89
|
* Builds the cache key for a query.
|
|
86
|
-
* @param queryTypeName The stable type name for the query. Use the instance's
|
|
90
|
+
* @param queryTypeName The stable type name for the query. Use the instance's `queryName`
|
|
87
91
|
* (a hardcoded fully-qualified string in generated proxies) rather than {@link Function.name},
|
|
88
92
|
* which is unstable under minification.
|
|
89
93
|
* @param args Optional arguments supplied to the query.
|
|
@@ -114,7 +118,7 @@ export class QueryInstanceCache {
|
|
|
114
118
|
*/
|
|
115
119
|
getOrCreate<TInstance>(
|
|
116
120
|
key: QueryCacheKey,
|
|
117
|
-
factory: () => TInstance
|
|
121
|
+
factory: () => TInstance,
|
|
118
122
|
): { instance: TInstance; isNew: boolean } {
|
|
119
123
|
if (!this._entries.has(key)) {
|
|
120
124
|
const entry: QueryCacheEntry<unknown> = {
|
|
@@ -159,8 +163,12 @@ export class QueryInstanceCache {
|
|
|
159
163
|
* @param key The cache key produced by {@link buildKey}.
|
|
160
164
|
* @returns The last {@link QueryResultWithState}, or `undefined`.
|
|
161
165
|
*/
|
|
162
|
-
getLastResult<TDataType>(
|
|
163
|
-
|
|
166
|
+
getLastResult<TDataType>(
|
|
167
|
+
key: QueryCacheKey,
|
|
168
|
+
): QueryResultWithState<TDataType> | undefined {
|
|
169
|
+
return this._entries.get(key)?.lastResult as
|
|
170
|
+
| QueryResultWithState<TDataType>
|
|
171
|
+
| undefined;
|
|
164
172
|
}
|
|
165
173
|
|
|
166
174
|
/**
|
|
@@ -169,31 +177,38 @@ export class QueryInstanceCache {
|
|
|
169
177
|
* @param key The cache key produced by {@link buildKey}.
|
|
170
178
|
* @param result The result to store.
|
|
171
179
|
*/
|
|
172
|
-
setLastResult<TDataType>(
|
|
180
|
+
setLastResult<TDataType>(
|
|
181
|
+
key: QueryCacheKey,
|
|
182
|
+
result: QueryResultWithState<TDataType>,
|
|
183
|
+
): void {
|
|
173
184
|
const entry = this._entries.get(key);
|
|
174
185
|
|
|
175
186
|
if (!entry) {
|
|
176
187
|
return;
|
|
177
188
|
}
|
|
178
189
|
|
|
179
|
-
const previousResult = entry.lastResult as
|
|
190
|
+
const previousResult = entry.lastResult as
|
|
191
|
+
| QueryResultWithState<TDataType>
|
|
192
|
+
| undefined;
|
|
180
193
|
|
|
181
194
|
// Reconcile the incoming payload against the one already held so items that did not actually
|
|
182
195
|
// change keep their previous references. A full snapshot — which is what the server re-sends
|
|
183
196
|
// whenever a subscription is re-established — otherwise arrives as all-new references and
|
|
184
197
|
// makes every consumer treat every item as changed.
|
|
185
|
-
const reconciled =
|
|
186
|
-
|
|
187
|
-
|
|
198
|
+
const reconciled =
|
|
199
|
+
previousResult === undefined
|
|
200
|
+
? result
|
|
201
|
+
: this.withReconciledData(previousResult, result);
|
|
188
202
|
|
|
189
203
|
entry.lastResult = reconciled as QueryResultWithState<unknown>;
|
|
190
204
|
|
|
191
205
|
// Reconciliation returns the previous data reference when nothing changed, so identity is
|
|
192
|
-
// enough to detect it.
|
|
193
|
-
//
|
|
206
|
+
// enough to detect it. Data, success, and readiness affect what the user sees; changeSet is
|
|
207
|
+
// ephemeral and does not independently require a notification.
|
|
194
208
|
if (
|
|
195
209
|
previousResult !== undefined &&
|
|
196
210
|
previousResult.isSuccess === reconciled.isSuccess &&
|
|
211
|
+
previousResult.isReady === reconciled.isReady &&
|
|
197
212
|
previousResult.data === reconciled.data
|
|
198
213
|
) {
|
|
199
214
|
return;
|
|
@@ -214,7 +229,7 @@ export class QueryInstanceCache {
|
|
|
214
229
|
*/
|
|
215
230
|
private withReconciledData<TDataType>(
|
|
216
231
|
previous: QueryResultWithState<TDataType>,
|
|
217
|
-
next: QueryResultWithState<TDataType
|
|
232
|
+
next: QueryResultWithState<TDataType>,
|
|
218
233
|
): QueryResultWithState<TDataType> {
|
|
219
234
|
const reconciledData = reconcileQueryData(previous.data, next.data);
|
|
220
235
|
|
|
@@ -233,7 +248,9 @@ export class QueryInstanceCache {
|
|
|
233
248
|
next.exceptionMessages,
|
|
234
249
|
next.exceptionStackTrace,
|
|
235
250
|
next.isPerforming,
|
|
236
|
-
next.changeSet
|
|
251
|
+
next.changeSet,
|
|
252
|
+
next.isReady,
|
|
253
|
+
);
|
|
237
254
|
}
|
|
238
255
|
|
|
239
256
|
/**
|
|
@@ -242,7 +259,10 @@ export class QueryInstanceCache {
|
|
|
242
259
|
* @param key The cache key produced by {@link buildKey}.
|
|
243
260
|
* @param listener The callback to register.
|
|
244
261
|
*/
|
|
245
|
-
addListener<TDataType>(
|
|
262
|
+
addListener<TDataType>(
|
|
263
|
+
key: QueryCacheKey,
|
|
264
|
+
listener: QueryCacheListener<TDataType>,
|
|
265
|
+
): void {
|
|
246
266
|
const entry = this._entries.get(key);
|
|
247
267
|
|
|
248
268
|
if (entry) {
|
|
@@ -256,7 +276,10 @@ export class QueryInstanceCache {
|
|
|
256
276
|
* @param key The cache key produced by {@link buildKey}.
|
|
257
277
|
* @param listener The callback to remove.
|
|
258
278
|
*/
|
|
259
|
-
removeListener<TDataType>(
|
|
279
|
+
removeListener<TDataType>(
|
|
280
|
+
key: QueryCacheKey,
|
|
281
|
+
listener: QueryCacheListener<TDataType>,
|
|
282
|
+
): void {
|
|
260
283
|
const entry = this._entries.get(key);
|
|
261
284
|
|
|
262
285
|
if (entry) {
|
package/queries/QueryResult.ts
CHANGED
|
@@ -13,6 +13,7 @@ type ServerQueryResult = {
|
|
|
13
13
|
data: any;
|
|
14
14
|
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
15
15
|
isSuccess: boolean;
|
|
16
|
+
isReady?: boolean;
|
|
16
17
|
isAuthorized: boolean;
|
|
17
18
|
isValid: boolean;
|
|
18
19
|
hasExceptions: boolean;
|
|
@@ -21,7 +22,7 @@ type ServerQueryResult = {
|
|
|
21
22
|
exceptionStackTrace: string;
|
|
22
23
|
paging: ServerPagingInfo;
|
|
23
24
|
changeSet?: ServerChangeSet;
|
|
24
|
-
}
|
|
25
|
+
};
|
|
25
26
|
|
|
26
27
|
type ServerChangeSet = {
|
|
27
28
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -30,7 +31,7 @@ type ServerChangeSet = {
|
|
|
30
31
|
replaced: any[];
|
|
31
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
33
|
removed: any[];
|
|
33
|
-
}
|
|
34
|
+
};
|
|
34
35
|
|
|
35
36
|
type ServerValidationResult = {
|
|
36
37
|
severity: number;
|
|
@@ -39,39 +40,47 @@ type ServerValidationResult = {
|
|
|
39
40
|
state: object;
|
|
40
41
|
reason?: string;
|
|
41
42
|
reasonDetail?: string;
|
|
42
|
-
}
|
|
43
|
+
};
|
|
43
44
|
|
|
44
45
|
type ServerPagingInfo = {
|
|
45
46
|
page: number;
|
|
46
|
-
size: number;
|
|
47
|
+
size: number;
|
|
47
48
|
totalItems: number;
|
|
48
49
|
totalPages: number;
|
|
49
|
-
}
|
|
50
|
+
};
|
|
50
51
|
|
|
51
52
|
/**
|
|
52
53
|
* Represents the result from executing a {@link IQueryFor}.
|
|
53
54
|
* @template TDataType The data type.
|
|
54
55
|
*/
|
|
55
56
|
export class QueryResult<TDataType = object> implements IQueryResult<TDataType> {
|
|
56
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Creates a settled empty result. It is ready because no server result is pending.
|
|
59
|
+
* @param defaultValue The query's empty data value.
|
|
60
|
+
* @returns A ready empty result.
|
|
61
|
+
*/
|
|
57
62
|
static empty<TDataType>(defaultValue: TDataType): QueryResult<TDataType> {
|
|
58
|
-
return new QueryResult(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
63
|
+
return new QueryResult(
|
|
64
|
+
{
|
|
65
|
+
data: defaultValue as object,
|
|
66
|
+
isSuccess: true,
|
|
67
|
+
isReady: true,
|
|
68
|
+
isAuthorized: true,
|
|
69
|
+
isValid: true,
|
|
70
|
+
hasExceptions: false,
|
|
71
|
+
validationResults: [],
|
|
72
|
+
exceptionMessages: [],
|
|
73
|
+
exceptionStackTrace: '',
|
|
74
|
+
paging: {
|
|
75
|
+
totalItems: 0,
|
|
76
|
+
totalPages: 0,
|
|
77
|
+
page: 0,
|
|
78
|
+
size: 0,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
Object,
|
|
82
|
+
false,
|
|
83
|
+
);
|
|
75
84
|
}
|
|
76
85
|
|
|
77
86
|
/**
|
|
@@ -79,42 +88,86 @@ export class QueryResult<TDataType = object> implements IQueryResult<TDataType>
|
|
|
79
88
|
* {@link CommandResult.validationFailed} so a caller reads a failed query the same way it reads a failed command.
|
|
80
89
|
* @param {ValidationResult[]} validationResults The validation results that caused the failure.
|
|
81
90
|
* @param {object} query The query being rejected, which describes how to shape its own result.
|
|
82
|
-
* @returns {QueryResult<TDataType>} A result that is neither successful nor valid.
|
|
91
|
+
* @returns {QueryResult<TDataType>} A ready result that is neither successful nor valid.
|
|
83
92
|
*/
|
|
84
93
|
static validationFailed<TDataType>(
|
|
85
94
|
validationResults: ValidationResult[],
|
|
86
|
-
query: {
|
|
95
|
+
query: {
|
|
96
|
+
readonly defaultValue: TDataType;
|
|
97
|
+
readonly modelType: Constructor;
|
|
98
|
+
readonly enumerable: boolean;
|
|
99
|
+
},
|
|
100
|
+
): QueryResult<TDataType> {
|
|
87
101
|
const { defaultValue, modelType, enumerable } = query;
|
|
88
|
-
return new QueryResult(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
102
|
+
return new QueryResult(
|
|
103
|
+
{
|
|
104
|
+
data: defaultValue as object,
|
|
105
|
+
isSuccess: false,
|
|
106
|
+
isReady: true,
|
|
107
|
+
isAuthorized: true,
|
|
108
|
+
isValid: false,
|
|
109
|
+
hasExceptions: false,
|
|
110
|
+
validationResults: validationResults.map((_) => ({
|
|
111
|
+
severity: _.severity,
|
|
112
|
+
message: _.message,
|
|
113
|
+
members: _.members,
|
|
114
|
+
state: _.state,
|
|
115
|
+
reason: _.reason,
|
|
116
|
+
reasonDetail: _.reasonDetail,
|
|
117
|
+
})),
|
|
118
|
+
exceptionMessages: [],
|
|
119
|
+
exceptionStackTrace: '',
|
|
120
|
+
paging: {
|
|
121
|
+
totalItems: 0,
|
|
122
|
+
totalPages: 0,
|
|
123
|
+
page: 0,
|
|
124
|
+
size: 0,
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
modelType,
|
|
128
|
+
enumerable,
|
|
129
|
+
) as QueryResult<TDataType>;
|
|
111
130
|
}
|
|
112
131
|
|
|
132
|
+
/**
|
|
133
|
+
* Creates a settled unauthorized result. Authorization rejection is terminal, so the result is ready.
|
|
134
|
+
* @returns A ready unauthorized result.
|
|
135
|
+
*/
|
|
113
136
|
static unauthorized<TDataType>(): QueryResult<TDataType> {
|
|
114
|
-
return new QueryResult(
|
|
115
|
-
|
|
137
|
+
return new QueryResult(
|
|
138
|
+
{
|
|
139
|
+
// SAFETY: An unauthorized result intentionally has no data, while the wire envelope uses object.
|
|
140
|
+
data: null as unknown as object,
|
|
141
|
+
isSuccess: false,
|
|
142
|
+
isReady: true,
|
|
143
|
+
isAuthorized: false,
|
|
144
|
+
isValid: true,
|
|
145
|
+
hasExceptions: false,
|
|
146
|
+
validationResults: [],
|
|
147
|
+
exceptionMessages: [],
|
|
148
|
+
exceptionStackTrace: '',
|
|
149
|
+
paging: {
|
|
150
|
+
totalItems: 0,
|
|
151
|
+
totalPages: 0,
|
|
152
|
+
page: 0,
|
|
153
|
+
size: 0,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
Object,
|
|
157
|
+
false,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* A settled unsuccessful result used for client-side and transport failures. These failures are ready because
|
|
163
|
+
* the client has completed the attempt; they are not the server's transient not-ready state.
|
|
164
|
+
*/
|
|
165
|
+
static noSuccess: QueryResult = new QueryResult(
|
|
166
|
+
{
|
|
167
|
+
data: {},
|
|
116
168
|
isSuccess: false,
|
|
117
|
-
|
|
169
|
+
isReady: true,
|
|
170
|
+
isAuthorized: true,
|
|
118
171
|
isValid: true,
|
|
119
172
|
hasExceptions: false,
|
|
120
173
|
validationResults: [],
|
|
@@ -124,27 +177,12 @@ export class QueryResult<TDataType = object> implements IQueryResult<TDataType>
|
|
|
124
177
|
totalItems: 0,
|
|
125
178
|
totalPages: 0,
|
|
126
179
|
page: 0,
|
|
127
|
-
size: 0
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
data: {},
|
|
134
|
-
isSuccess: false,
|
|
135
|
-
isAuthorized: true,
|
|
136
|
-
isValid: true,
|
|
137
|
-
hasExceptions: false,
|
|
138
|
-
validationResults: [],
|
|
139
|
-
exceptionMessages: [],
|
|
140
|
-
exceptionStackTrace: '',
|
|
141
|
-
paging: {
|
|
142
|
-
totalItems: 0,
|
|
143
|
-
totalPages: 0,
|
|
144
|
-
page: 0,
|
|
145
|
-
size: 0
|
|
146
|
-
}
|
|
147
|
-
}, Object, false);
|
|
180
|
+
size: 0,
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
Object,
|
|
184
|
+
false,
|
|
185
|
+
);
|
|
148
186
|
|
|
149
187
|
/**
|
|
150
188
|
* Creates an instance of query result.
|
|
@@ -152,12 +190,29 @@ export class QueryResult<TDataType = object> implements IQueryResult<TDataType>
|
|
|
152
190
|
* @param {Constructor} instanceType The type of instance to deserialize.
|
|
153
191
|
* @param {boolean} enumerable Whether or not the result is supposed be an enumerable or not.
|
|
154
192
|
*/
|
|
155
|
-
constructor(
|
|
193
|
+
constructor(
|
|
194
|
+
result: ServerQueryResult,
|
|
195
|
+
instanceType: Constructor,
|
|
196
|
+
enumerable: boolean,
|
|
197
|
+
) {
|
|
156
198
|
this.isSuccess = result.isSuccess;
|
|
199
|
+
// Older servers and hand-built envelopes do not carry readiness. Those results predate
|
|
200
|
+
// the transient not-ready state and are therefore complete from the client's perspective.
|
|
201
|
+
this.isReady = result.isReady ?? true;
|
|
157
202
|
this.isAuthorized = result.isAuthorized;
|
|
158
203
|
this.isValid = result.isValid;
|
|
159
204
|
this.hasExceptions = result.hasExceptions;
|
|
160
|
-
this.validationResults = result.validationResults.map(
|
|
205
|
+
this.validationResults = result.validationResults.map(
|
|
206
|
+
(_) =>
|
|
207
|
+
new ValidationResult(
|
|
208
|
+
_.severity,
|
|
209
|
+
_.message,
|
|
210
|
+
_.members,
|
|
211
|
+
_.state,
|
|
212
|
+
_.reason,
|
|
213
|
+
_.reasonDetail,
|
|
214
|
+
),
|
|
215
|
+
);
|
|
161
216
|
this.exceptionMessages = result.exceptionMessages;
|
|
162
217
|
this.exceptionStackTrace = result.exceptionStackTrace;
|
|
163
218
|
this.paging = new PagingInfo();
|
|
@@ -167,9 +222,11 @@ export class QueryResult<TDataType = object> implements IQueryResult<TDataType>
|
|
|
167
222
|
this.paging.totalPages = result.paging.totalPages;
|
|
168
223
|
|
|
169
224
|
if (result.data) {
|
|
170
|
-
this.data = (
|
|
171
|
-
|
|
172
|
-
|
|
225
|
+
this.data = (
|
|
226
|
+
enumerable
|
|
227
|
+
? deserializeQueryModels(instanceType, result.data)
|
|
228
|
+
: deserializeQueryModel(instanceType, result.data)
|
|
229
|
+
) as TDataType;
|
|
173
230
|
} else {
|
|
174
231
|
this.data = (enumerable ? [] : null) as TDataType;
|
|
175
232
|
}
|
|
@@ -177,8 +234,14 @@ export class QueryResult<TDataType = object> implements IQueryResult<TDataType>
|
|
|
177
234
|
if (enumerable && result.changeSet) {
|
|
178
235
|
this.changeSet = {
|
|
179
236
|
added: deserializeQueryModels(instanceType, result.changeSet.added ?? []),
|
|
180
|
-
replaced: deserializeQueryModels(
|
|
181
|
-
|
|
237
|
+
replaced: deserializeQueryModels(
|
|
238
|
+
instanceType,
|
|
239
|
+
result.changeSet.replaced ?? [],
|
|
240
|
+
),
|
|
241
|
+
removed: deserializeQueryModels(
|
|
242
|
+
instanceType,
|
|
243
|
+
result.changeSet.removed ?? [],
|
|
244
|
+
),
|
|
182
245
|
} as ChangeSet<unknown>;
|
|
183
246
|
}
|
|
184
247
|
}
|
|
@@ -192,6 +255,9 @@ export class QueryResult<TDataType = object> implements IQueryResult<TDataType>
|
|
|
192
255
|
/** @inheritdoc */
|
|
193
256
|
readonly isSuccess: boolean;
|
|
194
257
|
|
|
258
|
+
/** @inheritdoc */
|
|
259
|
+
readonly isReady: boolean;
|
|
260
|
+
|
|
195
261
|
/** @inheritdoc */
|
|
196
262
|
readonly isAuthorized: boolean;
|
|
197
263
|
|