{"version":3,"sources":["WebSocketConnectionHub.js"],"names":["Space1","WebSocketConnection","constructor","options","this","STATUS","DISCONNECTED","CONNECTED","RECONNECT_TIMEOUT","_webSocket","_url","_accessToken","_log","_onConnectedCallback","_onDisconnectedCallback","_onCallRequestedCallback","_onCallCancelledCallback","_onCallResponseCallback","_onErrorCallback","_virtualCollaborationObject","_status","_uuid","_isAwaitingResponse","_disablePersistance","disablePersistance","window","addEventListener","disconnect","isConnected","isDisconnected","isAwaitingResponse","init","url","logEnabled","token","_parseUrl","parseInt","sessionStorage","getItem","connect","setAccessToken","reconnect","console","log","setTimeout","persist","self","href","_getWsEndpoint","wsUrl","WebSocket","uuid","_generateUUID","onopen","authMessage","action","send","JSON","stringify","onmessage","evt","close","received","parse","data","callerUserId","callerDisplayName","roomName","sessionId","parameters","receivingUserId","accepted","onerror","message","onclose","e","code","setItem","setOnConnected","callback","readyState","OPEN","disconnectAndDispose","setOnDisconnected","setOnError","setOnCallRequested","setOnCallCancelled","setOnCallResponse","cancelCall","cancelledMessage","sendCallResponse","response","responseMessage","getAvailableUsers","onDone","onFail","filter","userfilter","request","XMLHttpRequest","undefined","setRequestHeader","open","protocol","host","onload","status","responseText","remoteAssistanceUsers","ev","error","callUser","userid","UI","showAlert","callIpCamera","cameraId","inviteUser","roomname","onCompleted","urlObject","hashDivision","split","withoutHash","length","hash","hostDivision","withoutQuery","searchParams","search","paramDivision","i","equalDivision","key","value","protocolDivision","withoutProtocol","pathDivision","slice","portDivision","port","hostname","path","d","Date","getTime","d2","performance","now","replace","c","r","Math","random","floor","toString"],"mappings":"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","file":"WebSocketConnectionHub.min.js","sourcesContent":["Space1.WebSocketConnection = class{\n \n constructor(options) {\n this.STATUS = { DISCONNECTED: 0, CONNECTED: 1 };\n this.RECONNECT_TIMEOUT = 5000;\n this._webSocket = null;\n this._url = null;\n this._accessToken = null;\n this._log = false;\n this._onConnectedCallback = null;\n this._onDisconnectedCallback = null;\n this._onCallRequestedCallback = null;\n this._onCallCancelledCallback = null;\n this._onCallResponseCallback = null;\n this._onErrorCallback = null;\n this._virtualCollaborationObject = {};\n this._status = 0;\n this._uuid = null;\n this._isAwaitingResponse = false;\n this._disablePersistance = false;\n\n if (options) {\n if (options.disablePersistance) {\n this._disablePersistance = options.disablePersistance;\n }\n }\n\n window.addEventListener('beforeunload', this.disconnect());\n }\n\n isConnected() {\n return this._status === this.STATUS.CONNECTED;\n }\n\n isDisconnected() {\n return this._status === this.STATUS.DISCONNECTED;\n }\n\n isAwaitingResponse() {\n return this._isAwaitingResponse;\n }\n\n init(url, logEnabled, token) {\n this._url = this._parseUrl(url);\n\n if (token) {\n this._accessToken = token;\n }\n\n if (logEnabled)\n this._log = true;\n\n if (!this._disablePersistance) {\n const rastatus = parseInt(window.sessionStorage.getItem(\"ra-status\"));\n if (rastatus !== this.STATUS.DISCONNECTED) { // 0 = disconnected\n this.connect();\n }\n }\n }\n\n setAccessToken(token) {\n this._accessToken = token;\n };\n\n reconnect() {\n console.log(\"Connection lost. Trying to reconnect in \" + (this.RECONNECT_TIMEOUT / 1000) +\"... \");\n setTimeout( () =>{\n console.log(\"Reconnecting... \");\n this.connect();\n }, this.RECONNECT_TIMEOUT);\n }\n\n connect(persist) {\n this.disconnect();\n\n let self = this;\n\n if (!this._url || this._url == null || this._url.href === \"\") {\n if (this._log) {\n console.log(\"Not initialised.\");\n }\n if (this._onErrorCallback) {\n this._onErrorCallback(\"Not initialized.\");\n }\n return;\n }\n\n\n\n\n this._getWsEndpoint(\n (wsUrl)=> {\n this._webSocket = new WebSocket(wsUrl + \"?type=web\");\n this._webSocket.uuid = this._generateUUID();\n // this._webSocket.addEventListener(\"open\", event => {\n // console.log(\"LOG-websocket-EVENT: \"+ event);\n // })\n\n this._webSocket.onopen = () => {\n console.log(\"ON-Open\");\n this._uuid = this._webSocket.uuid;\n if (this._log) {\n console.log(\"Connected\");\n }\n if (this._onConnectedCallback) {\n this._onConnectedCallback();\n }\n if (this._accessToken && this._accessToken !== \"\") {\n const authMessage = { action: \"authenticate\", token: this._accessToken };\n this._webSocket.send(JSON.stringify(authMessage));\n }\n this._status = this.STATUS.CONNECTED;\n };\n\n this._webSocket.onmessage = (evt) => {\n\n if (this._webSocket.uuid !== this._uuid) {\n this._webSocket.close();\n return;\n }\n\n const received = JSON.parse(evt.data);\n\n if (received.action == \"callrequest\") {\n if (this._onCallRequestedCallback) {\n this._onCallRequestedCallback(received.callerUserId, received.callerDisplayName, received.roomName, received.sessionId, received.parameters);\n }\n }\n if (received.action == \"callcancelled\") {\n if (this._onCallCancelledCallback) {\n this._onCallCancelledCallback(received.receivingUserId, received.callerUserId);\n }\n }\n if (received.action == \"callresponse\") {\n if (this.isAwaitingResponse() && this.isConnected()) {\n this._isAwaitingResponse=false;\n if (this._onCallResponseCallback) {\n this._onCallResponseCallback(received.accepted);\n }\n }\n }\n\n if (this._log) {\n console.log(evt.data);\n }\n };\n\n this._webSocket.onerror = (evt) => {\n if (this._uuid != null && this._webSocket.uuid !== this._uuid) {\n return;\n }\n if (this._log) {\n console.log(\"Socket error: \" + evt.message);\n }\n\n if (this._status !== this.STATUS.DISCONNECTED) {\n this.reconnect();\n if (this._onErrorCallback) {\n this._onErrorCallback(\"Socket error: \" + evt.message);\n }\n }\n };\n\n this._webSocket.onclose = (e) => {\n if (this._webSocket.uuid !== this._uuid) {\n return;\n }\n if (this._log) {\n console.log(\"Disconnected\");\n }\n\n if (e.code === 1000 || e.code >= 4000) {\n console.log(\"[WS]: Closed\");\n }\n else if (this._status !== this.STATUS.DISCONNECTED) {\n self.reconnect();\n }\n\n if (this._onDisconnectedCallback) {\n this._onDisconnectedCallback();\n }\n\n this._uuid = null;\n };\n\n if (persist && window.sessionStorage) {\n sessionStorage.setItem(\"ra-status\", this.STATUS.CONNECTED);\n }\n }\n );\n };\n\n setOnConnected(callback) {\n this._onConnectedCallback = callback;\n };\n\n disconnect(persist) {\n if (this._webSocket) {\n if (this._webSocket.readyState === WebSocket.OPEN) {\n this._webSocket.close();\n }\n }\n if (!this._disablePersistance) {\n if (persist && window.sessionStorage) {\n this._status = this.STATUS.DISCONNECTED;\n sessionStorage.setItem(\"ra-status\", this.STATUS.DISCONNECTED);\n }\n } else {\n this._status = this.STATUS.DISCONNECTED;\n }\n }\n\n disconnectAndDispose () {\n this._status = this.STATUS.DISCONNECTED;\n if (this._webSocket) {\n if (this._webSocket.readyState === WebSocket.OPEN) {\n this._webSocket.close();\n }\n }\n }\n\n setOnDisconnected(callback) {\n this._onDisconnectedCallback = callback;\n }\n\n setOnError(callback) {\n this._onErrorCallback = callback;\n }\n setOnCallRequested(callback) {\n this._onCallRequestedCallback = callback;\n }\n setOnCallCancelled(callback) {\n this._onCallCancelledCallback = callback;\n }\n setOnCallResponse(callback) {\n this._onCallResponseCallback = callback;\n }\n\n cancelCall(receivingUserId, callerUserId) {\n\n if (this.isAwaitingResponse()) {\n this._isAwaitingResponse = false;\n const cancelledMessage = {\n action: \"callcancelled\",\n receivingUserId: receivingUserId,\n callerUserId: callerUserId\n };\n this._webSocket.send(JSON.stringify(cancelledMessage));\n }\n\n if (!this._disablePersistance) {\n if (window.sessionStorage) {\n const rastatus = parseInt(window.sessionStorage.getItem(\"ra-status\"));\n if (rastatus === this.STATUS.DISCONNECTED) { // 0 = disconnected\n this.disconnect();\n }\n }\n }\n };\n\n sendCallResponse(callerUserId, response) {\n const responseMessage = {action: \"callresponse\", callerUserId: callerUserId};\n\n responseMessage.accepted = false;\n\n if (response == true) {\n responseMessage.accepted = true;\n }\n\n this._webSocket.send(JSON.stringify(responseMessage));\n }\n\n\n getAvailableUsers(onDone, onFail, filter) {\n\n let userfilter = \"all\";\n\n if (filter) {\n userfilter = filter;\n }\n\n const request = new XMLHttpRequest();\n if(this._accessToken != null && typeof this._accessToken !== undefined && this._accessToken !== \"\"){\n request.setRequestHeader(\"Authorization\", 'Bearer ' + this._accessToken);\n }\n request.open('GET', this._url.protocol + '//' + this._url.host + '/api/RemoteAssistance/users/' + userfilter + '?Api-Version=1.0', true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n // Success!\n const data = JSON.parse(request.responseText);\n if (onDone) {\n onDone(data.remoteAssistanceUsers);\n }\n\n } else {\n // We reached our target server, but it returned an error\n if (this._log) {\n console.log(\"Request Failed: \" + request.status);\n }\n if (onFail)\n onFail(request.status);\n }\n };\n\n request.onerror = (ev) => {\n // There was a connection error of some sort\n if (this._log) {\n console.log(\"Request Failed: \" + ev.error);\n }\n if (onFail)\n onFail(ev.error);\n };\n\n request.send();\n\n }\n\n callUser(userid, onDone, onFail, parameters) {\n\n\n if (!this._webSocket || this._webSocket.readyState != WebSocket.OPEN) {\n this.connect();\n }\n\n const request = new XMLHttpRequest();\n if(this._accessToken != null && typeof this._accessToken !== undefined && this._accessToken !== \"\"){\n request.setRequestHeader(\"Authorization\", 'Bearer ' + this._accessToken);\n }\n request.open('POST', this._url.protocol + '//' + this._url.host + '/api/RemoteAssistance/CallUser/' + userid + '/false?Api-Version=1.0', true);\n request.setRequestHeader(\"Content-Type\", \"application/json;charset=UTF-8\");\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n // Success!\n const data = JSON.parse(request.responseText);\n this._isAwaitingResponse = true;\n if (onDone) {\n onDone(data);\n }\n } else {\n // We reached our target server, but it returned an error\n if (request.status == 402) {\n Space1.UI.showAlert(\"Error\", JSON.parse(request.responseText));\n }\n\n if (this._log) {\n console.log(\"Request Failed: \" + request.status);\n }\n if (onFail)\n onFail(request.status);\n }\n };\n\n request.onerror = (ev) => {\n if (this._log) {\n console.log(\"Request Failed: \" + ev.error);\n }\n if (onFail)\n onFail(ev.error);\n };\n\n if (parameters) {\n request.send(JSON.stringify(parameters));\n } else {\n request.send();\n }\n };\n\n callIpCamera(cameraId, onDone, onFail, parameters) {\n\n if (!this._webSocket || this._webSocket.readyState != WebSocket.OPEN) {\n this.connect();\n }\n\n const request = new XMLHttpRequest();\n if(this._accessToken != null && typeof this._accessToken !== undefined && this._accessToken !== \"\"){\n request.setRequestHeader(\"Authorization\", 'Bearer ' + this._accessToken);\n }\n request.open('POST', this._url.protocol + '//' + this._url.host + '/api/RemoteAssistance/CallIpCamera/' + cameraId + '?Api-Version=1.0' + this._accessToken, true);\n request.setRequestHeader(\"Content-Type\", \"application/json;charset=UTF-8\");\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n // Success!\n const data = JSON.parse(request.responseText);\n if (onDone) {\n onDone(data);\n }\n } else {\n // We reached our target server, but it returned an error\n if (this._log) {\n console.log(\"Request Failed: \" + request.status);\n }\n if (onFail)\n onFail(request.status);\n }\n };\n\n request.onerror = (ev) =>{\n if (this._log) {\n console.log(\"Request Failed: \" + ev.error);\n }\n if (onFail)\n onFail(ev.error);\n };\n\n if (parameters) {\n request.send(JSON.stringify(parameters));\n } else {\n request.send();\n }\n }\n\n inviteUser (userid, roomname, sessionId, onDone, onFail, parameters) {\n\n\n if (!this._webSocket || this._webSocket.readyState != WebSocket.OPEN) {\n this.connect();\n }\n\n const request = new XMLHttpRequest();\n if(this._accessToken != null && typeof this._accessToken !== undefined && this._accessToken !== \"\"){\n request.setRequestHeader(\"Authorization\", 'Bearer ' + this._accessToken);\n }\n request.open('POST', this._url.protocol + '//' + this._url.host + '/api/RemoteAssistance/inviteUser/' + userid + '/' + roomname + '/' + sessionId+'?Api-Version=1.0', true);\n request.setRequestHeader(\"Content-Type\", \"application/json;charset=UTF-8\");\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n // Success!\n const data = JSON.parse(request.responseText);\n this._isAwaitingResponse = true;\n if (onDone) {\n onDone(data);\n }\n } else {\n // We reached our target server, but it returned an error\n if (this._log) {\n console.log(\"Request Failed: \" + request.status);\n }\n if (onFail)\n onFail(request.status);\n }\n };\n\n request.onerror = (ev) => {\n if (this._log) {\n console.log(\"Request Failed: \" + ev.error);\n }\n if (onFail)\n onFail(ev.error);\n };\n\n if (parameters) {\n request.send(JSON.stringify(parameters));\n } else {\n request.send();\n }\n }\n\n _getWsEndpoint(onCompleted) {\n\n let wsUrl = ((this._url.protocol === \"https:\") ? \"wss://\" : \"ws://\") + this._url.host + \"/ws\";\n const request = new XMLHttpRequest();\n if(this._accessToken != null && typeof this._accessToken !== undefined && this._accessToken !== \"\"){\n request.setRequestHeader(\"Authorization\", 'Bearer ' + this._accessToken);\n }\n request.open('GET', this._url.protocol + '//' + this._url.host + '/api/RemoteAssistance/GetWebSocketEndpoint/?Api-Version=1.0', true);\n\n request.onload = () =>{\n if (request.status >= 200 && request.status < 400) {\n // Success!\n const data = JSON.parse(request.responseText);\n wsUrl = data.url;\n\n } else {\n // We reached our target server, but it returned an error\n if (this._log) {\n console.log(\"Request Failed: \" + request.status);\n }\n }\n if (onCompleted)\n onCompleted(wsUrl);\n };\n\n request.onerror = (ev) =>{\n // There was a connection error of some sort\n if (this._log) {\n console.log(\"Request Failed: \" + ev.error);\n }\n if (onCompleted)\n onCompleted(wsUrl);\n };\n\n request.send();\n\n }\n\n _parseUrl(url) {\n\n const urlObject = {};\n urlObject.href = url;\n\n const hashDivision = url.split('#');\n const withoutHash = hashDivision[0];\n\n // If fragment identifier (#) exists, add it to object\n if (hashDivision.length > 1) {\n urlObject.hash = '#' + hashDivision[1];\n } else {\n urlObject.hash = '';\n }\n\n // Divide into base url/path and query string\n const hostDivision = withoutHash.split('?');\n const withoutQuery = hostDivision[0];\n\n // If query string exists, add the parameters to searchParams object\n let searchParams = '';\n urlObject.search = '';\n\n if (hostDivision.length > 1) {\n searchParams = {};\n\n // Add full query string to object\n urlObject.search = '?' + hostDivision[1];\n\n // Divide into parameters array\n const paramDivision = hostDivision[1].split('&');\n\n // Iterate over parameters\n for (let i = 0; i < paramDivision.length; i++) {\n const equalDivision = paramDivision[i].split('=');\n const key = equalDivision[0];\n const value = equalDivision[1];\n\n searchParams[key] = value;\n }\n }\n\n urlObject.searchParams = searchParams;\n\n // Divide into host and base url/path sections\n const protocolDivision = withoutQuery.split('//');\n\n // If no protocol was in url, default to http:\n if (protocolDivision.length == 1) {\n protocolDivision[1] = protocolDivision[0];\n protocolDivision[0] = 'http:';\n }\n\n const protocol = protocolDivision[0];\n const withoutProtocol = protocolDivision[1];\n\n // Add protocol to object\n urlObject.protocol = protocol;\n\n // Divide into base url and path sections\n let pathDivision = withoutProtocol.split('/');\n\n // Edge case for '/' ending causing empty item\n if (pathDivision[pathDivision.length - 1] === '') {\n pathDivision = pathDivision.slice(0, pathDivision.length - 1);\n }\n\n // Set host\n const host = pathDivision[0];\n urlObject.host = host;\n\n // Divide into hostname and port sections\n const portDivision = host.split(':');\n\n // Set default port (empty means 80)\n let port = '';\n\n if (portDivision.length > 1) {\n port = portDivision[1];\n }\n\n urlObject.port = port;\n\n // Save hostname to object\n urlObject.hostname = portDivision[0];\n\n // Reconstruct path\n if (pathDivision.length > 1) {\n let path = '';\n for (let i = 1; i < pathDivision.length; i++) {\n path += '/' + pathDivision[i];\n }\n\n // Add path to object\n urlObject.path = path;\n } else {\n urlObject.path = '';\n }\n\n return urlObject;\n }\n\n _generateUUID() { // Public Domain/MIT\n var d = new Date().getTime();//Timestamp\n var d2 = (performance && performance.now && (performance.now() * 1000)) || 0;//Time in microseconds since page-load or 0 if unsupported\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16;//random number between 0 and 16\n if (d > 0) {//Use timestamp until depleted\n r = (d + r) % 16 | 0;\n d = Math.floor(d / 16);\n } else {//Use microseconds since page-load if supported\n r = (d2 + r) % 16 | 0;\n d2 = Math.floor(d2 / 16);\n }\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n });\n }\n\n};"]}