@qikdev/sdk 0.1.169 → 0.1.180

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 (71) hide show
  1. package/.gitlab-ci.yml +24 -0
  2. package/dist/main.js +1 -1
  3. package/jsdoc.conf +10 -0
  4. package/package.json +5 -24
  5. package/public/docs/access.html +3826 -0
  6. package/public/docs/api.html +1356 -0
  7. package/public/docs/auth.html +2180 -0
  8. package/public/docs/cache.html +351 -0
  9. package/public/docs/content.html +2560 -0
  10. package/public/docs/files.html +779 -0
  11. package/public/docs/filter.html +1355 -0
  12. package/public/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  13. package/public/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  14. package/public/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  15. package/public/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  16. package/public/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  17. package/public/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  18. package/public/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  19. package/public/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  20. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  21. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  22. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  23. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  24. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  25. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  26. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  27. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  28. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  29. package/public/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  30. package/public/docs/index.html +96 -0
  31. package/public/docs/qik.access.js.html +790 -0
  32. package/public/docs/qik.api.js.html +511 -0
  33. package/public/docs/qik.auth.js.html +1006 -0
  34. package/public/docs/qik.cache.js.html +131 -0
  35. package/public/docs/qik.content.js.html +918 -0
  36. package/public/docs/qik.core.js.html +301 -0
  37. package/public/docs/qik.files.js.html +219 -0
  38. package/public/docs/qik.filter.js.html +611 -0
  39. package/public/docs/qik.socket.js.html +416 -0
  40. package/public/docs/qik.system.js.html +117 -0
  41. package/public/docs/qik.utils.js.html +1467 -0
  42. package/public/docs/scripts/collapse.js +20 -0
  43. package/public/docs/scripts/linenumber.js +25 -0
  44. package/public/docs/scripts/nav.js +12 -0
  45. package/public/docs/scripts/polyfill.js +4 -0
  46. package/public/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  47. package/public/docs/scripts/prettify/lang-css.js +2 -0
  48. package/public/docs/scripts/prettify/prettify.js +28 -0
  49. package/public/docs/scripts/search.js +83 -0
  50. package/public/docs/socket.html +810 -0
  51. package/public/docs/styles/jsdoc.css +765 -0
  52. package/public/docs/styles/prettify.css +79 -0
  53. package/public/docs/system.html +197 -0
  54. package/src/api/qik.access.js +790 -0
  55. package/src/api/qik.api.js +431 -0
  56. package/src/api/qik.auth.js +938 -0
  57. package/src/api/qik.cache.js +63 -0
  58. package/src/api/qik.content.js +858 -0
  59. package/src/api/qik.core.js +246 -0
  60. package/src/api/qik.files.js +150 -0
  61. package/src/api/qik.filter.js +543 -0
  62. package/src/api/qik.geo.js +895 -0
  63. package/src/api/qik.socket.js +348 -0
  64. package/src/api/qik.system.js +49 -0
  65. package/src/api/qik.utils.js +1410 -0
  66. package/src/index.js +20 -0
  67. package/src/version.js +1 -0
  68. package/test/index.spec.js +41 -0
  69. package/test/mocha.opts +0 -0
  70. package/dist/sdk.js +0 -2
  71. package/dist/sdk.js.LICENSE.txt +0 -8
