From e5c12b92fc0b2f8aa7ed7a77372fa63f4cb62de4 Mon Sep 17 00:00:00 2001 From: shanshan xu Date: Tue, 10 Oct 2023 10:52:37 -0400 Subject: [PATCH] Deep Heartbeat GA: update WebSocketManager to enable Blitz Chat widget user --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- src/lib/amazon-connect-websocket-manager.js | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98074e9..82dc459 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.2.0] +### Added +- Updated amazon-connect-websocket-manager.js library to enable Deep Heartbeat change for Blitz Chat widget users. + ## [2.1.0] ### Added - The [DescribeView API](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_DescribeView.html) diff --git a/package-lock.json b/package-lock.json index fef8129..b589e75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amazon-connect-chatjs", - "version": "2.1.0", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "amazon-connect-chatjs", - "version": "2.1.0", + "version": "2.2.0", "license": "Apache-2.0", "dependencies": { "detect-browser": "5.3.0", diff --git a/package.json b/package.json index 4c01627..bbfa5b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-chatjs", - "version": "2.1.0", + "version": "2.2.0", "main": "dist/amazon-connect-chat.js", "types": "dist/index.d.ts", "engines": { diff --git a/src/lib/amazon-connect-websocket-manager.js b/src/lib/amazon-connect-websocket-manager.js index 22958aa..ef6e85c 100644 --- a/src/lib/amazon-connect-websocket-manager.js +++ b/src/lib/amazon-connect-websocket-manager.js @@ -4,7 +4,7 @@ const global = typeof global !== 'undefined' ? global : global.connect = global.connect || {}; const currentWebsocketManager = connect.WebSocketManager; -!function(e){var n={};function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)t.d(o,r,function(n){return e[n]}.bind(null,r));return o},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=10)}([function(e,n){function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,n){e.exports=function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,n){function t(e,n){for(var t=0;t=0),c.type){case"b":t=parseInt(t,10).toString(2);break;case"c":t=String.fromCharCode(parseInt(t,10));break;case"d":case"i":t=parseInt(t,10);break;case"j":t=JSON.stringify(t,null,c.width?parseInt(c.width):0);break;case"e":t=c.precision?parseFloat(t).toExponential(c.precision):parseFloat(t).toExponential();break;case"f":t=c.precision?parseFloat(t).toFixed(c.precision):parseFloat(t);break;case"g":t=c.precision?String(Number(t.toPrecision(c.precision))):parseFloat(t);break;case"o":t=(parseInt(t,10)>>>0).toString(8);break;case"s":t=String(t),t=c.precision?t.substring(0,c.precision):t;break;case"t":t=String(!!t),t=c.precision?t.substring(0,c.precision):t;break;case"T":t=Object.prototype.toString.call(t).slice(8,-1).toLowerCase(),t=c.precision?t.substring(0,c.precision):t;break;case"u":t=parseInt(t,10)>>>0;break;case"v":t=t.valueOf(),t=c.precision?t.substring(0,c.precision):t;break;case"x":t=(parseInt(t,10)>>>0).toString(16);break;case"X":t=(parseInt(t,10)>>>0).toString(16).toUpperCase()}r.json.test(c.type)?b+=t:(!r.number.test(c.type)||d&&!c.sign?p="":(p=d?"+":"-",t=t.toString().replace(r.sign,"")),u=c.pad_char?"0"===c.pad_char?"0":c.pad_char.charAt(1):" ",l=c.width-(p+t).length,s=c.width&&l>0?u.repeat(l):"",b+=c.align?p+t+s:"0"===u?p+s+t:s+p+t)}return b}var s=Object.create(null);function u(e){if(s[e])return s[e];for(var n,t=e,o=[],i=0;t;){if(null!==(n=r.text.exec(t)))o.push(n[0]);else if(null!==(n=r.modulo.exec(t)))o.push("%");else{if(null===(n=r.placeholder.exec(t)))throw new SyntaxError("[sprintf] unexpected placeholder");if(n[2]){i|=1;var a=[],c=n[2],u=[];if(null===(u=r.key.exec(c)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(a.push(u[1]);""!==(c=c.substring(u[0].length));)if(null!==(u=r.key_access.exec(c)))a.push(u[1]);else{if(null===(u=r.index_access.exec(c)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1])}n[2]=a}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");o.push({placeholder:n[0],param_no:n[1],keys:n[2],sign:n[3],pad_char:n[4],align:n[5],width:n[6],precision:n[7],type:n[8]})}t=t.substring(n[0].length)}return s[e]=o}n.sprintf=i,n.vsprintf=a,"undefined"!=typeof window&&(window.sprintf=i,window.vsprintf=a,void 0===(o=function(){return{sprintf:i,vsprintf:a}}.call(n,t,n,e))||(e.exports=o))}()},function(e,n,t){var o=t(8);e.exports=function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),n&&o(e,n)},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,n,t){var o=t(0).default,r=t(9);e.exports=function(e,n){if(n&&("object"===o(n)||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return r(e)},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,n){e.exports=function(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,n){function t(n,o){return e.exports=t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,n){return e.__proto__=n,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n,o)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,n){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,n,t){"use strict";t.r(n),t.d(n,"WebSocketManager",(function(){return Ne}));var o=t(0),r=t.n(o),i=t(4),a="NULL",c="CLIENT_LOGGER",s="DEBUG",u="AMZ_WEB_SOCKET_MANAGER:",l="Network offline",d="Network online, connecting to WebSocket server",p="Network offline, ignoring this getWebSocketConnConfig request",f="Heartbeat response not received",g="aws/ping deep heartbeat response not received",b="Heartbeat response received",v="aws/ping deep heartbeat received",y="Sending heartbeat",m="Sending aws/ping deep heartbeat",h="Failed to send heartbeat since WebSocket is not open",S="Failed to send aws/ping deep heartbeat since WebSocket is not open",k="Deep Heartbeat is successful. WebSocketManager has received 200 response from aws/ping",w="Deep Heartbeat failed. WebSocketManager does not receive 200 response from aws/ping",O="Generic topic failed.",C="WebSocket connection established!",L="WebSocket connection is closed",T="WebSocketManager Error, error_event: ",_="Scheduling WebSocket reinitialization, after delay ",x="WebSocket URL cannot be used to establish connection",W="WebSocket Initialization failed - Terminating and cleaning subscriptions",I="Terminating WebSocket Manager",N="Fetching new WebSocket connection configuration",F="Successfully fetched webSocket connection configuration",M="Failed to fetch webSocket connection configuration",E="Retrying fetching new WebSocket connection configuration",D="Initializing Websocket Manager",R="Initializing Websocket Manager Failure callback registered",A="Websocket connection open callback registered",j="Websocket connection close callback registered",H="Websocket connection gain callback registered",P="Websocket connection lost callback registered",G="Websocket subscription failure callback registered",z="Reset Websocket state",q="WebSocketManager Message Error",U="Message received for topic ",J="Invalid incoming message",B="WebsocketManager invoke callbacks for topic success ",V="aws/subscribe",X="aws/unsubscribe",$="aws/heartbeat",K="aws/ping",Z="connected",Q="disconnected",Y={assertTrue:function(e,n){if(!e)throw new Error(n)},assertNotNull:function(e,n){return Y.assertTrue(null!==e&&void 0!==r()(e),Object(i.sprintf)("%s must be provided",n||"A value")),e},isNonEmptyString:function(e){return"string"==typeof e&&e.length>0},assertIsList:function(e,n){if(!Array.isArray(e))throw new Error(n+" is not an array")},isFunction:function(e){return!!(e&&e.constructor&&e.call&&e.apply)},isObject:function(e){return!("object"!==r()(e)||null===e)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e}},ee=new RegExp("^(wss://)\\w*"),ne=new RegExp("^(ws://127.0.0.1:)");Y.validWSUrl=function(e){return ee.test(e)||ne.test(e)},Y.getSubscriptionResponse=function(e,n,t){return{topic:e,content:{status:n?"success":"failure",topics:t}}},Y.assertIsObject=function(e,n){if(!Y.isObject(e))throw new Error(n+" is not an object!")},Y.addJitter=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;n=Math.min(n,1);var t=Math.random()>.5?1:-1;return Math.floor(e+t*e*Math.random()*n)},Y.isNetworkOnline=function(){return navigator.onLine},Y.isNetworkFailure=function(e){return!(!e._debug||!e._debug.type)&&"NetworkingError"===e._debug.type};var te=Y,oe=t(5),re=t.n(oe),ie=t(6),ae=t.n(ie),ce=t(3),se=t.n(ce),ue=t(7),le=t.n(ue),de=t(1),pe=t.n(de),fe=t(2),ge=t.n(fe);function be(e){var n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=se()(e);if(n){var r=se()(this).constructor;t=Reflect.construct(o,arguments,r)}else t=o.apply(this,arguments);return ae()(this,t)}}function ve(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function ye(e){for(var n=1;n1&&void 0!==arguments[1]?arguments[1]:"";if(this.hasClientLogger()){var t="string"==typeof n?n:JSON.stringify(n,Le()),o="string"==typeof this.logMetaData?this.logMetaData:JSON.stringify(this.logMetaData,Le()),r="".concat(Ce(e)," ").concat(t," ").concat(o);switch(e){case Se.DEBUG:return this._clientLogger.debug(r)||r;case Se.INFO:return this._clientLogger.info(r)||r;case Se.WARN:return this._clientLogger.warn(r)||r;case Se.ERROR:return this._clientLogger.error(r)||r;case Se.ADVANCED_LOG:return this._advancedLogWriter?this._clientLogger[this._advancedLogWriter](r)||r:""}}}},{key:"isLevelEnabled",value:function(e){return e>=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.prefix||he;return e.logMetaData&&this.setLogMetaData(e.logMetaData),this.logMetaData||console.info("*********Missing required option: WebSocketManager:logMetaData**********"),new Oe(this,ye({prefix:n,logMetaData:this.logMetaData},e))}},{key:"setLogMetaData",value:function(e){this.logMetaData=e}},{key:"updateLoggerConfig",value:function(e){var n=e||{};this._level=n.level||Se.INFO,this._advancedLogWriter="warn",n.advancedLogWriter&&(this._advancedLogWriter=n.advancedLogWriter),n.customizedLogger&&"object"===r()(n.customizedLogger)&&(this.useClientLogger=!0),this._clientLogger=n.logger||this.selectLogger(n),this._logsDestination=a,n.debug&&(this._logsDestination=s),n.logger&&(this._logsDestination=c)}},{key:"selectLogger",value:function(e){return e.customizedLogger&&"object"===r()(e.customizedLogger)?e.customizedLogger:e.useDefaultLogger?Te():null}}]),e}(),we=function(){function e(){pe()(this,e)}return ge()(e,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}},{key:"advancedLog",value:function(){}}]),e}(),Oe=function(e){re()(t,e);var n=be(t);function t(e,o){var r;return pe()(this,t),(r=n.call(this)).options=o||{},r.prefix=o.prefix||he,r.logManager=e,r}return ge()(t,[{key:"debug",value:function(){for(var e=arguments.length,n=new Array(e),t=0;t1&&void 0!==arguments[1]?arguments[1]:2e3;pe()(this,e),this.numAttempts=0,this.executor=n,this.hasActiveReconnection=!1,this.defaultRetry=t}return ge()(e,[{key:"retry",value:function(){var e=this;this.hasActiveReconnection||(this.hasActiveReconnection=!0,setTimeout((function(){e._execute()}),this._getDelay()))}},{key:"_execute",value:function(){this.hasActiveReconnection=!1,this.executor(),this.numAttempts++}},{key:"connected",value:function(){this.numAttempts=0}},{key:"_getDelay",value:function(){var e=Math.pow(2,this.numAttempts)*this.defaultRetry;return e<=3e4?e:3e4}},{key:"getIsConnected",value:function(){return!this.numAttempts}}]),e}(),xe=null,We=function(){var e=!1,n=xe.getLogger({prefix:u}),t=te.isNetworkOnline(),o={primary:null,secondary:null},r={reconnectWebSocket:!0,websocketInitFailed:!1,exponentialBackOffTime:1e3,exponentialTimeoutHandle:null,lifeTimeTimeoutHandle:null,webSocketInitCheckerTimeoutId:null,connState:null},i={connectWebSocketRetryCount:0,connectionAttemptStartTime:null,noOpenConnectionsTimestamp:null},a={pendingResponse:!1,intervalHandle:null},c={pendingResponse:!1,intervalHandle:null},s={initFailure:new Set,getWebSocketTransport:null,subscriptionUpdate:new Set,subscriptionFailure:new Set,topic:new Map,allMessage:new Set,connectionGain:new Set,connectionLost:new Set,connectionOpen:new Set,connectionClose:new Set,deepHeartbeatSuccess:new Set,deepHeartbeatFailure:new Set,topicFailure:new Set},Y={connConfig:null,promiseHandle:null,promiseCompleted:!0},ee={subscribed:new Set,pending:new Set,subscriptionHistory:new Set},ne={responseCheckIntervalId:null,requestCompleted:!0,reSubscribeIntervalId:null,consecutiveFailedSubscribeAttempts:0,consecutiveNoResponseRequest:0},oe=new _e((function(){Ie()})),re=new Set([V,X,$,K]),ie=setInterval((function(){if(t!==te.isNetworkOnline()){if(!(t=te.isNetworkOnline()))return n.advancedLog(l),void Me(n.info(l));var e=pe();t&&(!e||ue(e,WebSocket.CLOSING)||ue(e,WebSocket.CLOSED))&&(n.advancedLog(d),Me(n.info(d)),Ie())}}),250),ae=function(e,t){e.forEach((function(e){try{e(t)}catch(e){Me(n.error("Error executing callback",e))}}))},ce=function(e){if(null===e)return"NULL";switch(e.readyState){case WebSocket.CONNECTING:return"CONNECTING";case WebSocket.OPEN:return"OPEN";case WebSocket.CLOSING:return"CLOSING";case WebSocket.CLOSED:return"CLOSED";default:return"UNDEFINED"}},se=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";Me(n.debug("["+e+"] Primary WebSocket: "+ce(o.primary)+" | Secondary WebSocket: "+ce(o.secondary)))},ue=function(e,n){return e&&e.readyState===n},le=function(e){return ue(e,WebSocket.OPEN)},de=function(e){return null===e||void 0===e.readyState||ue(e,WebSocket.CLOSED)},pe=function(){return null!==o.secondary?o.secondary:o.primary},fe=function(){return le(pe())},ge=function(){if(e&&c.pendingResponse&&(n.advancedLog(g),Me(n.warn(g)),ae(s.deepHeartbeatFailure,{timestamp:Date.now(),error:"aws/ping response is not received"}),clearInterval(c.intervalHandle),c.pendingResponse=!1),a.pendingResponse)return n.advancedLog(f),Me(n.warn(f)),clearInterval(a.intervalHandle),a.intervalHandle=null,a.pendingResponse=!1,void Ie();fe()?(e&&(Me(n.debug(m)),pe().send(Te(K)),c.pendingResponse=!0),Me(n.debug(y)),pe().send(Te($)),a.pendingResponse=!0):(e&&(n.advancedLog(S),Me(n.warn(S)),ae(s.deepHeartbeatFailure,{timestamp:Date.now(),error:"Unable to send message to aws/ping because websocket connection is not established."})),n.advancedLog(h),Me(n.warn(h)),se("sendHeartBeat"),Ie())},be=function(){n.advancedLog(z),r.exponentialBackOffTime=1e3,a.pendingResponse=!1,c.pendingResponse=!1,r.reconnectWebSocket=!0,clearTimeout(r.lifeTimeTimeoutHandle),clearInterval(a.intervalHandle),clearInterval(c.intervalHandle),clearTimeout(r.exponentialTimeoutHandle),clearTimeout(r.webSocketInitCheckerTimeoutId),a.intervalHandle=null},ve=function(){ne.consecutiveFailedSubscribeAttempts=0,ne.consecutiveNoResponseRequest=0,clearInterval(ne.responseCheckIntervalId),clearInterval(ne.reSubscribeIntervalId)},ye=function(){i.connectWebSocketRetryCount=0,i.connectionAttemptStartTime=null,i.noOpenConnectionsTimestamp=null},me=function(){oe.connected();try{n.advancedLog(C),Me(n.info(C)),se("webSocketOnOpen"),null!==r.connState&&r.connState!==Q||ae(s.connectionGain),r.connState=Z;var e=Date.now();ae(s.connectionOpen,{connectWebSocketRetryCount:i.connectWebSocketRetryCount,connectionAttemptStartTime:i.connectionAttemptStartTime,noOpenConnectionsTimestamp:i.noOpenConnectionsTimestamp,connectionEstablishedTime:e,timeToConnect:e-i.connectionAttemptStartTime,timeWithoutConnection:i.noOpenConnectionsTimestamp?e-i.noOpenConnectionsTimestamp:null}),ye(),be(),pe().openTimestamp=Date.now(),0===ee.subscribed.size&&le(o.secondary)&&we(o.primary,"[Primary WebSocket] Closing WebSocket"),(ee.subscribed.size>0||ee.pending.size>0)&&(le(o.secondary)&&Me(n.info("Subscribing secondary websocket to topics of primary websocket")),ee.subscribed.forEach((function(e){ee.subscriptionHistory.add(e),ee.pending.add(e)})),ee.subscribed.clear(),ke()),ge(),null!==a.intervalHandle&&clearInterval(a.intervalHandle),a.intervalHandle=setInterval(ge,1e4);var t=1e3*Y.connConfig.webSocketTransport.transportLifeTimeInSeconds;Me(n.debug("Scheduling WebSocket manager reconnection, after delay "+t+" ms")),r.lifeTimeTimeoutHandle=setTimeout((function(){Me(n.debug("Starting scheduled WebSocket manager reconnection")),Ie()}),t)}catch(e){Me(n.error("Error after establishing WebSocket connection",e))}},he=function(e){se("webSocketOnError"),n.advancedLog(T,JSON.stringify(e)),Me(n.error(T,JSON.stringify(e))),oe.getIsConnected()?Ie():oe.retry()},Se=function(e){var t=JSON.parse(e.data);switch(t.topic){case V:if(Me(n.debug("Subscription Message received from webSocket server",e.data)),ne.requestCompleted=!0,ne.consecutiveNoResponseRequest=0,"success"===t.content.status)ne.consecutiveFailedSubscribeAttempts=0,t.content.topics.forEach((function(e){ee.subscriptionHistory.delete(e),ee.pending.delete(e),ee.subscribed.add(e)})),0===ee.subscriptionHistory.size?le(o.secondary)&&(Me(n.info("Successfully subscribed secondary websocket to all topics of primary websocket")),we(o.primary,"[Primary WebSocket] Closing WebSocket")):ke(),ae(s.subscriptionUpdate,t);else{if(clearInterval(ne.reSubscribeIntervalId),++ne.consecutiveFailedSubscribeAttempts,5===ne.consecutiveFailedSubscribeAttempts)return ae(s.subscriptionFailure,t),void(ne.consecutiveFailedSubscribeAttempts=0);ne.reSubscribeIntervalId=setInterval((function(){ke()}),500)}break;case $:Me(n.debug(b)),a.pendingResponse=!1,null===a.intervalHandle&&(a.intervalHandle=setInterval(ge,1e4));break;case K:Me(n.debug(v)),c.pendingResponse=!1,200===t.statusCode?ae(s.deepHeartbeatSuccess,{timestamp:Date.now()}):ae(s.deepHeartbeatFailure,{timestamp:Date.now(),statusCode:t.statusCode,statusContent:t.statusContent});break;default:if(t.topic){if(n.advancedLog(U,t.topic),Me(n.debug(U+t.topic)),le(o.primary)&&le(o.secondary)&&0===ee.subscriptionHistory.size&&this===o.primary)return void Me(n.warn("Ignoring Message for Topic "+t.topic+", to avoid duplicates"));if(0===s.allMessage.size&&0===s.topic.size)return void Me(n.warn("No registered callback listener for Topic",t.topic));n.advancedLog(B,t.topic),ae(s.allMessage,t),s.topic.has(t.topic)&&ae(s.topic.get(t.topic),t)}else t.message?(n.advancedLog(q,t),Me(n.warn(q,t)),ae(s.topicFailure,{timestamp:Date.now(),errorMessage:t.message,connectionId:t.connectionId,requestId:t.requestId})):(n.advancedLog(J,t),Me(n.warn(J,t)))}},ke=function e(){if(ne.consecutiveNoResponseRequest>3)return Me(n.warn("Ignoring subscribePendingTopics since we have exhausted max subscription retries with no response")),void ae(s.subscriptionFailure,te.getSubscriptionResponse(V,!1,Array.from(ee.pending)));fe()?0!==Array.from(ee.pending).length&&(clearInterval(ne.responseCheckIntervalId),pe().send(Te(V,{topics:Array.from(ee.pending)})),ne.requestCompleted=!1,ne.responseCheckIntervalId=setInterval((function(){ne.requestCompleted||(++ne.consecutiveNoResponseRequest,e())}),1e3)):Me(n.warn("Ignoring subscribePendingTopics call since Default WebSocket is not open"))},we=function(e,t){ue(e,WebSocket.CONNECTING)||ue(e,WebSocket.OPEN)?e.close(1e3,t):Me(n.warn("Ignoring WebSocket Close request, WebSocket State: "+ce(e)))},Oe=function(e){we(o.primary,"[Primary] WebSocket "+e),we(o.secondary,"[Secondary] WebSocket "+e)},Ce=function(){i.connectWebSocketRetryCount++;var e=te.addJitter(r.exponentialBackOffTime,.3);Date.now()+e<=Y.connConfig.urlConnValidTime?(n.advancedLog(_),Me(n.debug(_+e+" ms")),r.exponentialTimeoutHandle=setTimeout((function(){return Ne()}),e),r.exponentialBackOffTime*=2):(n.advancedLog(x),Me(n.warn(x)),Ie())},Le=function(e){be(),ve(),n.advancedLog(W,e),Me(n.error(W)),r.websocketInitFailed=!0,Oe(I),clearInterval(ie),ae(s.initFailure,{connectWebSocketRetryCount:i.connectWebSocketRetryCount,connectionAttemptStartTime:i.connectionAttemptStartTime,reason:e}),ye()},Te=function(e,n){return JSON.stringify({topic:e,content:n})},We=function(e){return!!(te.isObject(e)&&te.isObject(e.webSocketTransport)&&te.isNonEmptyString(e.webSocketTransport.url)&&te.validWSUrl(e.webSocketTransport.url)&&1e3*e.webSocketTransport.transportLifeTimeInSeconds>=3e5)||(Me(n.error("Invalid WebSocket Connection Configuration",e)),!1)},Ie=function(){if(!te.isNetworkOnline())return n.advancedLog(p),void Me(n.info(p));if(r.websocketInitFailed)Me(n.debug("WebSocket Init had failed, ignoring this getWebSocketConnConfig request"));else{if(Y.promiseCompleted)return be(),n.advancedLog(N),Me(n.info(N)),i.connectionAttemptStartTime=i.connectionAttemptStartTime||Date.now(),Y.promiseCompleted=!1,Y.promiseHandle=s.getWebSocketTransport(),Y.promiseHandle.then((function(e){return Y.promiseCompleted=!0,n.advancedLog(F),Me(n.debug(F,e)),We(e)?(Y.connConfig=e,Y.connConfig.urlConnValidTime=Date.now()+85e3,Ne()):(Le("Invalid WebSocket connection configuration: "+e),{webSocketConnectionFailed:!0})}),(function(e){return Y.promiseCompleted=!0,n.advancedLog(M),Me(n.error(M,e)),te.isNetworkFailure(e)?(n.advancedLog(E+JSON.stringify(e)),Me(n.info(E+JSON.stringify(e))),oe.retry()):Le("Failed to fetch webSocket connection configuration: "+JSON.stringify(e)),{webSocketConnectionFailed:!0}}));Me(n.debug("There is an ongoing getWebSocketConnConfig request, this request will be ignored"))}},Ne=function(){if(r.websocketInitFailed)return Me(n.info("web-socket initializing had failed, aborting re-init")),{webSocketConnectionFailed:!0};if(!te.isNetworkOnline())return Me(n.warn("System is offline aborting web-socket init")),{webSocketConnectionFailed:!0};n.advancedLog(D),Me(n.info(D)),se("initWebSocket");try{if(We(Y.connConfig)){var e=null;return le(o.primary)?(Me(n.debug("Primary Socket connection is already open")),ue(o.secondary,WebSocket.CONNECTING)||(Me(n.debug("Establishing a secondary web-socket connection")),oe.numAttempts=0,o.secondary=Fe()),e=o.secondary):(ue(o.primary,WebSocket.CONNECTING)||(Me(n.debug("Establishing a primary web-socket connection")),o.primary=Fe()),e=o.primary),r.webSocketInitCheckerTimeoutId=setTimeout((function(){le(e)||Ce()}),1e3),{webSocketConnectionFailed:!1}}}catch(e){return Me(n.error("Error Initializing web-socket-manager",e)),Le("Failed to initialize new WebSocket: "+e.message),{webSocketConnectionFailed:!0}}},Fe=function(){var e=new WebSocket(Y.connConfig.webSocketTransport.url);return e.addEventListener("open",me),e.addEventListener("message",Se),e.addEventListener("error",he),e.addEventListener("close",(function(t){return function(e,t){n.advancedLog(L,JSON.stringify(e)),Me(n.info(L,JSON.stringify(e))),se("webSocketOnClose before-cleanup"),ae(s.connectionClose,{openTimestamp:t.openTimestamp,closeTimestamp:Date.now(),connectionDuration:Date.now()-t.openTimestamp,code:e.code,reason:e.reason}),de(o.primary)&&(o.primary=null),de(o.secondary)&&(o.secondary=null),r.reconnectWebSocket&&(le(o.primary)||le(o.secondary)?de(o.primary)&&le(o.secondary)&&(Me(n.info("[Primary] WebSocket Cleanly Closed")),o.primary=o.secondary,o.secondary=null):(Me(n.warn("Neither primary websocket and nor secondary websocket have open connections, attempting to re-establish connection")),r.connState===Q?Me(n.info("Ignoring connectionLost callback invocation")):(ae(s.connectionLost,{openTimestamp:t.openTimestamp,closeTimestamp:Date.now(),connectionDuration:Date.now()-t.openTimestamp,code:e.code,reason:e.reason}),i.noOpenConnectionsTimestamp=Date.now()),r.connState=Q,Ie()),se("webSocketOnClose after-cleanup"))}(t,e)})),e},Me=function(e){return e&&"function"==typeof e.sendInternalLogToServer&&e.sendInternalLogToServer(),e};this.init=function(e){if(te.assertTrue(te.isFunction(e),"transportHandle must be a function"),null===s.getWebSocketTransport)return s.getWebSocketTransport=e,Ie();Me(n.warn("Web Socket Manager was already initialized"))},this.onInitFailure=function(e){return n.advancedLog(R),te.assertTrue(te.isFunction(e),"cb must be a function"),s.initFailure.add(e),r.websocketInitFailed&&e(),function(){return s.initFailure.delete(e)}},this.onConnectionOpen=function(e){return n.advancedLog(A),te.assertTrue(te.isFunction(e),"cb must be a function"),s.connectionOpen.add(e),function(){return s.connectionOpen.delete(e)}},this.onConnectionClose=function(e){return n.advancedLog(j),te.assertTrue(te.isFunction(e),"cb must be a function"),s.connectionClose.add(e),function(){return s.connectionClose.delete(e)}},this.onConnectionGain=function(e){return n.advancedLog(H),te.assertTrue(te.isFunction(e),"cb must be a function"),s.connectionGain.add(e),fe()&&e(),function(){return s.connectionGain.delete(e)}},this.onConnectionLost=function(e){return n.advancedLog(P),te.assertTrue(te.isFunction(e),"cb must be a function"),s.connectionLost.add(e),r.connState===Q&&e(),function(){return s.connectionLost.delete(e)}},this.onSubscriptionUpdate=function(e){return te.assertTrue(te.isFunction(e),"cb must be a function"),s.subscriptionUpdate.add(e),function(){return s.subscriptionUpdate.delete(e)}},this.onSubscriptionFailure=function(e){return n.advancedLog(G),te.assertTrue(te.isFunction(e),"cb must be a function"),s.subscriptionFailure.add(e),function(){return s.subscriptionFailure.delete(e)}},this.onMessage=function(e,n){return te.assertNotNull(e,"topicName"),te.assertTrue(te.isFunction(n),"cb must be a function"),s.topic.has(e)?s.topic.get(e).add(n):s.topic.set(e,new Set([n])),function(){return s.topic.get(e).delete(n)}},this.onAllMessage=function(e){return te.assertTrue(te.isFunction(e),"cb must be a function"),s.allMessage.add(e),function(){return s.allMessage.delete(e)}},this.subscribeTopics=function(e){te.assertNotNull(e,"topics"),te.assertIsList(e),e.forEach((function(e){ee.subscribed.has(e)||ee.pending.add(e)})),ne.consecutiveNoResponseRequest=0,ke()},this.sendMessage=function(e){if(te.assertIsObject(e,"payload"),void 0===e.topic||re.has(e.topic))Me(n.warn("Cannot send message, Invalid topic",e));else{try{e=JSON.stringify(e)}catch(t){return void Me(n.warn("Error stringify message",e))}fe()?pe().send(e):Me(n.warn("Cannot send message, web socket connection is not open"))}},this.deepHeartbeatHandler=function(){e=!0},this.onDeepHeartbeatSuccess=function(e){return n.advancedLog(k),te.assertTrue(te.isFunction(e),"cb must be a function"),s.deepHeartbeatSuccess.add(e),function(){return s.deepHeartbeatSuccess.delete(e)}},this.onDeepHeartbeatFailure=function(e){return n.advancedLog(w),te.assertTrue(te.isFunction(e),"cb must be a function"),s.deepHeartbeatFailure.add(e),function(){return s.deepHeartbeatFailure.delete(e)}},this.onTopicFailure=function(e){return n.advancedLog(O),te.assertTrue(te.isFunction(e),"cb must be a function"),s.topicFailure.add(e),function(){return s.topicFailure.delete(e)}},this.closeWebSocket=function(){be(),ve(),r.reconnectWebSocket=!1,clearInterval(ie),Oe("User request to close WebSocket")},this.terminateWebSocketManager=Le},Ie={create:function(e){return xe||(xe=new ke(e)),xe.hasLogMetaData()||xe.setLogMetaData(e),e||console.info("********Missing metaData for logs from websocketManager: initialize websocketManager using create(metaData)*******"),new We},setGlobalConfig:function(e){var n=e&&e.loggerConfig;xe||(xe=new ke),xe.updateLoggerConfig(n);var t=e&&e.webSocketManagerConfig,o=t&&t.isNetworkOnline;o&&"function"==typeof o&&(te.isNetworkOnline=o)},LogLevel:Se,Logger:me};global.connect=global.connect||{},connect.WebSocketManager=Ie;var Ne=Ie;n.default=Ne}]); +!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=10)}([function(e,t){function n(t){return e.exports=n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,n(t)}e.exports=n,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){function n(e,t){for(var n=0;n=0),c.type){case"b":n=parseInt(n,10).toString(2);break;case"c":n=String.fromCharCode(parseInt(n,10));break;case"d":case"i":n=parseInt(n,10);break;case"j":n=JSON.stringify(n,null,c.width?parseInt(c.width):0);break;case"e":n=c.precision?parseFloat(n).toExponential(c.precision):parseFloat(n).toExponential();break;case"f":n=c.precision?parseFloat(n).toFixed(c.precision):parseFloat(n);break;case"g":n=c.precision?String(Number(n.toPrecision(c.precision))):parseFloat(n);break;case"o":n=(parseInt(n,10)>>>0).toString(8);break;case"s":n=String(n),n=c.precision?n.substring(0,c.precision):n;break;case"t":n=String(!!n),n=c.precision?n.substring(0,c.precision):n;break;case"T":n=Object.prototype.toString.call(n).slice(8,-1).toLowerCase(),n=c.precision?n.substring(0,c.precision):n;break;case"u":n=parseInt(n,10)>>>0;break;case"v":n=n.valueOf(),n=c.precision?n.substring(0,c.precision):n;break;case"x":n=(parseInt(n,10)>>>0).toString(16);break;case"X":n=(parseInt(n,10)>>>0).toString(16).toUpperCase()}r.json.test(c.type)?b+=n:(!r.number.test(c.type)||p&&!c.sign?d="":(d=p?"+":"-",n=n.toString().replace(r.sign,"")),u=c.pad_char?"0"===c.pad_char?"0":c.pad_char.charAt(1):" ",l=c.width-(d+n).length,s=c.width&&l>0?u.repeat(l):"",b+=c.align?d+n+s:"0"===u?d+s+n:s+d+n)}return b}var s=Object.create(null);function u(e){if(s[e])return s[e];for(var t,n=e,o=[],i=0;n;){if(null!==(t=r.text.exec(n)))o.push(t[0]);else if(null!==(t=r.modulo.exec(n)))o.push("%");else{if(null===(t=r.placeholder.exec(n)))throw new SyntaxError("[sprintf] unexpected placeholder");if(t[2]){i|=1;var a=[],c=t[2],u=[];if(null===(u=r.key.exec(c)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(a.push(u[1]);""!==(c=c.substring(u[0].length));)if(null!==(u=r.key_access.exec(c)))a.push(u[1]);else{if(null===(u=r.index_access.exec(c)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1])}t[2]=a}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");o.push({placeholder:t[0],param_no:t[1],keys:t[2],sign:t[3],pad_char:t[4],align:t[5],width:t[6],precision:t[7],type:t[8]})}n=n.substring(t[0].length)}return s[e]=o}t.sprintf=i,t.vsprintf=a,"undefined"!=typeof window&&(window.sprintf=i,window.vsprintf=a,void 0===(o=function(){return{sprintf:i,vsprintf:a}}.call(t,n,t,e))||(e.exports=o))}()},function(e,t,n){var o=n(8);e.exports=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){var o=n(0).default,r=n(9);e.exports=function(e,t){if(t&&("object"===o(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return r(e)},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){function n(t,o){return e.exports=n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,n(t,o)}e.exports=n,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";n.r(t),n.d(t,"WebSocketManager",(function(){return Ne}));var o=n(0),r=n.n(o),i=n(4),a="NULL",c="CLIENT_LOGGER",s="DEBUG",u="AMZ_WEB_SOCKET_MANAGER:",l="Network offline",p="Network online, connecting to WebSocket server",d="Network offline, ignoring this getWebSocketConnConfig request",f="Heartbeat response not received",g="aws/ping deep heartbeat response not received",b="Heartbeat response received",v="aws/ping deep heartbeat received",m="Sending heartbeat",y="Sending aws/ping deep heartbeat",h="Failed to send heartbeat since WebSocket is not open",S="Failed to send aws/ping deep heartbeat since WebSocket is not open",k="Deep Heartbeat is successful. WebSocketManager has received 200 response from aws/ping",w="Deep Heartbeat failed. WebSocketManager does not receive 200 response from aws/ping",C="Generic topic failed.",O="WebSocket connection established!",T="WebSocket connection is closed",L="WebSocketManager Error, error_event: ",x="Scheduling WebSocket reinitialization, after delay ",_="WebSocket URL cannot be used to establish connection",I="WebSocket Initialization failed - Terminating and cleaning subscriptions",W="Terminating WebSocket Manager",N="Fetching new WebSocket connection configuration",F="Successfully fetched webSocket connection configuration",E="Failed to fetch webSocket connection configuration",M="Retrying fetching new WebSocket connection configuration",D="Initializing Websocket Manager",R="Initializing Websocket Manager Failure callback registered",A="Websocket connection open callback registered",j="Websocket connection close callback registered",H="Websocket connection gain callback registered",P="Websocket connection lost callback registered",G="Websocket subscription failure callback registered",z="Reset Websocket state",U="WebSocketManager Message Error",q="Message received for topic ",B="Invalid incoming message",J="WebsocketManager invoke callbacks for topic success ",V="aws/subscribe",X="aws/unsubscribe",$="aws/heartbeat",K="aws/ping",Z="connected",Q="disconnected",Y={assertTrue:function(e,t){if(!e)throw new Error(t)},assertNotNull:function(e,t){return Y.assertTrue(null!==e&&void 0!==r()(e),Object(i.sprintf)("%s must be provided",t||"A value")),e},isNonEmptyString:function(e){return"string"==typeof e&&e.length>0},assertIsList:function(e,t){if(!Array.isArray(e))throw new Error(t+" is not an array")},isFunction:function(e){return!!(e&&e.constructor&&e.call&&e.apply)},isObject:function(e){return!("object"!==r()(e)||null===e)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e}},ee=new RegExp("^(wss://)\\w*"),te=new RegExp("^(ws://127.0.0.1:)");Y.validWSUrl=function(e){return ee.test(e)||te.test(e)},Y.getSubscriptionResponse=function(e,t,n){return{topic:e,content:{status:t?"success":"failure",topics:n}}},Y.assertIsObject=function(e,t){if(!Y.isObject(e))throw new Error(t+" is not an object!")},Y.addJitter=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;t=Math.min(t,1);var n=Math.random()>.5?1:-1;return Math.floor(e+n*e*Math.random()*t)},Y.isNetworkOnline=function(){return navigator.onLine},Y.isNetworkFailure=function(e){return!(!e._debug||!e._debug.type)&&"NetworkingError"===e._debug.type};var ne=Y,oe=n(5),re=n.n(oe),ie=n(6),ae=n.n(ie),ce=n(3),se=n.n(ce),ue=n(7),le=n.n(ue),pe=n(1),de=n.n(pe),fe=n(2),ge=n.n(fe);function be(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=se()(e);if(t){var r=se()(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return ae()(this,n)}}function ve(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function me(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"";if(this.hasClientLogger()){var n="string"==typeof t?t:JSON.stringify(t,Te()),o="string"==typeof this.logMetaData?this.logMetaData:JSON.stringify(this.logMetaData,Te()),r="".concat(Oe(e)," ").concat(n);switch(o&&(r+=" ".concat(o)),e){case Se.DEBUG:return this._clientLogger.debug(r)||r;case Se.INFO:return this._clientLogger.info(r)||r;case Se.WARN:return this._clientLogger.warn(r)||r;case Se.ERROR:return this._clientLogger.error(r)||r;case Se.ADVANCED_LOG:return this._advancedLogWriter?this._clientLogger[this._advancedLogWriter](r)||r:""}}}},{key:"isLevelEnabled",value:function(e){return e>=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.prefix||he;return e.logMetaData&&this.setLogMetaData(e.logMetaData),new Ce(this,me({prefix:t,logMetaData:this.logMetaData},e))}},{key:"setLogMetaData",value:function(e){this.logMetaData=e}},{key:"updateLoggerConfig",value:function(e){var t=e||{};this._level=t.level||Se.INFO,this._advancedLogWriter="warn",t.advancedLogWriter&&(this._advancedLogWriter=t.advancedLogWriter),t.customizedLogger&&"object"===r()(t.customizedLogger)?this.useClientLogger=!0:this.useClientLogger=!1,this._clientLogger=t.logger||this.selectLogger(t),this._logsDestination=a,t.debug&&(this._logsDestination=s),t.logger&&(this._logsDestination=c)}},{key:"selectLogger",value:function(e){return e.customizedLogger&&"object"===r()(e.customizedLogger)?e.customizedLogger:e.useDefaultLogger?Le():null}}]),e}(),we=function(){function e(){de()(this,e)}return ge()(e,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}},{key:"advancedLog",value:function(){}}]),e}(),Ce=function(e){re()(n,e);var t=be(n);function n(e,o){var r;return de()(this,n),(r=t.call(this)).options=o||{},r.prefix=o.prefix||he,r.excludeTimestamp=o.excludeTimestamp,r.logManager=e,r}return ge()(n,[{key:"debug",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:2e3;de()(this,e),this.numAttempts=0,this.executor=t,this.hasActiveReconnection=!1,this.defaultRetry=n}return ge()(e,[{key:"retry",value:function(){var e=this;this.hasActiveReconnection||(this.hasActiveReconnection=!0,setTimeout((function(){e._execute()}),this._getDelay()))}},{key:"_execute",value:function(){this.hasActiveReconnection=!1,this.executor(),this.numAttempts++}},{key:"connected",value:function(){this.numAttempts=0}},{key:"_getDelay",value:function(){var e=Math.pow(2,this.numAttempts)*this.defaultRetry;return e<=3e4?e:3e4}},{key:"getIsConnected",value:function(){return!this.numAttempts}}]),e}(),_e=null,Ie=function(){var e=_e.getLogger({prefix:u,excludeTimestamp:!0}),t=ne.isNetworkOnline(),n={primary:null,secondary:null},o={reconnectWebSocket:!0,websocketInitFailed:!1,exponentialBackOffTime:1e3,exponentialTimeoutHandle:null,lifeTimeTimeoutHandle:null,webSocketInitCheckerTimeoutId:null,connState:null},r={connectWebSocketRetryCount:0,connectionAttemptStartTime:null,noOpenConnectionsTimestamp:null},i={pendingResponse:!1,intervalHandle:null},a={pendingResponse:!1,intervalHandle:null},c={initFailure:new Set,getWebSocketTransport:null,subscriptionUpdate:new Set,subscriptionFailure:new Set,topic:new Map,allMessage:new Set,connectionGain:new Set,connectionLost:new Set,connectionOpen:new Set,connectionClose:new Set,deepHeartbeatSuccess:new Set,deepHeartbeatFailure:new Set,topicFailure:new Set},s={connConfig:null,promiseHandle:null,promiseCompleted:!0},Y={subscribed:new Set,pending:new Set,subscriptionHistory:new Set},ee={responseCheckIntervalId:null,requestCompleted:!0,reSubscribeIntervalId:null,consecutiveFailedSubscribeAttempts:0,consecutiveNoResponseRequest:0},te=new xe((function(){Ie()})),oe=new Set([V,X,$,K]),re=setInterval((function(){if(t!==ne.isNetworkOnline()){if(!(t=ne.isNetworkOnline()))return void Fe(e.advancedLog(l));var n=pe();t&&(!n||se(n,WebSocket.CLOSING)||se(n,WebSocket.CLOSED))&&(Fe(e.advancedLog(p)),Ie())}}),250),ie=function(t,n){t.forEach((function(t){try{t(n)}catch(t){Fe(e.error("Error executing callback",t))}}))},ae=function(e){if(null===e)return"NULL";switch(e.readyState){case WebSocket.CONNECTING:return"CONNECTING";case WebSocket.OPEN:return"OPEN";case WebSocket.CLOSING:return"CLOSING";case WebSocket.CLOSED:return"CLOSED";default:return"UNDEFINED"}},ce=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";Fe(e.debug("["+t+"] Primary WebSocket: "+ae(n.primary)+" | Secondary WebSocket: "+ae(n.secondary)))},se=function(e,t){return e&&e.readyState===t},ue=function(e){return se(e,WebSocket.OPEN)},le=function(e){return null===e||void 0===e.readyState||se(e,WebSocket.CLOSED)},pe=function(){return null!==n.secondary?n.secondary:n.primary},de=function(){return ue(pe())},fe=function(){if(a.pendingResponse&&(Fe(e.debug(g)),ie(c.deepHeartbeatFailure,{timestamp:Date.now(),error:"aws/ping response is not received"}),clearInterval(a.intervalHandle),a.pendingResponse=!1),i.pendingResponse)return Fe(e.warn(f)),clearInterval(i.intervalHandle),i.intervalHandle=null,i.pendingResponse=!1,void Ie();de()?(Fe(e.debug(y)),pe().send(Te(K)),a.pendingResponse=!0,Fe(e.debug(m)),pe().send(Te($)),i.pendingResponse=!0):(Fe(e.debug(S)),ie(c.deepHeartbeatFailure,{timestamp:Date.now(),error:"Unable to send message to aws/ping because websocket connection is not established."}),Fe(e.warn(h)),ce("sendHeartBeat"),Ie())},ge=function(){Fe(e.advancedLog(z)),o.exponentialBackOffTime=1e3,i.pendingResponse=!1,a.pendingResponse=!1,o.reconnectWebSocket=!0,clearTimeout(o.lifeTimeTimeoutHandle),clearInterval(i.intervalHandle),clearInterval(a.intervalHandle),clearTimeout(o.exponentialTimeoutHandle),clearTimeout(o.webSocketInitCheckerTimeoutId),i.intervalHandle=null},be=function(){ee.consecutiveFailedSubscribeAttempts=0,ee.consecutiveNoResponseRequest=0,clearInterval(ee.responseCheckIntervalId),clearInterval(ee.reSubscribeIntervalId)},ve=function(){r.connectWebSocketRetryCount=0,r.connectionAttemptStartTime=null,r.noOpenConnectionsTimestamp=null},me=function(){te.connected();try{Fe(e.advancedLog(O)),ce("webSocketOnOpen"),null!==o.connState&&o.connState!==Q||ie(c.connectionGain),o.connState=Z;var t=Date.now();ie(c.connectionOpen,{connectWebSocketRetryCount:r.connectWebSocketRetryCount,connectionAttemptStartTime:r.connectionAttemptStartTime,noOpenConnectionsTimestamp:r.noOpenConnectionsTimestamp,connectionEstablishedTime:t,timeToConnect:t-r.connectionAttemptStartTime,timeWithoutConnection:r.noOpenConnectionsTimestamp?t-r.noOpenConnectionsTimestamp:null}),ve(),ge(),pe().openTimestamp=Date.now(),0===Y.subscribed.size&&ue(n.secondary)&&ke(n.primary,"[Primary WebSocket] Closing WebSocket"),(Y.subscribed.size>0||Y.pending.size>0)&&(ue(n.secondary)&&Fe(e.info("Subscribing secondary websocket to topics of primary websocket")),Y.subscribed.forEach((function(e){Y.subscriptionHistory.add(e),Y.pending.add(e)})),Y.subscribed.clear(),Se()),fe(),null!==i.intervalHandle&&clearInterval(i.intervalHandle),i.intervalHandle=setInterval(fe,1e4);var a=1e3*s.connConfig.webSocketTransport.transportLifeTimeInSeconds;Fe(e.debug("Scheduling WebSocket manager reconnection, after delay "+a+" ms")),o.lifeTimeTimeoutHandle=setTimeout((function(){Fe(e.debug("Starting scheduled WebSocket manager reconnection")),Ie()}),a)}catch(t){Fe(e.error("Error after establishing WebSocket connection",t))}},ye=function(t){ce("webSocketOnError"),Fe(e.advancedLog(L,t)),te.getIsConnected()?Ie():te.retry()},he=function(t){var o=JSON.parse(t.data);switch(o.topic){case V:if(Fe(e.debug("Subscription Message received from webSocket server")),ee.requestCompleted=!0,ee.consecutiveNoResponseRequest=0,"success"===o.content.status)ee.consecutiveFailedSubscribeAttempts=0,o.content.topics.forEach((function(e){Y.subscriptionHistory.delete(e),Y.pending.delete(e),Y.subscribed.add(e)})),0===Y.subscriptionHistory.size?ue(n.secondary)&&(Fe(e.debug("Successfully subscribed secondary websocket to all topics of primary websocket")),ke(n.primary,"[Primary WebSocket] Closing WebSocket")):Se(),ie(c.subscriptionUpdate,o);else{if(clearInterval(ee.reSubscribeIntervalId),++ee.consecutiveFailedSubscribeAttempts,5===ee.consecutiveFailedSubscribeAttempts)return ie(c.subscriptionFailure,o),void(ee.consecutiveFailedSubscribeAttempts=0);ee.reSubscribeIntervalId=setInterval((function(){Se()}),500)}break;case $:Fe(e.debug(b)),i.pendingResponse=!1,null===i.intervalHandle&&(i.intervalHandle=setInterval(fe,1e4));break;case K:Fe(e.debug(v)),a.pendingResponse=!1,200===o.statusCode?ie(c.deepHeartbeatSuccess,{timestamp:Date.now()}):ie(c.deepHeartbeatFailure,{timestamp:Date.now(),statusCode:o.statusCode,statusContent:o.statusContent});break;default:if(o.topic){if(Fe(e.advancedLog(q,o.topic)),ue(n.primary)&&ue(n.secondary)&&0===Y.subscriptionHistory.size&&this===n.primary)return void Fe(e.warn("Ignoring Message for Topic "+o.topic+", to avoid duplicates"));if(0===c.allMessage.size&&0===c.topic.size)return void Fe(e.warn("No registered callback listener for Topic",o.topic));Fe(e.advancedLog(J,o.topic)),ie(c.allMessage,o),c.topic.has(o.topic)&&ie(c.topic.get(o.topic),o)}else o.message?(Fe(e.advancedLog(U,o)),ie(c.topicFailure,{timestamp:Date.now(),errorMessage:o.message,connectionId:o.connectionId,requestId:o.requestId})):Fe(e.advancedLog(B,o))}},Se=function t(){if(ee.consecutiveNoResponseRequest>3)return Fe(e.warn("Ignoring subscribePendingTopics since we have exhausted max subscription retries with no response")),void ie(c.subscriptionFailure,ne.getSubscriptionResponse(V,!1,Array.from(Y.pending)));de()?0!==Array.from(Y.pending).length&&(clearInterval(ee.responseCheckIntervalId),pe().send(Te(V,{topics:Array.from(Y.pending)})),ee.requestCompleted=!1,ee.responseCheckIntervalId=setInterval((function(){ee.requestCompleted||(++ee.consecutiveNoResponseRequest,t())}),1e3)):Fe(e.warn("Ignoring subscribePendingTopics call since Default WebSocket is not open"))},ke=function(t,n){se(t,WebSocket.CONNECTING)||se(t,WebSocket.OPEN)?t.close(1e3,n):Fe(e.warn("Ignoring WebSocket Close request, WebSocket State: "+ae(t)))},we=function(e){ke(n.primary,"[Primary] WebSocket "+e),ke(n.secondary,"[Secondary] WebSocket "+e)},Ce=function(){r.connectWebSocketRetryCount++;var t=ne.addJitter(o.exponentialBackOffTime,.3);Date.now()+t<=s.connConfig.urlConnValidTime?(Fe(e.advancedLog(x)),o.exponentialTimeoutHandle=setTimeout((function(){return We()}),t),o.exponentialBackOffTime*=2):(Fe(e.advancedLog(_)),Ie())},Oe=function(t){ge(),be(),Fe(e.advancedLog(I,t)),o.websocketInitFailed=!0,we(W),clearInterval(re),ie(c.initFailure,{connectWebSocketRetryCount:r.connectWebSocketRetryCount,connectionAttemptStartTime:r.connectionAttemptStartTime,reason:t}),ve()},Te=function(e,t){return JSON.stringify({topic:e,content:t})},Le=function(t){return!!(ne.isObject(t)&&ne.isObject(t.webSocketTransport)&&ne.isNonEmptyString(t.webSocketTransport.url)&&ne.validWSUrl(t.webSocketTransport.url)&&1e3*t.webSocketTransport.transportLifeTimeInSeconds>=3e5)||(Fe(e.error("Invalid WebSocket Connection Configuration",t)),!1)},Ie=function(){if(ne.isNetworkOnline())if(o.websocketInitFailed)Fe(e.debug("WebSocket Init had failed, ignoring this getWebSocketConnConfig request"));else{if(s.promiseCompleted)return ge(),Fe(e.advancedLog(N)),r.connectionAttemptStartTime=r.connectionAttemptStartTime||Date.now(),s.promiseCompleted=!1,s.promiseHandle=c.getWebSocketTransport(),s.promiseHandle.then((function(t){return s.promiseCompleted=!0,Fe(e.advancedLog(F)),Le(t)?(s.connConfig=t,s.connConfig.urlConnValidTime=Date.now()+85e3,We()):(Oe("Invalid WebSocket connection configuration: "+t),{webSocketConnectionFailed:!0})}),(function(t){return s.promiseCompleted=!0,Fe(e.advancedLog(E,t)),ne.isNetworkFailure(t)?(Fe(e.advancedLog(M,t)),te.retry()):Oe("Failed to fetch webSocket connection configuration: "+JSON.stringify(t)),{webSocketConnectionFailed:!0}}));Fe(e.debug("There is an ongoing getWebSocketConnConfig request, this request will be ignored"))}else Fe(e.advancedLog(d))},We=function(){if(o.websocketInitFailed)return Fe(e.info("web-socket initializing had failed, aborting re-init")),{webSocketConnectionFailed:!0};if(!ne.isNetworkOnline())return Fe(e.warn("System is offline aborting web-socket init")),{webSocketConnectionFailed:!0};Fe(e.advancedLog(D)),ce("initWebSocket");try{if(Le(s.connConfig)){var t=null;return ue(n.primary)?(Fe(e.debug("Primary Socket connection is already open")),se(n.secondary,WebSocket.CONNECTING)||(Fe(e.debug("Establishing a secondary web-socket connection")),te.numAttempts=0,n.secondary=Ne()),t=n.secondary):(se(n.primary,WebSocket.CONNECTING)||(Fe(e.debug("Establishing a primary web-socket connection")),n.primary=Ne()),t=n.primary),o.webSocketInitCheckerTimeoutId=setTimeout((function(){ue(t)||Ce()}),1e3),{webSocketConnectionFailed:!1}}}catch(t){return Fe(e.error("Error Initializing web-socket-manager",t)),Oe("Failed to initialize new WebSocket: "+t.message),{webSocketConnectionFailed:!0}}},Ne=function(){var t=new WebSocket(s.connConfig.webSocketTransport.url);return t.addEventListener("open",me),t.addEventListener("message",he),t.addEventListener("error",ye),t.addEventListener("close",(function(i){return function(t,i){Fe(e.advancedLog(T,t)),ce("webSocketOnClose before-cleanup"),ie(c.connectionClose,{openTimestamp:i.openTimestamp,closeTimestamp:Date.now(),connectionDuration:Date.now()-i.openTimestamp,code:t.code,reason:t.reason}),le(n.primary)&&(n.primary=null),le(n.secondary)&&(n.secondary=null),o.reconnectWebSocket&&(ue(n.primary)||ue(n.secondary)?le(n.primary)&&ue(n.secondary)&&(Fe(e.debug("[Primary] WebSocket Cleanly Closed")),n.primary=n.secondary,n.secondary=null):(Fe(e.warn("Neither primary websocket and nor secondary websocket have open connections, attempting to re-establish connection")),o.connState===Q?Fe(e.info("Ignoring connectionLost callback invocation")):(ie(c.connectionLost,{openTimestamp:i.openTimestamp,closeTimestamp:Date.now(),connectionDuration:Date.now()-i.openTimestamp,code:t.code,reason:t.reason}),r.noOpenConnectionsTimestamp=Date.now()),o.connState=Q,Ie()),ce("webSocketOnClose after-cleanup"))}(i,t)})),t},Fe=function(e){return e&&"function"==typeof e.sendInternalLogToServer&&e.sendInternalLogToServer(),e};this.init=function(t){if(ne.assertTrue(ne.isFunction(t),"transportHandle must be a function"),null===c.getWebSocketTransport)return c.getWebSocketTransport=t,Ie();Fe(e.warn("Web Socket Manager was already initialized"))},this.onInitFailure=function(t){return Fe(e.advancedLog(R)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.initFailure.add(t),o.websocketInitFailed&&t(),function(){return c.initFailure.delete(t)}},this.onConnectionOpen=function(t){return Fe(e.advancedLog(A)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.connectionOpen.add(t),function(){return c.connectionOpen.delete(t)}},this.onConnectionClose=function(t){return Fe(e.advancedLog(j)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.connectionClose.add(t),function(){return c.connectionClose.delete(t)}},this.onConnectionGain=function(t){return Fe(e.advancedLog(H)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.connectionGain.add(t),de()&&t(),function(){return c.connectionGain.delete(t)}},this.onConnectionLost=function(t){return Fe(e.advancedLog(P)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.connectionLost.add(t),o.connState===Q&&t(),function(){return c.connectionLost.delete(t)}},this.onSubscriptionUpdate=function(e){return ne.assertTrue(ne.isFunction(e),"cb must be a function"),c.subscriptionUpdate.add(e),function(){return c.subscriptionUpdate.delete(e)}},this.onSubscriptionFailure=function(t){return Fe(e.advancedLog(G)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.subscriptionFailure.add(t),function(){return c.subscriptionFailure.delete(t)}},this.onMessage=function(e,t){return ne.assertNotNull(e,"topicName"),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.topic.has(e)?c.topic.get(e).add(t):c.topic.set(e,new Set([t])),function(){return c.topic.get(e).delete(t)}},this.onAllMessage=function(e){return ne.assertTrue(ne.isFunction(e),"cb must be a function"),c.allMessage.add(e),function(){return c.allMessage.delete(e)}},this.subscribeTopics=function(e){ne.assertNotNull(e,"topics"),ne.assertIsList(e),e.forEach((function(e){Y.subscribed.has(e)||Y.pending.add(e)})),ee.consecutiveNoResponseRequest=0,Se()},this.sendMessage=function(t){if(ne.assertIsObject(t,"payload"),void 0===t.topic||oe.has(t.topic))Fe(e.warn("Cannot send message, Invalid topic: "+t.topic));else{try{t=JSON.stringify(t)}catch(n){return void Fe(e.warn("Error stringify message",t))}de()?pe().send(t):Fe(e.warn("Cannot send message, web socket connection is not open"))}},this.onDeepHeartbeatSuccess=function(t){return Fe(e.advancedLog(k)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.deepHeartbeatSuccess.add(t),function(){return c.deepHeartbeatSuccess.delete(t)}},this.onDeepHeartbeatFailure=function(t){return Fe(e.advancedLog(w)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.deepHeartbeatFailure.add(t),function(){return c.deepHeartbeatFailure.delete(t)}},this.onTopicFailure=function(t){return Fe(e.advancedLog(C)),ne.assertTrue(ne.isFunction(t),"cb must be a function"),c.topicFailure.add(t),function(){return c.topicFailure.delete(t)}},this.closeWebSocket=function(){ge(),be(),o.reconnectWebSocket=!1,clearInterval(re),we("User request to close WebSocket")},this.terminateWebSocketManager=Oe},We={create:function(e){return _e||(_e=new ke(e)),_e.hasLogMetaData()||_e.setLogMetaData(e),new Ie},setGlobalConfig:function(e){var t=e&&e.loggerConfig;_e||(_e=new ke),_e.updateLoggerConfig(t);var n=e&&e.webSocketManagerConfig,o=n&&n.isNetworkOnline;o&&"function"==typeof o&&(ne.isNetworkOnline=o)},LogLevel:Se,Logger:ye};global.connect=global.connect||{},connect.WebSocketManager=We;var Ne=We;t.default=Ne}]); //# sourceMappingURL=amazon-connect-websocket-manager.js.map const WebSocketManager = connect.WebSocketManager;