@cratis/arc 22.185.0 → 22.186.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/commands/Command.ts +13 -20
- package/dist/cjs/commands/Command.d.ts +1 -0
- package/dist/cjs/commands/Command.d.ts.map +1 -1
- package/dist/cjs/commands/Command.js +15 -16
- package/dist/cjs/commands/Command.js.map +1 -1
- package/dist/cjs/queries/ObservableQueryFor.d.ts +2 -0
- package/dist/cjs/queries/ObservableQueryFor.d.ts.map +1 -1
- package/dist/cjs/queries/ObservableQueryFor.js +34 -27
- package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
- package/dist/cjs/queries/QueryInstanceCache.d.ts +1 -0
- package/dist/cjs/queries/QueryInstanceCache.d.ts.map +1 -1
- package/dist/cjs/queries/QueryInstanceCache.js +11 -16
- package/dist/cjs/queries/QueryInstanceCache.js.map +1 -1
- package/dist/cjs/queries/ServerSentEventHubConnection.d.ts +7 -0
- package/dist/cjs/queries/ServerSentEventHubConnection.d.ts.map +1 -1
- package/dist/cjs/queries/ServerSentEventHubConnection.js +97 -57
- package/dist/cjs/queries/ServerSentEventHubConnection.js.map +1 -1
- package/dist/cjs/queries/WebSocketHubConnection.d.ts +6 -0
- package/dist/cjs/queries/WebSocketHubConnection.d.ts.map +1 -1
- package/dist/cjs/queries/WebSocketHubConnection.js +62 -43
- package/dist/cjs/queries/WebSocketHubConnection.js.map +1 -1
- package/dist/esm/commands/Command.d.ts +1 -0
- package/dist/esm/commands/Command.d.ts.map +1 -1
- package/dist/esm/commands/Command.js +15 -16
- package/dist/esm/commands/Command.js.map +1 -1
- package/dist/esm/queries/ObservableQueryFor.d.ts +2 -0
- package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
- package/dist/esm/queries/ObservableQueryFor.js +35 -28
- package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
- package/dist/esm/queries/QueryInstanceCache.d.ts +1 -0
- package/dist/esm/queries/QueryInstanceCache.d.ts.map +1 -1
- package/dist/esm/queries/QueryInstanceCache.js +11 -16
- package/dist/esm/queries/QueryInstanceCache.js.map +1 -1
- package/dist/esm/queries/ServerSentEventHubConnection.d.ts +7 -0
- package/dist/esm/queries/ServerSentEventHubConnection.d.ts.map +1 -1
- package/dist/esm/queries/ServerSentEventHubConnection.js +97 -57
- package/dist/esm/queries/ServerSentEventHubConnection.js.map +1 -1
- package/dist/esm/queries/WebSocketHubConnection.d.ts +6 -0
- package/dist/esm/queries/WebSocketHubConnection.d.ts.map +1 -1
- package/dist/esm/queries/WebSocketHubConnection.js +62 -43
- package/dist/esm/queries/WebSocketHubConnection.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/queries/ObservableQueryFor.ts +43 -32
- package/queries/QueryInstanceCache.ts +12 -18
- package/queries/ServerSentEventHubConnection.ts +120 -113
- package/queries/WebSocketHubConnection.ts +72 -53
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketHubConnection.d.ts","sourceRoot":"","sources":["../../../queries/WebSocketHubConnection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAU9D,oBAAY,cAAc;IACtB,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,SAAS,cAAc;CAC1B;AAKD,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAMlB,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC;AAKD,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAkBD,qBAAa,sBAAsB;IAyB3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IA1B5B,MAAM,CAAC,QAAQ,CAAC,gBAAgB,QAAQ;IAExC,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,aAAa,CAAC,CAAgC;IAStD,YACqB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACtC,cAAc,GAAE,MAAc,EACb,OAAO,GAAE,gBAAwC,EAWrE;IAKD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAKD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAKD,IAAI,eAAe,IAAI,MAAM,CAE5B;IAKD,IAAI,cAAc,IAAI,MAAM,CAK3B;IASD,SAAS,CACL,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,GAC5B,IAAI,CASN;IAMD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAmBjC;IAKD,OAAO,IAAI,IAAI,CAGd;IAED,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"WebSocketHubConnection.d.ts","sourceRoot":"","sources":["../../../queries/WebSocketHubConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,7 +102,7 @@ var QueryResult = require('./QueryResult.js');
|
|
|
102
102
|
};
|
|
103
103
|
this._subscriptions.set(queryId, subscription);
|
|
104
104
|
this.ensureConnected();
|
|
105
|
-
if (this.
|
|
105
|
+
if (this.isOpenAndReleased()) {
|
|
106
106
|
this.sendSubscribeMessage(queryId, subscription);
|
|
107
107
|
}
|
|
108
108
|
// Until the server has said what it supports, subscriptions are held back and sent once, by releaseSubscriptions.
|
|
@@ -113,7 +113,7 @@ var QueryResult = require('./QueryResult.js');
|
|
|
113
113
|
*/ unsubscribe(queryId) {
|
|
114
114
|
const subscription = this._subscriptions.get(queryId);
|
|
115
115
|
this._subscriptions.delete(queryId);
|
|
116
|
-
if (this.
|
|
116
|
+
if (this.isOpenAndReleased() && subscription) {
|
|
117
117
|
const message = {
|
|
118
118
|
type: "Unsubscribe",
|
|
119
119
|
queryId
|
|
@@ -139,7 +139,7 @@ var QueryResult = require('./QueryResult.js');
|
|
|
139
139
|
// Reset disconnected flag when a new subscription comes in
|
|
140
140
|
this._disconnected = false;
|
|
141
141
|
}
|
|
142
|
-
if (this.
|
|
142
|
+
if (this.isSocketLive(this._socket)) {
|
|
143
143
|
this.cancelPendingReconnect();
|
|
144
144
|
return;
|
|
145
145
|
}
|
|
@@ -163,7 +163,7 @@ var QueryResult = require('./QueryResult.js');
|
|
|
163
163
|
}
|
|
164
164
|
openSocket() {
|
|
165
165
|
const currentSocket = this._socket;
|
|
166
|
-
if (
|
|
166
|
+
if (this.isSocketLive(currentSocket)) {
|
|
167
167
|
return;
|
|
168
168
|
}
|
|
169
169
|
if (currentSocket) {
|
|
@@ -172,60 +172,79 @@ var QueryResult = require('./QueryResult.js');
|
|
|
172
172
|
}
|
|
173
173
|
this._supportsSubscriptionRevisions = false;
|
|
174
174
|
this.resetSubscriptionRelease();
|
|
175
|
-
|
|
176
|
-
if (this._microservice?.length > 0) {
|
|
177
|
-
const param = `${Globals.Globals.microserviceWSQueryArgument}=${encodeURIComponent(this._microservice)}`;
|
|
178
|
-
url += (url.includes('?') ? '&' : '?') + param;
|
|
179
|
-
}
|
|
175
|
+
const url = this.buildSocketUrl();
|
|
180
176
|
const socket = new WebSocket(url);
|
|
181
177
|
this._socket = socket;
|
|
182
178
|
socket.onopen = ()=>{
|
|
183
|
-
if (this.
|
|
184
|
-
|
|
185
|
-
this.cancelPendingReconnect();
|
|
186
|
-
this._policy.reset();
|
|
187
|
-
this._keepAlive.start();
|
|
188
|
-
// A capable server announces itself with a Connected message straight after accepting the socket. Sending
|
|
189
|
-
// the subscriptions before that would mean sending them twice (once without a revision, once with), and the
|
|
190
|
-
// server would run every query twice and cancel the first run. Wait for it, and only fall back to the
|
|
191
|
-
// revision-less form for a server that never says anything.
|
|
192
|
-
this._releaseTimer = setTimeout(()=>{
|
|
193
|
-
this._releaseTimer = undefined;
|
|
194
|
-
if (this._socket === socket && !this._disconnected) {
|
|
195
|
-
this.releaseSubscriptions();
|
|
196
|
-
}
|
|
197
|
-
}, WebSocketHubConnection.ConnectedGraceMs);
|
|
179
|
+
if (!this.isActiveSocket(socket)) return;
|
|
180
|
+
this.handleSocketOpened(socket, url);
|
|
198
181
|
};
|
|
199
182
|
socket.onclose = ()=>{
|
|
200
|
-
if (this.
|
|
201
|
-
|
|
202
|
-
this._socket = undefined;
|
|
203
|
-
this._supportsSubscriptionRevisions = false;
|
|
204
|
-
this.resetSubscriptionRelease();
|
|
205
|
-
this._keepAlive.stop();
|
|
206
|
-
if (this._subscriptions.size === 0) return;
|
|
207
|
-
this._reconnectPending = true;
|
|
208
|
-
const scheduled = this._policy.schedule(()=>{
|
|
209
|
-
this._reconnectPending = false;
|
|
210
|
-
if (!this._disconnected && this._subscriptions.size > 0) {
|
|
211
|
-
this.ensureConnected();
|
|
212
|
-
}
|
|
213
|
-
}, this._url);
|
|
214
|
-
if (!scheduled) {
|
|
215
|
-
this._reconnectPending = false;
|
|
216
|
-
}
|
|
183
|
+
if (!this.isActiveSocket(socket)) return;
|
|
184
|
+
this.handleSocketClosed(url);
|
|
217
185
|
};
|
|
218
186
|
socket.onerror = (error)=>{
|
|
219
|
-
if (this.
|
|
187
|
+
if (!this.isActiveSocket(socket)) return;
|
|
220
188
|
console.error('Hub connection error', url, error);
|
|
221
189
|
this._keepAlive.stop();
|
|
222
190
|
// onclose will fire after onerror, triggering reconnect
|
|
223
191
|
};
|
|
224
192
|
socket.onmessage = (ev)=>{
|
|
225
|
-
if (this.
|
|
193
|
+
if (!this.isActiveSocket(socket)) return;
|
|
226
194
|
this.handleMessage(ev.data);
|
|
227
195
|
};
|
|
228
196
|
}
|
|
197
|
+
buildSocketUrl() {
|
|
198
|
+
let url = this._url;
|
|
199
|
+
if (this._microservice?.length > 0) {
|
|
200
|
+
const param = `${Globals.Globals.microserviceWSQueryArgument}=${encodeURIComponent(this._microservice)}`;
|
|
201
|
+
url += (url.includes('?') ? '&' : '?') + param;
|
|
202
|
+
}
|
|
203
|
+
return url;
|
|
204
|
+
}
|
|
205
|
+
isSocketLive(socket) {
|
|
206
|
+
return socket !== undefined && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING);
|
|
207
|
+
}
|
|
208
|
+
isActiveSocket(socket) {
|
|
209
|
+
return this._socket === socket && !this._disconnected;
|
|
210
|
+
}
|
|
211
|
+
isOpenAndReleased() {
|
|
212
|
+
return this._socket?.readyState === WebSocket.OPEN && this._subscriptionsReleased;
|
|
213
|
+
}
|
|
214
|
+
handleSocketOpened(socket, url) {
|
|
215
|
+
console.log('Hub connection established', url);
|
|
216
|
+
this.cancelPendingReconnect();
|
|
217
|
+
this._policy.reset();
|
|
218
|
+
this._keepAlive.start();
|
|
219
|
+
// A capable server announces itself with a Connected message straight after accepting the socket. Sending
|
|
220
|
+
// the subscriptions before that would mean sending them twice (once without a revision, once with), and the
|
|
221
|
+
// server would run every query twice and cancel the first run. Wait for it, and only fall back to the
|
|
222
|
+
// revision-less form for a server that never says anything.
|
|
223
|
+
this._releaseTimer = setTimeout(()=>{
|
|
224
|
+
this._releaseTimer = undefined;
|
|
225
|
+
if (this.isActiveSocket(socket)) {
|
|
226
|
+
this.releaseSubscriptions();
|
|
227
|
+
}
|
|
228
|
+
}, WebSocketHubConnection.ConnectedGraceMs);
|
|
229
|
+
}
|
|
230
|
+
handleSocketClosed(url) {
|
|
231
|
+
console.log('Hub connection closed', url);
|
|
232
|
+
this._socket = undefined;
|
|
233
|
+
this._supportsSubscriptionRevisions = false;
|
|
234
|
+
this.resetSubscriptionRelease();
|
|
235
|
+
this._keepAlive.stop();
|
|
236
|
+
if (this._subscriptions.size === 0) return;
|
|
237
|
+
this._reconnectPending = true;
|
|
238
|
+
const scheduled = this._policy.schedule(()=>{
|
|
239
|
+
this._reconnectPending = false;
|
|
240
|
+
if (!this._disconnected && this._subscriptions.size > 0) {
|
|
241
|
+
this.ensureConnected();
|
|
242
|
+
}
|
|
243
|
+
}, this._url);
|
|
244
|
+
if (!scheduled) {
|
|
245
|
+
this._reconnectPending = false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
229
248
|
cancelPendingReconnect() {
|
|
230
249
|
if (!this._reconnectPending) return;
|
|
231
250
|
this._policy.cancel();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketHubConnection.js","sources":["../../../queries/WebSocketHubConnection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Globals } from '../Globals.js';\nimport type { DataReceived } from './ObservableQueryConnection.js';\nimport { HubConnectionKeepAlive } from './HubConnectionKeepAlive.js';\nimport type { IReconnectPolicy } from './IReconnectPolicy.js';\nimport { ReconnectPolicy } from './ReconnectPolicy.js';\nimport { QueryResult } from './QueryResult.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Message types matching the backend {@link ObservableQueryHubMessageType} enum.\n * Serialized as strings by the JsonStringEnumConverter on the server.\n */\nexport enum HubMessageType {\n Subscribe = 'Subscribe',\n Unsubscribe = 'Unsubscribe',\n QueryResult = 'QueryResult',\n Unauthorized = 'Unauthorized',\n Error = 'Error',\n Ping = 'Ping',\n Pong = 'Pong',\n Connected = 'Connected',\n}\n\n/**\n * Wire format for messages exchanged over the observable query WebSocket and SSE hub transports.\n */\nexport interface HubMessage {\n type: HubMessageType;\n queryId?: string;\n\n /** Optional positive safe-integer revision used to reject stale replacement messages. */\n revision?: number;\n\n /**\n * Whether the server supports revision-aware subscription operations and result frames.\n * Only present on {@link HubMessageType.Connected} messages from capable servers.\n */\n supportsSubscriptionRevisions?: boolean;\n payload?: any;\n timestamp?: number;\n\n /**\n * The server's keep-alive interval in milliseconds, or 0 when keep-alive is disabled.\n * Only present on {@link HubMessageType.Connected} messages.\n */\n keepAliveIntervalMs?: number;\n}\n\n/**\n * Matches the backend {@link ObservableQuerySubscriptionRequest} record.\n */\nexport interface SubscriptionRequest {\n queryName: string;\n arguments?: Record<string, string | null>;\n page?: number;\n pageSize?: number;\n sortBy?: string;\n sortDirection?: string;\n transferMode?: string;\n}\n\ninterface ActiveSubscription {\n request: SubscriptionRequest;\n callback: DataReceived<any>;\n revision: number;\n}\n\n/**\n * Represents a single multiplexed WebSocket connection to the observable query hub\n * at {@code /.cratis/queries/ws}.\n *\n * Multiple query subscriptions are carried over the same physical WebSocket. Each subscription\n * is identified by a client-generated {@code queryId}; the server tags every result message with\n * the same id so responses can be routed to the correct callback. The client initially subscribes\n * without revisions for compatibility with older servers, then replaces active subscriptions with\n * revision-aware operations when the server advertises support in a Connected message.\n */\nexport class WebSocketHubConnection {\n /** How long to wait for the server's Connected message before subscribing the way older servers expect. */\n static readonly ConnectedGraceMs = 1000;\n\n private _socket?: WebSocket;\n private _disconnected = false;\n private _subscriptions: Map<string, ActiveSubscription> = new Map();\n private readonly _keepAlive: HubConnectionKeepAlive;\n private _lastPingSentTime?: number;\n private _lastPongLatency: number = 0;\n private _latencySamples: number[] = [];\n private _nextRevision = 0;\n private _supportsSubscriptionRevisions = false;\n private _reconnectPending = false;\n private _subscriptionsReleased = false;\n private _releaseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Initializes a new instance of {@link WebSocketHubConnection}.\n * @param {string} _url The WebSocket URL of the hub endpoint (e.g. {@code ws://localhost:5000/.cratis/queries/ws}).\n * @param {string} _microservice The microservice name to pass as a query argument.\n * @param {number} pingIntervalMs How often to send keep-alive pings when the connection is idle (default: 10 000 ms).\n * @param {IReconnectPolicy} _policy The reconnect policy to use (default: {@link ReconnectPolicy}).\n */\n constructor(\n private readonly _url: string,\n private readonly _microservice: string,\n pingIntervalMs: number = 10000,\n private readonly _policy: IReconnectPolicy = new ReconnectPolicy(),\n ) {\n this._keepAlive = new HubConnectionKeepAlive(pingIntervalMs, () => {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._lastPingSentTime = Date.now();\n this.sendMessage({\n type: HubMessageType.Ping,\n timestamp: this._lastPingSentTime,\n });\n }\n });\n }\n\n /**\n * Gets the number of active query subscriptions on this connection.\n */\n get queryCount(): number {\n return this._subscriptions.size;\n }\n\n /**\n * Gets whether the WebSocket connection is currently open.\n */\n get isConnected(): boolean {\n return this._socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Gets the latency of the last ping/pong sequence in milliseconds.\n */\n get lastPingLatency(): number {\n return this._lastPongLatency;\n }\n\n /**\n * Gets the rolling average latency in milliseconds.\n */\n get averageLatency(): number {\n if (this._latencySamples.length === 0) return 0;\n return (\n this._latencySamples.reduce((a, b) => a + b, 0) / this._latencySamples.length\n );\n }\n\n /**\n * Subscribe to a query on this hub connection.\n * If the WebSocket is not yet open, the subscribe message will be sent once the connection is established.\n * @param {string} queryId Client-generated unique identifier for this subscription.\n * @param {SubscriptionRequest} request The subscription request payload.\n * @param {DataReceived<any>} callback Callback invoked whenever the server pushes a result for this query.\n */\n subscribe(\n queryId: string,\n request: SubscriptionRequest,\n callback: DataReceived<any>,\n ): void {\n const subscription = { request, callback, revision: this.getNextRevision() };\n this._subscriptions.set(queryId, subscription);\n this.ensureConnected();\n\n if (this._socket?.readyState === WebSocket.OPEN && this._subscriptionsReleased) {\n this.sendSubscribeMessage(queryId, subscription);\n }\n // Until the server has said what it supports, subscriptions are held back and sent once, by releaseSubscriptions.\n }\n\n /**\n * Unsubscribe from a query on this hub connection.\n * @param {string} queryId The identifier of the subscription to cancel.\n */\n unsubscribe(queryId: string): void {\n const subscription = this._subscriptions.get(queryId);\n this._subscriptions.delete(queryId);\n\n if (this._socket?.readyState === WebSocket.OPEN && this._subscriptionsReleased && subscription) {\n const message: HubMessage = {\n type: HubMessageType.Unsubscribe,\n queryId,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n // If no subscriptions remain, close the connection to free resources.\n if (this._subscriptions.size === 0) {\n this.close();\n }\n }\n\n /**\n * Permanently close this hub connection and clean up all subscriptions.\n */\n dispose(): void {\n this._subscriptions.clear();\n this.close();\n }\n\n private ensureConnected(): void {\n if (this._disconnected) {\n // Reset disconnected flag when a new subscription comes in\n this._disconnected = false;\n }\n\n if (\n this._socket &&\n (this._socket.readyState === WebSocket.OPEN ||\n this._socket.readyState === WebSocket.CONNECTING)\n ) {\n this.cancelPendingReconnect();\n return;\n }\n\n // A subscription can arrive while an earlier close is waiting in reconnect backoff. The immediate open owns\n // the connection now, so the delayed callback must not be allowed to create a competing socket later.\n this.cancelPendingReconnect();\n this.openSocket();\n }\n\n private close(): void {\n this._disconnected = true;\n this._keepAlive.stop();\n this._policy.cancel();\n this._reconnectPending = false;\n this.resetSubscriptionRelease();\n const socket = this._socket;\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n if (socket) {\n this.detachAndCloseSocket(socket);\n }\n }\n\n private openSocket(): void {\n const currentSocket = this._socket;\n if (\n currentSocket &&\n (currentSocket.readyState === WebSocket.OPEN ||\n currentSocket.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n if (currentSocket) {\n this._socket = undefined;\n this.detachAndCloseSocket(currentSocket);\n }\n\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n\n let url = this._url;\n if (this._microservice?.length > 0) {\n const param = `${Globals.microserviceWSQueryArgument}=${encodeURIComponent(this._microservice)}`;\n url += (url.includes('?') ? '&' : '?') + param;\n }\n\n const socket = new WebSocket(url);\n this._socket = socket;\n\n socket.onopen = () => {\n if (this._socket !== socket || this._disconnected) return;\n console.log('Hub connection established', url);\n this.cancelPendingReconnect();\n this._policy.reset();\n this._keepAlive.start();\n\n // A capable server announces itself with a Connected message straight after accepting the socket. Sending\n // the subscriptions before that would mean sending them twice (once without a revision, once with), and the\n // server would run every query twice and cancel the first run. Wait for it, and only fall back to the\n // revision-less form for a server that never says anything.\n this._releaseTimer = setTimeout(() => {\n this._releaseTimer = undefined;\n if (this._socket === socket && !this._disconnected) {\n this.releaseSubscriptions();\n }\n }, WebSocketHubConnection.ConnectedGraceMs);\n };\n\n socket.onclose = () => {\n if (this._socket !== socket || this._disconnected) return;\n console.log('Hub connection closed', url);\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n this._keepAlive.stop();\n if (this._subscriptions.size === 0) return;\n this._reconnectPending = true;\n const scheduled = this._policy.schedule(() => {\n this._reconnectPending = false;\n if (!this._disconnected && this._subscriptions.size > 0) {\n this.ensureConnected();\n }\n }, this._url);\n if (!scheduled) {\n this._reconnectPending = false;\n }\n };\n\n socket.onerror = (error) => {\n if (this._socket !== socket || this._disconnected) return;\n console.error('Hub connection error', url, error);\n this._keepAlive.stop();\n // onclose will fire after onerror, triggering reconnect\n };\n\n socket.onmessage = (ev) => {\n if (this._socket !== socket || this._disconnected) return;\n this.handleMessage(ev.data as string);\n };\n }\n\n private cancelPendingReconnect(): void {\n if (!this._reconnectPending) return;\n\n this._policy.cancel();\n this._reconnectPending = false;\n }\n\n private detachAndCloseSocket(socket: WebSocket): void {\n socket.onopen = null;\n socket.onclose = null;\n socket.onerror = null;\n socket.onmessage = null;\n socket.close();\n }\n\n private resetSubscriptionRelease(): void {\n this._subscriptionsReleased = false;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n }\n\n private releaseSubscriptions(): void {\n if (this._subscriptionsReleased) return;\n this._subscriptionsReleased = true;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n this.sendAllSubscriptions();\n }\n\n private sendAllSubscriptions(): void {\n for (const [queryId, sub] of this._subscriptions) {\n this.sendSubscribeMessage(queryId, sub);\n }\n }\n\n private sendSubscribeMessage(\n queryId: string,\n subscription: ActiveSubscription,\n ): void {\n const message: HubMessage = {\n type: HubMessageType.Subscribe,\n queryId,\n payload: subscription.request,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n private sendMessage(message: HubMessage): void {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._socket.send(JSON.stringify(message));\n }\n }\n\n private handleMessage(rawData: string): void {\n try {\n const message = JSON.parse(rawData) as HubMessage;\n\n // Every received message is activity — skip keep-alive ping if data is flowing.\n this._keepAlive.recordActivity();\n\n switch (message.type) {\n case HubMessageType.Connected:\n this.handleConnected(message);\n break;\n case HubMessageType.QueryResult:\n this.handleQueryResult(message);\n break;\n case HubMessageType.Pong:\n this.handlePong(message);\n break;\n case HubMessageType.Unauthorized:\n console.warn('Hub: query unauthorized', message.queryId);\n this.handleUnauthorized(message);\n break;\n case HubMessageType.Error:\n if (this.isMessageForCurrentSubscription(message)) {\n console.error(\n 'Hub: query error',\n message.queryId,\n message.payload,\n );\n this.handleError(message);\n }\n break;\n }\n } catch (error) {\n console.error('Hub: error parsing message', error);\n }\n }\n\n private handleConnected(message: HubMessage): void {\n if (this._subscriptionsReleased) return;\n\n // Capability is known before anything is sent, so every subscription goes out exactly once, in its final form.\n this._supportsSubscriptionRevisions = message.supportsSubscriptionRevisions === true;\n this.releaseSubscriptions();\n }\n\n private handleQueryResult(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n const result = message.payload as QueryResult<any>;\n if (result?.isValid === false) {\n this._subscriptions.delete(message.queryId);\n }\n sub.callback(result);\n }\n\n private handleError(message: HubMessage): void {\n const result = new QueryResult(\n {\n data: undefined,\n isSuccess: false,\n isReady: true,\n isAuthorized: true,\n isValid: true,\n hasExceptions: true,\n validationResults: [],\n exceptionMessages: [message.payload as string],\n exceptionStackTrace: '',\n paging: { totalItems: 0, totalPages: 0, page: 0, size: 0 },\n },\n Object,\n false,\n );\n this.handleQueryResult({ ...message, payload: result });\n }\n\n private handleUnauthorized(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n this._subscriptions.delete(message.queryId);\n sub.callback(QueryResult.unauthorized());\n }\n\n private isMessageForCurrentSubscription(message: HubMessage): boolean {\n if (!message.queryId) return false;\n\n if (!this._supportsSubscriptionRevisions) {\n return (\n message.revision === undefined &&\n this._subscriptions.has(message.queryId)\n );\n }\n\n return (\n this.isValidRevision(message.revision) &&\n this._subscriptions.get(message.queryId)?.revision === message.revision\n );\n }\n\n private isValidRevision(revision: number | undefined): revision is number {\n return revision !== undefined && Number.isSafeInteger(revision) && revision > 0;\n }\n\n private getNextRevision(): number {\n if (this._nextRevision >= Number.MAX_SAFE_INTEGER) {\n throw new RangeError(\n 'WebSocket hub subscription revision exhausted the safe integer range',\n );\n }\n\n return ++this._nextRevision;\n }\n\n private handlePong(message: HubMessage): void {\n if (message.timestamp && this._lastPingSentTime) {\n const latency = Date.now() - message.timestamp;\n this._lastPongLatency = latency;\n this._latencySamples.push(latency);\n\n if (this._latencySamples.length > 100) {\n this._latencySamples.shift();\n }\n }\n }\n}\n"],"names":["HubMessageType","WebSocketHubConnection","ConnectedGraceMs","_socket","_disconnected","_subscriptions","Map","_keepAlive","_lastPingSentTime","_lastPongLatency","_latencySamples","_nextRevision","_supportsSubscriptionRevisions","_reconnectPending","_subscriptionsReleased","_releaseTimer","_url","pingIntervalMs","_policy","ReconnectPolicy","_microservice","HubConnectionKeepAlive","readyState","WebSocket","OPEN","Date","now","sendMessage","type","timestamp","queryCount","size","isConnected","lastPingLatency","averageLatency","length","reduce","a","b","subscribe","queryId","request","callback","subscription","revision","getNextRevision","set","ensureConnected","sendSubscribeMessage","unsubscribe","get","delete","message","close","dispose","clear","CONNECTING","cancelPendingReconnect","openSocket","stop","cancel","resetSubscriptionRelease","socket","undefined","detachAndCloseSocket","currentSocket","url","param","Globals","microserviceWSQueryArgument","encodeURIComponent","includes","onopen","console","log","reset","start","setTimeout","releaseSubscriptions","onclose","scheduled","schedule","onerror","error","onmessage","ev","handleMessage","data","clearTimeout","sendAllSubscriptions","sub","payload","send","JSON","stringify","rawData","parse","recordActivity","handleConnected","handleQueryResult","handlePong","warn","handleUnauthorized","isMessageForCurrentSubscription","handleError","supportsSubscriptionRevisions","result","isValid","QueryResult","isSuccess","isReady","isAuthorized","hasExceptions","validationResults","exceptionMessages","exceptionStackTrace","paging","totalItems","totalPages","page","Object","unauthorized","has","isValidRevision","Number","isSafeInteger","MAX_SAFE_INTEGER","RangeError","latency","push","shift"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebSocketHubConnection.js","sources":["../../../queries/WebSocketHubConnection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Globals } from '../Globals.js';\nimport type { DataReceived } from './ObservableQueryConnection.js';\nimport { HubConnectionKeepAlive } from './HubConnectionKeepAlive.js';\nimport type { IReconnectPolicy } from './IReconnectPolicy.js';\nimport { ReconnectPolicy } from './ReconnectPolicy.js';\nimport { QueryResult } from './QueryResult.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Message types matching the backend {@link ObservableQueryHubMessageType} enum.\n * Serialized as strings by the JsonStringEnumConverter on the server.\n */\nexport enum HubMessageType {\n Subscribe = 'Subscribe',\n Unsubscribe = 'Unsubscribe',\n QueryResult = 'QueryResult',\n Unauthorized = 'Unauthorized',\n Error = 'Error',\n Ping = 'Ping',\n Pong = 'Pong',\n Connected = 'Connected',\n}\n\n/**\n * Wire format for messages exchanged over the observable query WebSocket and SSE hub transports.\n */\nexport interface HubMessage {\n type: HubMessageType;\n queryId?: string;\n\n /** Optional positive safe-integer revision used to reject stale replacement messages. */\n revision?: number;\n\n /**\n * Whether the server supports revision-aware subscription operations and result frames.\n * Only present on {@link HubMessageType.Connected} messages from capable servers.\n */\n supportsSubscriptionRevisions?: boolean;\n payload?: any;\n timestamp?: number;\n\n /**\n * The server's keep-alive interval in milliseconds, or 0 when keep-alive is disabled.\n * Only present on {@link HubMessageType.Connected} messages.\n */\n keepAliveIntervalMs?: number;\n}\n\n/**\n * Matches the backend {@link ObservableQuerySubscriptionRequest} record.\n */\nexport interface SubscriptionRequest {\n queryName: string;\n arguments?: Record<string, string | null>;\n page?: number;\n pageSize?: number;\n sortBy?: string;\n sortDirection?: string;\n transferMode?: string;\n}\n\ninterface ActiveSubscription {\n request: SubscriptionRequest;\n callback: DataReceived<any>;\n revision: number;\n}\n\n/**\n * Represents a single multiplexed WebSocket connection to the observable query hub\n * at {@code /.cratis/queries/ws}.\n *\n * Multiple query subscriptions are carried over the same physical WebSocket. Each subscription\n * is identified by a client-generated {@code queryId}; the server tags every result message with\n * the same id so responses can be routed to the correct callback. The client initially subscribes\n * without revisions for compatibility with older servers, then replaces active subscriptions with\n * revision-aware operations when the server advertises support in a Connected message.\n */\nexport class WebSocketHubConnection {\n /** How long to wait for the server's Connected message before subscribing the way older servers expect. */\n static readonly ConnectedGraceMs = 1000;\n\n private _socket?: WebSocket;\n private _disconnected = false;\n private _subscriptions: Map<string, ActiveSubscription> = new Map();\n private readonly _keepAlive: HubConnectionKeepAlive;\n private _lastPingSentTime?: number;\n private _lastPongLatency: number = 0;\n private _latencySamples: number[] = [];\n private _nextRevision = 0;\n private _supportsSubscriptionRevisions = false;\n private _reconnectPending = false;\n private _subscriptionsReleased = false;\n private _releaseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Initializes a new instance of {@link WebSocketHubConnection}.\n * @param {string} _url The WebSocket URL of the hub endpoint (e.g. {@code ws://localhost:5000/.cratis/queries/ws}).\n * @param {string} _microservice The microservice name to pass as a query argument.\n * @param {number} pingIntervalMs How often to send keep-alive pings when the connection is idle (default: 10 000 ms).\n * @param {IReconnectPolicy} _policy The reconnect policy to use (default: {@link ReconnectPolicy}).\n */\n constructor(\n private readonly _url: string,\n private readonly _microservice: string,\n pingIntervalMs: number = 10000,\n private readonly _policy: IReconnectPolicy = new ReconnectPolicy(),\n ) {\n this._keepAlive = new HubConnectionKeepAlive(pingIntervalMs, () => {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._lastPingSentTime = Date.now();\n this.sendMessage({\n type: HubMessageType.Ping,\n timestamp: this._lastPingSentTime,\n });\n }\n });\n }\n\n /**\n * Gets the number of active query subscriptions on this connection.\n */\n get queryCount(): number {\n return this._subscriptions.size;\n }\n\n /**\n * Gets whether the WebSocket connection is currently open.\n */\n get isConnected(): boolean {\n return this._socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Gets the latency of the last ping/pong sequence in milliseconds.\n */\n get lastPingLatency(): number {\n return this._lastPongLatency;\n }\n\n /**\n * Gets the rolling average latency in milliseconds.\n */\n get averageLatency(): number {\n if (this._latencySamples.length === 0) return 0;\n return (\n this._latencySamples.reduce((a, b) => a + b, 0) / this._latencySamples.length\n );\n }\n\n /**\n * Subscribe to a query on this hub connection.\n * If the WebSocket is not yet open, the subscribe message will be sent once the connection is established.\n * @param {string} queryId Client-generated unique identifier for this subscription.\n * @param {SubscriptionRequest} request The subscription request payload.\n * @param {DataReceived<any>} callback Callback invoked whenever the server pushes a result for this query.\n */\n subscribe(\n queryId: string,\n request: SubscriptionRequest,\n callback: DataReceived<any>,\n ): void {\n const subscription = { request, callback, revision: this.getNextRevision() };\n this._subscriptions.set(queryId, subscription);\n this.ensureConnected();\n\n if (this.isOpenAndReleased()) {\n this.sendSubscribeMessage(queryId, subscription);\n }\n // Until the server has said what it supports, subscriptions are held back and sent once, by releaseSubscriptions.\n }\n\n /**\n * Unsubscribe from a query on this hub connection.\n * @param {string} queryId The identifier of the subscription to cancel.\n */\n unsubscribe(queryId: string): void {\n const subscription = this._subscriptions.get(queryId);\n this._subscriptions.delete(queryId);\n\n if (this.isOpenAndReleased() && subscription) {\n const message: HubMessage = {\n type: HubMessageType.Unsubscribe,\n queryId,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n // If no subscriptions remain, close the connection to free resources.\n if (this._subscriptions.size === 0) {\n this.close();\n }\n }\n\n /**\n * Permanently close this hub connection and clean up all subscriptions.\n */\n dispose(): void {\n this._subscriptions.clear();\n this.close();\n }\n\n private ensureConnected(): void {\n if (this._disconnected) {\n // Reset disconnected flag when a new subscription comes in\n this._disconnected = false;\n }\n\n if (this.isSocketLive(this._socket)) {\n this.cancelPendingReconnect();\n return;\n }\n\n // A subscription can arrive while an earlier close is waiting in reconnect backoff. The immediate open owns\n // the connection now, so the delayed callback must not be allowed to create a competing socket later.\n this.cancelPendingReconnect();\n this.openSocket();\n }\n\n private close(): void {\n this._disconnected = true;\n this._keepAlive.stop();\n this._policy.cancel();\n this._reconnectPending = false;\n this.resetSubscriptionRelease();\n const socket = this._socket;\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n if (socket) {\n this.detachAndCloseSocket(socket);\n }\n }\n\n private openSocket(): void {\n const currentSocket = this._socket;\n if (this.isSocketLive(currentSocket)) {\n return;\n }\n\n if (currentSocket) {\n this._socket = undefined;\n this.detachAndCloseSocket(currentSocket);\n }\n\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n\n const url = this.buildSocketUrl();\n const socket = new WebSocket(url);\n this._socket = socket;\n\n socket.onopen = () => {\n if (!this.isActiveSocket(socket)) return;\n this.handleSocketOpened(socket, url);\n };\n\n socket.onclose = () => {\n if (!this.isActiveSocket(socket)) return;\n this.handleSocketClosed(url);\n };\n\n socket.onerror = (error) => {\n if (!this.isActiveSocket(socket)) return;\n console.error('Hub connection error', url, error);\n this._keepAlive.stop();\n // onclose will fire after onerror, triggering reconnect\n };\n\n socket.onmessage = (ev) => {\n if (!this.isActiveSocket(socket)) return;\n this.handleMessage(ev.data as string);\n };\n }\n\n private buildSocketUrl(): string {\n let url = this._url;\n if (this._microservice?.length > 0) {\n const param = `${Globals.microserviceWSQueryArgument}=${encodeURIComponent(this._microservice)}`;\n url += (url.includes('?') ? '&' : '?') + param;\n }\n return url;\n }\n\n private isSocketLive(socket: WebSocket | undefined): boolean {\n return (\n socket !== undefined &&\n (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)\n );\n }\n\n private isActiveSocket(socket: WebSocket): boolean {\n return this._socket === socket && !this._disconnected;\n }\n\n private isOpenAndReleased(): boolean {\n return this._socket?.readyState === WebSocket.OPEN && this._subscriptionsReleased;\n }\n\n private handleSocketOpened(socket: WebSocket, url: string): void {\n console.log('Hub connection established', url);\n this.cancelPendingReconnect();\n this._policy.reset();\n this._keepAlive.start();\n\n // A capable server announces itself with a Connected message straight after accepting the socket. Sending\n // the subscriptions before that would mean sending them twice (once without a revision, once with), and the\n // server would run every query twice and cancel the first run. Wait for it, and only fall back to the\n // revision-less form for a server that never says anything.\n this._releaseTimer = setTimeout(() => {\n this._releaseTimer = undefined;\n if (this.isActiveSocket(socket)) {\n this.releaseSubscriptions();\n }\n }, WebSocketHubConnection.ConnectedGraceMs);\n }\n\n private handleSocketClosed(url: string): void {\n console.log('Hub connection closed', url);\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n this._keepAlive.stop();\n if (this._subscriptions.size === 0) return;\n this._reconnectPending = true;\n const scheduled = this._policy.schedule(() => {\n this._reconnectPending = false;\n if (!this._disconnected && this._subscriptions.size > 0) {\n this.ensureConnected();\n }\n }, this._url);\n if (!scheduled) {\n this._reconnectPending = false;\n }\n }\n\n private cancelPendingReconnect(): void {\n if (!this._reconnectPending) return;\n\n this._policy.cancel();\n this._reconnectPending = false;\n }\n\n private detachAndCloseSocket(socket: WebSocket): void {\n socket.onopen = null;\n socket.onclose = null;\n socket.onerror = null;\n socket.onmessage = null;\n socket.close();\n }\n\n private resetSubscriptionRelease(): void {\n this._subscriptionsReleased = false;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n }\n\n private releaseSubscriptions(): void {\n if (this._subscriptionsReleased) return;\n this._subscriptionsReleased = true;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n this.sendAllSubscriptions();\n }\n\n private sendAllSubscriptions(): void {\n for (const [queryId, sub] of this._subscriptions) {\n this.sendSubscribeMessage(queryId, sub);\n }\n }\n\n private sendSubscribeMessage(\n queryId: string,\n subscription: ActiveSubscription,\n ): void {\n const message: HubMessage = {\n type: HubMessageType.Subscribe,\n queryId,\n payload: subscription.request,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n private sendMessage(message: HubMessage): void {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._socket.send(JSON.stringify(message));\n }\n }\n\n private handleMessage(rawData: string): void {\n try {\n const message = JSON.parse(rawData) as HubMessage;\n\n // Every received message is activity — skip keep-alive ping if data is flowing.\n this._keepAlive.recordActivity();\n\n switch (message.type) {\n case HubMessageType.Connected:\n this.handleConnected(message);\n break;\n case HubMessageType.QueryResult:\n this.handleQueryResult(message);\n break;\n case HubMessageType.Pong:\n this.handlePong(message);\n break;\n case HubMessageType.Unauthorized:\n console.warn('Hub: query unauthorized', message.queryId);\n this.handleUnauthorized(message);\n break;\n case HubMessageType.Error:\n if (this.isMessageForCurrentSubscription(message)) {\n console.error(\n 'Hub: query error',\n message.queryId,\n message.payload,\n );\n this.handleError(message);\n }\n break;\n }\n } catch (error) {\n console.error('Hub: error parsing message', error);\n }\n }\n\n private handleConnected(message: HubMessage): void {\n if (this._subscriptionsReleased) return;\n\n // Capability is known before anything is sent, so every subscription goes out exactly once, in its final form.\n this._supportsSubscriptionRevisions = message.supportsSubscriptionRevisions === true;\n this.releaseSubscriptions();\n }\n\n private handleQueryResult(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n const result = message.payload as QueryResult<any>;\n if (result?.isValid === false) {\n this._subscriptions.delete(message.queryId);\n }\n sub.callback(result);\n }\n\n private handleError(message: HubMessage): void {\n const result = new QueryResult(\n {\n data: undefined,\n isSuccess: false,\n isReady: true,\n isAuthorized: true,\n isValid: true,\n hasExceptions: true,\n validationResults: [],\n exceptionMessages: [message.payload as string],\n exceptionStackTrace: '',\n paging: { totalItems: 0, totalPages: 0, page: 0, size: 0 },\n },\n Object,\n false,\n );\n this.handleQueryResult({ ...message, payload: result });\n }\n\n private handleUnauthorized(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n this._subscriptions.delete(message.queryId);\n sub.callback(QueryResult.unauthorized());\n }\n\n private isMessageForCurrentSubscription(message: HubMessage): boolean {\n if (!message.queryId) return false;\n\n if (!this._supportsSubscriptionRevisions) {\n return (\n message.revision === undefined &&\n this._subscriptions.has(message.queryId)\n );\n }\n\n return (\n this.isValidRevision(message.revision) &&\n this._subscriptions.get(message.queryId)?.revision === message.revision\n );\n }\n\n private isValidRevision(revision: number | undefined): revision is number {\n return revision !== undefined && Number.isSafeInteger(revision) && revision > 0;\n }\n\n private getNextRevision(): number {\n if (this._nextRevision >= Number.MAX_SAFE_INTEGER) {\n throw new RangeError(\n 'WebSocket hub subscription revision exhausted the safe integer range',\n );\n }\n\n return ++this._nextRevision;\n }\n\n private handlePong(message: HubMessage): void {\n if (message.timestamp && this._lastPingSentTime) {\n const latency = Date.now() - message.timestamp;\n this._lastPongLatency = latency;\n this._latencySamples.push(latency);\n\n if (this._latencySamples.length > 100) {\n this._latencySamples.shift();\n }\n }\n }\n}\n"],"names":["HubMessageType","WebSocketHubConnection","ConnectedGraceMs","_socket","_disconnected","_subscriptions","Map","_keepAlive","_lastPingSentTime","_lastPongLatency","_latencySamples","_nextRevision","_supportsSubscriptionRevisions","_reconnectPending","_subscriptionsReleased","_releaseTimer","_url","pingIntervalMs","_policy","ReconnectPolicy","_microservice","HubConnectionKeepAlive","readyState","WebSocket","OPEN","Date","now","sendMessage","type","timestamp","queryCount","size","isConnected","lastPingLatency","averageLatency","length","reduce","a","b","subscribe","queryId","request","callback","subscription","revision","getNextRevision","set","ensureConnected","isOpenAndReleased","sendSubscribeMessage","unsubscribe","get","delete","message","close","dispose","clear","isSocketLive","cancelPendingReconnect","openSocket","stop","cancel","resetSubscriptionRelease","socket","undefined","detachAndCloseSocket","currentSocket","url","buildSocketUrl","onopen","isActiveSocket","handleSocketOpened","onclose","handleSocketClosed","onerror","error","console","onmessage","ev","handleMessage","data","param","Globals","microserviceWSQueryArgument","encodeURIComponent","includes","CONNECTING","log","reset","start","setTimeout","releaseSubscriptions","scheduled","schedule","clearTimeout","sendAllSubscriptions","sub","payload","send","JSON","stringify","rawData","parse","recordActivity","handleConnected","handleQueryResult","handlePong","warn","handleUnauthorized","isMessageForCurrentSubscription","handleError","supportsSubscriptionRevisions","result","isValid","QueryResult","isSuccess","isReady","isAuthorized","hasExceptions","validationResults","exceptionMessages","exceptionStackTrace","paging","totalItems","totalPages","page","Object","unauthorized","has","isValidRevision","Number","isSafeInteger","MAX_SAFE_INTEGER","RangeError","latency","push","shift"],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ export declare abstract class Command<TCommandContent = object, TCommandResponse
|
|
|
31
31
|
execute(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): Promise<CommandResult<TCommandResponse>>;
|
|
32
32
|
validate(): Promise<CommandResult<TCommandResponse>>;
|
|
33
33
|
validateClientSide(): CommandResult<TCommandResponse>;
|
|
34
|
+
private resolveRoute;
|
|
34
35
|
private buildPayload;
|
|
35
36
|
private validateRequiredProperties;
|
|
36
37
|
private filterValidationResultsBySeverity;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.d.ts","sourceRoot":"","sources":["../../../commands/Command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAcrF,8BAAsB,OAAO,CAAC,eAAe,GAAG,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAE,YAAW,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IA6BzH,QAAQ,CAAC,aAAa,EAAE,WAAW;IAAW,QAAQ,CAAC,yBAAyB,EAAE,OAAO;IAzBrG,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAuB;IAEnE,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAE5C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAE9B,QAAQ,CAAC,yBAAyB,CAAC,EAAE,wBAAwB,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC5D,QAAQ,KAAK,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAE3C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAkB;IAOpC,YAAqB,aAAa,EAAE,WAAW,YAAS,EAAW,yBAAyB,EAAE,OAAO,EAKpG;IAGD,eAAe,CAAC,YAAY,EAAE,MAAM,QAEnC;IAGD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAGD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9B;IAGD,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAErD;IAGK,OAAO,CAAC,eAAe,CAAC,EAAE,wBAAwB,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"Command.d.ts","sourceRoot":"","sources":["../../../commands/Command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAcrF,8BAAsB,OAAO,CAAC,eAAe,GAAG,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAE,YAAW,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IA6BzH,QAAQ,CAAC,aAAa,EAAE,WAAW;IAAW,QAAQ,CAAC,yBAAyB,EAAE,OAAO;IAzBrG,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAuB;IAEnE,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAE5C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAE9B,QAAQ,CAAC,yBAAyB,CAAC,EAAE,wBAAwB,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC5D,QAAQ,KAAK,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAE3C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAkB;IAOpC,YAAqB,aAAa,EAAE,WAAW,YAAS,EAAW,yBAAyB,EAAE,OAAO,EAKpG;IAGD,eAAe,CAAC,YAAY,EAAE,MAAM,QAEnC;IAGD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAGD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9B;IAGD,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAErD;IAGK,OAAO,CAAC,eAAe,CAAC,EAAE,wBAAwB,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAsB5H;IAGK,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAmBzD;IAGD,kBAAkB,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAwBpD;IAED,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,0BAA0B;IAoBlC,OAAO,CAAC,iCAAiC;IAczC,OAAO,CAAC,YAAY;YAuBN,cAAc;IA8B5B,KAAK,IAAI,IAAI,CAOZ;IAGD,gBAAgB,CAAC,MAAM,EAAE,eAAe,QASvC;IAGD,iCAAiC,SAGhC;IAED,OAAO,CAAC,oBAAoB;IAY5B,aAAa,IAAI,IAAI,CAKpB;IAGD,IAAI,UAAU,YAEb;IAGD,eAAe,CAAC,QAAQ,EAAE,MAAM,QAY/B;IAGD,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,QAK3D;IAED,OAAO,CAAC,gBAAgB;CAM3B"}
|
|
@@ -66,14 +66,12 @@ import { ValidationResultReasonDetail } from '../validation/ValidationResultReas
|
|
|
66
66
|
if (filteredRequiredErrors.length > 0) {
|
|
67
67
|
return CommandResult.validationFailed(filteredRequiredErrors);
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
if (this.requestParameters && this.requestParameters.length > 0) {
|
|
71
|
-
const payload = this.buildPayload();
|
|
72
|
-
const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);
|
|
73
|
-
actualRoute = route;
|
|
74
|
-
}
|
|
69
|
+
const actualRoute = this.resolveRoute();
|
|
75
70
|
const submittedValues = this.captureCurrentValues();
|
|
76
|
-
const result = await this.performRequest(actualRoute, 'Command not found at route', 'Error during server call',
|
|
71
|
+
const result = await this.performRequest(actualRoute, 'Command not found at route', 'Error during server call', {
|
|
72
|
+
allowedSeverity,
|
|
73
|
+
ignoreWarnings
|
|
74
|
+
});
|
|
77
75
|
if (result.isSuccess) {
|
|
78
76
|
this._initialValues = submittedValues;
|
|
79
77
|
this.updateHasChanges();
|
|
@@ -91,13 +89,7 @@ import { ValidationResultReasonDetail } from '../validation/ValidationResultReas
|
|
|
91
89
|
if (filteredRequiredErrors.length > 0) {
|
|
92
90
|
return CommandResult.validationFailed(filteredRequiredErrors);
|
|
93
91
|
}
|
|
94
|
-
|
|
95
|
-
if (this.requestParameters && this.requestParameters.length > 0) {
|
|
96
|
-
const payload = this.buildPayload();
|
|
97
|
-
const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);
|
|
98
|
-
actualRoute = route;
|
|
99
|
-
}
|
|
100
|
-
actualRoute = `${actualRoute}/validate`;
|
|
92
|
+
const actualRoute = `${this.resolveRoute()}/validate`;
|
|
101
93
|
const result = await this.performRequest(actualRoute, 'Command validation endpoint not found at route', 'Error during validation call');
|
|
102
94
|
if (result.isSuccess && clientValidationErrors.length > 0) {
|
|
103
95
|
return Object.assign(result, {
|
|
@@ -134,6 +126,13 @@ import { ValidationResultReasonDetail } from '../validation/ValidationResultReas
|
|
|
134
126
|
response: null
|
|
135
127
|
}, Object, false);
|
|
136
128
|
}
|
|
129
|
+
resolveRoute() {
|
|
130
|
+
if (this.requestParameters && this.requestParameters.length > 0) {
|
|
131
|
+
const payload = this.buildPayload();
|
|
132
|
+
return UrlHelpers.replaceRouteParameters(this.route, payload).route;
|
|
133
|
+
}
|
|
134
|
+
return this.route;
|
|
135
|
+
}
|
|
137
136
|
buildPayload() {
|
|
138
137
|
const payload = {};
|
|
139
138
|
this.propertyDescriptors.forEach((propertyDescriptor)=>{
|
|
@@ -187,9 +186,9 @@ import { ValidationResultReasonDetail } from '../validation/ValidationResultReas
|
|
|
187
186
|
}
|
|
188
187
|
return headers;
|
|
189
188
|
}
|
|
190
|
-
async performRequest(route, notFoundMessage, errorMessage,
|
|
189
|
+
async performRequest(route, notFoundMessage, errorMessage, options = {}) {
|
|
191
190
|
const payload = this.buildPayload();
|
|
192
|
-
const headers = this.buildHeaders(allowedSeverity, ignoreWarnings);
|
|
191
|
+
const headers = this.buildHeaders(options.allowedSeverity, options.ignoreWarnings);
|
|
193
192
|
const actualRoute = joinPaths(this._apiBasePath, route);
|
|
194
193
|
const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);
|
|
195
194
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.js","sources":["../../../commands/Command.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 { ICommand, PropertyChanged } from './ICommand.js';\nimport { CommandResult } from \"./CommandResult.js\";\nimport { CommandValidator } from './CommandValidator.js';\nimport { Constructor, JsonSerializer } from '@cratis/fundamentals';\nimport { Globals } from '../Globals.js';\nimport { joinPaths } from '../joinPaths.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport { PropertyDescriptor } from '../reflection/PropertyDescriptor.js';\nimport { SliceLocation } from '../reflection/SliceLocation.js';\nimport { ValidationResult } from '../validation/ValidationResult.js';\nimport { ValidationResultSeverity } from '../validation/ValidationResultSeverity.js';\nimport { ValidationResultReason } from '../validation/ValidationResultReason.js';\nimport { ValidationResultReasonDetail } from '../validation/ValidationResultReasonDetail.js';\n\ntype Callback = {\n callback: WeakRef<PropertyChanged>;\n thisArg: WeakRef<object>;\n}\n\n/**\n * Represents an implementation of {@link ICommand} that works with HTTP fetch.\n * Missing required properties produce a {@link ValidationResultReason.Rule} result with\n * {@link ValidationResultReasonDetail.Required}, without contacting the server.\n */\nexport abstract class Command<TCommandContent = object, TCommandResponse = object> implements ICommand<TCommandContent, TCommandResponse> {\n /**\n * Gets the {@link SliceLocation} of the command. Generated proxies override it with the location resolved from the backend namespace.\n */\n static readonly sliceLocation: SliceLocation = SliceLocation.empty;\n\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _httpHeadersCallback: GetHttpHeaders;\n abstract readonly route: string;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n readonly validation?: CommandValidator<any>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n readonly roles: string[] = [];\n /** Inclusive minimum blocking severity declared by a model-bound command proxy. */\n readonly blockOnValidationSeverity?: ValidationResultSeverity;\n abstract readonly propertyDescriptors: PropertyDescriptor[];\n abstract get requestParameters(): string[];\n\n private _initialValues: object = {};\n private _hasChanges = false;\n private _callbacks: Callback[] = [];\n\n /**\n * Initializes a new instance of the {@link Command<,>} class.\n * @param _responseType Type of response.\n * @param _isResponseTypeEnumerable Whether or not the response type is enumerable.\n */\n constructor(readonly _responseType: Constructor = Object, readonly _isResponseTypeEnumerable: boolean) {\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 execute(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors, allowedSeverity, ignoreWarnings);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors, allowedSeverity, ignoreWarnings);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n let actualRoute = this.route;\n\n if (this.requestParameters && this.requestParameters.length > 0) {\n const payload = this.buildPayload();\n const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);\n actualRoute = route;\n }\n\n const submittedValues = this.captureCurrentValues();\n const result = await this.performRequest(actualRoute, 'Command not found at route', 'Error during server call', allowedSeverity, ignoreWarnings);\n if (result.isSuccess) {\n this._initialValues = submittedValues;\n this.updateHasChanges();\n }\n return result;\n }\n\n /** @inheritdoc */\n async validate(): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n let actualRoute = this.route;\n\n if (this.requestParameters && this.requestParameters.length > 0) {\n const payload = this.buildPayload();\n const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);\n actualRoute = route;\n }\n\n actualRoute = `${actualRoute}/validate`;\n const result = await this.performRequest(actualRoute, 'Command validation endpoint not found at route', 'Error during validation call');\n if (result.isSuccess && clientValidationErrors.length > 0) {\n return Object.assign(result, { validationResults: [...result.validationResults, ...clientValidationErrors] });\n }\n return result;\n }\n\n /** @inheritdoc */\n validateClientSide(): CommandResult<TCommandResponse> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n const advisoryResults = [...clientValidationErrors, ...validationErrors];\n if (advisoryResults.length === 0) {\n return CommandResult.empty as CommandResult<TCommandResponse>;\n }\n\n return new CommandResult({\n ...CommandResult.empty,\n correlationId: CommandResult.empty.correlationId.toString(),\n validationResults: advisoryResults,\n response: null\n }, Object, false) as CommandResult<TCommandResponse>;\n }\n\n private buildPayload(): object {\n const payload = {};\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n payload[property] = this[property];\n });\n return payload;\n }\n\n private validateRequiredProperties(): ValidationResult[] {\n const validationErrors: ValidationResult[] = [];\n this.propertyDescriptors.forEach(propertyDescriptor => {\n if (!propertyDescriptor.isOptional && !this.requestParameters.includes(propertyDescriptor.name)) {\n const value = this[propertyDescriptor.name];\n if (value === undefined || value === null) {\n validationErrors.push(new ValidationResult(\n ValidationResultSeverity.Error,\n `${propertyDescriptor.name} is required`,\n [propertyDescriptor.name],\n null,\n ValidationResultReason.Rule,\n ValidationResultReasonDetail.Required\n ));\n }\n }\n });\n return validationErrors;\n }\n\n private filterValidationResultsBySeverity(validationResults: ValidationResult[], allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): ValidationResult[] {\n if (this.blockOnValidationSeverity !== undefined) {\n const effectiveAllowed = Math.min(allowedSeverity ?? ValidationResultSeverity.Error, this.blockOnValidationSeverity - 1);\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Unknown || result.severity > effectiveAllowed);\n }\n if (ignoreWarnings === true) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n if (allowedSeverity === undefined) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n return validationResults.filter(result => result.severity > allowedSeverity);\n }\n\n private buildHeaders(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): HeadersInit {\n const customHeaders = this._httpHeadersCallback?.() ?? {};\n const headers = {\n ...customHeaders,\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 if (allowedSeverity !== undefined) {\n headers['X-Allowed-Severity'] = allowedSeverity.toString();\n }\n\n if (ignoreWarnings === true) {\n headers['X-Ignore-Warnings'] = 'true';\n }\n\n return headers;\n }\n\n private async performRequest(\n route: string,\n notFoundMessage: string,\n errorMessage: string,\n allowedSeverity?: ValidationResultSeverity,\n ignoreWarnings?: boolean\n ): Promise<CommandResult<TCommandResponse>> {\n const payload = this.buildPayload();\n const headers = this.buildHeaders(allowedSeverity, ignoreWarnings);\n const actualRoute = joinPaths(this._apiBasePath, route);\n const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JsonSerializer.serialize(payload)\n });\n\n if (response.status === 404) {\n return CommandResult.failed([`${notFoundMessage} '${actualRoute}'`]) as CommandResult<TCommandResponse>;\n }\n\n const result = await response.json();\n return new CommandResult(result, this._responseType, this._isResponseTypeEnumerable);\n } catch (ex) {\n return CommandResult.failed([`${errorMessage}: ${ex}`]) as CommandResult<TCommandResponse>;\n }\n }\n\n /** @inheritdoc */\n clear(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = undefined;\n });\n this._initialValues = {};\n this._hasChanges = false;\n }\n\n /** @inheritdoc */\n setInitialValues(values: TCommandContent) {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (Object.prototype.hasOwnProperty.call(values, property)) {\n this._initialValues[property] = values[property];\n this[property] = values[property];\n }\n });\n this.updateHasChanges();\n }\n\n /** @inheritdoc */\n setInitialValuesFromCurrentValues() {\n this._initialValues = this.captureCurrentValues();\n this.updateHasChanges();\n }\n\n private captureCurrentValues(): object {\n const values = {};\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (property in this) {\n values[property] = this[property];\n }\n });\n return values;\n }\n\n /** @inheritdoc */\n revertChanges(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = this._initialValues[property];\n });\n }\n\n /** @inheritdoc */\n get hasChanges() {\n return this._hasChanges;\n }\n\n /** @inheritdoc */\n propertyChanged(property: string) {\n this.updateHasChanges();\n\n this._callbacks.forEach(callbackContainer => {\n const callback = callbackContainer.callback.deref();\n const thisArg = callbackContainer.thisArg.deref();\n if (callback && thisArg) {\n callback.call(thisArg, property);\n } else {\n this._callbacks = this._callbacks.filter(_ => _.callback !== callbackContainer.callback);\n }\n });\n }\n\n /** @inheritdoc */\n onPropertyChanged(callback: PropertyChanged, thisArg: object) {\n this._callbacks.push({\n callback: new WeakRef(callback),\n thisArg: new WeakRef(thisArg)\n });\n }\n\n private updateHasChanges() {\n this._hasChanges = this.propertyDescriptors.some(propertyDescriptor => {\n const property = propertyDescriptor.name;\n return this[property] !== this._initialValues[property];\n });\n }\n}\n"],"names":["Command","sliceLocation","SliceLocation","empty","_microservice","_apiBasePath","_origin","_httpHeadersCallback","validation","roles","blockOnValidationSeverity","_initialValues","_hasChanges","_callbacks","_responseType","Object","_isResponseTypeEnumerable","Globals","microservice","apiBasePath","origin","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","execute","allowedSeverity","ignoreWarnings","clientValidationErrors","validate","filteredClientErrors","filterValidationResultsBySeverity","length","CommandResult","validationFailed","validationErrors","validateRequiredProperties","filteredRequiredErrors","actualRoute","route","requestParameters","payload","buildPayload","UrlHelpers","replaceRouteParameters","submittedValues","captureCurrentValues","result","performRequest","isSuccess","updateHasChanges","assign","validationResults","validateClientSide","advisoryResults","correlationId","toString","response","propertyDescriptors","forEach","propertyDescriptor","property","name","isOptional","includes","value","undefined","push","ValidationResult","ValidationResultSeverity","Error","ValidationResultReason","Rule","ValidationResultReasonDetail","Required","effectiveAllowed","Math","min","filter","severity","Unknown","buildHeaders","customHeaders","headers","microserviceHttpHeader","notFoundMessage","errorMessage","joinPaths","url","createUrlFrom","fetch","method","body","JsonSerializer","serialize","status","failed","json","ex","clear","setInitialValues","values","prototype","hasOwnProperty","call","setInitialValuesFromCurrentValues","revertChanges","hasChanges","propertyChanged","callbackContainer","deref","thisArg","_","onPropertyChanged","WeakRef","some"],"mappings":";;;;;;;;;;;AAAA;AACA;AAsBA;;;;AAIC,IACM,MAAeA,OAAAA,CAAAA;;;AAClB;;AAEC,QACD,OAAgBC,aAAAA,GAA+BC,aAAAA,CAAcC,KAAK;IAE1DC,aAAAA;IACAC,YAAAA;IACAC,OAAAA;IACAC,oBAAAA;4DAGR,UAASC;AACT,2DACSC,KAAAA,GAAkB,EAAE;wFAE7B,yBAASC;AAIDC,IAAAA,cAAAA,GAAyB,EAAC;AAC1BC,IAAAA,WAAAA,GAAc,KAAA;AACdC,IAAAA,UAAAA,GAAyB,EAAE;AAEnC;;;;AAIC,QACD,YAAY,aAASC,GAA6BC,MAAM,EAAWC,yBAAkC,CAAE;aAAlFF,aAAAA,GAAAA,aAAAA;aAA8CE,yBAAAA,GAAAA,yBAAAA;AAC/D,QAAA,IAAI,CAACZ,aAAa,GAAGa,OAAAA,CAAQC,YAAY,IAAI,EAAA;AAC7C,QAAA,IAAI,CAACb,YAAY,GAAGY,OAAAA,CAAQE,WAAW,IAAI,EAAA;AAC3C,QAAA,IAAI,CAACb,OAAO,GAAGW,OAAAA,CAAQG,MAAM,IAAI,EAAA;AACjC,QAAA,IAAI,CAACb,oBAAoB,GAAG,KAAO,EAAC,CAAA;AACxC,IAAA;uBAGAc,eAAAA,CAAgBH,YAAoB,EAAE;QAClC,IAAI,CAACd,aAAa,GAAGc,YAAAA;AACzB,IAAA;uBAGAI,cAAAA,CAAeH,WAAmB,EAAQ;QACtC,IAAI,CAACd,YAAY,GAAGc,WAAAA;AACxB,IAAA;uBAGAI,SAAAA,CAAUH,MAAc,EAAQ;QAC5B,IAAI,CAACd,OAAO,GAAGc,MAAAA;AACnB,IAAA;uBAGAI,sBAAAA,CAAuBC,QAAwB,EAAQ;QACnD,IAAI,CAAClB,oBAAoB,GAAGkB,QAAAA;AAChC,IAAA;AAEA,uBACA,MAAMC,OAAAA,CAAQC,eAA0C,EAAEC,cAAwB,EAA4C;QAC1H,MAAMC,sBAAAA,GAAyB,IAAI,CAACrB,UAAU,EAAEsB,QAAAA,CAAS,IAAI,KAAK,EAAE;AACpE,QAAA,MAAMC,uBAAuB,IAAI,CAACC,iCAAiC,CAACH,wBAAwBF,eAAAA,EAAiBC,cAAAA,CAAAA;QAC7G,IAAIG,oBAAAA,CAAqBE,MAAM,GAAG,CAAA,EAAG;YACjC,OAAOC,aAAAA,CAAcC,gBAAgB,CAACJ,oBAAAA,CAAAA;AAC1C,QAAA;QAEA,MAAMK,gBAAAA,GAAmB,IAAI,CAACC,0BAA0B,EAAA;AACxD,QAAA,MAAMC,yBAAyB,IAAI,CAACN,iCAAiC,CAACI,kBAAkBT,eAAAA,EAAiBC,cAAAA,CAAAA;QACzG,IAAIU,sBAAAA,CAAuBL,MAAM,GAAG,CAAA,EAAG;YACnC,OAAOC,aAAAA,CAAcC,gBAAgB,CAACG,sBAAAA,CAAAA;AAC1C,QAAA;QAEA,IAAIC,WAAAA,GAAc,IAAI,CAACC,KAAK;QAE5B,IAAI,IAAI,CAACC,iBAAiB,IAAI,IAAI,CAACA,iBAAiB,CAACR,MAAM,GAAG,CAAA,EAAG;YAC7D,MAAMS,OAAAA,GAAU,IAAI,CAACC,YAAY,EAAA;YACjC,MAAM,EAAEH,KAAK,EAAE,GAAGI,UAAAA,CAAWC,sBAAsB,CAAC,IAAI,CAACL,KAAK,EAAEE,OAAAA,CAAAA;YAChEH,WAAAA,GAAcC,KAAAA;AAClB,QAAA;QAEA,MAAMM,eAAAA,GAAkB,IAAI,CAACC,oBAAoB,EAAA;QACjD,MAAMC,MAAAA,GAAS,MAAM,IAAI,CAACC,cAAc,CAACV,WAAAA,EAAa,4BAAA,EAA8B,0BAAA,EAA4BZ,eAAAA,EAAiBC,cAAAA,CAAAA;QACjI,IAAIoB,MAAAA,CAAOE,SAAS,EAAE;YAClB,IAAI,CAACvC,cAAc,GAAGmC,eAAAA;AACtB,YAAA,IAAI,CAACK,gBAAgB,EAAA;AACzB,QAAA;QACA,OAAOH,MAAAA;AACX,IAAA;uBAGA,MAAMlB,QAAAA,GAAqD;QACvD,MAAMD,sBAAAA,GAAyB,IAAI,CAACrB,UAAU,EAAEsB,QAAAA,CAAS,IAAI,KAAK,EAAE;AACpE,QAAA,MAAMC,oBAAAA,GAAuB,IAAI,CAACC,iCAAiC,CAACH,sBAAAA,CAAAA;QACpE,IAAIE,oBAAAA,CAAqBE,MAAM,GAAG,CAAA,EAAG;YACjC,OAAOC,aAAAA,CAAcC,gBAAgB,CAACJ,oBAAAA,CAAAA;AAC1C,QAAA;QAEA,MAAMK,gBAAAA,GAAmB,IAAI,CAACC,0BAA0B,EAAA;AACxD,QAAA,MAAMC,sBAAAA,GAAyB,IAAI,CAACN,iCAAiC,CAACI,gBAAAA,CAAAA;QACtE,IAAIE,sBAAAA,CAAuBL,MAAM,GAAG,CAAA,EAAG;YACnC,OAAOC,aAAAA,CAAcC,gBAAgB,CAACG,sBAAAA,CAAAA;AAC1C,QAAA;QAEA,IAAIC,WAAAA,GAAc,IAAI,CAACC,KAAK;QAE5B,IAAI,IAAI,CAACC,iBAAiB,IAAI,IAAI,CAACA,iBAAiB,CAACR,MAAM,GAAG,CAAA,EAAG;YAC7D,MAAMS,OAAAA,GAAU,IAAI,CAACC,YAAY,EAAA;YACjC,MAAM,EAAEH,KAAK,EAAE,GAAGI,UAAAA,CAAWC,sBAAsB,CAAC,IAAI,CAACL,KAAK,EAAEE,OAAAA,CAAAA;YAChEH,WAAAA,GAAcC,KAAAA;AAClB,QAAA;QAEAD,WAAAA,GAAc,CAAA,EAAGA,WAAAA,CAAY,SAAS,CAAC;AACvC,QAAA,MAAMS,SAAS,MAAM,IAAI,CAACC,cAAc,CAACV,aAAa,gDAAA,EAAkD,8BAAA,CAAA;AACxG,QAAA,IAAIS,OAAOE,SAAS,IAAIrB,sBAAAA,CAAuBI,MAAM,GAAG,CAAA,EAAG;YACvD,OAAOlB,MAAAA,CAAOqC,MAAM,CAACJ,MAAAA,EAAQ;gBAAEK,iBAAAA,EAAmB;AAAIL,oBAAAA,GAAAA,MAAAA,CAAOK,iBAAiB;AAAKxB,oBAAAA,GAAAA;AAAuB;AAAC,aAAA,CAAA;AAC/G,QAAA;QACA,OAAOmB,MAAAA;AACX,IAAA;AAEA,uBACAM,kBAAAA,GAAsD;QAClD,MAAMzB,sBAAAA,GAAyB,IAAI,CAACrB,UAAU,EAAEsB,QAAAA,CAAS,IAAI,KAAK,EAAE;AACpE,QAAA,MAAMC,oBAAAA,GAAuB,IAAI,CAACC,iCAAiC,CAACH,sBAAAA,CAAAA;QACpE,IAAIE,oBAAAA,CAAqBE,MAAM,GAAG,CAAA,EAAG;YACjC,OAAOC,aAAAA,CAAcC,gBAAgB,CAACJ,oBAAAA,CAAAA;AAC1C,QAAA;QAEA,MAAMK,gBAAAA,GAAmB,IAAI,CAACC,0BAA0B,EAAA;AACxD,QAAA,MAAMC,sBAAAA,GAAyB,IAAI,CAACN,iCAAiC,CAACI,gBAAAA,CAAAA;QACtE,IAAIE,sBAAAA,CAAuBL,MAAM,GAAG,CAAA,EAAG;YACnC,OAAOC,aAAAA,CAAcC,gBAAgB,CAACG,sBAAAA,CAAAA;AAC1C,QAAA;AAEA,QAAA,MAAMiB,eAAAA,GAAkB;AAAI1B,YAAAA,GAAAA,sBAAAA;AAA2BO,YAAAA,GAAAA;AAAiB,SAAA;QACxE,IAAImB,eAAAA,CAAgBtB,MAAM,KAAK,CAAA,EAAG;AAC9B,YAAA,OAAOC,cAAc/B,KAAK;AAC9B,QAAA;AAEA,QAAA,OAAO,IAAI+B,aAAAA,CAAc;AACrB,YAAA,GAAGA,cAAc/B,KAAK;AACtBqD,YAAAA,aAAAA,EAAetB,aAAAA,CAAc/B,KAAK,CAACqD,aAAa,CAACC,QAAQ,EAAA;YACzDJ,iBAAAA,EAAmBE,eAAAA;YACnBG,QAAAA,EAAU;AACd,SAAA,EAAG3C,MAAAA,EAAQ,KAAA,CAAA;AACf,IAAA;IAEQ4B,YAAAA,GAAuB;AAC3B,QAAA,MAAMD,UAAU,EAAC;AACjB,QAAA,IAAI,CAACiB,mBAAmB,CAACC,OAAO,CAACC,CAAAA,kBAAAA,GAAAA;YAC7B,MAAMC,QAAAA,GAAWD,mBAAmBE,IAAI;AACxCrB,YAAAA,OAAO,CAACoB,QAAAA,CAAS,GAAG,IAAI,CAACA,QAAAA,CAAS;AACtC,QAAA,CAAA,CAAA;QACA,OAAOpB,OAAAA;AACX,IAAA;IAEQL,0BAAAA,GAAiD;AACrD,QAAA,MAAMD,mBAAuC,EAAE;AAC/C,QAAA,IAAI,CAACuB,mBAAmB,CAACC,OAAO,CAACC,CAAAA,kBAAAA,GAAAA;AAC7B,YAAA,IAAI,CAACA,kBAAAA,CAAmBG,UAAU,IAAI,CAAC,IAAI,CAACvB,iBAAiB,CAACwB,QAAQ,CAACJ,kBAAAA,CAAmBE,IAAI,CAAA,EAAG;AAC7F,gBAAA,MAAMG,KAAAA,GAAQ,IAAI,CAACL,kBAAAA,CAAmBE,IAAI,CAAC;gBAC3C,IAAIG,KAAAA,KAAUC,SAAAA,IAAaD,KAAAA,KAAU,IAAA,EAAM;AACvC9B,oBAAAA,gBAAAA,CAAiBgC,IAAI,CAAC,IAAIC,gBAAAA,CACtBC,wBAAAA,CAAyBC,KAAK,EAC9B,CAAA,EAAGV,kBAAAA,CAAmBE,IAAI,CAAC,YAAY,CAAC,EACxC;AAACF,wBAAAA,kBAAAA,CAAmBE;AAAK,qBAAA,EACzB,IAAA,EACAS,sBAAAA,CAAuBC,IAAI,EAC3BC,6BAA6BC,QAAQ,CAAA,CAAA;AAE7C,gBAAA;AACJ,YAAA;AACJ,QAAA,CAAA,CAAA;QACA,OAAOvC,gBAAAA;AACX,IAAA;AAEQJ,IAAAA,iCAAAA,CAAkCqB,iBAAqC,EAAE1B,eAA0C,EAAEC,cAAwB,EAAsB;AACvK,QAAA,IAAI,IAAI,CAAClB,yBAAyB,KAAKyD,SAAAA,EAAW;YAC9C,MAAMS,gBAAAA,GAAmBC,IAAAA,CAAKC,GAAG,CAACnD,eAAAA,IAAmB2C,wBAAAA,CAAyBC,KAAK,EAAE,IAAI,CAAC7D,yBAAyB,GAAG,CAAA,CAAA;AACtH,YAAA,OAAO2C,iBAAAA,CAAkB0B,MAAM,CAAC/B,CAAAA,MAAAA,GAAUA,MAAAA,CAAOgC,QAAQ,KAAKV,wBAAAA,CAAyBW,OAAO,IAAIjC,MAAAA,CAAOgC,QAAQ,GAAGJ,gBAAAA,CAAAA;AACxH,QAAA;AACA,QAAA,IAAIhD,mBAAmB,IAAA,EAAM;YACzB,OAAOyB,iBAAAA,CAAkB0B,MAAM,CAAC/B,CAAAA,SAAUA,MAAAA,CAAOgC,QAAQ,KAAKV,wBAAAA,CAAyBC,KAAK,CAAA;AAChG,QAAA;AACA,QAAA,IAAI5C,oBAAoBwC,SAAAA,EAAW;YAC/B,OAAOd,iBAAAA,CAAkB0B,MAAM,CAAC/B,CAAAA,SAAUA,MAAAA,CAAOgC,QAAQ,KAAKV,wBAAAA,CAAyBC,KAAK,CAAA;AAChG,QAAA;AACA,QAAA,OAAOlB,kBAAkB0B,MAAM,CAAC/B,CAAAA,MAAAA,GAAUA,MAAAA,CAAOgC,QAAQ,GAAGrD,eAAAA,CAAAA;AAChE,IAAA;IAEQuD,YAAAA,CAAavD,eAA0C,EAAEC,cAAwB,EAAe;AACpG,QAAA,MAAMuD,aAAAA,GAAgB,IAAI,CAAC5E,oBAAoB,QAAQ,EAAC;AACxD,QAAA,MAAM6E,OAAAA,GAAU;AACZ,YAAA,GAAGD,aAAa;YAChB,QAAA,EAAU,kBAAA;YACV,cAAA,EAAgB;AACpB,SAAA;AAEA,QAAA,IAAI,IAAI,CAAC/E,aAAa,EAAE6B,SAAS,CAAA,EAAG;AAChCmD,YAAAA,OAAO,CAACnE,OAAAA,CAAQoE,sBAAsB,CAAC,GAAG,IAAI,CAACjF,aAAa;AAChE,QAAA;AAEA,QAAA,IAAIuB,oBAAoBwC,SAAAA,EAAW;AAC/BiB,YAAAA,OAAO,CAAC,oBAAA,CAAqB,GAAGzD,eAAAA,CAAgB8B,QAAQ,EAAA;AAC5D,QAAA;AAEA,QAAA,IAAI7B,mBAAmB,IAAA,EAAM;YACzBwD,OAAO,CAAC,oBAAoB,GAAG,MAAA;AACnC,QAAA;QAEA,OAAOA,OAAAA;AACX,IAAA;IAEA,MAAcnC,cAAAA,CACVT,KAAa,EACb8C,eAAuB,EACvBC,YAAoB,EACpB5D,eAA0C,EAC1CC,cAAwB,EACgB;QACxC,MAAMc,OAAAA,GAAU,IAAI,CAACC,YAAY,EAAA;AACjC,QAAA,MAAMyC,OAAAA,GAAU,IAAI,CAACF,YAAY,CAACvD,eAAAA,EAAiBC,cAAAA,CAAAA;AACnD,QAAA,MAAMW,WAAAA,GAAciD,SAAAA,CAAU,IAAI,CAACnF,YAAY,EAAEmC,KAAAA,CAAAA;QACjD,MAAMiD,GAAAA,GAAM7C,UAAAA,CAAW8C,aAAa,CAAC,IAAI,CAACpF,OAAO,EAAE,IAAI,CAACD,YAAY,EAAEkC,WAAAA,CAAAA;QAEtE,IAAI;YACA,MAAMmB,QAAAA,GAAW,MAAMiC,KAAAA,CAAMF,GAAAA,EAAK;gBAC9BG,MAAAA,EAAQ,MAAA;AACRR,gBAAAA,OAAAA;gBACAS,IAAAA,EAAMC,cAAAA,CAAeC,SAAS,CAACrD,OAAAA;AACnC,aAAA,CAAA;YAEA,IAAIgB,QAAAA,CAASsC,MAAM,KAAK,GAAA,EAAK;gBACzB,OAAO9D,aAAAA,CAAc+D,MAAM,CAAC;AAAC,oBAAA,CAAA,EAAGX,eAAAA,CAAgB,EAAE,EAAE/C,WAAAA,CAAY,CAAC;AAAE,iBAAA,CAAA;AACvE,YAAA;YAEA,MAAMS,MAAAA,GAAS,MAAMU,QAAAA,CAASwC,IAAI,EAAA;YAClC,OAAO,IAAIhE,cAAcc,MAAAA,EAAQ,IAAI,CAAClC,aAAa,EAAE,IAAI,CAACE,yBAAyB,CAAA;AACvF,QAAA,CAAA,CAAE,OAAOmF,EAAAA,EAAI;YACT,OAAOjE,aAAAA,CAAc+D,MAAM,CAAC;gBAAC,CAAA,EAAGV,YAAAA,CAAa,EAAE,EAAEY,EAAAA,CAAAA;AAAK,aAAA,CAAA;AAC1D,QAAA;AACJ,IAAA;AAEA,uBACAC,KAAAA,GAAc;AACV,QAAA,IAAI,CAACzC,mBAAmB,CAACC,OAAO,CAACC,CAAAA,kBAAAA,GAAAA;YAC7B,MAAMC,QAAAA,GAAWD,mBAAmBE,IAAI;YACxC,IAAI,CAACD,SAAS,GAAGK,SAAAA;AACrB,QAAA,CAAA,CAAA;QACA,IAAI,CAACxD,cAAc,GAAG,EAAC;QACvB,IAAI,CAACC,WAAW,GAAG,KAAA;AACvB,IAAA;uBAGAyF,gBAAAA,CAAiBC,MAAuB,EAAE;AACtC,QAAA,IAAI,CAAC3C,mBAAmB,CAACC,OAAO,CAACC,CAAAA,kBAAAA,GAAAA;YAC7B,MAAMC,QAAAA,GAAWD,mBAAmBE,IAAI;YACxC,IAAIhD,MAAAA,CAAOwF,SAAS,CAACC,cAAc,CAACC,IAAI,CAACH,QAAQxC,QAAAA,CAAAA,EAAW;AACxD,gBAAA,IAAI,CAACnD,cAAc,CAACmD,SAAS,GAAGwC,MAAM,CAACxC,QAAAA,CAAS;AAChD,gBAAA,IAAI,CAACA,QAAAA,CAAS,GAAGwC,MAAM,CAACxC,QAAAA,CAAS;AACrC,YAAA;AACJ,QAAA,CAAA,CAAA;AACA,QAAA,IAAI,CAACX,gBAAgB,EAAA;AACzB,IAAA;AAEA,uBACAuD,iCAAAA,GAAoC;AAChC,QAAA,IAAI,CAAC/F,cAAc,GAAG,IAAI,CAACoC,oBAAoB,EAAA;AAC/C,QAAA,IAAI,CAACI,gBAAgB,EAAA;AACzB,IAAA;IAEQJ,oBAAAA,GAA+B;AACnC,QAAA,MAAMuD,SAAS,EAAC;AAChB,QAAA,IAAI,CAAC3C,mBAAmB,CAACC,OAAO,CAACC,CAAAA,kBAAAA,GAAAA;YAC7B,MAAMC,QAAAA,GAAWD,mBAAmBE,IAAI;YACxC,IAAID,QAAAA,IAAY,IAAI,EAAE;AAClBwC,gBAAAA,MAAM,CAACxC,QAAAA,CAAS,GAAG,IAAI,CAACA,QAAAA,CAAS;AACrC,YAAA;AACJ,QAAA,CAAA,CAAA;QACA,OAAOwC,MAAAA;AACX,IAAA;AAEA,uBACAK,aAAAA,GAAsB;AAClB,QAAA,IAAI,CAAChD,mBAAmB,CAACC,OAAO,CAACC,CAAAA,kBAAAA,GAAAA;YAC7B,MAAMC,QAAAA,GAAWD,mBAAmBE,IAAI;AACxC,YAAA,IAAI,CAACD,QAAAA,CAAS,GAAG,IAAI,CAACnD,cAAc,CAACmD,QAAAA,CAAS;AAClD,QAAA,CAAA,CAAA;AACJ,IAAA;uBAGA,IAAI8C,UAAAA,GAAa;QACb,OAAO,IAAI,CAAChG,WAAW;AAC3B,IAAA;uBAGAiG,eAAAA,CAAgB/C,QAAgB,EAAE;AAC9B,QAAA,IAAI,CAACX,gBAAgB,EAAA;AAErB,QAAA,IAAI,CAACtC,UAAU,CAAC+C,OAAO,CAACkD,CAAAA,iBAAAA,GAAAA;AACpB,YAAA,MAAMrF,QAAAA,GAAWqF,iBAAAA,CAAkBrF,QAAQ,CAACsF,KAAK,EAAA;AACjD,YAAA,MAAMC,OAAAA,GAAUF,iBAAAA,CAAkBE,OAAO,CAACD,KAAK,EAAA;AAC/C,YAAA,IAAItF,YAAYuF,OAAAA,EAAS;gBACrBvF,QAAAA,CAASgF,IAAI,CAACO,OAAAA,EAASlD,QAAAA,CAAAA;YAC3B,CAAA,MAAO;AACH,gBAAA,IAAI,CAACjD,UAAU,GAAG,IAAI,CAACA,UAAU,CAACkE,MAAM,CAACkC,CAAAA,CAAAA,GAAKA,CAAAA,CAAExF,QAAQ,KAAKqF,kBAAkBrF,QAAQ,CAAA;AAC3F,YAAA;AACJ,QAAA,CAAA,CAAA;AACJ,IAAA;AAEA,uBACAyF,iBAAAA,CAAkBzF,QAAyB,EAAEuF,OAAe,EAAE;AAC1D,QAAA,IAAI,CAACnG,UAAU,CAACuD,IAAI,CAAC;AACjB3C,YAAAA,QAAAA,EAAU,IAAI0F,OAAAA,CAAQ1F,QAAAA,CAAAA;AACtBuF,YAAAA,OAAAA,EAAS,IAAIG,OAAAA,CAAQH,OAAAA;AACzB,SAAA,CAAA;AACJ,IAAA;IAEQ7D,gBAAAA,GAAmB;QACvB,IAAI,CAACvC,WAAW,GAAG,IAAI,CAAC+C,mBAAmB,CAACyD,IAAI,CAACvD,CAAAA,kBAAAA,GAAAA;YAC7C,MAAMC,QAAAA,GAAWD,mBAAmBE,IAAI;YACxC,OAAO,IAAI,CAACD,QAAAA,CAAS,KAAK,IAAI,CAACnD,cAAc,CAACmD,QAAAA,CAAS;AAC3D,QAAA,CAAA,CAAA;AACJ,IAAA;AACJ;;"}
|
|
1
|
+
{"version":3,"file":"Command.js","sources":["../../../commands/Command.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 { ICommand, PropertyChanged } from './ICommand.js';\nimport { CommandResult } from \"./CommandResult.js\";\nimport { CommandValidator } from './CommandValidator.js';\nimport { Constructor, JsonSerializer } from '@cratis/fundamentals';\nimport { Globals } from '../Globals.js';\nimport { joinPaths } from '../joinPaths.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport { PropertyDescriptor } from '../reflection/PropertyDescriptor.js';\nimport { SliceLocation } from '../reflection/SliceLocation.js';\nimport { ValidationResult } from '../validation/ValidationResult.js';\nimport { ValidationResultSeverity } from '../validation/ValidationResultSeverity.js';\nimport { ValidationResultReason } from '../validation/ValidationResultReason.js';\nimport { ValidationResultReasonDetail } from '../validation/ValidationResultReasonDetail.js';\n\ntype Callback = {\n callback: WeakRef<PropertyChanged>;\n thisArg: WeakRef<object>;\n}\n\n/**\n * Represents an implementation of {@link ICommand} that works with HTTP fetch.\n * Missing required properties produce a {@link ValidationResultReason.Rule} result with\n * {@link ValidationResultReasonDetail.Required}, without contacting the server.\n */\nexport abstract class Command<TCommandContent = object, TCommandResponse = object> implements ICommand<TCommandContent, TCommandResponse> {\n /**\n * Gets the {@link SliceLocation} of the command. Generated proxies override it with the location resolved from the backend namespace.\n */\n static readonly sliceLocation: SliceLocation = SliceLocation.empty;\n\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _httpHeadersCallback: GetHttpHeaders;\n abstract readonly route: string;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n readonly validation?: CommandValidator<any>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n readonly roles: string[] = [];\n /** Inclusive minimum blocking severity declared by a model-bound command proxy. */\n readonly blockOnValidationSeverity?: ValidationResultSeverity;\n abstract readonly propertyDescriptors: PropertyDescriptor[];\n abstract get requestParameters(): string[];\n\n private _initialValues: object = {};\n private _hasChanges = false;\n private _callbacks: Callback[] = [];\n\n /**\n * Initializes a new instance of the {@link Command<,>} class.\n * @param _responseType Type of response.\n * @param _isResponseTypeEnumerable Whether or not the response type is enumerable.\n */\n constructor(readonly _responseType: Constructor = Object, readonly _isResponseTypeEnumerable: boolean) {\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 execute(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors, allowedSeverity, ignoreWarnings);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors, allowedSeverity, ignoreWarnings);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n const actualRoute = this.resolveRoute();\n\n const submittedValues = this.captureCurrentValues();\n const result = await this.performRequest(actualRoute, 'Command not found at route', 'Error during server call', { allowedSeverity, ignoreWarnings });\n if (result.isSuccess) {\n this._initialValues = submittedValues;\n this.updateHasChanges();\n }\n return result;\n }\n\n /** @inheritdoc */\n async validate(): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n const actualRoute = `${this.resolveRoute()}/validate`;\n const result = await this.performRequest(actualRoute, 'Command validation endpoint not found at route', 'Error during validation call');\n if (result.isSuccess && clientValidationErrors.length > 0) {\n return Object.assign(result, { validationResults: [...result.validationResults, ...clientValidationErrors] });\n }\n return result;\n }\n\n /** @inheritdoc */\n validateClientSide(): CommandResult<TCommandResponse> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n const advisoryResults = [...clientValidationErrors, ...validationErrors];\n if (advisoryResults.length === 0) {\n return CommandResult.empty as CommandResult<TCommandResponse>;\n }\n\n return new CommandResult({\n ...CommandResult.empty,\n correlationId: CommandResult.empty.correlationId.toString(),\n validationResults: advisoryResults,\n response: null\n }, Object, false) as CommandResult<TCommandResponse>;\n }\n\n private resolveRoute(): string {\n if (this.requestParameters && this.requestParameters.length > 0) {\n const payload = this.buildPayload();\n return UrlHelpers.replaceRouteParameters(this.route, payload).route;\n }\n return this.route;\n }\n\n private buildPayload(): object {\n const payload = {};\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n payload[property] = this[property];\n });\n return payload;\n }\n\n private validateRequiredProperties(): ValidationResult[] {\n const validationErrors: ValidationResult[] = [];\n this.propertyDescriptors.forEach(propertyDescriptor => {\n if (!propertyDescriptor.isOptional && !this.requestParameters.includes(propertyDescriptor.name)) {\n const value = this[propertyDescriptor.name];\n if (value === undefined || value === null) {\n validationErrors.push(new ValidationResult(\n ValidationResultSeverity.Error,\n `${propertyDescriptor.name} is required`,\n [propertyDescriptor.name],\n null,\n ValidationResultReason.Rule,\n ValidationResultReasonDetail.Required\n ));\n }\n }\n });\n return validationErrors;\n }\n\n private filterValidationResultsBySeverity(validationResults: ValidationResult[], allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): ValidationResult[] {\n if (this.blockOnValidationSeverity !== undefined) {\n const effectiveAllowed = Math.min(allowedSeverity ?? ValidationResultSeverity.Error, this.blockOnValidationSeverity - 1);\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Unknown || result.severity > effectiveAllowed);\n }\n if (ignoreWarnings === true) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n if (allowedSeverity === undefined) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n return validationResults.filter(result => result.severity > allowedSeverity);\n }\n\n private buildHeaders(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): HeadersInit {\n const customHeaders = this._httpHeadersCallback?.() ?? {};\n const headers = {\n ...customHeaders,\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 if (allowedSeverity !== undefined) {\n headers['X-Allowed-Severity'] = allowedSeverity.toString();\n }\n\n if (ignoreWarnings === true) {\n headers['X-Ignore-Warnings'] = 'true';\n }\n\n return headers;\n }\n\n private async performRequest(\n route: string,\n notFoundMessage: string,\n errorMessage: string,\n options: { allowedSeverity?: ValidationResultSeverity; ignoreWarnings?: boolean } = {}\n ): Promise<CommandResult<TCommandResponse>> {\n const payload = this.buildPayload();\n const headers = this.buildHeaders(options.allowedSeverity, options.ignoreWarnings);\n const actualRoute = joinPaths(this._apiBasePath, route);\n const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JsonSerializer.serialize(payload)\n });\n\n if (response.status === 404) {\n return CommandResult.failed([`${notFoundMessage} '${actualRoute}'`]) as CommandResult<TCommandResponse>;\n }\n\n const result = await response.json();\n return new CommandResult(result, this._responseType, this._isResponseTypeEnumerable);\n } catch (ex) {\n return CommandResult.failed([`${errorMessage}: ${ex}`]) as CommandResult<TCommandResponse>;\n }\n }\n\n /** @inheritdoc */\n clear(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = undefined;\n });\n this._initialValues = {};\n this._hasChanges = false;\n }\n\n /** @inheritdoc */\n setInitialValues(values: TCommandContent) {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (Object.prototype.hasOwnProperty.call(values, property)) {\n this._initialValues[property] = values[property];\n this[property] = values[property];\n }\n });\n this.updateHasChanges();\n }\n\n /** @inheritdoc */\n setInitialValuesFromCurrentValues() {\n this._initialValues = this.captureCurrentValues();\n this.updateHasChanges();\n }\n\n private captureCurrentValues(): object {\n const values = {};\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (property in this) {\n values[property] = this[property];\n }\n });\n return values;\n }\n\n /** @inheritdoc */\n revertChanges(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = this._initialValues[property];\n });\n }\n\n /** @inheritdoc */\n get hasChanges() {\n return this._hasChanges;\n }\n\n /** @inheritdoc */\n propertyChanged(property: string) {\n this.updateHasChanges();\n\n this._callbacks.forEach(callbackContainer => {\n const callback = callbackContainer.callback.deref();\n const thisArg = callbackContainer.thisArg.deref();\n if (callback && thisArg) {\n callback.call(thisArg, property);\n } else {\n this._callbacks = this._callbacks.filter(_ => _.callback !== callbackContainer.callback);\n }\n });\n }\n\n /** @inheritdoc */\n onPropertyChanged(callback: PropertyChanged, thisArg: object) {\n this._callbacks.push({\n callback: new WeakRef(callback),\n thisArg: new WeakRef(thisArg)\n });\n }\n\n private updateHasChanges() {\n this._hasChanges = this.propertyDescriptors.some(propertyDescriptor => {\n const property = propertyDescriptor.name;\n return this[property] !== this._initialValues[property];\n });\n }\n}\n"],"names":["Command","sliceLocation","SliceLocation","empty","_microservice","_apiBasePath","_origin","_httpHeadersCallback","validation","roles","blockOnValidationSeverity","_initialValues","_hasChanges","_callbacks","_responseType","Object","_isResponseTypeEnumerable","Globals","microservice","apiBasePath","origin","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","execute","allowedSeverity","ignoreWarnings","clientValidationErrors","validate","filteredClientErrors","filterValidationResultsBySeverity","length","CommandResult","validationFailed","validationErrors","validateRequiredProperties","filteredRequiredErrors","actualRoute","resolveRoute","submittedValues","captureCurrentValues","result","performRequest","isSuccess","updateHasChanges","assign","validationResults","validateClientSide","advisoryResults","correlationId","toString","response","requestParameters","payload","buildPayload","UrlHelpers","replaceRouteParameters","route","propertyDescriptors","forEach","propertyDescriptor","property","name","isOptional","includes","value","undefined","push","ValidationResult","ValidationResultSeverity","Error","ValidationResultReason","Rule","ValidationResultReasonDetail","Required","effectiveAllowed","Math","min","filter","severity","Unknown","buildHeaders","customHeaders","headers","microserviceHttpHeader","notFoundMessage","errorMessage","options","joinPaths","url","createUrlFrom","fetch","method","body","JsonSerializer","serialize","status","failed","json","ex","clear","setInitialValues","values","prototype","hasOwnProperty","call","setInitialValuesFromCurrentValues","revertChanges","hasChanges","propertyChanged","callbackContainer","deref","thisArg","_","onPropertyChanged","WeakRef","some"],"mappings":"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"}
|
|
@@ -39,6 +39,8 @@ export declare abstract class ObservableQueryFor<TDataType, TParameters = object
|
|
|
39
39
|
setPollingOptions(options: Partial<PollingOptions>): void;
|
|
40
40
|
setHttpMethod(method: QueryHttpMethod): void;
|
|
41
41
|
subscribe(callback: OnNextResult<QueryResult<TDataType>>, args?: TParameters): ObservableQuerySubscription<TDataType>;
|
|
42
|
+
private createConnection;
|
|
43
|
+
private buildRequestHeaders;
|
|
42
44
|
perform(args?: TParameters): Promise<QueryResult<TDataType>>;
|
|
43
45
|
private validateArguments;
|
|
44
46
|
private buildQueryArguments;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservableQueryFor.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryFor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAS5D,8BAAsB,kBAAkB,CACpC,SAAS,EACT,WAAW,GAAG,MAAM,CACtB,YAAW,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC;IA+BhD,QAAQ,CAAC,SAAS,EAAE,WAAW;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO;IA5BhC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAuB;IAEnE,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAwC;IAC5D,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,eAAe,CAAC,CAA0B;IAElD,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAE1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC9D,QAAQ,KAAK,yBAAyB,IAAI,MAAM,EAAE,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAOf,YACa,SAAS,EAAE,WAAW,EACtB,UAAU,EAAE,OAAO,EAQ/B;IAKD,OAAO,SAEN;IAGD,eAAe,CAAC,YAAY,EAAE,MAAM,QAEnC;IAGD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAGD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9B;IAGD,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAErD;IAMD,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAExD;IAGD,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAE3C;IAGD,SAAS,CACL,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC9C,IAAI,CAAC,EAAE,WAAW,GACnB,2BAA2B,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"ObservableQueryFor.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryFor.ts"],"names":[],"mappings":"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"}
|