@@ -0,0 +1,348 @@
1
+ import { EventDispatcher } from './qik.utils.js';
2
+
3
+ ///////////////////////////////////////////////////
4
+
5
+ /**
6
+ * Creates a new instance of QikSocket a module of the SDK
7
+ * that contains all helper functions to do with realtime sockets
8
+ * @name socket
9
+ * @constructor
10
+ * @hideconstructor
11
+ * @param {QikAPI} qik A reference to the parent instance of the QikCore module. This module is usually created by a QikCore instance that passes itself in as the first argument.
12
+ */
13
+
14
+ const QikSocket = function(qik, mode) {
15
+
16
+ mode = mode || 'production';
17
+
18
+ if (!qik.auth) {
19
+ throw new Error(`Can't Instantiate QikSocket before QikAuth exists`);
20
+ }
21
+
22
+
23
+ const windowID = qik.utils.guid();
24
+
25
+ ///////////////////////////////////////////////////
26
+
27
+ let service = {
28
+ debug: false,
29
+ url: `wss://iqtm6zjz3l.execute-api.ap-southeast-2.amazonaws.com/${mode}`,
30
+ connected: false,
31
+ windowID,
32
+ autoreconnect:true,
33
+ }
34
+
35
+ let socket;
36
+ let timer;
37
+ let buckets = {};
38
+ const channels = {};
39
+
40
+
41
+
42
+ //Create a new dispatcher
43
+ const dispatcher = new EventDispatcher();
44
+ dispatcher.bootstrap(service);
45
+
46
+ ///////////////////////////////////////////////////
47
+
48
+ function getSubscriptions() {
49
+ return Object.keys(buckets);
50
+ }
51
+
52
+ ///////////////////////////////////////////////////
53
+
54
+
55
+ /**
56
+ * @description Create an event dispatcher instance and subscribe to a new socket channel.
57
+ * This can then be used to receive socket events for this channel
58
+ * @alias socket.channel
59
+ * @param {String} key The key or name of the channel to subscribe to
60
+ * @example
61
+ * const socketChannel = await sdk.socket.channel('awesome:notifications')
62
+ * socketChannel.addEventListener('message', function(message) {
63
+ * console.log('Received a new message from the socket')
64
+ * })
65
+ *
66
+ * // Disconnect from this channel and remove all listeners
67
+ * socketChannel.destroy();
68
+ *
69
+ */
70
+ service.channel = async function(key) {
71
+ if (buckets[key]) {
72
+ return buckets[key];
73
+ }
74
+
75
+ const bucket = new EventDispatcher();
76
+ buckets[key] = bucket;
77
+
78
+ if (!service.connected) {
79
+ // Return the socket
80
+ await service.connect();
81
+ }
82
+
83
+ // Subscribe to this channel
84
+ service.subscribe(key);
85
+
86
+ // Listen for all relevant events
87
+ service.addEventListener(key, dispatchMessage);
88
+
89
+ function dispatchMessage(message) {
90
+ bucket.dispatch('message', message);
91
+ }
92
+
93
+ // Destroy the service
94
+ bucket.destroy = function() {
95
+ service.removeAllListeners();
96
+ buckets[key] = null;
97
+ }
98
+
99
+ return buckets[key];
100
+ }
101
+
102
+ ///////////////////////////////////////////////////
103
+
104
+ function ping() {
105
+ broadcast({
106
+ action: 'ping',
107
+ })
108
+ }
109
+
110
+ function startHeartbeat() {
111
+ if (timer) {
112
+ return;
113
+ }
114
+ timer = setInterval(ping, 10000);
115
+ }
116
+
117
+ function stopHeartbeat() {
118
+ if (!timer) {
119
+ return;
120
+ }
121
+
122
+ clearInterval(timer)
123
+ timer = null;
124
+ }
125
+
126
+ ///////////////////////////////////////////////////
127
+
128
+ function socketOpened(event) {
129
+ service.debug ? console.log("[socket] Connection open", event) : null;
130
+ service.connected = true;
131
+
132
+ dispatcher.dispatch('connected', event);
133
+
134
+ // startHeartbeat();
135
+ }
136
+
137
+ async function socketClosed(event) {
138
+ if (event.wasClean) {
139
+ service.debug ? console.log(`[socket] Connection closed cleanly, code=${event.code} reason=${event.reason}`) : null;
140
+ } else {
141
+ // e.g. server process killed or network down
142
+ // event.code is usually 1006 in this case
143
+ service.debug ? console.log('[socket] - connection closed due to error', event) : null
144
+ }
145
+
146
+ service.connected = false;
147
+ dispatcher.dispatch('disconnected', event);
148
+ socket = null;
149
+
150
+ if(service.autoreconnect) {
151
+ service.reconnect();
152
+ }
153
+ }
154
+
155
+ function socketError(error) {
156
+ console.log('[event] socketError', event);
157
+ service.debug ? console.log("[socket] Error", error) : null;
158
+ dispatcher.dispatch('error', error);
159
+ }
160
+
161
+ function socketMessageReceived(event) {
162
+ const eventData = JSON.parse(event.data);
163
+ service.debug ? console.log("[socket] message received", eventData) : null;
164
+
165
+ // Dispatch a generic message
166
+ dispatcher.dispatch('message', eventData);
167
+
168
+ if (eventData.channel) {
169
+ dispatcher.dispatch(eventData.channel, eventData);
170
+ }
171
+ }
172
+
173
+ async function broadcast(data) {
174
+ socket.send(JSON.stringify(data));
175
+ }
176
+
177
+ ///////////////////////////////////////////////////
178
+
179
+ function wait() {
180
+ return new Promise(function(resolve) {
181
+ function check() {
182
+ if (service.connected) {
183
+ return resolve(socket);
184
+ }
185
+
186
+ setTimeout(check, 1000);
187
+ }
188
+
189
+ check();
190
+ })
191
+ }
192
+
193
+ ///////////////////////////////////////////////////
194
+
195
+ /**
196
+ * @description Connect to the socket service
197
+ * @alias socket.connect
198
+ * @example
199
+ * const connected = await sdk.socket.connect()
200
+ *
201
+ */
202
+ service.connect = async function() {
203
+ if (socket) {
204
+
205
+ if (!socket.connected) {
206
+ return wait();
207
+ }
208
+
209
+ console.log('[socket] - Socket is already connected');
210
+ return socket;
211
+ }
212
+
213
+ const accessToken = qik.auth.getCurrentToken();
214
+
215
+ if (!accessToken) {
216
+ service.debug ? console.log('[socket] - Must be authenticated to connect to socket') : null;
217
+ return;
218
+ }
219
+
220
+ socket = new WebSocket(`${service.url}?access_token=${accessToken}&windowid=${windowID}`);
221
+ socket.addEventListener('close', socketClosed);
222
+ socket.addEventListener('error', socketError);
223
+ socket.addEventListener('open', socketOpened);
224
+ socket.addEventListener('message', socketMessageReceived);
225
+ service.debug ? console.log('[socket] - Connected with event listeners') : null;
226
+
227
+ return wait();
228
+ }
229
+
230
+
231
+ /**
232
+ * @description Reconnect to the socket service
233
+ * @alias socket.reconnect
234
+ * @example
235
+ * const connected = await sdk.socket.reconnect()
236
+ *
237
+ */
238
+ service.reconnect = async function() {
239
+ if(service.connected) {
240
+ return;
241
+ }
242
+
243
+ service.debug ? console.log(`[socket] reconnecting...`) : null;
244
+
245
+ // Reconnect all listeners
246
+ const result = await service.connect();
247
+
248
+ // Resubscribe to all previously connected channels
249
+ const subscribedChannels = Object.keys(channels);
250
+ subscribedChannels.forEach(function(channel) {
251
+ service.subscribe(channel);
252
+ })
253
+
254
+ return result;
255
+ }
256
+
257
+
258
+ ///////////////////////////////////////////////////
259
+
260
+ /**
261
+ * @description Close the connection to the socket service
262
+ * @alias socket.close
263
+ * @example
264
+ * const closed = await sdk.socket.close()
265
+ *
266
+ */
267
+ service.close = async function() {
268
+ if (!socket) {
269
+ console.log('[socket] - Socket is not connected');
270
+ return;
271
+ }
272
+
273
+ const previousSetting = service.autoreconnect;
274
+ service.autoreconnect = false;
275
+ socket.close();
276
+ socket.removeEventListener('close', socketClosed);
277
+ socket.removeEventListener('error', socketError);
278
+ socket.removeEventListener('open', socketOpened);
279
+ socket.removeEventListener('message', socketMessageReceived);
280
+ socket = null;
281
+ socketClosed({ wasClean: true });
282
+ service.autoreconnect = previousSetting;
283
+ }
284
+
285
+ service.disconnect = service.close;
286
+
287
+ ///////////////////////////////////////////////////
288
+
289
+ /**
290
+ * @description Subscribe to a socket channel
291
+ * @alias socket.subscribe
292
+ * @param {String} key The name of the channel to subscribe to
293
+ * @example
294
+ * const subscribed = await sdk.socket.subscribe('some:cool:alert')
295
+ *
296
+ */
297
+ service.subscribe = async function(channel) {
298
+ if (!socket) {
299
+ console.log(`[socket] - Can't subscribe to channel as socket is not connected`);
300
+ return;
301
+ }
302
+
303
+ broadcast({
304
+ action: 'subscribe',
305
+ channel,
306
+ })
307
+
308
+ channels[channel] = true;
309
+
310
+ dispatcher.dispatch('subscribe', channel)
311
+ service.debug ? console.log(`[socket] - subscribed to ${channel}`) : null;
312
+ }
313
+
314
+ ///////////////////////////////////////////////////
315
+
316
+ /**
317
+ * @description Unsubscribe from a socket channel
318
+ * @alias socket.unsubscribe
319
+ * @param {String} key The name of the channel to unsubscribe from
320
+ * @example
321
+ * const unsubscribed = await sdk.socket.unsubscribe('some:cool:alert')
322
+ *
323
+ */
324
+ service.unsubscribe = async function(channel) {
325
+ if (!socket) {
326
+ console.log(`[socket] - Can't unsubscribe from channel as socket is not connected`);
327
+ return;
328
+ }
329
+
330
+ broadcast({
331
+ action: 'unsubscribe',
332
+ channel,
333
+ })
334
+
335
+ delete channels[channel];
336
+
337
+ dispatcher.dispatch('unsubscribe', channel)
338
+ service.debug ? console.log(`[socket] - unsubscribed from ${channel}`) : null;
339
+ }
340
+
341
+ ///////////////////////////////////////////////////
342
+
343
+ return service;
344
+
345
+ }
346
+
347
+
348
+ export default QikSocket;
@@ -0,0 +1,49 @@
1
+ ///////////////////////////////////////////////////
2
+
3
+ /**
4
+ * Creates a new QikSystem instance.
5
+ * This module provides a number of helper functions for the system
6
+ * @alias system
7
+ * @constructor
8
+ * @hideconstructor
9
+ * @param {QikCore} qik A reference to the parent instance of the QikCore module. This module is usually created by a QikCore instance that passes itself in as the first argument.
10
+ */
11
+ export default function(qik) {
12
+
13
+ ///////////////////////////////////////////////////
14
+
15
+ var service = {}
16
+
17
+
18
+ ///////////////////////////////////////////////////////////////////////////////
19
+
20
+ var inflightCountries;
21
+
22
+ /**
23
+ * @alias system.countries
24
+ * @description Helper function for retrieving a full list of all countries, their ISO codes
25
+ * and phone number prefixes. Helpful for populating dropdown lists.
26
+ * @example
27
+ * const countries = await sdk.system.countries()
28
+ */
29
+ service.countries = async function() {
30
+
31
+ if (!inflightCountries) {
32
+
33
+ inflightCountries = new Promise(async function(resolve, reject) {
34
+ qik.api.get(`/system/countries`)
35
+ .then(function(res) {
36
+ return resolve(res.data);
37
+ })
38
+ .catch(reject);
39
+ })
40
+ }
41
+
42
+ return inflightCountries;
43
+ }
44
+
45
+ ///////////////////////////////////////////////////
46
+
47
+ return service;
48
+
49
+ }