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.
Files changed (195) hide show
  1. package/README.md +14 -8
  2. package/api/RealtimeAPI.d.ts +6 -6
  3. package/api/RealtimeAPI.d.ts.map +1 -1
  4. package/api/RealtimeAPI.js +170 -197
  5. package/api/RealtimeAPI.test.d.ts +2 -0
  6. package/api/RealtimeAPI.test.d.ts.map +1 -0
  7. package/api/RealtimeAPI.test.js +67 -0
  8. package/api/RoutingAPI.d.ts +6 -2
  9. package/api/RoutingAPI.d.ts.map +1 -1
  10. package/api/RoutingAPI.js +8 -38
  11. package/api/RoutingAPI.test.d.ts +2 -0
  12. package/api/RoutingAPI.test.d.ts.map +1 -0
  13. package/api/RoutingAPI.test.js +29 -0
  14. package/api/StopsAPI.d.ts +1 -1
  15. package/api/StopsAPI.d.ts.map +1 -1
  16. package/api/StopsAPI.js +8 -40
  17. package/api/StopsAPI.test.d.ts +2 -0
  18. package/api/StopsAPI.test.d.ts.map +1 -0
  19. package/api/StopsAPI.test.js +26 -0
  20. package/api/index.d.ts +3 -4
  21. package/api/index.d.ts.map +1 -1
  22. package/api/index.js +3 -10
  23. package/api/typedefs.js +1 -0
  24. package/common/api/HttpAPI.d.ts +2 -2
  25. package/common/api/HttpAPI.d.ts.map +1 -1
  26. package/common/api/HttpAPI.js +21 -48
  27. package/common/api/HttpAPI.test.d.ts +2 -0
  28. package/common/api/HttpAPI.test.d.ts.map +1 -0
  29. package/common/api/HttpAPI.test.js +54 -0
  30. package/common/api/WebSocketAPI.d.ts +8 -4
  31. package/common/api/WebSocketAPI.d.ts.map +1 -1
  32. package/common/api/WebSocketAPI.js +125 -129
  33. package/common/api/WebSocketAPI.test.d.ts +2 -0
  34. package/common/api/WebSocketAPI.test.d.ts.map +1 -0
  35. package/common/api/WebSocketAPI.test.js +380 -0
  36. package/common/controls/Control.d.ts +5 -5
  37. package/common/controls/Control.d.ts.map +1 -1
  38. package/common/controls/Control.js +44 -77
  39. package/common/controls/Control.test.d.ts +2 -0
  40. package/common/controls/Control.test.d.ts.map +1 -0
  41. package/common/controls/Control.test.js +89 -0
  42. package/common/index.js +2 -18
  43. package/common/layers/Layer.d.ts +11 -11
  44. package/common/layers/Layer.d.ts.map +1 -1
  45. package/common/layers/Layer.js +70 -104
  46. package/common/layers/Layer.test.d.ts +2 -0
  47. package/common/layers/Layer.test.d.ts.map +1 -0
  48. package/common/layers/Layer.test.js +137 -0
  49. package/common/mixins/CopyrightMixin.js +23 -52
  50. package/common/mixins/MapboxLayerMixin.js +162 -204
  51. package/common/mixins/RealtimeLayerMixin.js +580 -635
  52. package/common/mixins/StopFinderMixin.d.ts +3 -3
  53. package/common/mixins/StopFinderMixin.d.ts.map +1 -1
  54. package/common/mixins/StopFinderMixin.js +115 -157
  55. package/common/mixins/UserInteractionsLayerMixin.js +142 -175
  56. package/common/mixins/UserInteractionsLayerMixin.test.d.ts +2 -0
  57. package/common/mixins/UserInteractionsLayerMixin.test.d.ts.map +1 -0
  58. package/common/mixins/UserInteractionsLayerMixin.test.js +214 -0
  59. package/common/styles/index.js +4 -24
  60. package/common/styles/realtimeDefaultStyle.d.ts.map +1 -1
  61. package/common/styles/realtimeDefaultStyle.js +67 -78
  62. package/common/styles/realtimeDelayStyle.js +4 -17
  63. package/common/styles/realtimeSimpleStyle.js +5 -7
  64. package/common/typedefs.js +1 -0
  65. package/common/utils/cleanStopTime.js +3 -5
  66. package/common/utils/compareDepartures.d.ts +1 -1
  67. package/common/utils/compareDepartures.d.ts.map +1 -1
  68. package/common/utils/compareDepartures.js +8 -11
  69. package/common/utils/createCanvas.js +3 -5
  70. package/common/utils/createTrackerFilters.d.ts +1 -1
  71. package/common/utils/createTrackerFilters.d.ts.map +1 -1
  72. package/common/utils/createTrackerFilters.js +22 -32
  73. package/common/utils/createTrackerFilters.test.d.ts +2 -0
  74. package/common/utils/createTrackerFilters.test.d.ts.map +1 -0
  75. package/common/utils/createTrackerFilters.test.js +79 -0
  76. package/common/utils/getLayersAsFlatArray.js +6 -8
  77. package/common/utils/getMapboxMapCopyrights.js +9 -11
  78. package/common/utils/getMapboxMapCopyrights.test.d.ts +2 -0
  79. package/common/utils/getMapboxMapCopyrights.test.d.ts.map +1 -0
  80. package/common/utils/getMapboxMapCopyrights.test.js +40 -0
  81. package/common/utils/getMapboxRender.js +12 -15
  82. package/common/utils/getMaplibreRender.js +10 -13
  83. package/common/utils/getRealtimeModeSuffix.js +2 -6
  84. package/common/utils/getUrlWithParams.js +5 -8
  85. package/common/utils/getVehiclePosition.js +20 -23
  86. package/common/utils/index.js +12 -37
  87. package/common/utils/removeDuplicate.d.ts +1 -1
  88. package/common/utils/removeDuplicate.d.ts.map +1 -1
  89. package/common/utils/removeDuplicate.js +6 -21
  90. package/common/utils/removeDuplicate.test.d.ts +2 -0
  91. package/common/utils/removeDuplicate.test.d.ts.map +1 -0
  92. package/common/utils/removeDuplicate.test.js +19 -0
  93. package/common/utils/renderTrajectories.js +31 -43
  94. package/common/utils/sortByDelay.js +4 -6
  95. package/common/utils/timeUtils.js +14 -24
  96. package/common/utils/timeUtils.test.d.ts +2 -0
  97. package/common/utils/timeUtils.test.d.ts.map +1 -0
  98. package/common/utils/timeUtils.test.js +10 -0
  99. package/common/utils/trackerConfig.js +27 -39
  100. package/common/utils/trackerConfig.test.d.ts +2 -0
  101. package/common/utils/trackerConfig.test.d.ts.map +1 -0
  102. package/common/utils/trackerConfig.test.js +23 -0
  103. package/iife.js +3 -5
  104. package/index.d.ts +4 -0
  105. package/index.js +9 -10
  106. package/mapbox/controls/CopyrightControl.d.ts +0 -1
  107. package/mapbox/controls/CopyrightControl.d.ts.map +1 -1
  108. package/mapbox/controls/CopyrightControl.js +18 -38
  109. package/mapbox/controls/index.js +1 -5
  110. package/mapbox/index.js +4 -20
  111. package/mapbox/layers/Layer.d.ts +1 -1
  112. package/mapbox/layers/Layer.d.ts.map +1 -1
  113. package/mapbox/layers/Layer.js +29 -71
  114. package/mapbox/layers/Layer.test.d.ts +2 -0
  115. package/mapbox/layers/Layer.test.d.ts.map +1 -0
  116. package/mapbox/layers/Layer.test.js +204 -0
  117. package/mapbox/layers/RealtimeLayer.d.ts +4 -4
  118. package/mapbox/layers/RealtimeLayer.d.ts.map +1 -1
  119. package/mapbox/layers/RealtimeLayer.js +83 -125
  120. package/mapbox/layers/RealtimeLayer.test.d.ts +2 -0
  121. package/mapbox/layers/RealtimeLayer.test.d.ts.map +1 -0
  122. package/mapbox/layers/RealtimeLayer.test.js +10 -0
  123. package/mapbox/layers/index.js +2 -7
  124. package/mapbox/utils.js +19 -33
  125. package/mbt.js +59 -37
  126. package/mbt.js.map +2 -2
  127. package/mbt.min.js +10 -10
  128. package/mbt.min.js.map +2 -2
  129. package/ol/controls/CopyrightControl.js +26 -47
  130. package/ol/controls/CopyrightControl.test.d.ts +2 -0
  131. package/ol/controls/CopyrightControl.test.d.ts.map +1 -0
  132. package/ol/controls/CopyrightControl.test.js +177 -0
  133. package/ol/controls/RoutingControl.d.ts +6 -5
  134. package/ol/controls/RoutingControl.d.ts.map +1 -1
  135. package/ol/controls/RoutingControl.js +209 -270
  136. package/ol/controls/RoutingControl.test.d.ts +2 -0
  137. package/ol/controls/RoutingControl.test.d.ts.map +1 -0
  138. package/ol/controls/RoutingControl.test.js +150 -0
  139. package/ol/controls/StopFinderControl.js +9 -32
  140. package/ol/controls/StopFinderControl.test.d.ts +2 -0
  141. package/ol/controls/StopFinderControl.test.d.ts.map +1 -0
  142. package/ol/controls/StopFinderControl.test.js +49 -0
  143. package/ol/controls/index.js +3 -9
  144. package/ol/index.js +5 -21
  145. package/ol/layers/Layer.d.ts +1 -1
  146. package/ol/layers/Layer.d.ts.map +1 -1
  147. package/ol/layers/Layer.js +40 -72
  148. package/ol/layers/Layer.test.d.ts +2 -0
  149. package/ol/layers/Layer.test.d.ts.map +1 -0
  150. package/ol/layers/Layer.test.js +196 -0
  151. package/ol/layers/MapboxLayer.d.ts +7 -7
  152. package/ol/layers/MapboxLayer.d.ts.map +1 -1
  153. package/ol/layers/MapboxLayer.js +30 -66
  154. package/ol/layers/MapboxLayer.test.d.ts +2 -0
  155. package/ol/layers/MapboxLayer.test.d.ts.map +1 -0
  156. package/ol/layers/MapboxLayer.test.js +164 -0
  157. package/ol/layers/MapboxStyleLayer.d.ts +3 -3
  158. package/ol/layers/MapboxStyleLayer.d.ts.map +1 -1
  159. package/ol/layers/MapboxStyleLayer.js +92 -135
  160. package/ol/layers/MapboxStyleLayer.test.d.ts +2 -0
  161. package/ol/layers/MapboxStyleLayer.test.d.ts.map +1 -0
  162. package/ol/layers/MapboxStyleLayer.test.js +232 -0
  163. package/ol/layers/MaplibreLayer.d.ts +1 -1
  164. package/ol/layers/MaplibreLayer.d.ts.map +1 -1
  165. package/ol/layers/MaplibreLayer.js +14 -48
  166. package/ol/layers/RealtimeLayer.d.ts +2 -2
  167. package/ol/layers/RealtimeLayer.d.ts.map +1 -1
  168. package/ol/layers/RealtimeLayer.js +111 -147
  169. package/ol/layers/RealtimeLayer.test.d.ts +2 -0
  170. package/ol/layers/RealtimeLayer.test.d.ts.map +1 -0
  171. package/ol/layers/RealtimeLayer.test.js +71 -0
  172. package/ol/layers/RoutingLayer.d.ts +2 -2
  173. package/ol/layers/RoutingLayer.d.ts.map +1 -1
  174. package/ol/layers/RoutingLayer.js +29 -61
  175. package/ol/layers/RoutingLayer.test.d.ts +2 -0
  176. package/ol/layers/RoutingLayer.test.d.ts.map +1 -0
  177. package/ol/layers/RoutingLayer.test.js +39 -0
  178. package/ol/layers/VectorLayer.d.ts +1 -1
  179. package/ol/layers/VectorLayer.d.ts.map +1 -1
  180. package/ol/layers/VectorLayer.js +14 -48
  181. package/ol/layers/VectorLayer.test.d.ts +2 -0
  182. package/ol/layers/VectorLayer.test.d.ts.map +1 -0
  183. package/ol/layers/VectorLayer.test.js +87 -0
  184. package/ol/layers/WMSLayer.d.ts +1 -1
  185. package/ol/layers/WMSLayer.d.ts.map +1 -1
  186. package/ol/layers/WMSLayer.js +34 -68
  187. package/ol/layers/WMSLayer.test.d.ts +2 -0
  188. package/ol/layers/WMSLayer.test.d.ts.map +1 -0
  189. package/ol/layers/WMSLayer.test.js +66 -0
  190. package/ol/layers/index.js +8 -19
  191. package/ol/styles/fullTrajectoryDelayStyle.js +11 -13
  192. package/ol/styles/fullTrajectoryStyle.js +16 -18
  193. package/ol/styles/index.js +2 -7
  194. package/package.json +5 -2
  195. 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;QAL6B,MAAM,GAAxB,OAAO;QACe,OAAO,GAA7B,WAAW;QACW,MAAM,GAA5B,WAAW;QACQ,MAAM;OAenC;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
