1var GoSuiteSocket = (function () { 2 var socket = new WebSocket('wss://socket.go-suite.com/ws'); 3 var eventsHandlers = {}; 4 var subscriptions = []; 5 var subscriptionsBeforeOpenSocket = []; 6 var isOpen = false; 7 8 function on(event, cb) { 9 if (event === 'open' && isOpen) { 10 cb(); 11 return; 12 } 13 14 if (!eventsHandlers[event]) { 15 eventsHandlers[event] = []; 16 } 17 18 eventsHandlers[event].push(cb); 19 20 return GoSuiteSocket; 21 } 22 23 function off(event, cb) { 24 eventsHandlers[event] = (eventsHandlers[event] || []).filter(function (registeredCb) { 25 return cb !== registeredCb; 26 }); 27 28 return GoSuiteSocket; 29 } 30 31 function send(requestType, data) { 32 data.request = requestType; 33 socket.send(JSON.stringify(data)); 34 35 return GoSuiteSocket; 36 } 37 38 function _subscribe(channels) { 39 send('subscribe', { to: channels }); 40 } 41 42 function subscribe(channels) { 43 if (!isOpen) { 44 subscriptionsBeforeOpenSocket.push(channels); 45 return; 46 } 47 48 if (!Array.isArray(channels)) { 49 channels = [channels]; 50 } 51 52 var subscribeTo = channels.filter(function (ch) { 53 return subscriptions.indexOf(ch) === -1; 54 }); 55 56 subscribeTo.forEach(function (ch) { 57 subscriptions.push(ch); 58 }); 59 60 _subscribe(subscribeTo); 61 62 return GoSuiteSocket; 63 } 64 65 function _unsubscribe(channels) { 66 send('unsubscribe', { from: channels }); 67 } 68 69 function unsubscribe(channels) { 70 if (!Array.isArray(channels)) { 71 channels = [channels]; 72 } 73 74 channels.forEach(function (c) { 75 subscriptions = subscriptions.filter(function (ch) { 76 return ch !== c; 77 }); 78 }); 79 80 _unsubscribe(channels); 81 82 return GoSuiteSocket; 83 } 84 85 socket.onopen = function () { 86 isOpen = true; 87 88 if (subscriptionsBeforeOpenSocket.length) { 89 subscriptionsBeforeOpenSocket.forEach(function (tempSub) { 90 subscribe(tempSub); 91 }); 92 subscriptionsBeforeOpenSocket = []; 93 } 94 95 (eventsHandlers['open'] || []).forEach(function (cb) { 96 cb(); 97 }); 98 }; 99 100 socket.onmessage = function (e) { 101 try { 102 var data = JSON.parse(e.data || null); 103 (eventsHandlers['message'] || []).forEach(function (cb) { 104 cb(data); 105 }); 106 107 var rq = data && data.request; 108 (eventsHandlers[rq] || []).forEach(function (cb) { 109 cb(data); 110 }); 111 112 } catch (err) { 113 (eventsHandlers['error'] || []).forEach(function (cb) { 114 cb(err); 115 }); 116 } 117 }; 118 119 socket.onclose = function () { 120 (eventsHandlers['close'] || []).forEach(function (cb) { 121 cb(); 122 }); 123 }; 124 125 socket.onerror = function (err) { 126 (eventsHandlers['error'] || []).forEach(function (cb) { 127 cb(err); 128 }); 129 }; 130 131 return { 132 on: on, 133 off: off, 134 subscribe: subscribe, 135 unsubscribe: unsubscribe, 136 send: send 137 }; 138})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.