mobility-toolbox-js 2.0.0-beta.34 → 2.0.0-beta.37
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/README.md +14 -8
- package/api/RealtimeAPI.d.ts +6 -6
- package/api/RealtimeAPI.d.ts.map +1 -1
- package/api/RealtimeAPI.js +170 -197
- package/api/RealtimeAPI.test.d.ts +2 -0
- package/api/RealtimeAPI.test.d.ts.map +1 -0
- package/api/RealtimeAPI.test.js +67 -0
- package/api/RoutingAPI.d.ts +6 -2
- package/api/RoutingAPI.d.ts.map +1 -1
- package/api/RoutingAPI.js +8 -38
- package/api/RoutingAPI.test.d.ts +2 -0
- package/api/RoutingAPI.test.d.ts.map +1 -0
- package/api/RoutingAPI.test.js +29 -0
- package/api/StopsAPI.d.ts +1 -1
- package/api/StopsAPI.d.ts.map +1 -1
- package/api/StopsAPI.js +8 -40
- package/api/StopsAPI.test.d.ts +2 -0
- package/api/StopsAPI.test.d.ts.map +1 -0
- package/api/StopsAPI.test.js +26 -0
- package/api/index.d.ts +3 -4
- package/api/index.d.ts.map +1 -1
- package/api/index.js +3 -10
- package/api/typedefs.js +1 -0
- package/common/api/HttpAPI.d.ts +2 -2
- package/common/api/HttpAPI.d.ts.map +1 -1
- package/common/api/HttpAPI.js +21 -48
- package/common/api/HttpAPI.test.d.ts +2 -0
- package/common/api/HttpAPI.test.d.ts.map +1 -0
- package/common/api/HttpAPI.test.js +54 -0
- package/common/api/WebSocketAPI.d.ts +8 -4
- package/common/api/WebSocketAPI.d.ts.map +1 -1
- package/common/api/WebSocketAPI.js +125 -129
- package/common/api/WebSocketAPI.test.d.ts +2 -0
- package/common/api/WebSocketAPI.test.d.ts.map +1 -0
- package/common/api/WebSocketAPI.test.js +380 -0
- package/common/controls/Control.d.ts +5 -5
- package/common/controls/Control.d.ts.map +1 -1
- package/common/controls/Control.js +44 -77
- package/common/controls/Control.test.d.ts +2 -0
- package/common/controls/Control.test.d.ts.map +1 -0
- package/common/controls/Control.test.js +89 -0
- package/common/index.js +2 -18
- package/common/layers/Layer.d.ts +11 -11
- package/common/layers/Layer.d.ts.map +1 -1
- package/common/layers/Layer.js +70 -104
- package/common/layers/Layer.test.d.ts +2 -0
- package/common/layers/Layer.test.d.ts.map +1 -0
- package/common/layers/Layer.test.js +137 -0
- package/common/mixins/CopyrightMixin.js +23 -52
- package/common/mixins/MapboxLayerMixin.js +162 -204
- package/common/mixins/RealtimeLayerMixin.js +580 -635
- package/common/mixins/StopFinderMixin.d.ts +3 -3
- package/common/mixins/StopFinderMixin.d.ts.map +1 -1
- package/common/mixins/StopFinderMixin.js +115 -157
- package/common/mixins/UserInteractionsLayerMixin.js +142 -175
- package/common/mixins/UserInteractionsLayerMixin.test.d.ts +2 -0
- package/common/mixins/UserInteractionsLayerMixin.test.d.ts.map +1 -0
- package/common/mixins/UserInteractionsLayerMixin.test.js +214 -0
- package/common/styles/index.js +4 -24
- package/common/styles/realtimeDefaultStyle.d.ts.map +1 -1
- package/common/styles/realtimeDefaultStyle.js +67 -78
- package/common/styles/realtimeDelayStyle.js +4 -17
- package/common/styles/realtimeSimpleStyle.js +5 -7
- package/common/typedefs.js +1 -0
- package/common/utils/cleanStopTime.js +3 -5
- package/common/utils/compareDepartures.d.ts +1 -1
- package/common/utils/compareDepartures.d.ts.map +1 -1
- package/common/utils/compareDepartures.js +8 -11
- package/common/utils/createCanvas.js +3 -5
- package/common/utils/createTrackerFilters.d.ts +1 -1
- package/common/utils/createTrackerFilters.d.ts.map +1 -1
- package/common/utils/createTrackerFilters.js +22 -32
- package/common/utils/createTrackerFilters.test.d.ts +2 -0
- package/common/utils/createTrackerFilters.test.d.ts.map +1 -0
- package/common/utils/createTrackerFilters.test.js +79 -0
- package/common/utils/getLayersAsFlatArray.js +6 -8
- package/common/utils/getMapboxMapCopyrights.js +9 -11
- package/common/utils/getMapboxMapCopyrights.test.d.ts +2 -0
- package/common/utils/getMapboxMapCopyrights.test.d.ts.map +1 -0
- package/common/utils/getMapboxMapCopyrights.test.js +40 -0
- package/common/utils/getMapboxRender.js +12 -15
- package/common/utils/getMaplibreRender.js +10 -13
- package/common/utils/getRealtimeModeSuffix.js +2 -6
- package/common/utils/getUrlWithParams.js +5 -8
- package/common/utils/getVehiclePosition.js +20 -23
- package/common/utils/index.js +12 -37
- package/common/utils/removeDuplicate.d.ts +1 -1
- package/common/utils/removeDuplicate.d.ts.map +1 -1
- package/common/utils/removeDuplicate.js +6 -21
- package/common/utils/removeDuplicate.test.d.ts +2 -0
- package/common/utils/removeDuplicate.test.d.ts.map +1 -0
- package/common/utils/removeDuplicate.test.js +19 -0
- package/common/utils/renderTrajectories.js +31 -43
- package/common/utils/sortByDelay.js +4 -6
- package/common/utils/timeUtils.js +14 -24
- package/common/utils/timeUtils.test.d.ts +2 -0
- package/common/utils/timeUtils.test.d.ts.map +1 -0
- package/common/utils/timeUtils.test.js +10 -0
- package/common/utils/trackerConfig.js +27 -39
- package/common/utils/trackerConfig.test.d.ts +2 -0
- package/common/utils/trackerConfig.test.d.ts.map +1 -0
- package/common/utils/trackerConfig.test.js +23 -0
- package/iife.js +3 -5
- package/index.d.ts +4 -0
- package/index.js +9 -10
- package/mapbox/controls/CopyrightControl.d.ts +0 -1
- package/mapbox/controls/CopyrightControl.d.ts.map +1 -1
- package/mapbox/controls/CopyrightControl.js +18 -38
- package/mapbox/controls/index.js +1 -5
- package/mapbox/index.js +4 -20
- package/mapbox/layers/Layer.d.ts +1 -1
- package/mapbox/layers/Layer.d.ts.map +1 -1
- package/mapbox/layers/Layer.js +29 -71
- package/mapbox/layers/Layer.test.d.ts +2 -0
- package/mapbox/layers/Layer.test.d.ts.map +1 -0
- package/mapbox/layers/Layer.test.js +204 -0
- package/mapbox/layers/RealtimeLayer.d.ts +4 -4
- package/mapbox/layers/RealtimeLayer.d.ts.map +1 -1
- package/mapbox/layers/RealtimeLayer.js +83 -125
- package/mapbox/layers/RealtimeLayer.test.d.ts +2 -0
- package/mapbox/layers/RealtimeLayer.test.d.ts.map +1 -0
- package/mapbox/layers/RealtimeLayer.test.js +10 -0
- package/mapbox/layers/index.js +2 -7
- package/mapbox/utils.js +19 -33
- package/mbt.js +59 -37
- package/mbt.js.map +2 -2
- package/mbt.min.js +10 -10
- package/mbt.min.js.map +2 -2
- package/ol/controls/CopyrightControl.js +26 -47
- package/ol/controls/CopyrightControl.test.d.ts +2 -0
- package/ol/controls/CopyrightControl.test.d.ts.map +1 -0
- package/ol/controls/CopyrightControl.test.js +177 -0
- package/ol/controls/RoutingControl.d.ts +6 -5
- package/ol/controls/RoutingControl.d.ts.map +1 -1
- package/ol/controls/RoutingControl.js +209 -270
- package/ol/controls/RoutingControl.test.d.ts +2 -0
- package/ol/controls/RoutingControl.test.d.ts.map +1 -0
- package/ol/controls/RoutingControl.test.js +150 -0
- package/ol/controls/StopFinderControl.js +9 -32
- package/ol/controls/StopFinderControl.test.d.ts +2 -0
- package/ol/controls/StopFinderControl.test.d.ts.map +1 -0
- package/ol/controls/StopFinderControl.test.js +49 -0
- package/ol/controls/index.js +3 -9
- package/ol/index.js +5 -21
- package/ol/layers/Layer.d.ts +1 -1
- package/ol/layers/Layer.d.ts.map +1 -1
- package/ol/layers/Layer.js +40 -72
- package/ol/layers/Layer.test.d.ts +2 -0
- package/ol/layers/Layer.test.d.ts.map +1 -0
- package/ol/layers/Layer.test.js +196 -0
- package/ol/layers/MapboxLayer.d.ts +7 -7
- package/ol/layers/MapboxLayer.d.ts.map +1 -1
- package/ol/layers/MapboxLayer.js +30 -66
- package/ol/layers/MapboxLayer.test.d.ts +2 -0
- package/ol/layers/MapboxLayer.test.d.ts.map +1 -0
- package/ol/layers/MapboxLayer.test.js +164 -0
- package/ol/layers/MapboxStyleLayer.d.ts +3 -3
- package/ol/layers/MapboxStyleLayer.d.ts.map +1 -1
- package/ol/layers/MapboxStyleLayer.js +92 -135
- package/ol/layers/MapboxStyleLayer.test.d.ts +2 -0
- package/ol/layers/MapboxStyleLayer.test.d.ts.map +1 -0
- package/ol/layers/MapboxStyleLayer.test.js +232 -0
- package/ol/layers/MaplibreLayer.d.ts +1 -1
- package/ol/layers/MaplibreLayer.d.ts.map +1 -1
- package/ol/layers/MaplibreLayer.js +14 -48
- package/ol/layers/RealtimeLayer.d.ts +2 -2
- package/ol/layers/RealtimeLayer.d.ts.map +1 -1
- package/ol/layers/RealtimeLayer.js +111 -147
- package/ol/layers/RealtimeLayer.test.d.ts +2 -0
- package/ol/layers/RealtimeLayer.test.d.ts.map +1 -0
- package/ol/layers/RealtimeLayer.test.js +71 -0
- package/ol/layers/RoutingLayer.d.ts +2 -2
- package/ol/layers/RoutingLayer.d.ts.map +1 -1
- package/ol/layers/RoutingLayer.js +29 -61
- package/ol/layers/RoutingLayer.test.d.ts +2 -0
- package/ol/layers/RoutingLayer.test.d.ts.map +1 -0
- package/ol/layers/RoutingLayer.test.js +39 -0
- package/ol/layers/VectorLayer.d.ts +1 -1
- package/ol/layers/VectorLayer.d.ts.map +1 -1
- package/ol/layers/VectorLayer.js +14 -48
- package/ol/layers/VectorLayer.test.d.ts +2 -0
- package/ol/layers/VectorLayer.test.d.ts.map +1 -0
- package/ol/layers/VectorLayer.test.js +87 -0
- package/ol/layers/WMSLayer.d.ts +1 -1
- package/ol/layers/WMSLayer.d.ts.map +1 -1
- package/ol/layers/WMSLayer.js +34 -68
- package/ol/layers/WMSLayer.test.d.ts +2 -0
- package/ol/layers/WMSLayer.test.d.ts.map +1 -0
- package/ol/layers/WMSLayer.test.js +66 -0
- package/ol/layers/index.js +8 -19
- package/ol/styles/fullTrajectoryDelayStyle.js +11 -13
- package/ol/styles/fullTrajectoryStyle.js +16 -18
- package/ol/styles/index.js +2 -7
- package/package.json +5 -2
- package/setupTests.js +12 -14
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import WS from 'jest-websocket-mock';
|
|
11
|
+
import WebSocketAPI from './WebSocketAPI';
|
|
12
|
+
describe('WebSocketAPI', () => {
|
|
13
|
+
describe('#constructor', () => {
|
|
14
|
+
let server;
|
|
15
|
+
let server2;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
server = new WS(`ws://foo:1234`);
|
|
18
|
+
server2 = new WS(`ws://foo:12345`);
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
server.close();
|
|
22
|
+
server2.close();
|
|
23
|
+
WS.clean();
|
|
24
|
+
});
|
|
25
|
+
describe('#constructor', () => {
|
|
26
|
+
test("doesn't connect.", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
const client = new WebSocketAPI();
|
|
28
|
+
expect(client.websocket).toBe();
|
|
29
|
+
expect(client.closed).toBe(false);
|
|
30
|
+
expect(client.closing).toBe(false);
|
|
31
|
+
expect(client.connecting).toBe(false);
|
|
32
|
+
expect(client.open).toBe(false);
|
|
33
|
+
}));
|
|
34
|
+
});
|
|
35
|
+
describe('#close', () => {
|
|
36
|
+
test('should close the websocket and clear some property', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
// eslint-disable-next-line no-unused-vars
|
|
38
|
+
const client = new WebSocketAPI();
|
|
39
|
+
const subsc2 = {
|
|
40
|
+
params: 'foo',
|
|
41
|
+
cb: () => { },
|
|
42
|
+
errorCb: () => { },
|
|
43
|
+
quiet: false,
|
|
44
|
+
};
|
|
45
|
+
client.subscriptions = [subsc2];
|
|
46
|
+
client.messagesOnOpen = ['GET foo'];
|
|
47
|
+
client.connect(`ws://foo:1234`);
|
|
48
|
+
client.websocket.addEventListener = jest.fn();
|
|
49
|
+
client.websocket.removeEventListener = jest.fn();
|
|
50
|
+
client.websocket.close = jest.fn();
|
|
51
|
+
yield server.connected;
|
|
52
|
+
expect(client.websocket).toBeDefined();
|
|
53
|
+
expect(client.messagesOnOpen).toEqual(['GET foo']);
|
|
54
|
+
client.close();
|
|
55
|
+
expect(client.messagesOnOpen).toEqual([]);
|
|
56
|
+
expect(client.websocket).toBeNull();
|
|
57
|
+
}));
|
|
58
|
+
});
|
|
59
|
+
describe('#connect', () => {
|
|
60
|
+
test('create a new WebSocket.', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
61
|
+
const client = new WebSocketAPI();
|
|
62
|
+
client.connect(`ws://foo:1234`);
|
|
63
|
+
yield server.connected;
|
|
64
|
+
client.send('hello');
|
|
65
|
+
yield expect(server).toReceiveMessage('hello');
|
|
66
|
+
expect(server).toHaveReceivedMessages(['hello']);
|
|
67
|
+
}));
|
|
68
|
+
test('close previous connection.', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
69
|
+
const client = new WebSocketAPI();
|
|
70
|
+
client.connect(`ws://foo:1234`);
|
|
71
|
+
yield server.connected;
|
|
72
|
+
expect(client.websocket).toBeDefined();
|
|
73
|
+
const old = client.websocket;
|
|
74
|
+
expect(old.readyState).toBe(WebSocket.OPEN);
|
|
75
|
+
client.connect(`ws://foo:12345`);
|
|
76
|
+
expect(old.readyState).toBe(WebSocket.CLOSING);
|
|
77
|
+
expect(client.websocket.readyState).toBe(WebSocket.CONNECTING);
|
|
78
|
+
}));
|
|
79
|
+
test('call onOpen function', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
80
|
+
const onOpen = jest.fn();
|
|
81
|
+
const client = new WebSocketAPI();
|
|
82
|
+
client.subscribe = jest.fn();
|
|
83
|
+
client.connect(`ws://foo:1234`, onOpen);
|
|
84
|
+
yield server.connected;
|
|
85
|
+
expect(client.websocket.readyState).toBe(WebSocket.OPEN);
|
|
86
|
+
expect(onOpen).toHaveBeenCalledTimes(1);
|
|
87
|
+
}));
|
|
88
|
+
test('subscribe previous subscriptions on open (quiet or not)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
89
|
+
const client = new WebSocketAPI();
|
|
90
|
+
client.subscribe = jest.fn();
|
|
91
|
+
client.send = jest.fn();
|
|
92
|
+
const subsc = {
|
|
93
|
+
params: 'foo',
|
|
94
|
+
cb: () => { },
|
|
95
|
+
errorCb: () => { },
|
|
96
|
+
quiet: true,
|
|
97
|
+
};
|
|
98
|
+
const subsc2 = {
|
|
99
|
+
params: 'foo',
|
|
100
|
+
cb: () => { },
|
|
101
|
+
errorCb: () => { },
|
|
102
|
+
quiet: false,
|
|
103
|
+
};
|
|
104
|
+
client.subscriptions = [subsc, subsc2];
|
|
105
|
+
client.connect(`ws://foo:1234`);
|
|
106
|
+
yield server.connected;
|
|
107
|
+
expect(client.websocket.readyState).toBe(WebSocket.OPEN);
|
|
108
|
+
expect(client.subscribe).toHaveBeenCalledTimes(2);
|
|
109
|
+
client.subscribe.mockReset();
|
|
110
|
+
client.connect(`ws://foo:12345`);
|
|
111
|
+
yield server2.connected;
|
|
112
|
+
expect(client.websocket.readyState).toBe(WebSocket.OPEN);
|
|
113
|
+
expect(client.subscribe).toHaveBeenCalledTimes(2);
|
|
114
|
+
expect(client.subscribe).toHaveBeenCalledWith(subsc.params, subsc.cb, subsc.errorCb, subsc.quiet);
|
|
115
|
+
}));
|
|
116
|
+
test('send GET and SUB for not quiet previous subscriptions', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
117
|
+
const client = new WebSocketAPI();
|
|
118
|
+
client.send = jest.fn();
|
|
119
|
+
const subsc = {
|
|
120
|
+
params: { channel: 'foo' },
|
|
121
|
+
cb: () => { },
|
|
122
|
+
errorCb: () => { },
|
|
123
|
+
quiet: false,
|
|
124
|
+
};
|
|
125
|
+
client.subscriptions = [subsc];
|
|
126
|
+
client.connect(`ws://foo:1234`);
|
|
127
|
+
client.websocket.addEventListener = jest.fn();
|
|
128
|
+
client.websocket.removeEventListener = jest.fn();
|
|
129
|
+
yield server.connected;
|
|
130
|
+
expect(client.websocket.readyState).toBe(WebSocket.OPEN);
|
|
131
|
+
expect(client.send).toHaveBeenCalledTimes(2);
|
|
132
|
+
expect(client.send.mock.calls[0]).toEqual(['GET foo']);
|
|
133
|
+
expect(client.send.mock.calls[1]).toEqual(['SUB foo']);
|
|
134
|
+
client.send.mockReset();
|
|
135
|
+
client.connect(`ws://foo:12345`);
|
|
136
|
+
client.websocket.addEventListener = jest.fn();
|
|
137
|
+
client.websocket.removeEventListener = jest.fn();
|
|
138
|
+
yield server2.connected;
|
|
139
|
+
expect(client.websocket.readyState).toBe(WebSocket.OPEN);
|
|
140
|
+
// not quiet subscriptions will send GET and SUB requests.
|
|
141
|
+
expect(client.send).toHaveBeenCalledTimes(2);
|
|
142
|
+
expect(client.send.mock.calls[0]).toEqual(['GET foo']);
|
|
143
|
+
expect(client.send.mock.calls[1]).toEqual(['SUB foo']);
|
|
144
|
+
}));
|
|
145
|
+
test('doesn\t send GET and SUB for quiet previous subscriptions', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
146
|
+
const client = new WebSocketAPI();
|
|
147
|
+
client.send = jest.fn();
|
|
148
|
+
const subsc = {
|
|
149
|
+
params: { channel: 'foo' },
|
|
150
|
+
cb: () => { },
|
|
151
|
+
errorCb: () => { },
|
|
152
|
+
quiet: true,
|
|
153
|
+
};
|
|
154
|
+
client.subscriptions = [subsc];
|
|
155
|
+
client.connect(`ws://foo:1234`);
|
|
156
|
+
client.websocket.addEventListener = jest.fn();
|
|
157
|
+
client.websocket.removeEventListener = jest.fn();
|
|
158
|
+
yield server.connected;
|
|
159
|
+
expect(client.websocket.readyState).toBe(WebSocket.OPEN);
|
|
160
|
+
expect(client.send).toHaveBeenCalledTimes(0);
|
|
161
|
+
client.send.mockReset();
|
|
162
|
+
client.connect(`ws://foo:12345`);
|
|
163
|
+
client.websocket.addEventListener = jest.fn();
|
|
164
|
+
client.websocket.removeEventListener = jest.fn();
|
|
165
|
+
yield server2.connected;
|
|
166
|
+
expect(client.websocket.readyState).toBe(WebSocket.OPEN);
|
|
167
|
+
// not quiet subscriptions will send GET and SUB requests.
|
|
168
|
+
expect(client.send).toHaveBeenCalledTimes(0);
|
|
169
|
+
}));
|
|
170
|
+
});
|
|
171
|
+
describe('#get', () => {
|
|
172
|
+
test('listen to message event', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
173
|
+
// eslint-disable-next-line no-unused-vars
|
|
174
|
+
const client = new WebSocketAPI();
|
|
175
|
+
client.connect(`ws://foo:1234`);
|
|
176
|
+
yield server.connected;
|
|
177
|
+
const params = { channel: 'get', args: ['baz'], id: 'id' };
|
|
178
|
+
const cb = jest.fn();
|
|
179
|
+
const errorCb = jest.fn();
|
|
180
|
+
client.get(params, cb, errorCb);
|
|
181
|
+
expect(cb).toHaveBeenCalledTimes(0);
|
|
182
|
+
const obj = { source: 'get baz', client_reference: 'id' };
|
|
183
|
+
server.send(JSON.stringify(obj));
|
|
184
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
185
|
+
expect(cb).toHaveBeenCalledWith(obj);
|
|
186
|
+
}));
|
|
187
|
+
test('unlisten after receiving one response', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
188
|
+
// eslint-disable-next-line no-unused-vars
|
|
189
|
+
const client = new WebSocketAPI();
|
|
190
|
+
client.connect(`ws://foo:1234`);
|
|
191
|
+
yield server.connected;
|
|
192
|
+
const params = { channel: 'get', args: ['baz'], id: 'id' };
|
|
193
|
+
const cb = jest.fn();
|
|
194
|
+
const errorCb = jest.fn();
|
|
195
|
+
client.get(params, cb, errorCb);
|
|
196
|
+
expect(cb).toHaveBeenCalledTimes(0);
|
|
197
|
+
const obj = { source: 'get baz', client_reference: 'id' };
|
|
198
|
+
server.send(JSON.stringify(obj));
|
|
199
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
200
|
+
server.send(JSON.stringify(obj));
|
|
201
|
+
server.send(JSON.stringify(obj));
|
|
202
|
+
server.send(JSON.stringify(obj));
|
|
203
|
+
server.send(JSON.stringify(obj));
|
|
204
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
205
|
+
}));
|
|
206
|
+
test('call (then remove) good callbacks on multiple requests', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
207
|
+
// eslint-disable-next-line no-unused-vars
|
|
208
|
+
const client = new WebSocketAPI();
|
|
209
|
+
client.connect(`ws://foo:1234`);
|
|
210
|
+
yield server.connected;
|
|
211
|
+
const params = { channel: 'get', args: ['baz'], id: 'id' };
|
|
212
|
+
const cb = jest.fn();
|
|
213
|
+
const errorCb = jest.fn();
|
|
214
|
+
client.get(params, cb, errorCb);
|
|
215
|
+
const params2 = { channel: 'get', args: ['foo'], id: 'id' };
|
|
216
|
+
const cb2 = jest.fn();
|
|
217
|
+
const errorCb2 = jest.fn();
|
|
218
|
+
client.get(params2, cb2, errorCb2);
|
|
219
|
+
client.get(params, cb2, errorCb);
|
|
220
|
+
expect(cb).toHaveBeenCalledTimes(0);
|
|
221
|
+
const obj = { source: 'get baz', client_reference: 'id' };
|
|
222
|
+
server.send(JSON.stringify(obj));
|
|
223
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
224
|
+
expect(cb2).toHaveBeenCalledTimes(1);
|
|
225
|
+
server.send(JSON.stringify({ source: 'get foo', client_reference: 'id' }));
|
|
226
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
227
|
+
expect(cb2).toHaveBeenCalledTimes(2);
|
|
228
|
+
}));
|
|
229
|
+
});
|
|
230
|
+
describe('#subscribe', () => {
|
|
231
|
+
test('adds subscription to subscriptions array', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
232
|
+
// eslint-disable-next-line no-unused-vars
|
|
233
|
+
const client = new WebSocketAPI();
|
|
234
|
+
client.connect(`ws://foo:1234`);
|
|
235
|
+
yield server.connected;
|
|
236
|
+
const params = { channel: 'bar', args: ['baz'], id: 'id' };
|
|
237
|
+
const cb = jest.fn();
|
|
238
|
+
const errorCb = jest.fn();
|
|
239
|
+
client.subscribe(params, cb, errorCb);
|
|
240
|
+
expect(client.subscriptions.length).toBe(1);
|
|
241
|
+
expect(client.subscriptions[0].params).toBe(params);
|
|
242
|
+
expect(client.subscriptions[0].cb).toBe(cb);
|
|
243
|
+
expect(client.subscriptions[0].errorCb).toBe(errorCb);
|
|
244
|
+
expect(client.subscriptions[0].quiet).toBe(false);
|
|
245
|
+
const obj = { source: 'bar baz', client_reference: 'id' };
|
|
246
|
+
server.send(JSON.stringify(obj));
|
|
247
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
248
|
+
expect(cb).toHaveBeenCalledWith(obj);
|
|
249
|
+
}));
|
|
250
|
+
test("doesn't duplicate subscriptions", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
251
|
+
// eslint-disable-next-line no-unused-vars
|
|
252
|
+
const client = new WebSocketAPI();
|
|
253
|
+
client.connect(`ws://foo:1234`);
|
|
254
|
+
yield server.connected;
|
|
255
|
+
const params = { channel: 'bar', args: ['baz'], id: 'id' };
|
|
256
|
+
const cb = jest.fn();
|
|
257
|
+
const errorCb = jest.fn();
|
|
258
|
+
client.subscribe(params, cb, errorCb, true);
|
|
259
|
+
client.subscribe(params, cb, errorCb, true);
|
|
260
|
+
expect(client.subscriptions.length).toBe(1);
|
|
261
|
+
const obj = { source: 'bar baz', client_reference: 'id' };
|
|
262
|
+
server.send(JSON.stringify(obj));
|
|
263
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
264
|
+
expect(cb).toHaveBeenCalledWith(obj);
|
|
265
|
+
}));
|
|
266
|
+
test('send GET and SUB requests.', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
267
|
+
// eslint-disable-next-line no-unused-vars
|
|
268
|
+
const client = new WebSocketAPI();
|
|
269
|
+
client.connect(`ws://foo:1234`);
|
|
270
|
+
client.send = jest.fn();
|
|
271
|
+
const params = { channel: 'bar', args: ['baz'], id: 'id' };
|
|
272
|
+
const cb = jest.fn();
|
|
273
|
+
const errorCb = jest.fn();
|
|
274
|
+
client.subscribe(params, cb, errorCb);
|
|
275
|
+
expect(client.send).toHaveBeenCalledTimes(2);
|
|
276
|
+
expect(client.send).toHaveBeenCalledWith('GET bar baz id');
|
|
277
|
+
expect(client.send).toHaveBeenCalledWith('SUB bar baz id');
|
|
278
|
+
client.send.mockRestore();
|
|
279
|
+
}));
|
|
280
|
+
test('should register callback without sending GET and SUB requests (quiet=true).', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
281
|
+
// eslint-disable-next-line no-unused-vars
|
|
282
|
+
const client = new WebSocketAPI();
|
|
283
|
+
client.connect(`ws://foo:1234`);
|
|
284
|
+
yield server.connected;
|
|
285
|
+
const params = { channel: 'bar', args: ['baz'], id: 'id' };
|
|
286
|
+
const cb = jest.fn();
|
|
287
|
+
const errorCb = jest.fn();
|
|
288
|
+
client.send = jest.fn();
|
|
289
|
+
client.subscribe(params, cb, errorCb, true);
|
|
290
|
+
expect(client.subscriptions.length).toBe(1);
|
|
291
|
+
expect(client.subscriptions[0].params).toBe(params);
|
|
292
|
+
expect(client.subscriptions[0].cb).toBe(cb);
|
|
293
|
+
expect(client.subscriptions[0].errorCb).toBe(errorCb);
|
|
294
|
+
expect(client.subscriptions[0].quiet).toBe(true);
|
|
295
|
+
expect(client.send).toBeCalledTimes(0);
|
|
296
|
+
client.send.mockRestore();
|
|
297
|
+
}));
|
|
298
|
+
});
|
|
299
|
+
describe('#unsubscribe', () => {
|
|
300
|
+
test('should only unsubscribe the subscription using the good cb', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
301
|
+
// eslint-disable-next-line no-unused-vars
|
|
302
|
+
const client = new WebSocketAPI();
|
|
303
|
+
client.connect(`ws://foo:1234`);
|
|
304
|
+
yield server.connected;
|
|
305
|
+
const params = { channel: 'foo', id: 'id' };
|
|
306
|
+
const cb = jest.fn();
|
|
307
|
+
const cb2 = jest.fn();
|
|
308
|
+
client.subscribe(params, cb);
|
|
309
|
+
client.subscribe(params, cb2);
|
|
310
|
+
expect(client.subscriptions.length).toBe(2);
|
|
311
|
+
expect(client.subscriptions[0].params).toBe(params);
|
|
312
|
+
expect(client.subscriptions[0].cb).toBe(cb);
|
|
313
|
+
expect(client.subscriptions[1].params).toBe(params);
|
|
314
|
+
expect(client.subscriptions[1].cb).toBe(cb2);
|
|
315
|
+
client.unsubscribe('foo', cb);
|
|
316
|
+
expect(client.subscriptions.length).toBe(1);
|
|
317
|
+
expect(cb).toHaveBeenCalledTimes(0);
|
|
318
|
+
expect(cb2).toHaveBeenCalledTimes(0);
|
|
319
|
+
const obj = { source: 'foo', client_reference: 'id' };
|
|
320
|
+
server.send(JSON.stringify(obj));
|
|
321
|
+
expect(cb2).toHaveBeenCalledTimes(1);
|
|
322
|
+
expect(cb).toHaveBeenCalledTimes(0);
|
|
323
|
+
}));
|
|
324
|
+
test('should unsubscribe all subscriptions related to a channel', () => {
|
|
325
|
+
// eslint-disable-next-line no-unused-vars
|
|
326
|
+
const client = new WebSocketAPI();
|
|
327
|
+
client.connect(`ws://foo:1234`);
|
|
328
|
+
client.websocket.removeEventListener = jest.fn();
|
|
329
|
+
client.websocket.addEventListener = jest.fn();
|
|
330
|
+
const params = { channel: 'foo' };
|
|
331
|
+
const params2 = { channel: 'bar' };
|
|
332
|
+
const cb = jest.fn();
|
|
333
|
+
const cb2 = jest.fn();
|
|
334
|
+
client.subscribe(params, cb);
|
|
335
|
+
client.subscribe(params, cb);
|
|
336
|
+
client.subscribe(params, cb);
|
|
337
|
+
client.subscribe(params, cb2);
|
|
338
|
+
client.subscribe(params2, cb2);
|
|
339
|
+
expect(client.subscriptions.length).toBe(3);
|
|
340
|
+
expect(client.websocket.removeEventListener).toBeCalledTimes(2);
|
|
341
|
+
expect(client.websocket.addEventListener.mock.calls.filter((c) => c[0] === 'message').length).toBe(5);
|
|
342
|
+
client.unsubscribe('foo');
|
|
343
|
+
expect(client.subscriptions.length).toBe(1);
|
|
344
|
+
expect(client.subscriptions[0].params).toBe(params2);
|
|
345
|
+
expect(client.subscriptions[0].cb).toBe(cb2);
|
|
346
|
+
});
|
|
347
|
+
test('send DEL when there is no more unquiet subscriptions on the channel', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
348
|
+
// eslint-disable-next-line no-unused-vars
|
|
349
|
+
const client = new WebSocketAPI();
|
|
350
|
+
client.connect(`ws://foo:1234`);
|
|
351
|
+
yield server.connected;
|
|
352
|
+
client.send = jest.fn();
|
|
353
|
+
client.websocket.removeEventListener = jest.fn();
|
|
354
|
+
client.websocket.addEventListener = jest.fn();
|
|
355
|
+
const params = { channel: 'foo' };
|
|
356
|
+
const cb = jest.fn();
|
|
357
|
+
client.subscribe(params, cb);
|
|
358
|
+
expect(client.send).toHaveBeenCalledWith('GET foo');
|
|
359
|
+
expect(client.send).toHaveBeenCalledWith('SUB foo');
|
|
360
|
+
client.unsubscribe('foo');
|
|
361
|
+
expect(client.send).toHaveBeenCalledWith('DEL foo');
|
|
362
|
+
}));
|
|
363
|
+
test("doesn't send DEL when we unsubscribe a quiet channel", () => {
|
|
364
|
+
// eslint-disable-next-line no-unused-vars
|
|
365
|
+
const client = new WebSocketAPI();
|
|
366
|
+
client.connect(`ws://foo:1234`);
|
|
367
|
+
client.send = jest.fn();
|
|
368
|
+
client.websocket.removeEventListener = jest.fn();
|
|
369
|
+
client.websocket.addEventListener = jest.fn();
|
|
370
|
+
const params = { channel: 'foo' };
|
|
371
|
+
const cb = jest.fn();
|
|
372
|
+
client.subscribe(params, cb, null, true);
|
|
373
|
+
expect(cb).toHaveBeenCalledTimes(0);
|
|
374
|
+
client.unsubscribe('foo');
|
|
375
|
+
expect(cb).toHaveBeenCalledTimes(0);
|
|
376
|
+
client.send.mockRestore();
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
});
|
|
@@ -21,11 +21,11 @@ declare class Control extends BaseObject {
|
|
|
21
21
|
* @param {function} [options.render] Render function called whenever the control needs to be rerendered.
|
|
22
22
|
*/
|
|
23
23
|
constructor(options?: {
|
|
24
|
-
active?: boolean;
|
|
25
|
-
element?: HTMLElement;
|
|
26
|
-
target?: HTMLElement;
|
|
27
|
-
render?: Function;
|
|
28
|
-
});
|
|
24
|
+
active?: boolean | undefined;
|
|
25
|
+
element?: HTMLElement | undefined;
|
|
26
|
+
target?: HTMLElement | undefined;
|
|
27
|
+
render?: Function | undefined;
|
|
28
|
+
} | undefined);
|
|
29
29
|
/**
|
|
30
30
|
* @ignore
|
|
31
31
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Control.d.ts","sourceRoot":"","sources":["../../../src/common/controls/Control.js"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AACH;IACE;;;;;;;;OAQG;IACH;
|
|
1
|
+
{"version":3,"file":"Control.d.ts","sourceRoot":"","sources":["../../../src/common/controls/Control.js"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AACH;IACE;;;;;;;;OAQG;IACH;;;;;mBAaC;IAJC;;OAEG;IACH,gBAAoB;IAGtB;;;;OAIG;IACH,yBAmEC;IAED;;OAEG;IACH,4BAEC;IADC,SAAc;IAGhB;;OAEG;IACH,sBAEC;IAED;;;OAGG;IACH,iBAEC;IAED;;;OAGG;IAEH,mBAAe;IAEf;;;;;OAKG;IACH,eAAW;IAEX;;;;;OAKG;IAEH,6BAAyB;CAC1B"}
|
|
@@ -1,32 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __assign = (this && this.__assign) || function () {
|
|
18
|
-
__assign = Object.assign || function(t) {
|
|
19
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
20
|
-
s = arguments[i];
|
|
21
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
22
|
-
t[p] = s[p];
|
|
23
|
-
}
|
|
24
|
-
return t;
|
|
25
|
-
};
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
var Object_1 = require("ol/Object");
|
|
1
|
+
import BaseObject from 'ol/Object';
|
|
30
2
|
/**
|
|
31
3
|
* A class representing a control to display on map.
|
|
32
4
|
*
|
|
@@ -38,8 +10,7 @@ var Object_1 = require("ol/Object");
|
|
|
38
10
|
* @classproperty {HTMLElement} element - The HTML element used to render the control.
|
|
39
11
|
* @classproperty {HTMLElement} target - The HTML element where to render the element property. Default is the map's element. Read only.
|
|
40
12
|
*/
|
|
41
|
-
|
|
42
|
-
__extends(Control, _super);
|
|
13
|
+
class Control extends BaseObject {
|
|
43
14
|
/**
|
|
44
15
|
* Constructor
|
|
45
16
|
*
|
|
@@ -49,66 +20,63 @@ var Control = /** @class */ (function (_super) {
|
|
|
49
20
|
* @param {HTMLElement} [options.target] The HTML element where to render the element property. Default is the map's element.
|
|
50
21
|
* @param {function} [options.render] Render function called whenever the control needs to be rerendered.
|
|
51
22
|
*/
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
var active = __assign({ active: options.active !== false }, options).active;
|
|
23
|
+
constructor(options = {}) {
|
|
24
|
+
super(options);
|
|
25
|
+
this.defineProperties(options);
|
|
26
|
+
const { active } = Object.assign({ active: options.active !== false }, options);
|
|
57
27
|
/**
|
|
58
28
|
* @ignore
|
|
59
29
|
*/
|
|
60
|
-
|
|
61
|
-
return _this;
|
|
30
|
+
this.active = active;
|
|
62
31
|
}
|
|
63
32
|
/**
|
|
64
33
|
* Define control's properties.
|
|
65
34
|
*
|
|
66
35
|
* @private
|
|
67
36
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
var _a = __assign({}, options), target = _a.target, element = _a.element, render = _a.render;
|
|
37
|
+
defineProperties(options) {
|
|
38
|
+
const { target, element, render } = Object.assign({}, options);
|
|
71
39
|
Object.defineProperties(this, {
|
|
72
40
|
active: {
|
|
73
|
-
get:
|
|
74
|
-
set:
|
|
75
|
-
|
|
41
|
+
get: () => this.get('active'),
|
|
42
|
+
set: (newActive) => {
|
|
43
|
+
this.set('active', newActive);
|
|
76
44
|
if (newActive) {
|
|
77
|
-
|
|
45
|
+
this.activate();
|
|
78
46
|
}
|
|
79
47
|
else {
|
|
80
|
-
|
|
48
|
+
this.deactivate();
|
|
81
49
|
}
|
|
82
|
-
|
|
50
|
+
this.render();
|
|
83
51
|
},
|
|
84
52
|
},
|
|
85
53
|
map: {
|
|
86
|
-
get:
|
|
87
|
-
set:
|
|
54
|
+
get: () => this.get('map'),
|
|
55
|
+
set: (map) => {
|
|
88
56
|
// Remove previous node.
|
|
89
|
-
if (
|
|
90
|
-
|
|
57
|
+
if (this.map && this.element && this.element.parentNode) {
|
|
58
|
+
this.element.parentNode.removeChild(this.element);
|
|
91
59
|
}
|
|
92
60
|
// Clean listeners
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (
|
|
61
|
+
this.deactivate();
|
|
62
|
+
this.set('map', map);
|
|
63
|
+
if (this.map) {
|
|
96
64
|
// Add new node
|
|
97
|
-
|
|
98
|
-
(
|
|
99
|
-
(
|
|
100
|
-
if (!
|
|
101
|
-
|
|
65
|
+
const targett = this.target ||
|
|
66
|
+
(this.map.getTargetElement && this.map.getTargetElement()) ||
|
|
67
|
+
(this.map.getContainer && this.map.getContainer());
|
|
68
|
+
if (!this.element) {
|
|
69
|
+
this.createDefaultElement();
|
|
102
70
|
}
|
|
103
|
-
if (
|
|
104
|
-
targett.appendChild(
|
|
71
|
+
if (this.element) {
|
|
72
|
+
targett.appendChild(this.element);
|
|
105
73
|
}
|
|
106
74
|
// Add listeners
|
|
107
|
-
if (
|
|
108
|
-
|
|
75
|
+
if (this.active) {
|
|
76
|
+
this.activate();
|
|
109
77
|
}
|
|
110
78
|
}
|
|
111
|
-
|
|
79
|
+
this.render();
|
|
112
80
|
},
|
|
113
81
|
},
|
|
114
82
|
target: {
|
|
@@ -124,39 +92,39 @@ var Control = /** @class */ (function (_super) {
|
|
|
124
92
|
writable: true,
|
|
125
93
|
},
|
|
126
94
|
});
|
|
127
|
-
}
|
|
95
|
+
}
|
|
128
96
|
/**
|
|
129
97
|
* Attach the control to the map. Add events, html element ...
|
|
130
98
|
*/
|
|
131
|
-
|
|
99
|
+
attachToMap(map) {
|
|
132
100
|
this.map = map;
|
|
133
|
-
}
|
|
101
|
+
}
|
|
134
102
|
/**
|
|
135
103
|
* Detach the control From the map. Remove events, html element ..
|
|
136
104
|
*/
|
|
137
|
-
|
|
105
|
+
detachFromMap() {
|
|
138
106
|
this.map = null;
|
|
139
|
-
}
|
|
107
|
+
}
|
|
140
108
|
/**
|
|
141
109
|
* Add listeners then renders the control.
|
|
142
110
|
* To be defined in inherited classes.
|
|
143
111
|
*/
|
|
144
|
-
|
|
112
|
+
activate() {
|
|
145
113
|
this.deactivate();
|
|
146
|
-
}
|
|
114
|
+
}
|
|
147
115
|
/**
|
|
148
116
|
* Remove listeners added by activate() function then renders the control.
|
|
149
117
|
* To be defined in inherited classes.
|
|
150
118
|
*/
|
|
151
119
|
// eslint-disable-next-line class-methods-use-this
|
|
152
|
-
|
|
120
|
+
deactivate() { }
|
|
153
121
|
/**
|
|
154
122
|
* The default render function. It renders content in the HTML element.
|
|
155
123
|
* To be defined in inherited classes.
|
|
156
124
|
*
|
|
157
125
|
* @private
|
|
158
126
|
*/
|
|
159
|
-
|
|
127
|
+
render() { }
|
|
160
128
|
/**
|
|
161
129
|
* The default element to display if this.element is not defined.
|
|
162
130
|
* To be defined in inherited classes.
|
|
@@ -164,7 +132,6 @@ var Control = /** @class */ (function (_super) {
|
|
|
164
132
|
* @private
|
|
165
133
|
*/
|
|
166
134
|
// eslint-disable-next-line class-methods-use-this
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
exports.default = Control;
|
|
135
|
+
createDefaultElement() { }
|
|
136
|
+
}
|
|
137
|
+
export default Control;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Control.test.d.ts","sourceRoot":"","sources":["../../../src/common/controls/Control.test.js"],"names":[],"mappings":""}
|