@cratis/arc 20.10.0 → 20.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/queries/ObservableQueryFor.d.ts.map +1 -1
- package/dist/cjs/queries/ObservableQueryFor.js +2 -1
- package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
- package/dist/cjs/queries/ObservableQueryMultiplexer.d.ts.map +1 -1
- package/dist/cjs/queries/ObservableQueryMultiplexer.js +3 -1
- package/dist/cjs/queries/ObservableQueryMultiplexer.js.map +1 -1
- package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts +2 -0
- package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts.map +1 -0
- package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts +2 -0
- package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts.map +1 -0
- package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
- package/dist/esm/queries/ObservableQueryFor.js +2 -1
- package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
- package/dist/esm/queries/ObservableQueryMultiplexer.d.ts.map +1 -1
- package/dist/esm/queries/ObservableQueryMultiplexer.js +3 -1
- package/dist/esm/queries/ObservableQueryMultiplexer.js.map +1 -1
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts +2 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts.map +1 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.js +68 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.js.map +1 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts +2 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts.map +1 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.js +71 -0
- package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/queries/ObservableQueryFor.ts +4 -2
- package/queries/ObservableQueryMultiplexer.ts +2 -1
- package/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.ts +88 -0
- package/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.ts +91 -0
package/package.json
CHANGED
|
@@ -103,11 +103,13 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
|
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
//
|
|
106
|
+
// For multiplexed mode, include route arguments as plain arguments in the subscribe payload.
|
|
107
|
+
// In direct mode, route arguments are already part of the URL path and should not be duplicated.
|
|
107
108
|
const parameterValues = ParametersHelper.collectParameterValues(this);
|
|
108
109
|
const { unusedParameters } = UrlHelpers.replaceRouteParameters(this.route, args as object);
|
|
110
|
+
const routeAndQueryArguments = (args as object) || {};
|
|
109
111
|
const connectionQueryArguments: any = {
|
|
110
|
-
...unusedParameters,
|
|
112
|
+
...(Globals.queryDirectMode ? unusedParameters : routeAndQueryArguments),
|
|
111
113
|
...parameterValues,
|
|
112
114
|
...this.buildQueryArguments()
|
|
113
115
|
};
|
|
@@ -126,7 +126,8 @@ export class ObservableQueryMultiplexer {
|
|
|
126
126
|
|
|
127
127
|
for (const [key, value] of Object.entries(a)) {
|
|
128
128
|
if (pagingAndSortingKeys.has(key)) continue;
|
|
129
|
-
|
|
129
|
+
if (value === undefined || value === null) continue;
|
|
130
|
+
remaining[key] = String(value);
|
|
130
131
|
hasRemaining = true;
|
|
131
132
|
}
|
|
132
133
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { an_observable_query_for } from '../given/an_observable_query_for';
|
|
5
|
+
import { given } from '../../../given';
|
|
6
|
+
import { Globals } from '../../../Globals';
|
|
7
|
+
import { QueryTransportMethod } from '../../QueryTransportMethod';
|
|
8
|
+
import { ObservableQuerySubscription } from '../../ObservableQuerySubscription';
|
|
9
|
+
import { HubMessageType } from '../../WebSocketHubConnection';
|
|
10
|
+
import { resetSharedMultiplexer } from '../../ObservableQueryMultiplexer';
|
|
11
|
+
|
|
12
|
+
import * as sinon from 'sinon';
|
|
13
|
+
|
|
14
|
+
describe('when subscribing with hub mode and SSE transport and null or undefined args', given(an_observable_query_for, context => {
|
|
15
|
+
let callback: sinon.SinonStub;
|
|
16
|
+
let subscription: ObservableQuerySubscription<string>;
|
|
17
|
+
let fetchStub: sinon.SinonStub;
|
|
18
|
+
let originalQueryDirectMode: boolean;
|
|
19
|
+
let originalTransportMethod: QueryTransportMethod;
|
|
20
|
+
let eventSourceInstance: EventSource & {
|
|
21
|
+
onopen: (() => void) | null;
|
|
22
|
+
onmessage: ((event: { data: string }) => void) | null;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
originalQueryDirectMode = Globals.queryDirectMode;
|
|
27
|
+
originalTransportMethod = Globals.queryTransportMethod;
|
|
28
|
+
resetSharedMultiplexer();
|
|
29
|
+
|
|
30
|
+
Globals.queryDirectMode = false;
|
|
31
|
+
Globals.queryTransportMethod = QueryTransportMethod.ServerSentEvents;
|
|
32
|
+
|
|
33
|
+
context.queryWithParameterDescriptorValues.setOrigin('https://example.com');
|
|
34
|
+
callback = sinon.stub();
|
|
35
|
+
|
|
36
|
+
const FakeEventSourceConstructor = function (this: EventSource, url: string) {
|
|
37
|
+
void url;
|
|
38
|
+
eventSourceInstance = this as EventSource & {
|
|
39
|
+
onopen: (() => void) | null;
|
|
40
|
+
onmessage: ((event: { data: string }) => void) | null;
|
|
41
|
+
};
|
|
42
|
+
Object.assign(this, {
|
|
43
|
+
onopen: null,
|
|
44
|
+
onerror: null,
|
|
45
|
+
onmessage: null,
|
|
46
|
+
close: sinon.stub(),
|
|
47
|
+
addEventListener: sinon.stub(),
|
|
48
|
+
removeEventListener: sinon.stub(),
|
|
49
|
+
readyState: 0,
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
(globalThis as Record<string, unknown>)['EventSource'] = FakeEventSourceConstructor;
|
|
53
|
+
|
|
54
|
+
fetchStub = sinon.stub().resolves({ ok: true } as Response);
|
|
55
|
+
(globalThis as Record<string, unknown>)['fetch'] = fetchStub;
|
|
56
|
+
|
|
57
|
+
subscription = context.queryWithParameterDescriptorValues.subscribe(callback, {
|
|
58
|
+
filter: undefined,
|
|
59
|
+
limit: null
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
eventSourceInstance.onopen?.();
|
|
63
|
+
eventSourceInstance.onmessage?.({
|
|
64
|
+
data: JSON.stringify({
|
|
65
|
+
type: HubMessageType.Connected,
|
|
66
|
+
payload: 'conn-1'
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
afterEach(() => {
|
|
72
|
+
Globals.queryDirectMode = originalQueryDirectMode;
|
|
73
|
+
Globals.queryTransportMethod = originalTransportMethod;
|
|
74
|
+
if (subscription) {
|
|
75
|
+
subscription.unsubscribe();
|
|
76
|
+
}
|
|
77
|
+
delete (globalThis as Record<string, unknown>)['EventSource'];
|
|
78
|
+
delete (globalThis as Record<string, unknown>)['fetch'];
|
|
79
|
+
resetSharedMultiplexer();
|
|
80
|
+
sinon.restore();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should not include null or undefined arguments in the subscribe request', () => {
|
|
84
|
+
fetchStub.called.should.be.true;
|
|
85
|
+
const subscribeBody = JSON.parse(fetchStub.firstCall.args[1].body as string);
|
|
86
|
+
(subscribeBody.request.arguments === undefined).should.be.true;
|
|
87
|
+
});
|
|
88
|
+
}));
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { an_observable_query_for } from '../given/an_observable_query_for';
|
|
5
|
+
import { given } from '../../../given';
|
|
6
|
+
import { Globals } from '../../../Globals';
|
|
7
|
+
import { QueryTransportMethod } from '../../QueryTransportMethod';
|
|
8
|
+
import { ObservableQuerySubscription } from '../../ObservableQuerySubscription';
|
|
9
|
+
import { HubMessageType } from '../../WebSocketHubConnection';
|
|
10
|
+
import { resetSharedMultiplexer } from '../../ObservableQueryMultiplexer';
|
|
11
|
+
|
|
12
|
+
import * as sinon from 'sinon';
|
|
13
|
+
|
|
14
|
+
describe('when subscribing with hub mode and SSE transport and route and query args', given(an_observable_query_for, context => {
|
|
15
|
+
let callback: sinon.SinonStub;
|
|
16
|
+
let subscription: ObservableQuerySubscription<string>;
|
|
17
|
+
let fetchStub: sinon.SinonStub;
|
|
18
|
+
let originalQueryDirectMode: boolean;
|
|
19
|
+
let originalTransportMethod: QueryTransportMethod;
|
|
20
|
+
let eventSourceInstance: EventSource & {
|
|
21
|
+
onopen: (() => void) | null;
|
|
22
|
+
onmessage: ((event: { data: string }) => void) | null;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
originalQueryDirectMode = Globals.queryDirectMode;
|
|
27
|
+
originalTransportMethod = Globals.queryTransportMethod;
|
|
28
|
+
resetSharedMultiplexer();
|
|
29
|
+
|
|
30
|
+
Globals.queryDirectMode = false;
|
|
31
|
+
Globals.queryTransportMethod = QueryTransportMethod.ServerSentEvents;
|
|
32
|
+
|
|
33
|
+
context.queryWithRouteAndQueryArgs.setOrigin('https://example.com');
|
|
34
|
+
callback = sinon.stub();
|
|
35
|
+
|
|
36
|
+
const FakeEventSourceConstructor = function (this: EventSource, url: string) {
|
|
37
|
+
void url;
|
|
38
|
+
eventSourceInstance = this as EventSource & {
|
|
39
|
+
onopen: (() => void) | null;
|
|
40
|
+
onmessage: ((event: { data: string }) => void) | null;
|
|
41
|
+
};
|
|
42
|
+
Object.assign(this, {
|
|
43
|
+
onopen: null,
|
|
44
|
+
onerror: null,
|
|
45
|
+
onmessage: null,
|
|
46
|
+
close: sinon.stub(),
|
|
47
|
+
addEventListener: sinon.stub(),
|
|
48
|
+
removeEventListener: sinon.stub(),
|
|
49
|
+
readyState: 0,
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
(globalThis as Record<string, unknown>)['EventSource'] = FakeEventSourceConstructor;
|
|
53
|
+
|
|
54
|
+
fetchStub = sinon.stub().resolves({ ok: true } as Response);
|
|
55
|
+
(globalThis as Record<string, unknown>)['fetch'] = fetchStub;
|
|
56
|
+
|
|
57
|
+
subscription = context.queryWithRouteAndQueryArgs.subscribe(callback, {
|
|
58
|
+
id: 'my-item-id',
|
|
59
|
+
filter: 'active',
|
|
60
|
+
limit: 50
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
eventSourceInstance.onopen?.();
|
|
64
|
+
eventSourceInstance.onmessage?.({
|
|
65
|
+
data: JSON.stringify({
|
|
66
|
+
type: HubMessageType.Connected,
|
|
67
|
+
payload: 'conn-1'
|
|
68
|
+
})
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
afterEach(() => {
|
|
73
|
+
Globals.queryDirectMode = originalQueryDirectMode;
|
|
74
|
+
Globals.queryTransportMethod = originalTransportMethod;
|
|
75
|
+
if (subscription) {
|
|
76
|
+
subscription.unsubscribe();
|
|
77
|
+
}
|
|
78
|
+
delete (globalThis as Record<string, unknown>)['EventSource'];
|
|
79
|
+
delete (globalThis as Record<string, unknown>)['fetch'];
|
|
80
|
+
resetSharedMultiplexer();
|
|
81
|
+
sinon.restore();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should include route and query arguments in the subscribe request', () => {
|
|
85
|
+
fetchStub.called.should.be.true;
|
|
86
|
+
const subscribeBody = JSON.parse(fetchStub.firstCall.args[1].body as string);
|
|
87
|
+
subscribeBody.request.arguments.id.should.equal('my-item-id');
|
|
88
|
+
subscribeBody.request.arguments.filter.should.equal('active');
|
|
89
|
+
subscribeBody.request.arguments.limit.should.equal('50');
|
|
90
|
+
});
|
|
91
|
+
}));
|