@clairejs/client 3.1.7 → 3.1.8

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.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  ## Change Log
2
2
 
3
- #### 3.1.7:
3
+ #### 3.1.8:
4
4
 
5
- - fix socket terminated not calling disconnection handler
5
+ - fix socket terminated not calling disconnection handler error
6
6
  - fix typo in socket config
7
7
 
8
8
  #### 3.1.5:
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){for(var n in t)e[n]=t[n]}(exports,function(e){var t={};function __webpack_require__(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,__webpack_require__),s.l=!0,s.exports}return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.t=function(e,t){if(1&t&&(e=__webpack_require__(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(__webpack_require__.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)__webpack_require__.d(n,s,function(t){return e[t]}.bind(null,s));return n},__webpack_require__.n=function(e){var t=e&&e.__esModule?function getDefault(){return e.default}:function getModuleExports(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=6)}([function(e,t){e.exports=require("@clairejs/core")},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractHttpClient=void 0;t.AbstractHttpClient=class AbstractHttpClient{constructor(e){this.apiServerUrl=e}resolveHeaders(e){return s(this,void 0,void 0,(function*(){return e}))}resolveUrl(e){return s(this,void 0,void 0,(function*(){return this.apiServerUrl+e}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},function(e,t){e.exports=require("axios")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},function(e,t,n){"use strict";var s=this&&this.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,s,i)}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),i(n(7),t),i(n(8),t),i(n(9),t),i(n(1),t),i(n(4),t),i(n(10),t),i(n(2),t),i(n(12),t),i(n(14),t),i(n(15),t),i(n(16),t),i(n(17),t),i(n(18),t),i(n(5),t),i(n(19),t),i(n(20),t),i(n(21),t),i(n(22),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(0);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.RefreshHttpClient=void 0;const r=i(n(3)),o=n(1);class RefreshHttpClient extends o.AbstractHttpClient{constructor(e,t,n){super(e),this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.refreshing=!1,this.refreshQueue=[]}getRefreshedAccessToken(){return s(this,void 0,void 0,(function*(){}))}resolveResult(e,t){return s(this,void 0,void 0,(function*(){if(!t||!Object.keys(t).map((e=>e.toLowerCase().includes("authorization")))){const e=yield this.tokenManager.getAccessToken();e&&e.expiration<Date.now()+3e4&&(yield this.refreshToken(e))}const n=yield this.finalHeaders(t);return(yield e(n)).data}))}finalHeaders(e){return s(this,void 0,void 0,(function*(){const t=yield this.tokenManager.getAccessToken(),n=yield this.resolveHeaders(e);return{headers:Object.assign({authorization:(null==t?void 0:t.token)||""},n)}}))}refreshToken(e){return s(this,void 0,void 0,(function*(){if(this.refreshing)this.logger.debug("Awaiting refresh token, queued"),yield new Promise((e=>{this.refreshQueue.push({resolver:e})}));else{if(!(e=e||(yield this.tokenManager.getAccessToken()))||!e.refreshToken)return;try{this.refreshing=!0;const e=yield this.getRefreshedAccessToken();yield this.tokenManager.setAccessToken(e),this.logger.debug("Access token was refreshed")}catch(e){this.logger.debug("Cannot refresh access token, clear local token"),yield this.tokenManager.setAccessToken()}finally{this.refreshing=!1;for(const e of this.refreshQueue)e.resolver();this.refreshQueue=[]}}}))}get(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e);return this.logger.debug("[GET] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.get(n,e)}))),t)}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e);return this.logger.debug("[POST] ",i),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.post(i,t,e)}))),n)}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e);return this.logger.debug("[PUT] ",i),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.put(i,t,e)}))),n)}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e);return this.logger.debug("[DEL] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.delete(n,e)}))),t)}))}}t.RefreshHttpClient=RefreshHttpClient},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultHttpClient=void 0;const r=n(1),o=i(n(3));class DefaultHttpClient extends r.AbstractHttpClient{get(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield o.default.get(n,{headers:s})).data}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield o.default.post(s,t,{headers:i})).data}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield o.default.put(s,t,{headers:i})).data}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield o.default.delete(n,{headers:s})).data}))}}t.DefaultHttpClient=DefaultHttpClient},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(0),i=n(4),r=n(11);class DefaultClientSocketManager extends i.AbstractClientSocketManager{constructor(e,t,n){super(),this.wsProvider=e,this.logger=t,this.config=n,this.allSockets=[],this.allChannels=[],this.accumulatedPing=0,this.retryDelay=0,this.pingpongId=0,this.pingpong=[]}getPingMs(){const e=this.pingpong.filter((e=>e.sentTimestamp&&e.receivedTimestamp));return e.length?e.map((e=>e.receivedTimestamp-e.sentTimestamp)).reduce(((e,t)=>e+t),0)/e.length:0}subChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");const s=[];for(const e of t){n.registeredChannels.includes(e)||n.registeredChannels.push(e);const t=this.allChannels.find((t=>t.channel===e));t&&t.connected||s.push(e)}this.joinChannels(s)}unsubChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");n.registeredChannels=n.registeredChannels.filter((e=>!t.includes(e)));const s=[];for(const e of t)this.allSockets.find((t=>t.registeredChannels.includes(e)))||s.push(e);this.leaveChannels(s)}removeSocket(e){const t=this.allSockets.find((t=>t.socket===e));t&&t.disconnectionHandler&&t.disconnectionHandler(),this.allSockets=this.allSockets.filter((t=>t.socket!==e)),this.allSockets.length||this.forceDisconnect()}registerReconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.reconnectionHandler=t)}registerDisconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.disconnectionHandler=t)}registerMessageHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.messageHandler=t)}sendPlainMessageToChannel(e,t){if(t){let n=this.allChannels.find((e=>e.channel===t));n||(n={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(n)),n.connected?this.sendRawMessage({type:s.MessageType.PLAIN,data:{channel:t,message:e}}):n.pendingMessages.push(e)}else this.sendRawMessage({type:s.MessageType.PLAIN,data:{message:e}})}joinChannels(e){if(e.length)if(this.socket&&this.socketConnected)this.sendRawMessage({type:s.MessageType.CHANNEL_JOIN,data:e});else for(const t of e){let e=this.allChannels.find((e=>e.channel===t));e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected}}leaveChannels(e){e.length&&(this.handleChannelLeave(e),this.socket&&this.socketConnected&&this.sendRawMessage({type:s.MessageType.CHANNEL_LEAVE,data:e}))}sendPingPong(){this.pingpongId+=1,this.pingpongId%=100;const e={id:this.pingpongId,sentTimestamp:Date.now()};this.pingpong.push(e),this.pingpong.length>10&&this.pingpong.shift(),this.sendRawMessage({type:s.MessageType.PING_PONG,data:e.id})}sendRawMessage(e){if(!this.socket||!this.socketConnected)throw s.ErrorBuilder.error(s.Errors.BAD_STATE,"Socket not available");this.socket.send(e),this.logger.debug("Raw send",e)}handleChannelJoin(e){this.logger.debug("Joinning channels",e);for(const t of e){let e=this.allChannels.find((e=>e.channel===t));if(e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected=!0,e.pendingMessages.length){this.logger.debug(`Flushing ${e.pendingMessages.length} message`);for(const t of e.pendingMessages)this.sendPlainMessageToChannel(t,e.channel);e.pendingMessages=[]}}}handleChannelLeave(e){this.logger.debug("Leaving channels",e),this.allChannels=this.allChannels.filter((t=>!e.includes(t.channel)))}handlePlainMessage(e,t){for(const n of this.allSockets)n.messageHandler&&n.messageHandler(e,t)}handleConnect(){var e,t;this.logger.debug("Socket connected"),this.socketConnected=!0,this.pingIntervalId&&clearInterval(this.pingIntervalId),this.accumulatedPing=0,this.pingIntervalId=setInterval((()=>{var e,t,n;this.accumulatedPing+=1,this.accumulatedPing>((null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.deadThreshold)||3)?(this.intendedDisconnection=!1,null===(n=this.socket)||void 0===n||n.close()):this.sendPingPong()}),(null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.pingIntervalMs)||1e4),this.intendedDisconnection=!1,this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0);for(const e of this.allSockets)e.reconnectionHandler&&e.reconnectionHandler();const n=this.allChannels.filter((e=>!e.connected)).map((e=>e.channel));this.joinChannels(n)}handleDisconnect(e){e&&(this.intendedDisconnection=!0),this.logger.debug("Socket connnection closed, error: ",e),this.pingIntervalId&&clearInterval(this.pingIntervalId),this.socket=void 0,this.socketConnected=!1;for(const e of this.allSockets)e.disconnectionHandler&&e.disconnectionHandler();this.intendedDisconnection?(this.allSockets=[],this.allChannels=[],this.logger.debug("Socket connection terminated")):(this.allChannels=this.allChannels.map((e=>Object.assign(Object.assign({},e),{connected:!1}))),this.retryTimeoutId||(this.retryDelay=0,this.retry()))}handleMessage(e){var t,n;switch(this.logger.debug("Raw receive",e),e.type){case s.MessageType.PING_PONG:this.accumulatedPing=0;const i=e.data;if(i){const e=this.pingpong.find((e=>e.id===i));e&&(e.receivedTimestamp=Date.now())}break;case s.MessageType.CHANNEL_JOIN:(null===(t=e.data)||void 0===t?void 0:t.error)?this.logger.error("Join channel error",e.data.error):this.handleChannelJoin(e.data);break;case s.MessageType.CHANNEL_LEAVE:this.handleChannelLeave(e.data);break;case s.MessageType.PLAIN:this.handlePlainMessage(e.data.message,e.data.channel);break;case s.MessageType.DISCONNECTION:this.intendedDisconnection=!0,null===(n=this.socket)||void 0===n||n.close()}}create(){const e=new r.DefaultClientSocket(this);return this.allSockets.push({socket:e,registeredChannels:[]}),1===this.allSockets.length&&this.forceReconnect(),e}forceDisconnect(){this.intendedDisconnection=!0,this.socket&&(this.socket.close(),this.socket=void 0),this.retryTimeoutId&&clearTimeout(this.retryTimeoutId)}forceReconnect(){var e;this.intendedDisconnection=!1,this.socketConnected?null===(e=this.socket)||void 0===e||e.close():(this.retryDelay=0,void 0===this.socket&&(this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0),this.physicConnect()))}physicConnect(){this.wsProvider().then((e=>{e.onopen((()=>{this.handleConnect()})),e.onmessage((e=>{const t=JSON.parse(e);t&&t.type?this.handleMessage(t):this.logger.debug("Invalid mesasge structure",e)})),e.onclose((e=>{this.handleDisconnect(e)})),this.socket=e}))}retry(){var e;this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`),this.physicConnect(),this.retryDelay+=(null===(e=this.config)||void 0===e?void 0:e.reconnectTimeDeltaMs)||3e3,this.retryTimeoutId=setTimeout((()=>{this.socketConnected||this.intendedDisconnection||this.retry()}),this.retryDelay)}}t.DefaultClientSocketManager=DefaultClientSocketManager},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocket=void 0;t.DefaultClientSocket=class DefaultClientSocket{constructor(e){this.socketManager=e}joinChannels(e){this.socketManager.subChannels(this,e)}leaveChannels(e){this.socketManager.unsubChannels(this,e)}close(){this.socketManager.removeSocket(this)}onReconnect(e){this.socketManager.registerReconnectionHandler(this,e)}onDisconnect(e){this.socketManager.registerDisconnectionHandler(this,e)}onMessage(e){this.socketManager.registerMessageHandler(this,e)}send(e,t){this.socketManager.sendPlainMessageToChannel(e,t)}}},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Translator=void 0;const o=n(0),c=n(13),a=n(2),keyResolver=e=>`__${e}__`;let l=class Translator{constructor(e){this.storage=e,this.currentLang=null,this.subscribers=[]}addLangSubscriber(e){this.subscribers.push(e)}removeLangSubscriber(e){this.subscribers=this.subscribers.filter((t=>t!==e))}getCurrentLanguage(){return r(this,void 0,void 0,(function*(){return null===this.currentLang&&(this.currentLang=(yield this.storage.getItem(c.CURRENT_LANGUAGE))||void 0),this.currentLang}))}setCurrentLanguage(e){return r(this,void 0,void 0,(function*(){this.currentLang=e,yield this.storage.setItem(c.CURRENT_LANGUAGE,e);for(const t of this.subscribers)t(e)}))}getLanguages(){return r(this,void 0,void 0,(function*(){return(yield this.storage.getItem(c.SYSTEM_LANGUAGES))||void 0}))}setLanguages(e){return r(this,void 0,void 0,(function*(){yield this.storage.setItem(c.SYSTEM_LANGUAGES,e)}))}getTranslationObject(e){const t=this,n=Object.keys(e),s={},resolveTranslation=(e,s)=>{const i=s.reduce(((e,t)=>(Object.keys(t).forEach((t=>{e.includes(t)||e.push(t)})),e)),[]);for(const r of i){if(s.every((e=>"object"==typeof e[r])))e[r]={},resolveTranslation(e[r],s.map((e=>e[r])));else{const i=keyResolver(r);e[i]=s.map((e=>e[r])),Object.defineProperty(e,r,{value:function(...e){const s=t.currentLang||n[0];if(!s)return"";let r=this[i][n.indexOf(s)];return"string"==typeof r?r:"function"==typeof r?r(...e):i},configurable:!1,writable:!1})}}};return resolveTranslation(s,Object.values(e)),s}};l=s([(0,o.Injectable)(),i("design:paramtypes",[a.AbstractStorage])],l),t.Translator=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CURRENT_LANGUAGE=t.SYSTEM_LANGUAGES=void 0,t.SYSTEM_LANGUAGES="SYSTEM_LANGUAGES",t.CURRENT_LANGUAGE="CURRENT_LANGUAGE"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultTokenManager=void 0;const o=n(0),c=n(2),a=n(5);let l=class DefaultTokenManager extends a.AbstractTokenManager{constructor(e,t="ACCESS_TOKEN"){super(),this.storage=e,this.storageKey=t,this.accessToken=null}getAccessToken(){return r(this,void 0,void 0,(function*(){return null===this.accessToken&&(this.accessToken=yield this.storage.getItem(this.storageKey)),this.accessToken}))}setAccessToken(e){return r(this,void 0,void 0,(function*(){e?yield this.storage.setItem(this.storageKey,e):yield this.storage.deleteItem(this.storageKey),this.accessToken=e}))}};l=s([(0,o.Injectable)(),i("design:paramtypes",[c.AbstractStorage,String])],l),t.DefaultTokenManager=l},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CrudApi=t.mergeInstances=t.removeInstances=t.stringifyQueries=void 0;t.stringifyQueries=e=>Object.keys(e).reduce(((t,n)=>t+`${n}=${JSON.stringify(e[n])}&`),"");t.removeInstances=(e,t)=>{const n=e.slice();for(const e of t){const t=n.findIndex((t=>!!t.id&&!!e.id&&t.id===e.id));t>=0&&n.splice(t,1)}return n};t.mergeInstances=(e,t,n)=>{const s=t.slice();for(const t of n){const n=s.findIndex((e=>!!e.id&&!!t.id&&e.id===t.id));n<0?s.push(Object.assign(new e,t)):Object.assign(s[n],t)}return s};t.CrudApi=class CrudApi{constructor(e,t){this.model=e,this.httpClient=t}getEndpointBaseUrl(){return`/${this.model.name.toLowerCase()}`}getMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.get(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}updateMany(e,n){return s(this,void 0,void 0,(function*(){return yield this.httpClient.put(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(n||{})}`,e)}))}deleteMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.delete(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}createMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.post(`${this.getEndpointBaseUrl()}`,e)}))}}}]));
1
+ !function(e,t){for(var n in t)e[n]=t[n]}(exports,function(e){var t={};function __webpack_require__(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,__webpack_require__),s.l=!0,s.exports}return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.t=function(e,t){if(1&t&&(e=__webpack_require__(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(__webpack_require__.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)__webpack_require__.d(n,s,function(t){return e[t]}.bind(null,s));return n},__webpack_require__.n=function(e){var t=e&&e.__esModule?function getDefault(){return e.default}:function getModuleExports(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=6)}([function(e,t){e.exports=require("@clairejs/core")},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractHttpClient=void 0;t.AbstractHttpClient=class AbstractHttpClient{constructor(e){this.apiServerUrl=e}resolveHeaders(e){return s(this,void 0,void 0,(function*(){return e}))}resolveUrl(e){return s(this,void 0,void 0,(function*(){return this.apiServerUrl+e}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},function(e,t){e.exports=require("axios")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},function(e,t,n){"use strict";var s=this&&this.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,s,i)}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),i(n(7),t),i(n(8),t),i(n(9),t),i(n(1),t),i(n(4),t),i(n(10),t),i(n(2),t),i(n(12),t),i(n(14),t),i(n(15),t),i(n(16),t),i(n(17),t),i(n(18),t),i(n(5),t),i(n(19),t),i(n(20),t),i(n(21),t),i(n(22),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(0);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.RefreshHttpClient=void 0;const r=i(n(3)),o=n(1);class RefreshHttpClient extends o.AbstractHttpClient{constructor(e,t,n){super(e),this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.refreshing=!1,this.refreshQueue=[]}getRefreshedAccessToken(){return s(this,void 0,void 0,(function*(){}))}resolveResult(e,t){return s(this,void 0,void 0,(function*(){if(!t||!Object.keys(t).map((e=>e.toLowerCase().includes("authorization")))){const e=yield this.tokenManager.getAccessToken();e&&e.expiration<Date.now()+3e4&&(yield this.refreshToken(e))}const n=yield this.finalHeaders(t);return(yield e(n)).data}))}finalHeaders(e){return s(this,void 0,void 0,(function*(){const t=yield this.tokenManager.getAccessToken(),n=yield this.resolveHeaders(e);return{headers:Object.assign({authorization:(null==t?void 0:t.token)||""},n)}}))}refreshToken(e){return s(this,void 0,void 0,(function*(){if(this.refreshing)this.logger.debug("Awaiting refresh token, queued"),yield new Promise((e=>{this.refreshQueue.push({resolver:e})}));else{if(!(e=e||(yield this.tokenManager.getAccessToken()))||!e.refreshToken)return;try{this.refreshing=!0;const e=yield this.getRefreshedAccessToken();yield this.tokenManager.setAccessToken(e),this.logger.debug("Access token was refreshed")}catch(e){this.logger.debug("Cannot refresh access token, clear local token"),yield this.tokenManager.setAccessToken()}finally{this.refreshing=!1;for(const e of this.refreshQueue)e.resolver();this.refreshQueue=[]}}}))}get(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e);return this.logger.debug("[GET] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.get(n,e)}))),t)}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e);return this.logger.debug("[POST] ",i),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.post(i,t,e)}))),n)}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e);return this.logger.debug("[PUT] ",i),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.put(i,t,e)}))),n)}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e);return this.logger.debug("[DEL] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.delete(n,e)}))),t)}))}}t.RefreshHttpClient=RefreshHttpClient},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultHttpClient=void 0;const r=n(1),o=i(n(3));class DefaultHttpClient extends r.AbstractHttpClient{get(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield o.default.get(n,{headers:s})).data}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield o.default.post(s,t,{headers:i})).data}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield o.default.put(s,t,{headers:i})).data}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield o.default.delete(n,{headers:s})).data}))}}t.DefaultHttpClient=DefaultHttpClient},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(0),i=n(4),r=n(11);class DefaultClientSocketManager extends i.AbstractClientSocketManager{constructor(e,t,n){super(),this.wsProvider=e,this.logger=t,this.config=n,this.allSockets=[],this.allChannels=[],this.accumulatedPing=0,this.retryDelay=0,this.pingpongId=0,this.pingpong=[]}getPingMs(){const e=this.pingpong.filter((e=>e.sentTimestamp&&e.receivedTimestamp));return e.length?e.map((e=>e.receivedTimestamp-e.sentTimestamp)).reduce(((e,t)=>e+t),0)/e.length:0}subChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");const s=[];for(const e of t){n.registeredChannels.includes(e)||n.registeredChannels.push(e);const t=this.allChannels.find((t=>t.channel===e));t&&t.connected||s.push(e)}this.joinChannels(s)}unsubChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");n.registeredChannels=n.registeredChannels.filter((e=>!t.includes(e)));const s=[];for(const e of t)this.allSockets.find((t=>t.registeredChannels.includes(e)))||s.push(e);this.leaveChannels(s)}removeSocket(e){const t=this.allSockets.find((t=>t.socket===e));t&&t.disconnectionHandler&&t.disconnectionHandler(),this.allSockets=this.allSockets.filter((t=>t.socket!==e)),this.allSockets.length||this.forceDisconnect()}registerReconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.reconnectionHandler=t)}registerDisconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.disconnectionHandler=t)}registerMessageHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.messageHandler=t)}sendPlainMessageToChannel(e,t){if(t){let n=this.allChannels.find((e=>e.channel===t));n||(n={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(n)),n.connected?this.sendRawMessage({type:s.MessageType.PLAIN,data:{channel:t,message:e}}):n.pendingMessages.push(e)}else this.sendRawMessage({type:s.MessageType.PLAIN,data:{message:e}})}joinChannels(e){if(e.length)if(this.socket&&this.socketConnected)this.sendRawMessage({type:s.MessageType.CHANNEL_JOIN,data:e});else for(const t of e){let e=this.allChannels.find((e=>e.channel===t));e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected}}leaveChannels(e){e.length&&(this.handleChannelLeave(e),this.socket&&this.socketConnected&&this.sendRawMessage({type:s.MessageType.CHANNEL_LEAVE,data:e}))}sendPingPong(){this.pingpongId+=1,this.pingpongId%=100;const e={id:this.pingpongId,sentTimestamp:Date.now()};this.pingpong.push(e),this.pingpong.length>10&&this.pingpong.shift(),this.sendRawMessage({type:s.MessageType.PING_PONG,data:e.id})}sendRawMessage(e){if(!this.socket||!this.socketConnected)throw s.ErrorBuilder.error(s.Errors.BAD_STATE,"Socket not available");this.socket.send(e),this.logger.debug("Raw send",e)}handleChannelJoin(e){this.logger.debug("Joinning channels",e);for(const t of e){let e=this.allChannels.find((e=>e.channel===t));if(e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected=!0,e.pendingMessages.length){this.logger.debug(`Flushing ${e.pendingMessages.length} message`);for(const t of e.pendingMessages)this.sendPlainMessageToChannel(t,e.channel);e.pendingMessages=[]}}}handleChannelLeave(e){this.logger.debug("Leaving channels",e),this.allChannels=this.allChannels.filter((t=>!e.includes(t.channel)))}handlePlainMessage(e,t){for(const n of this.allSockets)n.messageHandler&&n.messageHandler(e,t)}handleConnect(){var e,t;this.logger.debug("Socket connected"),this.socketConnected=!0,this.pingIntervalId&&clearInterval(this.pingIntervalId),this.accumulatedPing=0,this.pingIntervalId=setInterval((()=>{var e,t,n;this.accumulatedPing+=1,this.accumulatedPing>((null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.deadThreshold)||3)?(this.intendedDisconnection=!1,null===(n=this.socket)||void 0===n||n.close()):this.sendPingPong()}),(null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.pingIntervalMs)||1e4),this.intendedDisconnection=!1,this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0);for(const e of this.allSockets)e.reconnectionHandler&&e.reconnectionHandler();const n=this.allChannels.filter((e=>!e.connected)).map((e=>e.channel));this.joinChannels(n)}handleDisconnect(e){e&&(this.intendedDisconnection=!0),this.logger.debug("Socket connnection closed, error: ",e),this.pingIntervalId&&clearInterval(this.pingIntervalId),this.socket=void 0,this.socketConnected=!1;for(const t of this.allSockets)t.disconnectionHandler&&t.disconnectionHandler(e);this.intendedDisconnection?(this.allSockets=[],this.allChannels=[],this.logger.debug("Socket connection terminated")):(this.allChannels=this.allChannels.map((e=>Object.assign(Object.assign({},e),{connected:!1}))),this.retryTimeoutId||(this.retryDelay=0,this.retry()))}handleMessage(e){var t,n;switch(this.logger.debug("Raw receive",e),e.type){case s.MessageType.PING_PONG:this.accumulatedPing=0;const i=e.data;if(i){const e=this.pingpong.find((e=>e.id===i));e&&(e.receivedTimestamp=Date.now())}break;case s.MessageType.CHANNEL_JOIN:(null===(t=e.data)||void 0===t?void 0:t.error)?this.logger.error("Join channel error",e.data.error):this.handleChannelJoin(e.data);break;case s.MessageType.CHANNEL_LEAVE:this.handleChannelLeave(e.data);break;case s.MessageType.PLAIN:this.handlePlainMessage(e.data.message,e.data.channel);break;case s.MessageType.DISCONNECTION:this.intendedDisconnection=!0,null===(n=this.socket)||void 0===n||n.close()}}create(){const e=new r.DefaultClientSocket(this);return this.allSockets.push({socket:e,registeredChannels:[]}),1===this.allSockets.length&&this.forceReconnect(),e}forceDisconnect(){this.intendedDisconnection=!0,this.socket&&(this.socket.close(),this.socket=void 0),this.retryTimeoutId&&clearTimeout(this.retryTimeoutId)}forceReconnect(){var e;this.intendedDisconnection=!1,this.socketConnected?null===(e=this.socket)||void 0===e||e.close():(this.retryDelay=0,void 0===this.socket&&(this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0),this.physicConnect()))}physicConnect(){this.wsProvider().then((e=>{e.onopen((()=>{this.handleConnect()})),e.onmessage((e=>{const t=JSON.parse(e);t&&t.type?this.handleMessage(t):this.logger.debug("Invalid mesasge structure",e)})),e.onclose((e=>{this.handleDisconnect(e)})),this.socket=e}))}retry(){var e;this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`),this.physicConnect(),this.retryDelay+=(null===(e=this.config)||void 0===e?void 0:e.reconnectTimeDeltaMs)||3e3,this.retryTimeoutId=setTimeout((()=>{this.socketConnected||this.intendedDisconnection||this.retry()}),this.retryDelay)}}t.DefaultClientSocketManager=DefaultClientSocketManager},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocket=void 0;t.DefaultClientSocket=class DefaultClientSocket{constructor(e){this.socketManager=e}joinChannels(e){this.socketManager.subChannels(this,e)}leaveChannels(e){this.socketManager.unsubChannels(this,e)}close(){this.socketManager.removeSocket(this)}onReconnect(e){this.socketManager.registerReconnectionHandler(this,e)}onDisconnect(e){this.socketManager.registerDisconnectionHandler(this,e)}onMessage(e){this.socketManager.registerMessageHandler(this,e)}send(e,t){this.socketManager.sendPlainMessageToChannel(e,t)}}},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Translator=void 0;const o=n(0),c=n(13),a=n(2),keyResolver=e=>`__${e}__`;let l=class Translator{constructor(e){this.storage=e,this.currentLang=null,this.subscribers=[]}addLangSubscriber(e){this.subscribers.push(e)}removeLangSubscriber(e){this.subscribers=this.subscribers.filter((t=>t!==e))}getCurrentLanguage(){return r(this,void 0,void 0,(function*(){return null===this.currentLang&&(this.currentLang=(yield this.storage.getItem(c.CURRENT_LANGUAGE))||void 0),this.currentLang}))}setCurrentLanguage(e){return r(this,void 0,void 0,(function*(){this.currentLang=e,yield this.storage.setItem(c.CURRENT_LANGUAGE,e);for(const t of this.subscribers)t(e)}))}getLanguages(){return r(this,void 0,void 0,(function*(){return(yield this.storage.getItem(c.SYSTEM_LANGUAGES))||void 0}))}setLanguages(e){return r(this,void 0,void 0,(function*(){yield this.storage.setItem(c.SYSTEM_LANGUAGES,e)}))}getTranslationObject(e){const t=this,n=Object.keys(e),s={},resolveTranslation=(e,s)=>{const i=s.reduce(((e,t)=>(Object.keys(t).forEach((t=>{e.includes(t)||e.push(t)})),e)),[]);for(const r of i){if(s.every((e=>"object"==typeof e[r])))e[r]={},resolveTranslation(e[r],s.map((e=>e[r])));else{const i=keyResolver(r);e[i]=s.map((e=>e[r])),Object.defineProperty(e,r,{value:function(...e){const s=t.currentLang||n[0];if(!s)return"";let r=this[i][n.indexOf(s)];return"string"==typeof r?r:"function"==typeof r?r(...e):i},configurable:!1,writable:!1})}}};return resolveTranslation(s,Object.values(e)),s}};l=s([(0,o.Injectable)(),i("design:paramtypes",[a.AbstractStorage])],l),t.Translator=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CURRENT_LANGUAGE=t.SYSTEM_LANGUAGES=void 0,t.SYSTEM_LANGUAGES="SYSTEM_LANGUAGES",t.CURRENT_LANGUAGE="CURRENT_LANGUAGE"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultTokenManager=void 0;const o=n(0),c=n(2),a=n(5);let l=class DefaultTokenManager extends a.AbstractTokenManager{constructor(e,t="ACCESS_TOKEN"){super(),this.storage=e,this.storageKey=t,this.accessToken=null}getAccessToken(){return r(this,void 0,void 0,(function*(){return null===this.accessToken&&(this.accessToken=yield this.storage.getItem(this.storageKey)),this.accessToken}))}setAccessToken(e){return r(this,void 0,void 0,(function*(){e?yield this.storage.setItem(this.storageKey,e):yield this.storage.deleteItem(this.storageKey),this.accessToken=e}))}};l=s([(0,o.Injectable)(),i("design:paramtypes",[c.AbstractStorage,String])],l),t.DefaultTokenManager=l},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CrudApi=t.mergeInstances=t.removeInstances=t.stringifyQueries=void 0;t.stringifyQueries=e=>Object.keys(e).reduce(((t,n)=>t+`${n}=${JSON.stringify(e[n])}&`),"");t.removeInstances=(e,t)=>{const n=e.slice();for(const e of t){const t=n.findIndex((t=>!!t.id&&!!e.id&&t.id===e.id));t>=0&&n.splice(t,1)}return n};t.mergeInstances=(e,t,n)=>{const s=t.slice();for(const t of n){const n=s.findIndex((e=>!!e.id&&!!t.id&&e.id===t.id));n<0?s.push(Object.assign(new e,t)):Object.assign(s[n],t)}return s};t.CrudApi=class CrudApi{constructor(e,t){this.model=e,this.httpClient=t}getEndpointBaseUrl(){return`/${this.model.name.toLowerCase()}`}getMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.get(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}updateMany(e,n){return s(this,void 0,void 0,(function*(){return yield this.httpClient.put(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(n||{})}`,e)}))}deleteMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.delete(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}createMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.post(`${this.getEndpointBaseUrl()}`,e)}))}}}]));
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"@clairejs/core\"","webpack:///./src/api/AbstractHttpClient.ts","webpack:///./src/system/AbstractStorage.ts","webpack:///external \"axios\"","webpack:///./src/socket/AbstractClientSocketManager.ts","webpack:///./src/api/AbstractTokenManager.ts","webpack:///./src/index.ts","webpack:///./src/system/ClaireClient.ts","webpack:///./src/api/RefreshHttpClient.ts","webpack:///./src/api/DefaultHttpClient.ts","webpack:///./src/socket/DefaultClientSocketManager.ts","webpack:///./src/socket/DefaultClientSocket.ts","webpack:///./src/translation/Translator.ts","webpack:///./src/constants.ts","webpack:///./src/routing/AbstractErrorHandler.ts","webpack:///./src/routing/AbstractViewMiddleware.ts","webpack:///./src/api/DefaultTokenManager.ts","webpack:///./src/api/CrudApi.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","require","AbstractHttpClient","apiServerUrl","headers","url","this","AbstractStorage","AbstractClientSocketManager","AbstractTokenManager","ClaireClient","ClaireApp","RefreshHttpClient","logger","tokenManager","super","refreshing","refreshQueue","apiCall","keys","map","k","toLowerCase","includes","accessToken","getAccessToken","expiration","Date","now","refreshToken","finalHeaders","data","userHeaders","resolveHeaders","authorization","token","oldToken","debug","Promise","resolve","push","resolver","newToken","getRefreshedAccessToken","setAccessToken","err","refresh","finalUrl","resolveUrl","resolveResult","body","post","put","delete","DefaultHttpClient","DefaultClientSocketManager","wsProvider","config","allSockets","allChannels","accumulatedPing","retryDelay","pingpongId","pingpong","candidates","filter","pp","sentTimestamp","receivedTimestamp","length","reduce","total","diff","socket","channels","info","find","unconnectedChannels","channel","registeredChannels","foundChannel","connected","joinChannels","removedChannels","leaveChannels","socketInfo","disconnectionHandler","forceDisconnect","handler","reconnectionHandler","messageHandler","message","pendingMessages","sendRawMessage","type","MessageType","PLAIN","socketConnected","CHANNEL_JOIN","handleChannelLeave","CHANNEL_LEAVE","pingpongInfo","id","shift","PING_PONG","ErrorBuilder","error","Errors","BAD_STATE","send","sendPlainMessageToChannel","pingIntervalId","clearInterval","setInterval","keepAlive","deadThreshold","intendedDisconnection","close","sendPingPong","pingIntervalMs","retryTimeoutId","clearTimeout","undefined","pendingChannels","retry","pong","handleChannelJoin","handlePlainMessage","DISCONNECTION","DefaultClientSocket","forceReconnect","physicConnect","then","onopen","handleConnect","onmessage","JSON","parse","handleMessage","onclose","handleDisconnect","reconnectTimeDeltaMs","setTimeout","socketManager","subChannels","unsubChannels","removeSocket","registerReconnectionHandler","registerDisconnectionHandler","registerMessageHandler","keyResolver","Translator","storage","currentLang","subscribers","subscriber","getItem","CURRENT_LANGUAGE","lang","setItem","sub","SYSTEM_LANGUAGES","languages","translationMap","_this","locales","translation","resolveTranslation","translationsObject","translationValues","collector","forEach","every","tKey","args","currentLocale","indexOf","configurable","writable","values","Injectable","AbstractErrorHandler","AbstractViewMiddleware","DefaultTokenManager","storageKey","deleteItem","stringifyQueries","queries","stringify","removeInstances","target","source","result","slice","instance","index","findIndex","splice","mergeInstances","model","assign","CrudApi","httpClient","getEndpointBaseUrl"],"mappings":"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","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 6);\n","module.exports = require(\"@clairejs/core\");","export abstract class AbstractHttpClient {\r\n constructor(readonly apiServerUrl: string) {}\r\n\r\n protected async resolveHeaders(headers?: object): Promise<object | undefined> {\r\n return headers;\r\n }\r\n\r\n protected async resolveUrl(url: string): Promise<string> {\r\n return this.apiServerUrl + url;\r\n }\r\n\r\n abstract get<T = any>(url: string, headers?: object): Promise<T>;\r\n abstract post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract delete<T = any>(url: string, headers?: object): Promise<T>;\r\n}\r\n","export abstract class AbstractStorage {\r\n public abstract getItem<T>(key: string): Promise<T | undefined>;\r\n public abstract setItem<T>(key: string, value: T): Promise<void>;\r\n public abstract deleteItem(key: string): Promise<void>;\r\n}\r\n","module.exports = require(\"axios\");","import { IClientSocket } from \"@clairejs/core\";\r\n\r\nexport abstract class AbstractClientSocketManager {\r\n abstract create(): IClientSocket;\r\n abstract joinChannels(channels: string[]): void;\r\n abstract leaveChannels(channels: string[]): void;\r\n abstract getPingMs(): number;\r\n}\r\n","import { AccessToken } from \"@clairejs/core\";\r\n\r\nexport abstract class AbstractTokenManager {\r\n abstract getAccessToken(): Promise<AccessToken | undefined>;\r\n abstract setAccessToken(token?: AccessToken): Promise<void>;\r\n}\r\n","export * from \"./system/ClaireClient\";\r\nexport * from \"./api/RefreshHttpClient\";\r\nexport * from \"./api/DefaultHttpClient\";\r\nexport * from \"./api/AbstractHttpClient\";\r\nexport * from \"./socket/AbstractClientSocketManager\";\r\nexport * from \"./socket/DefaultClientSocketManager\";\r\nexport * from \"./system/AbstractStorage\";\r\nexport * from \"./translation/Translator\";\r\nexport * from \"./routing/AbstractErrorHandler\";\r\nexport * from \"./routing/AbstractViewMiddleware\";\r\nexport * from \"./routing/UrlInfo\";\r\nexport * from \"./routing/RouterConfig\";\r\nexport * from \"./routing/ComponentInfo\";\r\nexport * from \"./api/AbstractTokenManager\";\r\nexport * from \"./socket/IWebSocket\";\r\nexport * from \"./translation/types\";\r\nexport * from \"./api/DefaultTokenManager\";\r\nexport * from \"./api/CrudApi\";\r\n","import { ClaireApp } from \"@clairejs/core\";\r\n\r\nexport class ClaireClient extends ClaireApp {}\r\n","import { AbstractLogger, AccessToken } from \"@clairejs/core\";\r\nimport axios from \"axios\";\r\n\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\nexport class RefreshHttpClient extends AbstractHttpClient {\r\n private refreshing = false;\r\n private refreshQueue: {\r\n resolver: () => void;\r\n }[] = [];\r\n\r\n public constructor(\r\n readonly apiServerUrl: string,\r\n readonly logger: AbstractLogger,\r\n readonly tokenManager: AbstractTokenManager,\r\n ) {\r\n super(apiServerUrl);\r\n }\r\n\r\n protected async getRefreshedAccessToken(): Promise<AccessToken | undefined> {\r\n return undefined;\r\n }\r\n\r\n protected async resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any> {\r\n //-- request does not explicitely provide authorization header, resolve automatically\r\n if (!headers || !Object.keys(headers).map((k) => k.toLowerCase().includes(\"authorization\"))) {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n //-- 30s buffer\r\n if (accessToken && accessToken.expiration < Date.now() + 30000) {\r\n await this.refreshToken(accessToken);\r\n }\r\n }\r\n const finalHeaders = await this.finalHeaders(headers);\r\n return (await apiCall(finalHeaders)).data;\r\n }\r\n\r\n private async finalHeaders(headers: object): Promise<any> {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n const userHeaders = await this.resolveHeaders(headers);\r\n return { headers: { authorization: accessToken?.token || \"\", ...userHeaders } };\r\n }\r\n\r\n async refreshToken(oldToken?: AccessToken) {\r\n if (this.refreshing) {\r\n this.logger.debug(\"Awaiting refresh token, queued\");\r\n await new Promise<void>((resolve) => {\r\n this.refreshQueue.push({ resolver: resolve });\r\n });\r\n } else {\r\n oldToken = oldToken || (await this.tokenManager.getAccessToken());\r\n //-- call to api server to refresh token\r\n if (!oldToken || !oldToken.refreshToken) {\r\n //-- there is no refresh token to refresh\r\n return;\r\n }\r\n\r\n try {\r\n this.refreshing = true;\r\n const newToken = await this.getRefreshedAccessToken();\r\n await this.tokenManager.setAccessToken(newToken);\r\n this.logger.debug(\"Access token was refreshed\");\r\n } catch (err) {\r\n //-- cannot refresh access token, clear old token\r\n this.logger.debug(\"Cannot refresh access token, clear local token\");\r\n await this.tokenManager.setAccessToken();\r\n } finally {\r\n this.refreshing = false;\r\n for (const refresh of this.refreshQueue) {\r\n refresh.resolver();\r\n }\r\n //-- clear queue\r\n this.refreshQueue = [];\r\n }\r\n }\r\n }\r\n\r\n public async get<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[GET] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.get(finalUrl, headers), headers);\r\n }\r\n public async post<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[POST] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.post(finalUrl, body, headers), headers);\r\n }\r\n public async put<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[PUT] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.put(finalUrl, body, headers), headers);\r\n }\r\n\r\n public async delete<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[DEL] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.delete(finalUrl, headers), headers);\r\n }\r\n}\r\n","import { AbstractHttpClient } from \"./AbstractHttpClient\";\r\nimport axios from \"axios\";\r\n\r\nexport class DefaultHttpClient extends AbstractHttpClient {\r\n async get<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.get(finalUrl, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.post(finalUrl, body, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.put(finalUrl, body, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async delete<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.delete(finalUrl, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n}\r\n","import {\r\n AbstractLogger,\r\n ErrorBuilder,\r\n Errors,\r\n MessageType,\r\n SocketMessage,\r\n DisconnectionHandler,\r\n IClientSocket,\r\n PlainMessageHandler,\r\n ReconnectionHandler,\r\n} from \"@clairejs/core\";\r\n\r\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\r\nimport { SocketConfig } from \"./SocketConfig\";\r\nimport { DefaultClientSocket } from \"./DefaultClientSocket\";\r\nimport { IWebSocket } from \"./IWebSocket\";\r\n\r\nconst pingpongMaxCount = 10;\r\n\r\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\r\n private socket?: IWebSocket;\r\n\r\n private allSockets: {\r\n socket: DefaultClientSocket;\r\n registeredChannels: string[];\r\n reconnectionHandler?: ReconnectionHandler;\r\n disconnectionHandler?: DisconnectionHandler;\r\n messageHandler?: PlainMessageHandler;\r\n }[] = [];\r\n\r\n private allChannels: { channel: string; connected: boolean; pendingMessages: any[] }[] = [];\r\n\r\n private socketConnected?: boolean;\r\n private pingIntervalId?: any;\r\n private retryTimeoutId?: any;\r\n private accumulatedPing = 0;\r\n private retryDelay = 0;\r\n private intendedDisconnection?: boolean;\r\n private pingpongId = 0;\r\n\r\n public pingpong: { id: number; sentTimestamp: number; receivedTimestamp?: number }[] = [];\r\n\r\n constructor(\r\n private readonly wsProvider: () => Promise<IWebSocket>,\r\n private readonly logger: AbstractLogger,\r\n private readonly config?: SocketConfig,\r\n ) {\r\n super();\r\n }\r\n\r\n getPingMs(): number {\r\n const candidates = this.pingpong.filter((pp) => pp.sentTimestamp && pp.receivedTimestamp);\r\n if (!candidates.length) {\r\n return 0;\r\n }\r\n return (\r\n candidates.map((pp) => pp.receivedTimestamp! - pp.sentTimestamp).reduce((total, diff) => total + diff, 0) /\r\n candidates.length\r\n );\r\n }\r\n\r\n subChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n //-- un-connected channels\r\n const unconnectedChannels: string[] = [];\r\n for (const channel of channels) {\r\n if (!info.registeredChannels.includes(channel)) {\r\n info.registeredChannels.push(channel);\r\n }\r\n const foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel || !foundChannel.connected) {\r\n unconnectedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.joinChannels(unconnectedChannels);\r\n }\r\n\r\n unsubChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));\r\n\r\n //-- check if no one is subscribing these channel then remove\r\n const removedChannels: string[] = [];\r\n for (const channel of channels) {\r\n //-- no one is listening\r\n if (!this.allSockets.find((socket) => socket.registeredChannels.includes(channel))) {\r\n removedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.leaveChannels(removedChannels);\r\n }\r\n\r\n removeSocket(socket: DefaultClientSocket) {\r\n const socketInfo = this.allSockets.find((s) => s.socket === socket);\r\n if (socketInfo && socketInfo.disconnectionHandler) {\r\n socketInfo.disconnectionHandler();\r\n }\r\n\r\n this.allSockets = this.allSockets.filter((s) => s.socket !== socket);\r\n if (!this.allSockets.length) {\r\n this.forceDisconnect();\r\n }\r\n }\r\n\r\n registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.reconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.disconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.messageHandler = handler;\r\n }\r\n }\r\n\r\n sendPlainMessageToChannel(message: any, channel?: string) {\r\n if (channel) {\r\n //-- check if channel has been connected\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n if (foundChannel.connected) {\r\n //-- send\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: { channel, message },\r\n });\r\n } else {\r\n foundChannel.pendingMessages.push(message);\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: {\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n\r\n joinChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n if (!this.socket || !this.socketConnected) {\r\n //-- create pending channels\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n\r\n ///-- this channel is already connected, skip\r\n if (foundChannel.connected) {\r\n continue;\r\n }\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_JOIN,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n leaveChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n this.handleChannelLeave(channels);\r\n\r\n if (this.socket && this.socketConnected) {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_LEAVE,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n private sendPingPong() {\r\n this.pingpongId += 1;\r\n this.pingpongId %= 100;\r\n const pingpongInfo = { id: this.pingpongId, sentTimestamp: Date.now() };\r\n this.pingpong.push(pingpongInfo);\r\n\r\n if (this.pingpong.length > pingpongMaxCount) {\r\n this.pingpong.shift();\r\n }\r\n\r\n this.sendRawMessage({\r\n type: MessageType.PING_PONG,\r\n data: pingpongInfo.id,\r\n });\r\n }\r\n\r\n private sendRawMessage(message: SocketMessage) {\r\n if (!this.socket || !this.socketConnected) {\r\n throw ErrorBuilder.error(Errors.BAD_STATE, \"Socket not available\");\r\n }\r\n this.socket.send(message);\r\n this.logger.debug(\"Raw send\", message);\r\n }\r\n\r\n private handleChannelJoin(channels: string[]) {\r\n this.logger.debug(\"Joinning channels\", channels);\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n foundChannel.connected = true;\r\n\r\n //-- flush messages\r\n if (foundChannel.pendingMessages.length) {\r\n this.logger.debug(`Flushing ${foundChannel.pendingMessages.length} message`);\r\n for (const message of foundChannel.pendingMessages) {\r\n this.sendPlainMessageToChannel(message, foundChannel.channel);\r\n }\r\n foundChannel.pendingMessages = [];\r\n }\r\n }\r\n }\r\n\r\n private handleChannelLeave(channels: string[]) {\r\n this.logger.debug(\"Leaving channels\", channels);\r\n this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));\r\n }\r\n\r\n private handlePlainMessage(message: any, channel?: string) {\r\n for (const socket of this.allSockets) {\r\n socket.messageHandler && socket.messageHandler(message, channel);\r\n }\r\n }\r\n\r\n private handleConnect() {\r\n this.logger.debug(\"Socket connected\");\r\n this.socketConnected = true;\r\n\r\n //-- socket open, set interval\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.accumulatedPing = 0;\r\n this.pingIntervalId = setInterval(() => {\r\n this.accumulatedPing += 1;\r\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreshold || 3)) {\r\n //-- socket connection lost, not intended\r\n this.intendedDisconnection = false;\r\n this.socket?.close();\r\n } else {\r\n this.sendPingPong();\r\n }\r\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\r\n\r\n this.intendedDisconnection = false;\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n\r\n for (const socket of this.allSockets) {\r\n socket.reconnectionHandler && socket.reconnectionHandler();\r\n }\r\n\r\n //-- try join pending channels\r\n const pendingChannels = this.allChannels.filter((c) => !c.connected).map((c) => c.channel);\r\n this.joinChannels(pendingChannels);\r\n }\r\n\r\n private handleDisconnect(err?: any) {\r\n if (err) {\r\n this.intendedDisconnection = true;\r\n }\r\n\r\n this.logger.debug(\"Socket connnection closed, error: \", err);\r\n\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.socket = undefined;\r\n this.socketConnected = false;\r\n\r\n for (const socket of this.allSockets) {\r\n socket.disconnectionHandler && socket.disconnectionHandler();\r\n }\r\n\r\n if (this.intendedDisconnection) {\r\n //-- remove all channels\r\n this.allSockets = [];\r\n this.allChannels = [];\r\n this.logger.debug(\"Socket connection terminated\");\r\n } else {\r\n //-- disconnect all channels to be reconnected when the socket is connected again\r\n this.allChannels = this.allChannels.map((c) => ({ ...c, connected: false }));\r\n if (!this.retryTimeoutId) {\r\n this.retryDelay = 0;\r\n this.retry();\r\n }\r\n }\r\n }\r\n\r\n private handleMessage(message: SocketMessage) {\r\n this.logger.debug(\"Raw receive\", message);\r\n switch (message.type) {\r\n case MessageType.PING_PONG:\r\n this.accumulatedPing = 0;\r\n const id = message.data;\r\n if (id) {\r\n const pong = this.pingpong.find((pp) => pp.id === id);\r\n if (pong) {\r\n pong.receivedTimestamp = Date.now();\r\n }\r\n }\r\n break;\r\n case MessageType.CHANNEL_JOIN:\r\n if (message.data?.error) {\r\n this.logger.error(\"Join channel error\", message.data.error);\r\n } else {\r\n this.handleChannelJoin(message.data);\r\n }\r\n break;\r\n case MessageType.CHANNEL_LEAVE:\r\n this.handleChannelLeave(message.data);\r\n break;\r\n case MessageType.PLAIN:\r\n this.handlePlainMessage(message.data.message, message.data.channel);\r\n break;\r\n case MessageType.DISCONNECTION:\r\n this.intendedDisconnection = true;\r\n this.socket?.close();\r\n break;\r\n }\r\n }\r\n\r\n create(): IClientSocket {\r\n const socket = new DefaultClientSocket(this);\r\n\r\n this.allSockets.push({ socket, registeredChannels: [] });\r\n\r\n if (this.allSockets.length === 1) {\r\n this.forceReconnect();\r\n }\r\n\r\n return socket;\r\n }\r\n\r\n forceDisconnect() {\r\n this.intendedDisconnection = true;\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n }\r\n }\r\n\r\n forceReconnect(): void {\r\n this.intendedDisconnection = false;\r\n if (this.socketConnected) {\r\n this.socket?.close();\r\n } else {\r\n this.retryDelay = 0;\r\n if (this.socket === undefined) {\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n this.physicConnect();\r\n }\r\n }\r\n }\r\n\r\n private physicConnect() {\r\n this.wsProvider().then((socket) => {\r\n socket.onopen(() => {\r\n this.handleConnect();\r\n });\r\n\r\n socket.onmessage((data) => {\r\n const message: SocketMessage = JSON.parse(data);\r\n if (!message || !message.type) {\r\n this.logger.debug(\"Invalid mesasge structure\", data);\r\n return;\r\n }\r\n\r\n this.handleMessage(message);\r\n });\r\n\r\n socket.onclose((err) => {\r\n this.handleDisconnect(err);\r\n });\r\n\r\n this.socket = socket;\r\n });\r\n }\r\n\r\n private retry() {\r\n this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`);\r\n this.physicConnect();\r\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\r\n this.retryTimeoutId = setTimeout(() => {\r\n if (!this.socketConnected && !this.intendedDisconnection) {\r\n this.retry();\r\n }\r\n }, this.retryDelay);\r\n }\r\n}\r\n","import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from \"@clairejs/core\";\r\nimport { DefaultClientSocketManager } from \"./DefaultClientSocketManager\";\r\n\r\nexport class DefaultClientSocket implements IClientSocket {\r\n constructor(readonly socketManager: DefaultClientSocketManager) {}\r\n\r\n joinChannels(channels: string[]): void {\r\n this.socketManager.subChannels(this, channels);\r\n }\r\n\r\n leaveChannels(channels: string[]): void {\r\n this.socketManager.unsubChannels(this, channels);\r\n }\r\n\r\n close(): void {\r\n this.socketManager.removeSocket(this);\r\n }\r\n\r\n onReconnect(handler: ReconnectionHandler): void {\r\n this.socketManager.registerReconnectionHandler(this, handler);\r\n }\r\n\r\n onDisconnect(handler: DisconnectionHandler): void {\r\n this.socketManager.registerDisconnectionHandler(this, handler);\r\n }\r\n\r\n onMessage(handler: PlainMessageHandler): void {\r\n this.socketManager.registerMessageHandler(this, handler);\r\n }\r\n\r\n send(message: any, channel?: string): void {\r\n this.socketManager.sendPlainMessageToChannel(message, channel);\r\n }\r\n}\r\n","import { Injectable } from \"@clairejs/core\";\r\nimport { CURRENT_LANGUAGE, SYSTEM_LANGUAGES } from \"../constants\";\r\nimport { AbstractStorage } from \"../system/AbstractStorage\";\r\nimport { TranslationMap } from \"./types\";\r\n\r\nconst keyResolver = (key: string) => `__${key}__`;\r\ntype LangSubscriber = (lang: string) => void;\r\n\r\n@Injectable()\r\nexport class Translator {\r\n currentLang?: string = null!;\r\n subscribers: LangSubscriber[] = [];\r\n\r\n constructor(readonly storage: AbstractStorage) {}\r\n\r\n addLangSubscriber(subscriber: LangSubscriber) {\r\n this.subscribers.push(subscriber);\r\n }\r\n\r\n removeLangSubscriber(subscriber: LangSubscriber) {\r\n this.subscribers = this.subscribers.filter((s) => s !== subscriber);\r\n }\r\n\r\n async getCurrentLanguage() {\r\n if (this.currentLang === null) {\r\n this.currentLang = ((await this.storage.getItem(CURRENT_LANGUAGE)) as any as string) || undefined;\r\n }\r\n return this.currentLang;\r\n }\r\n\r\n async setCurrentLanguage(lang: string) {\r\n this.currentLang = lang;\r\n await this.storage.setItem(CURRENT_LANGUAGE, lang);\r\n for (const sub of this.subscribers) {\r\n sub(lang);\r\n }\r\n }\r\n\r\n async getLanguages() {\r\n return ((await this.storage.getItem(SYSTEM_LANGUAGES)) as any as string[]) || undefined;\r\n }\r\n\r\n async setLanguages(languages: string[]) {\r\n await this.storage.setItem(SYSTEM_LANGUAGES, languages);\r\n }\r\n\r\n getTranslationObject(translationMap: TranslationMap) {\r\n const _this = this;\r\n const locales = Object.keys(translationMap);\r\n const translation: any = {};\r\n\r\n const resolveTranslation = (translationsObject: any, translationValues: any[]): void => {\r\n //-- get all keys of languages\r\n const keys = translationValues.reduce((collector, t) => {\r\n Object.keys(t).forEach((key) => {\r\n if (!collector.includes(key)) {\r\n collector.push(key);\r\n }\r\n });\r\n return collector;\r\n }, [] as string[]);\r\n\r\n //-- create getters / setters for those keys\r\n for (const key of keys) {\r\n const isObject = translationValues.every((value) => typeof value[key] === \"object\");\r\n if (isObject) {\r\n translationsObject[key] = {};\r\n resolveTranslation(\r\n translationsObject[key],\r\n translationValues.map((value) => value[key])\r\n );\r\n } else {\r\n const tKey = keyResolver(key);\r\n translationsObject[tKey] = translationValues.map((value) => value[key]);\r\n Object.defineProperty(translationsObject, key, {\r\n value: function (...args: any[]): string {\r\n const currentLocale = _this.currentLang || locales[0];\r\n if (!currentLocale) {\r\n return \"\";\r\n }\r\n\r\n let translation = this[tKey][locales.indexOf(currentLocale)];\r\n if (typeof translation === \"string\") {\r\n return translation;\r\n } else if (typeof translation === \"function\") {\r\n return translation(...args);\r\n } else {\r\n return tKey;\r\n }\r\n },\r\n configurable: false,\r\n writable: false,\r\n });\r\n }\r\n }\r\n };\r\n\r\n resolveTranslation(translation, Object.values(translationMap));\r\n return translation;\r\n }\r\n}\r\n","export const SYSTEM_LANGUAGES = \"SYSTEM_LANGUAGES\";\r\nexport const CURRENT_LANGUAGE = \"CURRENT_LANGUAGE\";\r\n","export abstract class AbstractErrorHandler {\r\n public abstract handle(err: any, component?: any): void;\r\n}\r\n","import { UrlInfo } from \"./UrlInfo\";\r\nexport abstract class AbstractViewMiddleware {\r\n public abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;\r\n}\r\n","import { Injectable, AccessToken } from \"@clairejs/core\";\r\nimport { AbstractStorage } from \"../system/AbstractStorage\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\n@Injectable()\r\nexport class DefaultTokenManager extends AbstractTokenManager {\r\n private accessToken?: AccessToken = null!;\r\n\r\n constructor(readonly storage: AbstractStorage, readonly storageKey: string = \"ACCESS_TOKEN\") {\r\n super();\r\n }\r\n\r\n async getAccessToken(): Promise<AccessToken | undefined> {\r\n if (this.accessToken === null) {\r\n this.accessToken = await this.storage.getItem(this.storageKey);\r\n }\r\n return this.accessToken;\r\n }\r\n\r\n async setAccessToken(token?: AccessToken): Promise<void> {\r\n if (token) {\r\n await this.storage.setItem(this.storageKey, token);\r\n } else {\r\n await this.storage.deleteItem(this.storageKey);\r\n }\r\n this.accessToken = token;\r\n }\r\n}\r\n","import {\r\n AbstractModel,\r\n Constructor,\r\n CreateManyRequestBody,\r\n CreateManyResponseBody,\r\n GetManyQueries,\r\n GetManyResponseBody,\r\n UpdateManyBody,\r\n UpdateManyQueries,\r\n UpdateManyResponse,\r\n} from \"@clairejs/core\";\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\n\r\nexport const stringifyQueries = (queries: Record<string, any>) => {\r\n const keys = Object.keys(queries);\r\n return keys.reduce((collector, key) => collector + `${key}=${JSON.stringify(queries[key])}&`, \"\");\r\n};\r\n\r\nexport const removeInstances = <T extends AbstractModel>(target: T[], source: T[]) => {\r\n const result = target.slice();\r\n for (const instance of source) {\r\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\r\n if (index >= 0) {\r\n result.splice(index, 1);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport const mergeInstances = <T extends AbstractModel>(model: Constructor<T>, target: T[], source: Partial<T>[]) => {\r\n const result = target.slice();\r\n for (const instance of source) {\r\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\r\n if (index < 0) {\r\n result.push(Object.assign(new model(), instance));\r\n } else {\r\n Object.assign(result[index], instance);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport class CrudApi<T extends AbstractModel> {\r\n constructor(readonly model: Constructor<T>, readonly httpClient: AbstractHttpClient) {}\r\n\r\n protected getEndpointBaseUrl() {\r\n return `/${this.model.name.toLowerCase()}`;\r\n }\r\n\r\n async getMany(queries?: GetManyQueries<T>): Promise<GetManyResponseBody<T>> {\r\n return await this.httpClient.get(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\r\n }\r\n\r\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\r\n return await this.httpClient.put(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`, body);\r\n }\r\n\r\n async deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\r\n return await this.httpClient.delete(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\r\n }\r\n\r\n async createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>> {\r\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\r\n }\r\n}\r\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"@clairejs/core\"","webpack:///./src/api/AbstractHttpClient.ts","webpack:///./src/system/AbstractStorage.ts","webpack:///external \"axios\"","webpack:///./src/socket/AbstractClientSocketManager.ts","webpack:///./src/api/AbstractTokenManager.ts","webpack:///./src/index.ts","webpack:///./src/system/ClaireClient.ts","webpack:///./src/api/RefreshHttpClient.ts","webpack:///./src/api/DefaultHttpClient.ts","webpack:///./src/socket/DefaultClientSocketManager.ts","webpack:///./src/socket/DefaultClientSocket.ts","webpack:///./src/translation/Translator.ts","webpack:///./src/constants.ts","webpack:///./src/routing/AbstractErrorHandler.ts","webpack:///./src/routing/AbstractViewMiddleware.ts","webpack:///./src/api/DefaultTokenManager.ts","webpack:///./src/api/CrudApi.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","require","AbstractHttpClient","apiServerUrl","headers","url","this","AbstractStorage","AbstractClientSocketManager","AbstractTokenManager","ClaireClient","ClaireApp","RefreshHttpClient","logger","tokenManager","super","refreshing","refreshQueue","apiCall","keys","map","k","toLowerCase","includes","accessToken","getAccessToken","expiration","Date","now","refreshToken","finalHeaders","data","userHeaders","resolveHeaders","authorization","token","oldToken","debug","Promise","resolve","push","resolver","newToken","getRefreshedAccessToken","setAccessToken","err","refresh","finalUrl","resolveUrl","resolveResult","body","post","put","delete","DefaultHttpClient","DefaultClientSocketManager","wsProvider","config","allSockets","allChannels","accumulatedPing","retryDelay","pingpongId","pingpong","candidates","filter","pp","sentTimestamp","receivedTimestamp","length","reduce","total","diff","socket","channels","info","find","unconnectedChannels","channel","registeredChannels","foundChannel","connected","joinChannels","removedChannels","leaveChannels","socketInfo","disconnectionHandler","forceDisconnect","handler","reconnectionHandler","messageHandler","message","pendingMessages","sendRawMessage","type","MessageType","PLAIN","socketConnected","CHANNEL_JOIN","handleChannelLeave","CHANNEL_LEAVE","pingpongInfo","id","shift","PING_PONG","ErrorBuilder","error","Errors","BAD_STATE","send","sendPlainMessageToChannel","pingIntervalId","clearInterval","setInterval","keepAlive","deadThreshold","intendedDisconnection","close","sendPingPong","pingIntervalMs","retryTimeoutId","clearTimeout","undefined","pendingChannels","retry","pong","handleChannelJoin","handlePlainMessage","DISCONNECTION","DefaultClientSocket","forceReconnect","physicConnect","then","onopen","handleConnect","onmessage","JSON","parse","handleMessage","onclose","handleDisconnect","reconnectTimeDeltaMs","setTimeout","socketManager","subChannels","unsubChannels","removeSocket","registerReconnectionHandler","registerDisconnectionHandler","registerMessageHandler","keyResolver","Translator","storage","currentLang","subscribers","subscriber","getItem","CURRENT_LANGUAGE","lang","setItem","sub","SYSTEM_LANGUAGES","languages","translationMap","_this","locales","translation","resolveTranslation","translationsObject","translationValues","collector","forEach","every","tKey","args","currentLocale","indexOf","configurable","writable","values","Injectable","AbstractErrorHandler","AbstractViewMiddleware","DefaultTokenManager","storageKey","deleteItem","stringifyQueries","queries","stringify","removeInstances","target","source","result","slice","instance","index","findIndex","splice","mergeInstances","model","assign","CrudApi","httpClient","getEndpointBaseUrl"],"mappings":"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","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 6);\n","module.exports = require(\"@clairejs/core\");","export abstract class AbstractHttpClient {\r\n constructor(readonly apiServerUrl: string) {}\r\n\r\n protected async resolveHeaders(headers?: object): Promise<object | undefined> {\r\n return headers;\r\n }\r\n\r\n protected async resolveUrl(url: string): Promise<string> {\r\n return this.apiServerUrl + url;\r\n }\r\n\r\n abstract get<T = any>(url: string, headers?: object): Promise<T>;\r\n abstract post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract delete<T = any>(url: string, headers?: object): Promise<T>;\r\n}\r\n","export abstract class AbstractStorage {\r\n public abstract getItem<T>(key: string): Promise<T | undefined>;\r\n public abstract setItem<T>(key: string, value: T): Promise<void>;\r\n public abstract deleteItem(key: string): Promise<void>;\r\n}\r\n","module.exports = require(\"axios\");","import { IClientSocket } from \"@clairejs/core\";\r\n\r\nexport abstract class AbstractClientSocketManager {\r\n abstract create(): IClientSocket;\r\n abstract joinChannels(channels: string[]): void;\r\n abstract leaveChannels(channels: string[]): void;\r\n abstract getPingMs(): number;\r\n}\r\n","import { AccessToken } from \"@clairejs/core\";\r\n\r\nexport abstract class AbstractTokenManager {\r\n abstract getAccessToken(): Promise<AccessToken | undefined>;\r\n abstract setAccessToken(token?: AccessToken): Promise<void>;\r\n}\r\n","export * from \"./system/ClaireClient\";\r\nexport * from \"./api/RefreshHttpClient\";\r\nexport * from \"./api/DefaultHttpClient\";\r\nexport * from \"./api/AbstractHttpClient\";\r\nexport * from \"./socket/AbstractClientSocketManager\";\r\nexport * from \"./socket/DefaultClientSocketManager\";\r\nexport * from \"./system/AbstractStorage\";\r\nexport * from \"./translation/Translator\";\r\nexport * from \"./routing/AbstractErrorHandler\";\r\nexport * from \"./routing/AbstractViewMiddleware\";\r\nexport * from \"./routing/UrlInfo\";\r\nexport * from \"./routing/RouterConfig\";\r\nexport * from \"./routing/ComponentInfo\";\r\nexport * from \"./api/AbstractTokenManager\";\r\nexport * from \"./socket/IWebSocket\";\r\nexport * from \"./translation/types\";\r\nexport * from \"./api/DefaultTokenManager\";\r\nexport * from \"./api/CrudApi\";\r\n","import { ClaireApp } from \"@clairejs/core\";\r\n\r\nexport class ClaireClient extends ClaireApp {}\r\n","import { AbstractLogger, AccessToken } from \"@clairejs/core\";\r\nimport axios from \"axios\";\r\n\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\nexport class RefreshHttpClient extends AbstractHttpClient {\r\n private refreshing = false;\r\n private refreshQueue: {\r\n resolver: () => void;\r\n }[] = [];\r\n\r\n public constructor(\r\n readonly apiServerUrl: string,\r\n readonly logger: AbstractLogger,\r\n readonly tokenManager: AbstractTokenManager,\r\n ) {\r\n super(apiServerUrl);\r\n }\r\n\r\n protected async getRefreshedAccessToken(): Promise<AccessToken | undefined> {\r\n return undefined;\r\n }\r\n\r\n protected async resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any> {\r\n //-- request does not explicitely provide authorization header, resolve automatically\r\n if (!headers || !Object.keys(headers).map((k) => k.toLowerCase().includes(\"authorization\"))) {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n //-- 30s buffer\r\n if (accessToken && accessToken.expiration < Date.now() + 30000) {\r\n await this.refreshToken(accessToken);\r\n }\r\n }\r\n const finalHeaders = await this.finalHeaders(headers);\r\n return (await apiCall(finalHeaders)).data;\r\n }\r\n\r\n private async finalHeaders(headers: object): Promise<any> {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n const userHeaders = await this.resolveHeaders(headers);\r\n return { headers: { authorization: accessToken?.token || \"\", ...userHeaders } };\r\n }\r\n\r\n async refreshToken(oldToken?: AccessToken) {\r\n if (this.refreshing) {\r\n this.logger.debug(\"Awaiting refresh token, queued\");\r\n await new Promise<void>((resolve) => {\r\n this.refreshQueue.push({ resolver: resolve });\r\n });\r\n } else {\r\n oldToken = oldToken || (await this.tokenManager.getAccessToken());\r\n //-- call to api server to refresh token\r\n if (!oldToken || !oldToken.refreshToken) {\r\n //-- there is no refresh token to refresh\r\n return;\r\n }\r\n\r\n try {\r\n this.refreshing = true;\r\n const newToken = await this.getRefreshedAccessToken();\r\n await this.tokenManager.setAccessToken(newToken);\r\n this.logger.debug(\"Access token was refreshed\");\r\n } catch (err) {\r\n //-- cannot refresh access token, clear old token\r\n this.logger.debug(\"Cannot refresh access token, clear local token\");\r\n await this.tokenManager.setAccessToken();\r\n } finally {\r\n this.refreshing = false;\r\n for (const refresh of this.refreshQueue) {\r\n refresh.resolver();\r\n }\r\n //-- clear queue\r\n this.refreshQueue = [];\r\n }\r\n }\r\n }\r\n\r\n public async get<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[GET] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.get(finalUrl, headers), headers);\r\n }\r\n public async post<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[POST] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.post(finalUrl, body, headers), headers);\r\n }\r\n public async put<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[PUT] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.put(finalUrl, body, headers), headers);\r\n }\r\n\r\n public async delete<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[DEL] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.delete(finalUrl, headers), headers);\r\n }\r\n}\r\n","import { AbstractHttpClient } from \"./AbstractHttpClient\";\r\nimport axios from \"axios\";\r\n\r\nexport class DefaultHttpClient extends AbstractHttpClient {\r\n async get<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.get(finalUrl, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.post(finalUrl, body, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.put(finalUrl, body, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async delete<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.delete(finalUrl, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n}\r\n","import {\r\n AbstractLogger,\r\n ErrorBuilder,\r\n Errors,\r\n MessageType,\r\n SocketMessage,\r\n DisconnectionHandler,\r\n IClientSocket,\r\n PlainMessageHandler,\r\n ReconnectionHandler,\r\n} from \"@clairejs/core\";\r\n\r\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\r\nimport { SocketConfig } from \"./SocketConfig\";\r\nimport { DefaultClientSocket } from \"./DefaultClientSocket\";\r\nimport { IWebSocket } from \"./IWebSocket\";\r\n\r\nconst pingpongMaxCount = 10;\r\n\r\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\r\n private socket?: IWebSocket;\r\n\r\n private allSockets: {\r\n socket: DefaultClientSocket;\r\n registeredChannels: string[];\r\n reconnectionHandler?: ReconnectionHandler;\r\n disconnectionHandler?: DisconnectionHandler;\r\n messageHandler?: PlainMessageHandler;\r\n }[] = [];\r\n\r\n private allChannels: { channel: string; connected: boolean; pendingMessages: any[] }[] = [];\r\n\r\n private socketConnected?: boolean;\r\n private pingIntervalId?: any;\r\n private retryTimeoutId?: any;\r\n private accumulatedPing = 0;\r\n private retryDelay = 0;\r\n private intendedDisconnection?: boolean;\r\n private pingpongId = 0;\r\n\r\n public pingpong: { id: number; sentTimestamp: number; receivedTimestamp?: number }[] = [];\r\n\r\n constructor(\r\n private readonly wsProvider: () => Promise<IWebSocket>,\r\n private readonly logger: AbstractLogger,\r\n private readonly config?: SocketConfig,\r\n ) {\r\n super();\r\n }\r\n\r\n getPingMs(): number {\r\n const candidates = this.pingpong.filter((pp) => pp.sentTimestamp && pp.receivedTimestamp);\r\n if (!candidates.length) {\r\n return 0;\r\n }\r\n return (\r\n candidates.map((pp) => pp.receivedTimestamp! - pp.sentTimestamp).reduce((total, diff) => total + diff, 0) /\r\n candidates.length\r\n );\r\n }\r\n\r\n subChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n //-- un-connected channels\r\n const unconnectedChannels: string[] = [];\r\n for (const channel of channels) {\r\n if (!info.registeredChannels.includes(channel)) {\r\n info.registeredChannels.push(channel);\r\n }\r\n const foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel || !foundChannel.connected) {\r\n unconnectedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.joinChannels(unconnectedChannels);\r\n }\r\n\r\n unsubChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));\r\n\r\n //-- check if no one is subscribing these channel then remove\r\n const removedChannels: string[] = [];\r\n for (const channel of channels) {\r\n //-- no one is listening\r\n if (!this.allSockets.find((socket) => socket.registeredChannels.includes(channel))) {\r\n removedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.leaveChannels(removedChannels);\r\n }\r\n\r\n removeSocket(socket: DefaultClientSocket) {\r\n const socketInfo = this.allSockets.find((s) => s.socket === socket);\r\n if (socketInfo && socketInfo.disconnectionHandler) {\r\n socketInfo.disconnectionHandler();\r\n }\r\n\r\n this.allSockets = this.allSockets.filter((s) => s.socket !== socket);\r\n if (!this.allSockets.length) {\r\n this.forceDisconnect();\r\n }\r\n }\r\n\r\n registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.reconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.disconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.messageHandler = handler;\r\n }\r\n }\r\n\r\n sendPlainMessageToChannel(message: any, channel?: string) {\r\n if (channel) {\r\n //-- check if channel has been connected\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n if (foundChannel.connected) {\r\n //-- send\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: { channel, message },\r\n });\r\n } else {\r\n foundChannel.pendingMessages.push(message);\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: {\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n\r\n joinChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n if (!this.socket || !this.socketConnected) {\r\n //-- create pending channels\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n\r\n ///-- this channel is already connected, skip\r\n if (foundChannel.connected) {\r\n continue;\r\n }\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_JOIN,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n leaveChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n this.handleChannelLeave(channels);\r\n\r\n if (this.socket && this.socketConnected) {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_LEAVE,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n private sendPingPong() {\r\n this.pingpongId += 1;\r\n this.pingpongId %= 100;\r\n const pingpongInfo = { id: this.pingpongId, sentTimestamp: Date.now() };\r\n this.pingpong.push(pingpongInfo);\r\n\r\n if (this.pingpong.length > pingpongMaxCount) {\r\n this.pingpong.shift();\r\n }\r\n\r\n this.sendRawMessage({\r\n type: MessageType.PING_PONG,\r\n data: pingpongInfo.id,\r\n });\r\n }\r\n\r\n private sendRawMessage(message: SocketMessage) {\r\n if (!this.socket || !this.socketConnected) {\r\n throw ErrorBuilder.error(Errors.BAD_STATE, \"Socket not available\");\r\n }\r\n this.socket.send(message);\r\n this.logger.debug(\"Raw send\", message);\r\n }\r\n\r\n private handleChannelJoin(channels: string[]) {\r\n this.logger.debug(\"Joinning channels\", channels);\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n foundChannel.connected = true;\r\n\r\n //-- flush messages\r\n if (foundChannel.pendingMessages.length) {\r\n this.logger.debug(`Flushing ${foundChannel.pendingMessages.length} message`);\r\n for (const message of foundChannel.pendingMessages) {\r\n this.sendPlainMessageToChannel(message, foundChannel.channel);\r\n }\r\n foundChannel.pendingMessages = [];\r\n }\r\n }\r\n }\r\n\r\n private handleChannelLeave(channels: string[]) {\r\n this.logger.debug(\"Leaving channels\", channels);\r\n this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));\r\n }\r\n\r\n private handlePlainMessage(message: any, channel?: string) {\r\n for (const socket of this.allSockets) {\r\n socket.messageHandler && socket.messageHandler(message, channel);\r\n }\r\n }\r\n\r\n private handleConnect() {\r\n this.logger.debug(\"Socket connected\");\r\n this.socketConnected = true;\r\n\r\n //-- socket open, set interval\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.accumulatedPing = 0;\r\n this.pingIntervalId = setInterval(() => {\r\n this.accumulatedPing += 1;\r\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreshold || 3)) {\r\n //-- socket connection lost, not intended\r\n this.intendedDisconnection = false;\r\n this.socket?.close();\r\n } else {\r\n this.sendPingPong();\r\n }\r\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\r\n\r\n this.intendedDisconnection = false;\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n\r\n for (const socket of this.allSockets) {\r\n socket.reconnectionHandler && socket.reconnectionHandler();\r\n }\r\n\r\n //-- try join pending channels\r\n const pendingChannels = this.allChannels.filter((c) => !c.connected).map((c) => c.channel);\r\n this.joinChannels(pendingChannels);\r\n }\r\n\r\n private handleDisconnect(err?: any) {\r\n if (err) {\r\n this.intendedDisconnection = true;\r\n }\r\n\r\n this.logger.debug(\"Socket connnection closed, error: \", err);\r\n\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.socket = undefined;\r\n this.socketConnected = false;\r\n\r\n for (const socket of this.allSockets) {\r\n socket.disconnectionHandler && socket.disconnectionHandler(err);\r\n }\r\n\r\n if (this.intendedDisconnection) {\r\n //-- remove all channels\r\n this.allSockets = [];\r\n this.allChannels = [];\r\n this.logger.debug(\"Socket connection terminated\");\r\n } else {\r\n //-- disconnect all channels to be reconnected when the socket is connected again\r\n this.allChannels = this.allChannels.map((c) => ({ ...c, connected: false }));\r\n if (!this.retryTimeoutId) {\r\n this.retryDelay = 0;\r\n this.retry();\r\n }\r\n }\r\n }\r\n\r\n private handleMessage(message: SocketMessage) {\r\n this.logger.debug(\"Raw receive\", message);\r\n switch (message.type) {\r\n case MessageType.PING_PONG:\r\n this.accumulatedPing = 0;\r\n const id = message.data;\r\n if (id) {\r\n const pong = this.pingpong.find((pp) => pp.id === id);\r\n if (pong) {\r\n pong.receivedTimestamp = Date.now();\r\n }\r\n }\r\n break;\r\n case MessageType.CHANNEL_JOIN:\r\n if (message.data?.error) {\r\n this.logger.error(\"Join channel error\", message.data.error);\r\n } else {\r\n this.handleChannelJoin(message.data);\r\n }\r\n break;\r\n case MessageType.CHANNEL_LEAVE:\r\n this.handleChannelLeave(message.data);\r\n break;\r\n case MessageType.PLAIN:\r\n this.handlePlainMessage(message.data.message, message.data.channel);\r\n break;\r\n case MessageType.DISCONNECTION:\r\n this.intendedDisconnection = true;\r\n this.socket?.close();\r\n break;\r\n }\r\n }\r\n\r\n create(): IClientSocket {\r\n const socket = new DefaultClientSocket(this);\r\n\r\n this.allSockets.push({ socket, registeredChannels: [] });\r\n\r\n if (this.allSockets.length === 1) {\r\n this.forceReconnect();\r\n }\r\n\r\n return socket;\r\n }\r\n\r\n forceDisconnect() {\r\n this.intendedDisconnection = true;\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n }\r\n }\r\n\r\n forceReconnect(): void {\r\n this.intendedDisconnection = false;\r\n if (this.socketConnected) {\r\n this.socket?.close();\r\n } else {\r\n this.retryDelay = 0;\r\n if (this.socket === undefined) {\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n this.physicConnect();\r\n }\r\n }\r\n }\r\n\r\n private physicConnect() {\r\n this.wsProvider().then((socket) => {\r\n socket.onopen(() => {\r\n this.handleConnect();\r\n });\r\n\r\n socket.onmessage((data) => {\r\n const message: SocketMessage = JSON.parse(data);\r\n if (!message || !message.type) {\r\n this.logger.debug(\"Invalid mesasge structure\", data);\r\n return;\r\n }\r\n\r\n this.handleMessage(message);\r\n });\r\n\r\n socket.onclose((err) => {\r\n this.handleDisconnect(err);\r\n });\r\n\r\n this.socket = socket;\r\n });\r\n }\r\n\r\n private retry() {\r\n this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`);\r\n this.physicConnect();\r\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\r\n this.retryTimeoutId = setTimeout(() => {\r\n if (!this.socketConnected && !this.intendedDisconnection) {\r\n this.retry();\r\n }\r\n }, this.retryDelay);\r\n }\r\n}\r\n","import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from \"@clairejs/core\";\r\nimport { DefaultClientSocketManager } from \"./DefaultClientSocketManager\";\r\n\r\nexport class DefaultClientSocket implements IClientSocket {\r\n constructor(readonly socketManager: DefaultClientSocketManager) {}\r\n\r\n joinChannels(channels: string[]): void {\r\n this.socketManager.subChannels(this, channels);\r\n }\r\n\r\n leaveChannels(channels: string[]): void {\r\n this.socketManager.unsubChannels(this, channels);\r\n }\r\n\r\n close(): void {\r\n this.socketManager.removeSocket(this);\r\n }\r\n\r\n onReconnect(handler: ReconnectionHandler): void {\r\n this.socketManager.registerReconnectionHandler(this, handler);\r\n }\r\n\r\n onDisconnect(handler: DisconnectionHandler): void {\r\n this.socketManager.registerDisconnectionHandler(this, handler);\r\n }\r\n\r\n onMessage(handler: PlainMessageHandler): void {\r\n this.socketManager.registerMessageHandler(this, handler);\r\n }\r\n\r\n send(message: any, channel?: string): void {\r\n this.socketManager.sendPlainMessageToChannel(message, channel);\r\n }\r\n}\r\n","import { Injectable } from \"@clairejs/core\";\r\nimport { CURRENT_LANGUAGE, SYSTEM_LANGUAGES } from \"../constants\";\r\nimport { AbstractStorage } from \"../system/AbstractStorage\";\r\nimport { TranslationMap } from \"./types\";\r\n\r\nconst keyResolver = (key: string) => `__${key}__`;\r\ntype LangSubscriber = (lang: string) => void;\r\n\r\n@Injectable()\r\nexport class Translator {\r\n currentLang?: string = null!;\r\n subscribers: LangSubscriber[] = [];\r\n\r\n constructor(readonly storage: AbstractStorage) {}\r\n\r\n addLangSubscriber(subscriber: LangSubscriber) {\r\n this.subscribers.push(subscriber);\r\n }\r\n\r\n removeLangSubscriber(subscriber: LangSubscriber) {\r\n this.subscribers = this.subscribers.filter((s) => s !== subscriber);\r\n }\r\n\r\n async getCurrentLanguage() {\r\n if (this.currentLang === null) {\r\n this.currentLang = ((await this.storage.getItem(CURRENT_LANGUAGE)) as any as string) || undefined;\r\n }\r\n return this.currentLang;\r\n }\r\n\r\n async setCurrentLanguage(lang: string) {\r\n this.currentLang = lang;\r\n await this.storage.setItem(CURRENT_LANGUAGE, lang);\r\n for (const sub of this.subscribers) {\r\n sub(lang);\r\n }\r\n }\r\n\r\n async getLanguages() {\r\n return ((await this.storage.getItem(SYSTEM_LANGUAGES)) as any as string[]) || undefined;\r\n }\r\n\r\n async setLanguages(languages: string[]) {\r\n await this.storage.setItem(SYSTEM_LANGUAGES, languages);\r\n }\r\n\r\n getTranslationObject(translationMap: TranslationMap) {\r\n const _this = this;\r\n const locales = Object.keys(translationMap);\r\n const translation: any = {};\r\n\r\n const resolveTranslation = (translationsObject: any, translationValues: any[]): void => {\r\n //-- get all keys of languages\r\n const keys = translationValues.reduce((collector, t) => {\r\n Object.keys(t).forEach((key) => {\r\n if (!collector.includes(key)) {\r\n collector.push(key);\r\n }\r\n });\r\n return collector;\r\n }, [] as string[]);\r\n\r\n //-- create getters / setters for those keys\r\n for (const key of keys) {\r\n const isObject = translationValues.every((value) => typeof value[key] === \"object\");\r\n if (isObject) {\r\n translationsObject[key] = {};\r\n resolveTranslation(\r\n translationsObject[key],\r\n translationValues.map((value) => value[key])\r\n );\r\n } else {\r\n const tKey = keyResolver(key);\r\n translationsObject[tKey] = translationValues.map((value) => value[key]);\r\n Object.defineProperty(translationsObject, key, {\r\n value: function (...args: any[]): string {\r\n const currentLocale = _this.currentLang || locales[0];\r\n if (!currentLocale) {\r\n return \"\";\r\n }\r\n\r\n let translation = this[tKey][locales.indexOf(currentLocale)];\r\n if (typeof translation === \"string\") {\r\n return translation;\r\n } else if (typeof translation === \"function\") {\r\n return translation(...args);\r\n } else {\r\n return tKey;\r\n }\r\n },\r\n configurable: false,\r\n writable: false,\r\n });\r\n }\r\n }\r\n };\r\n\r\n resolveTranslation(translation, Object.values(translationMap));\r\n return translation;\r\n }\r\n}\r\n","export const SYSTEM_LANGUAGES = \"SYSTEM_LANGUAGES\";\r\nexport const CURRENT_LANGUAGE = \"CURRENT_LANGUAGE\";\r\n","export abstract class AbstractErrorHandler {\r\n public abstract handle(err: any, component?: any): void;\r\n}\r\n","import { UrlInfo } from \"./UrlInfo\";\r\nexport abstract class AbstractViewMiddleware {\r\n public abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;\r\n}\r\n","import { Injectable, AccessToken } from \"@clairejs/core\";\r\nimport { AbstractStorage } from \"../system/AbstractStorage\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\n@Injectable()\r\nexport class DefaultTokenManager extends AbstractTokenManager {\r\n private accessToken?: AccessToken = null!;\r\n\r\n constructor(readonly storage: AbstractStorage, readonly storageKey: string = \"ACCESS_TOKEN\") {\r\n super();\r\n }\r\n\r\n async getAccessToken(): Promise<AccessToken | undefined> {\r\n if (this.accessToken === null) {\r\n this.accessToken = await this.storage.getItem(this.storageKey);\r\n }\r\n return this.accessToken;\r\n }\r\n\r\n async setAccessToken(token?: AccessToken): Promise<void> {\r\n if (token) {\r\n await this.storage.setItem(this.storageKey, token);\r\n } else {\r\n await this.storage.deleteItem(this.storageKey);\r\n }\r\n this.accessToken = token;\r\n }\r\n}\r\n","import {\r\n AbstractModel,\r\n Constructor,\r\n CreateManyRequestBody,\r\n CreateManyResponseBody,\r\n GetManyQueries,\r\n GetManyResponseBody,\r\n UpdateManyBody,\r\n UpdateManyQueries,\r\n UpdateManyResponse,\r\n} from \"@clairejs/core\";\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\n\r\nexport const stringifyQueries = (queries: Record<string, any>) => {\r\n const keys = Object.keys(queries);\r\n return keys.reduce((collector, key) => collector + `${key}=${JSON.stringify(queries[key])}&`, \"\");\r\n};\r\n\r\nexport const removeInstances = <T extends AbstractModel>(target: T[], source: T[]) => {\r\n const result = target.slice();\r\n for (const instance of source) {\r\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\r\n if (index >= 0) {\r\n result.splice(index, 1);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport const mergeInstances = <T extends AbstractModel>(model: Constructor<T>, target: T[], source: Partial<T>[]) => {\r\n const result = target.slice();\r\n for (const instance of source) {\r\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\r\n if (index < 0) {\r\n result.push(Object.assign(new model(), instance));\r\n } else {\r\n Object.assign(result[index], instance);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport class CrudApi<T extends AbstractModel> {\r\n constructor(readonly model: Constructor<T>, readonly httpClient: AbstractHttpClient) {}\r\n\r\n protected getEndpointBaseUrl() {\r\n return `/${this.model.name.toLowerCase()}`;\r\n }\r\n\r\n async getMany(queries?: GetManyQueries<T>): Promise<GetManyResponseBody<T>> {\r\n return await this.httpClient.get(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\r\n }\r\n\r\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\r\n return await this.httpClient.put(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`, body);\r\n }\r\n\r\n async deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\r\n return await this.httpClient.delete(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\r\n }\r\n\r\n async createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>> {\r\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\r\n }\r\n}\r\n"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clairejs/client",
3
- "version": "3.1.7",
3
+ "version": "3.1.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -13,7 +13,7 @@
13
13
  "rxjs": "^6.6.7"
14
14
  },
15
15
  "peerDependencies": {
16
- "@clairejs/core": "^3.1.6"
16
+ "@clairejs/core": "^3.1.9"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/mocha": "^8.2.2",