/*!
 * @namespace usocket
 * @description gerencia conexão e mensagens do serviço WebSocket UOL
 * @version 2.8.9
 * @author uolconteudo-projetos
 */
!function(e){"object"!=typeof e.usocket&&(e.usocket=function(e){var n=function(){},o=navigator.userAgent,t=void 0!==e.WebSocket&&3===e.WebSocket.CLOSED;!0===/Android (4.[0123]|2.\d)/.test(o)&&!1===/ Chrome\//.test(o)&&(t=!1);var r={},c="rtw.uol.com",i=!1,a=1e3,s=1e4,l=1006,u={},f=[],d=null,h=null,p=+new Date,m=null,v=function(e){return Object.keys(e).map(function(n){return e[n]})},g=function(){if(+new Date-p>=45e3&&d&&!0!==d.isFake&&(r.send(""),p=+new Date),!1===r.isConnected()&&d)return d.onerror({code:"TIMEOUT"}),!1;h=setTimeout(g,5e3)},b=function(n,o){return new Promise(function(t,r){var c=o.callbackName||"callback",i=o.charset||"UTF-8",a=o.timeout||1e4;if(n){timeout_trigger=e.setTimeout(function(){r()},a);var s=document.createElement("script");s.type="text/javascript",s.async=!0,s.charset=i,s.src=n,s.onerror=r;var l=document.getElementsByTagName("head")[0],u=l.appendChild(s);e[c]=function(n){e.clearTimeout(timeout_trigger);for(var o=e.UOLWebSocketCollection,r=0;r<o.length;r++)o[r].call(null,n);t(),l.removeChild(u)}}else r()})},C=function(e,n,o){var t=[];o?u[o]&&t.push(u[o]):t=t.concat(v(u));for(var r=0,c=t.length;r<c;r++)void 0!==t[r]&&"function"==typeof t[r].pub&&t[r].pub(e,n)},k=function(e){if(null!==d){var n=[];if(e){if(u[e]&&n.push(u[e]),!0===d.isFake)return d.removeChannels(e),!0}else n=n.concat(v(u));for(var o=0,t=n.length;o<t;o++)n[o].off(),delete u[n[o].channelName]}},N=function(){k(),clearTimeout(h),d&&(d.onmessage=null,d.onclose=null,d.onerror=null,d=null)},O=function(e){e=e||"",null===d||4===d.readyState?((d=!0===t&&!1===i?new WebSocket("wss://"+c+"/sub?id="+e):new function(e){console.log(":: INIT FakeWebSocket ::");var n,o=1,t=0,c=0,i={url:e,channels:[],channelsUpdated:{},openDelay:100},a={URL:e,CONNECTING:0,OPEN:o,CLOSING:2,CLOSED:3,isFake:!0,removeChannels:function(e){if(e)i.channels=i.channels.filter(function(n){return n!==e}),delete i.channelsUpdated[e],delete u[e];else for(var n;n=i.channels.pop();)delete i.channelsUpdated[n],delete u[n]},channel:"",setLastModified:function(e){i.channelsUpdated[this.channel]=e},readyState:0,reconnect:function(e,n){!n||"function"==typeof n&&!0===n.call(i)?(clearTimeout(t),t=setTimeout(f,e)):a.close(!1);return!0},send:function(e){var n=e.match(/^unsubscribe:(.+)/);n?r.onmessage('{"unsubscribed":"'+n[1]+'"}'):i.channels.push(e)},close:function(e){this.readyState=2,clearTimeout(n),clearTimeout(t),this.readyState=3,!1!==e?a.onclose("error",{code:l}):d=null},onopen:function(){},onmessage:function(){},onerror:function(){},onclose:function(){}};function f(e){var n;if(e?n=e:(a.channel=function(){c>=i.channels.length&&(c=0);return i.channels[c++]}(),n=a.channel),0===i.channels.length)return a.onclose("error",{code:l});b(i.url+"?id="+n+"&ifmod="+(i.channelsUpdated[n]||0)+"&ts="+ +new Date,{callbackName:"UOLWebSocketCallback",timeout:s,charset:"UTF-8"}).then(a.onopen).catch(function(){a&&a.onclose&&a.onclose("error",{code:l})})}return h=function(e){var n=e.match(/id=([^&]+)$/);if(null===n)return!1;return i.channels.push(n[1]),i.url=e.replace("wss:","https:").replace(/\?.*/,""),!0}(e),n=setTimeout(function(){!0===h?(a.readyState=o,a.onopen(),i.channels.length&&f()):a.onclose("error",{code:l})},i.openDelay),a;}("wss://"+c+"/sub?id="+e)).reconnect||(d.reconnect=n),d.onopen=function(e){S(),g(),C("open",e)},d.onmessage=r.onmessage,d.onerror=function(e){C("error",e),e.invalidChannel||N()},d.onclose=function(e,n){var o=e&&e.code||n&&n.code||0;o===l||1001===o?C("error",e):!1!==e.triggerClose&&C("close",e),N()}):!0===r.isConnected()?d.send(e):S(e)},S=function(e){if("string"==typeof e)f.push(e);else for(var n;n=f.shift();)d.send(n)},y=function(e){if(u[e])return u[e];if(this instanceof y==!1)return new y(e);var n={message:[],close:[],error:[],lost:[],open:[]};this.channelName=e;var o={};return this.data=function(e){return void 0===e?o:o=e},this.on=function(e,o){if(n[e]){var t;for(t in n[e])if(!0===n[e].hasOwnProperty(t)&&n[e][t]===o)return this;n[e].push(o)}return this},this.off=function(e,o){var t,r;if(e){var c=n[e];if(c)for(t=0,r=c.length;t<r;t++)(o&&c[t]===o||!o)&&(c[t]=null)}else for(t in n)if(!0===n.hasOwnProperty(t))for(;n[t].pop(););return this},this.close=function(){return!0===r.isConnected()&&(this.client_solicitation=!0,d.send("unsubscribe:"+e)),this},this.pub=function(e,o){for(var t=n[e],r=0,c=t.length;r<c;r++)t[r].call(this,o)},O(e),this};return r.version="2.8.9",r.CONFIG_CHANGES="CONFIG_CHANGES",r.connect=function(e){return u[e]=new y(e),u[e]},r.disconnect=function(e){return d&&d.close(1e3,e||"NORMAL"),r},r.isConnected=function(){return!(!d||d.readyState!==d.OPEN)},r.send=function(e){return!0===this.isConnected()&&d.send(e),this},r.lastMessageTime=function(){return new Date(p)},r.onmessage=function(e){if(!e)return d.reconnect(a);if(!1===r.isConnected())return!1;var n=d.isFake?e:e.data;if(void 0===n)return d.reconnect(a);try{"object"!=typeof n&&(n=JSON.parse(n))}catch(e){return d.reconnect(1e4),C("error",{error:"INVALID_JSON"}),console.error("mensagem precisa ser um JSON válido",n)}if(n.invalidChannel)return C("error",n,n.invalidChannel),k(n.invalidChannel),d&&!0===d.isFake&&d.reconnect(a,function(){return this.channels.length>0}),console.log("invalidChannel: ",n.invalidChannel);if(n.unsubscribed)return C("close",n,n.unsubscribed),k(n.unsubscribed),d.reconnect(200);if(!n.channelName)return d.reconnect(1e4),C("error",{error:"NO_CHANNEL_NAME"}),console.error('json precisa do atributo "channelName"',n);if(!n.lastModified)return d.reconnect(1e4),C("error",{error:"NO_LAST_MODIFIED"}),console.error('json precisa do atributo "lastModified"',n);if(void 0===u[n.channelName])return!1;var o=u[n.channelName].data().lastModified;void 0!==o&&n.prevModified!==o&&C("lost",{error:"LOST_DATA"}),u[n.channelName].data(n),p=+new Date,C("message",n,n.channelName),!0===d.isFake&&(d.setLastModified(n.lastModified),d.reconnect(200))},r.config=function(e){var n,o={domain:c,forcePolling:i,pollingDelay:a,channels:u,connection:d};if(void 0===e)return o;if("string"==typeof e)return o[e];if(!0===e.parasite&&null!==m)return!1;if(!0===r.isConnected())return console.log("usocket.confg()\tAs configurações só são aplicadas quando não há conexão estabelecida."),!1;for(n in m=e,e)if(!0===e.hasOwnProperty(n)){var t=e[n];switch(n){case"domain":c=t;break;case"forcePolling":i=t;break;case"pollingDelay":a=t}}return!0},r.polling=function(e,o,t,r){if(void 0!==u[e]&&void 0===r)return console.error("Não é possível fazer polling em canal com conexão WebSocket ativa.");o=o||n;var i=function(n){if(n.channelName===e||n.invalidChannel===e){o.apply(t,[n.hasOwnProperty("invalidChannel"),n]);for(var r=0,c=UOLWebSocketCollection.length;r<c;r++)UOLWebSocketCollection[r]===i&&(UOLWebSocketCollection.splice(r,1),i=null)}};UOLWebSocketCollection.push(i),b("https://"+c+"/sub?id="+e+"&ifmod=0&ts="+ +new Date,{callbackName:"UOLWebSocketCallback",charset:"UTF-8"})},(e.UOLWebSocketCollection=e.UOLWebSocketCollection||[]).push(r.onmessage),r}(e)),"function"==typeof define&&define.amd&&define("usocket",[],function(){return usocket}),"undefined"!=typeof angular&&angular.module("usocket",[]).factory("usocket",[function(){return usocket}])}(window);