+ {"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
- "use strict";
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
- var Control = /** @class */ (function (_super) {
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
- function Control(options) {
53
- if (options === void 0) { options = {}; }
54
- var _this = _super.call(this, options) || this;
55
- _this.defineProperties(options);
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
- _this.active = active;
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
- Control.prototype.defineProperties = function (options) {
69
- var _this = this;
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: function () { return _this.get('active'); },
74
- set: function (newActive) {
75
- _this.set('active', newActive);
41
+ get: () => this.get('active'),
42
+ set: (newActive) => {
43
+ this.set('active', newActive);
76
44
  if (newActive) {
77
- _this.activate();
45
+ this.activate();
78
46
  }
79
47
  else {
80
- _this.deactivate();
48
+ this.deactivate();
81
49
  }
82
- _this.render();
50
+ this.render();
83
51
  },
84
52
  },
85
53
  map: {
86
- get: function () { return _this.get('map'); },
87
- set: function (map) {
54
+ get: () => this.get('map'),
55
+ set: (map) => {
88
56
  // Remove previous node.
89
- if (_this.map && _this.element && _this.element.parentNode) {
90
- _this.element.parentNode.removeChild(_this.element);
57
+ if (this.map && this.element && this.element.parentNode) {
58
+ this.element.parentNode.removeChild(this.element);
91
59
  }
92
60
  // Clean listeners
93
- _this.deactivate();
94
- _this.set('map', map);
95
- if (_this.map) {
61
+ this.deactivate();
62
+ this.set('map', map);
63
+ if (this.map) {
96
64
  // Add new node
97
- var targett = _this.target ||
98
- (_this.map.getTargetElement && _this.map.getTargetElement()) ||
99
- (_this.map.getContainer && _this.map.getContainer());
100
- if (!_this.element) {
101
- _this.createDefaultElement();
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 (_this.element) {
104
- targett.appendChild(_this.element);
71
+ if (this.element) {
72
+ targett.appendChild(this.element);
105
73
  }
106
74
  // Add listeners
107
- if (_this.active) {
108
- _this.activate();
75
+ if (this.active) {
76
+ this.activate();
109
77
  }
110
78
  }
111
- _this.render();
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
- Control.prototype.attachToMap = function (map) {
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
- Control.prototype.detachFromMap = function () {
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
- Control.prototype.activate = function () {
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
- Control.prototype.deactivate = function () { };
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
- Control.prototype.render = function () { };
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
- Control.prototype.createDefaultElement = function () { };
168
- return Control;
169
- }(Object_1.default));
170
- exports.default = Control;
135
+ createDefaultElement() { }
136
+ }
137
+ export default Control;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Control.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Control.test.d.ts","sourceRoot":"","sources":["../../../src/common/controls/Control.test.js"],"names":[],"mappings":""}