@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.
Files changed (30) hide show
  1. package/dist/cjs/queries/ObservableQueryFor.d.ts.map +1 -1
  2. package/dist/cjs/queries/ObservableQueryFor.js +2 -1
  3. package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
  4. package/dist/cjs/queries/ObservableQueryMultiplexer.d.ts.map +1 -1
  5. package/dist/cjs/queries/ObservableQueryMultiplexer.js +3 -1
  6. package/dist/cjs/queries/ObservableQueryMultiplexer.js.map +1 -1
  7. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts +2 -0
  8. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts.map +1 -0
  9. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts +2 -0
  10. package/dist/cjs/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts.map +1 -0
  11. package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
  12. package/dist/esm/queries/ObservableQueryFor.js +2 -1
  13. package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
  14. package/dist/esm/queries/ObservableQueryMultiplexer.d.ts.map +1 -1
  15. package/dist/esm/queries/ObservableQueryMultiplexer.js +3 -1
  16. package/dist/esm/queries/ObservableQueryMultiplexer.js.map +1 -1
  17. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts +2 -0
  18. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.d.ts.map +1 -0
  19. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.js +68 -0
  20. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.js.map +1 -0
  21. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts +2 -0
  22. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.d.ts.map +1 -0
  23. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.js +71 -0
  24. package/dist/esm/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.js.map +1 -0
  25. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +1 -1
  27. package/queries/ObservableQueryFor.ts +4 -2
  28. package/queries/ObservableQueryMultiplexer.ts +2 -1
  29. package/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_null_or_undefined_args.ts +88 -0
  30. package/queries/for_ObservableQueryFor/when_subscribing/with_hub_mode_and_sse_transport_and_route_and_query_args.ts +91 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/arc",
3
- "version": "20.10.0",
3
+ "version": "20.10.1",
4
4
  "description": "",
5
5
  "author": "Cratis",
6
6
  "license": "MIT",
@@ -103,11 +103,13 @@ export abstract class ObservableQueryFor<TDataType, TParameters = object> implem
103
103
  });
104
104
  }
105
105
 
106
- // Build query arguments including unused args parameters, parameter descriptor values, and paging/sorting
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
- remaining[key] = value !== undefined && value !== null ? String(value) : null;
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
+ }));