@clairejs/client 3.2.27 → 3.2.29
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 +8 -0
- package/dist/api/RefreshHttpClient.d.ts +2 -1
- package/dist/api/RefreshHttpClient.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/webpack.config.js +1 -1
package/README.md
CHANGED
|
@@ -11,11 +11,12 @@ export declare class RefreshHttpClient extends DefaultHttpClient {
|
|
|
11
11
|
protected readonly storage?: AbstractStorage | undefined;
|
|
12
12
|
private refreshing;
|
|
13
13
|
private refreshQueue;
|
|
14
|
+
private tokenQueue;
|
|
14
15
|
constructor(apiServerUrl: string, logger: AbstractLogger, tokenManager: AbstractTokenManager, maxRetryCount?: number, delayMsBetweenRetry?: number, storage?: AbstractStorage | undefined);
|
|
15
16
|
protected getRefreshedAccessToken(): Promise<AccessToken>;
|
|
16
17
|
protected reauthenticate(): Promise<void>;
|
|
17
18
|
protected getAuthorization(): Promise<string>;
|
|
18
|
-
protected refreshToken(
|
|
19
|
+
protected refreshToken(token?: AccessToken): Promise<void>;
|
|
19
20
|
protected errorHandler<T = any>(operation: () => Promise<T>, err: any): Promise<T | undefined>;
|
|
20
21
|
}
|
|
21
22
|
//# sourceMappingURL=RefreshHttpClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RefreshHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/RefreshHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAKxD,qBAAa,iBAAkB,SAAQ,iBAAiB;
|
|
1
|
+
{"version":3,"file":"RefreshHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/RefreshHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAKxD,qBAAa,iBAAkB,SAAQ,iBAAiB;IAQhD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM;IACvC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc;IACzC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,oBAAoB;IACrD,SAAS,CAAC,QAAQ,CAAC,aAAa;IAChC,SAAS,CAAC,QAAQ,CAAC,mBAAmB;IACtC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;IAZ/B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,UAAU,CAAmC;gBAG9B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB,EAClC,aAAa,SAAI,EACjB,mBAAmB,SAAM,EACzB,OAAO,CAAC,6BAAiB;cAKhC,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC;cAI/C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;cAI/B,gBAAgB;cAYhB,YAAY,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;cAqChD,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CA0BvG"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{"use strict";var e={560:function(e,t){var n=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(){this.issuedGetRequests={}}resetCache(e){const t=new RegExp(e);Object.keys(this.issuedGetRequests).filter((e=>e.match(t))).forEach((e=>this.issuedGetRequests[e]=!1))}get(e,t,s){return n(this,void 0,void 0,(function*(){const n=this.issuedGetRequests[e],i=yield this.doGet(e,Object.assign(Object.assign({},t),n?{}:{"cache-control":"no-cache"}),s);return this.issuedGetRequests[e]=!0,i}))}}},805:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},814:function(e,t,n){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;const i=n(318);t.stringifyQueries=e=>Object.keys(e).filter((t=>void 0!==e[t])).reduce(((t,n)=>t+`&${encodeURIComponent(n)}=${encodeURIComponent(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,n,s,r)=>{const o=(r?n.filter((e=>(s||[]).some((t=>e.id&&t.id&&e.id===t.id)))):n).map((e=>Object.assign({},e))),a=(0,i.getObjectMetadata)(e);for(const n of s||[]){const s=o.findIndex((e=>e.id&&n.id&&e.id===n.id));if(s<0)o.push(Object.assign(new e,n));else{const e=o[s],r=n,c=Object.keys(e).concat(Object.keys(n)).reduce(i.uniqueReducer,[]);for(const n of c){const s=null==a?void 0:a.fields.find((e=>e.name===n));let o=!1;if(null==s?void 0:s.hasMany){const a=(0,i.getModelById)(s.hasMany.relationDto.id);a&&(o=!0,null===e[n]||void 0===e[n]?void 0!==r[n]&&(e[n]=r[n]):s.hasMany.single?e[n]=(0,t.mergeInstances)(a,[e[n]],[r[n]],!0):e[n]=(0,t.mergeInstances)(a,e[n],r[n],!0))}o||("object"!=typeof e[n]||Array.isArray(e[n])||null===e[n]?void 0!==r[n]&&(e[n]=r[n]):(0,i.deepMerge)(e[n],r[n]))}}}return o};t.CrudApi=class CrudApi{constructor(e,t){this.model=e,this.httpClient=t,this.dirty=!0}getEndpointBaseUrl(){return`/${this.model.name.toLowerCase()}`}getMany(e,n=!0){return s(this,void 0,void 0,(function*(){const s=!n||this.dirty,i=yield this.httpClient.get(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`,s?{"cache-control":"no-cache"}:void 0);return this.dirty=!1,i}))}updateMany(e,n){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.put(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(n||{})}`,e)}))}deleteMany(e){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.delete(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}createMany(e){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.post(`${this.getEndpointBaseUrl()}`,e)}))}}},854:function(e,t,n){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=i(n(167)),o=n(318),a=n(560);class DefaultHttpClient extends a.AbstractHttpClient{constructor(e,t,n=2,i=200,o){super(),this.apiServerUrl=e,this.logger=t,this.maxRetryCount=n,this.delayMsBetweenRetry=i,this.storage=o,this.api=r.default.create(),this.storage&&(this.api.interceptors.request.use((e=>s(this,void 0,void 0,(function*(){if("get"===e.method){const t=e.url||"",n=yield this.storage.getItem(t);if(n){if(Date.now()<n.expiration)return n.data;yield this.storage.deleteItem(t)}}return e})))),this.api.interceptors.response.use((e=>s(this,void 0,void 0,(function*(){var t,n;if("get"===e.config.method){const s=e.config.url||"",i=null===(n=null===(t=e.headers["Cache-Control"])||void 0===t?void 0:t.toString())||void 0===n?void 0:n.match(/max-age=(\d+)/),r=i?parseInt(i[1]):0;if(r){const t={data:e.data,expiration:Date.now()+1e3*r};yield this.storage.setItem(s,t)}}return e})))))}resolveUrl(e){return s(this,void 0,void 0,(function*(){return this.apiServerUrl+e}))}getAuthorization(){return s(this,void 0,void 0,(function*(){return""}))}errorHandler(e,t){return s(this,void 0,void 0,(function*(){throw t}))}retry(e,t=0){var n;return s(this,void 0,void 0,(function*(){try{return yield e()}catch(s){if((!s.response||503===s.response.status||"Service Unavailable"===(null===(n=s.response.data)||void 0===n?void 0:n.message))&&t<this.maxRetryCount)return this.logger.debug(`unknown error encountered, retrying request ${t+1}/${this.maxRetryCount} after ${this.delayMsBetweenRetry}ms`),yield new Promise((e=>setTimeout(e,this.delayMsBetweenRetry))),yield this.retry(e,t+1);throw s}}))}performRequest(e){var t,n;return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e.url),operation=()=>s(this,void 0,void 0,(function*(){var t,n;const s=(null===(t=e.options)||void 0===t?void 0:t.noAuthorization)?{}:{authorization:yield this.getAuthorization()};return(yield this.api({method:e.method,url:i,data:e.body,headers:Object.assign(Object.assign({},e.headers),s),withCredentials:null===(n=e.options)||void 0===n?void 0:n.withCredentials})).data}));try{return yield this.retry(operation)}catch(s){if(null===(t=e.options)||void 0===t?void 0:t.noErrorHandling)throw s;return yield this.errorHandler(operation,(null===(n=s.response)||void 0===n?void 0:n.data)||o.Errors.HTTP_REQUEST_ERROR())}}))}doGet(e,t,n){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"GET",url:e,headers:t,options:n})}))}post(e,t,n,i){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"POST",url:e,headers:n,options:i,body:t})}))}put(e,t,n,i){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"PUT",url:e,headers:n,options:i,body:t})}))}delete(e,t,n){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"DELETE",url:e,headers:t,options:n})}))}}t.DefaultHttpClient=DefaultHttpClient},375:function(e,t,n){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 a=e.length-1;a>=0;a--)(i=e[a])&&(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(318),a=n(259),c=n(805);let l=class DefaultTokenManager extends c.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",[a.AbstractStorage,String])],l),t.DefaultTokenManager=l},390:function(e,t,n){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.RefreshHttpClient=void 0;const i=n(318),r=n(854),o=i.Errors.TOKEN_EXPIRED().name,a=i.Errors.INVALID_TOKEN().name;class RefreshHttpClient extends r.DefaultHttpClient{constructor(e,t,n,s=2,i=200,r){super(e,t,s,i,r),this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.maxRetryCount=s,this.delayMsBetweenRetry=i,this.storage=r,this.refreshing=!1,this.refreshQueue=[]}getRefreshedAccessToken(){return s(this,void 0,void 0,(function*(){throw i.Errors.INVALID_TOKEN()}))}reauthenticate(){return s(this,void 0,void 0,(function*(){throw i.Errors.INVALID_CREDENTIALS()}))}getAuthorization(){return s(this,void 0,void 0,(function*(){const e=yield this.tokenManager.getAccessToken();return(null==e?void 0:e.token)||""}))}refreshToken(e){return s(this,void 0,void 0,(function*(){if(this.refreshing)return this.logger.debug("Awaiting refresh token, queued"),yield new Promise((e=>{this.refreshQueue.push({resolver:e})}));if(!(e=e||(yield this.tokenManager.getAccessToken()))||!e.refreshToken)return yield this.reauthenticate();try{this.refreshing=!0;const e=yield this.getRefreshedAccessToken();yield this.tokenManager.setAccessToken(e),this.logger.debug("Access token was refreshed")}finally{this.refreshing=!1;for(const e of this.refreshQueue)e.resolver();this.refreshQueue=[]}}))}errorHandler(e,t){return s(this,void 0,void 0,(function*(){const n=t.name;if(n===o)return yield this.refreshToken().catch((()=>this.reauthenticate())).catch((()=>{throw i.Errors.SESSION_EXPIRED()})).then((()=>e())).catch((e=>{var t;throw(null===(t=e.response)||void 0===t?void 0:t.data)||i.Errors.HTTP_REQUEST_ERROR()}));if(n===a)return yield this.reauthenticate().catch((()=>{throw i.Errors.SESSION_EXPIRED()})).then((()=>e())).catch((e=>{var t;throw(null===(t=e.response)||void 0===t?void 0:t.data)||i.Errors.HTTP_REQUEST_ERROR()}));throw t}))}}t.RefreshHttpClient=RefreshHttpClient},341:function(e,t,n){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(533),t),i(n(390),t),i(n(854),t),i(n(560),t),i(n(422),t),i(n(548),t),i(n(259),t),i(n(182),t),i(n(332),t),i(n(628),t),i(n(999),t),i(n(23),t),i(n(359),t),i(n(805),t),i(n(819),t),i(n(375),t),i(n(814),t)},332:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},628:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},359:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},23:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},999:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},422:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},38:(e,t)=>{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)}}},548:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(318),i=n(422),r=n(38);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.Errors.SYSTEM_ERROR("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.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;switch(this.logger.debug("Raw receive",e),e.type){case s.MessageType.READY:this.handleConnect();break;case s.MessageType.PING_PONG:this.accumulatedPing=0;const n=e.data;if(n){const e=this.pingpong.find((e=>e.id===n));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)}}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=>{this.socket=e,this.socket.onopen((()=>{this.socketConnected=!0,this.logger.debug("Physic link connected, sending & waiting for READY message"),this.sendRawMessage({type:s.MessageType.READY,data:""})})),this.socket.onmessage((e=>{const t=JSON.parse(e);t&&t.type?this.handleMessage(t):this.logger.debug("Invalid mesasge structure",e)})),this.socket.onclose((e=>{this.handleDisconnect(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},819:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},259:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},533:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(318);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},182:function(e,t,n){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 a=e.length-1;a>=0;a--)(i=e[a])&&(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(318),a=/{([_a-zA-Z][a-zA-Z0-9_]*)}/g;let c=class Translator{constructor(e){this.logger=e,this.translations={},this.translationLoadings={}}setTranslations(e){const t=Object.keys(e);this.translationProviders=e;for(const e of t)this.translations[e]=null}awaitingTranslations(e){return r(this,void 0,void 0,(function*(){if(null!==this.translations[e])return Promise.resolve();if(this.translationLoadings[e]){let resolver=()=>{};const t=new Promise((e=>resolver=e));return this.translationLoadings[e].push(resolver),t}if(this.translationLoadings[e]=[],this.translationProviders&&this.translationProviders[e])try{const t=yield this.translationProviders[e];this.translations[e]=t.default}catch(t){this.logger.error("Error loading translation",t),this.translations[e]=void 0}else this.translations[e]=void 0;for(const t of this.translationLoadings[e]||[])t();this.translationLoadings[e]=[]}))}translate(e,t,n){if(!this.translationProviders||!this.translationProviders[e])return this.translateText(t,n);const s=this.translations[e];return s&&s[t]?this.translateText(s[t],n):this.translateText(t,n)}translateText(e,t){let n="";if(e){const s=e.matchAll(a);let i=0;for(const r of s){const s=r[1];n+=e.slice(i,r.index),t&&"string"==typeof t[s]?n+=t[s]:n+=r[0],i=(r.index||0)+r[0].length}i<e.length&&(n+=e.slice(i))}return n}};c=s([(0,o.Injectable)(),i("design:paramtypes",[o.AbstractLogger])],c),t.Translator=c},318:e=>{e.exports=require("@clairejs/core")},167:e=>{e.exports=require("axios")}},t={};var n=function __webpack_require__(n){var s=t[n];if(void 0!==s)return s.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,__webpack_require__),i.exports}(341),s=exports;for(var i in n)s[i]=n[i];n.__esModule&&Object.defineProperty(s,"__esModule",{value:!0})})();
|
|
1
|
+
(()=>{"use strict";var e={560:function(e,t){var n=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(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(){this.issuedGetRequests={}}resetCache(e){const t=new RegExp(e);Object.keys(this.issuedGetRequests).filter((e=>e.match(t))).forEach((e=>this.issuedGetRequests[e]=!1))}get(e,t,s){return n(this,void 0,void 0,(function*(){const n=this.issuedGetRequests[e],i=yield this.doGet(e,Object.assign(Object.assign({},t),n?{}:{"cache-control":"no-cache"}),s);return this.issuedGetRequests[e]=!0,i}))}}},805:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},814:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(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;const i=n(318);t.stringifyQueries=e=>Object.keys(e).filter((t=>void 0!==e[t])).reduce(((t,n)=>t+`&${encodeURIComponent(n)}=${encodeURIComponent(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,n,s,o)=>{const r=(o?n.filter((e=>(s||[]).some((t=>e.id&&t.id&&e.id===t.id)))):n).map((e=>Object.assign({},e))),a=(0,i.getObjectMetadata)(e);for(const n of s||[]){const s=r.findIndex((e=>e.id&&n.id&&e.id===n.id));if(s<0)r.push(Object.assign(new e,n));else{const e=r[s],o=n,c=Object.keys(e).concat(Object.keys(n)).reduce(i.uniqueReducer,[]);for(const n of c){const s=null==a?void 0:a.fields.find((e=>e.name===n));let r=!1;if(null==s?void 0:s.hasMany){const a=(0,i.getModelById)(s.hasMany.relationDto.id);a&&(r=!0,null===e[n]||void 0===e[n]?void 0!==o[n]&&(e[n]=o[n]):s.hasMany.single?e[n]=(0,t.mergeInstances)(a,[e[n]],[o[n]],!0):e[n]=(0,t.mergeInstances)(a,e[n],o[n],!0))}r||("object"!=typeof e[n]||Array.isArray(e[n])||null===e[n]?void 0!==o[n]&&(e[n]=o[n]):(0,i.deepMerge)(e[n],o[n]))}}}return r};t.CrudApi=class CrudApi{constructor(e,t){this.model=e,this.httpClient=t,this.dirty=!0}getEndpointBaseUrl(){return`/${this.model.name.toLowerCase()}`}getMany(e,n=!0){return s(this,void 0,void 0,(function*(){const s=!n||this.dirty,i=yield this.httpClient.get(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`,s?{"cache-control":"no-cache"}:void 0);return this.dirty=!1,i}))}updateMany(e,n){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.put(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(n||{})}`,e)}))}deleteMany(e){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.delete(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}createMany(e){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.post(`${this.getEndpointBaseUrl()}`,e)}))}}},854:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(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 o=i(n(167)),r=n(318),a=n(560);class DefaultHttpClient extends a.AbstractHttpClient{constructor(e,t,n=2,i=200,r){super(),this.apiServerUrl=e,this.logger=t,this.maxRetryCount=n,this.delayMsBetweenRetry=i,this.storage=r,this.api=o.default.create(),this.storage&&(this.api.interceptors.request.use((e=>s(this,void 0,void 0,(function*(){if("get"===e.method){const t=e.url||"",n=yield this.storage.getItem(t);if(n){if(Date.now()<n.expiration)return n.data;yield this.storage.deleteItem(t)}}return e})))),this.api.interceptors.response.use((e=>s(this,void 0,void 0,(function*(){var t,n;if("get"===e.config.method){const s=e.config.url||"",i=null===(n=null===(t=e.headers["Cache-Control"])||void 0===t?void 0:t.toString())||void 0===n?void 0:n.match(/max-age=(\d+)/),o=i?parseInt(i[1]):0;if(o){const t={data:e.data,expiration:Date.now()+1e3*o};yield this.storage.setItem(s,t)}}return e})))))}resolveUrl(e){return s(this,void 0,void 0,(function*(){return this.apiServerUrl+e}))}getAuthorization(){return s(this,void 0,void 0,(function*(){return""}))}errorHandler(e,t){return s(this,void 0,void 0,(function*(){throw t}))}retry(e,t=0){var n;return s(this,void 0,void 0,(function*(){try{return yield e()}catch(s){if((!s.response||503===s.response.status||"Service Unavailable"===(null===(n=s.response.data)||void 0===n?void 0:n.message))&&t<this.maxRetryCount)return this.logger.debug(`unknown error encountered, retrying request ${t+1}/${this.maxRetryCount} after ${this.delayMsBetweenRetry}ms`),yield new Promise((e=>setTimeout(e,this.delayMsBetweenRetry))),yield this.retry(e,t+1);throw s}}))}performRequest(e){var t,n;return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e.url),operation=()=>s(this,void 0,void 0,(function*(){var t,n;const s=(null===(t=e.options)||void 0===t?void 0:t.noAuthorization)?{}:{authorization:yield this.getAuthorization()};return(yield this.api({method:e.method,url:i,data:e.body,headers:Object.assign(Object.assign({},e.headers),s),withCredentials:null===(n=e.options)||void 0===n?void 0:n.withCredentials})).data}));try{return yield this.retry(operation)}catch(s){if(null===(t=e.options)||void 0===t?void 0:t.noErrorHandling)throw s;return yield this.errorHandler(operation,(null===(n=s.response)||void 0===n?void 0:n.data)||r.Errors.HTTP_REQUEST_ERROR())}}))}doGet(e,t,n){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"GET",url:e,headers:t,options:n})}))}post(e,t,n,i){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"POST",url:e,headers:n,options:i,body:t})}))}put(e,t,n,i){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"PUT",url:e,headers:n,options:i,body:t})}))}delete(e,t,n){return s(this,void 0,void 0,(function*(){return yield this.performRequest({method:"DELETE",url:e,headers:t,options:n})}))}}t.DefaultHttpClient=DefaultHttpClient},375:function(e,t,n){var s=this&&this.__decorate||function(e,t,n,s){var i,o=arguments.length,r=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,n,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(r=(o<3?i(r):o>3?i(t,n,r):i(t,n))||r);return o>3&&r&&Object.defineProperty(t,n,r),r},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},o=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(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 r=n(318),a=n(259),c=n(805);let l=class DefaultTokenManager extends c.AbstractTokenManager{constructor(e,t="ACCESS_TOKEN"){super(),this.storage=e,this.storageKey=t,this.accessToken=null}getAccessToken(){return o(this,void 0,void 0,(function*(){return null===this.accessToken&&(this.accessToken=yield this.storage.getItem(this.storageKey)),this.accessToken}))}setAccessToken(e){return o(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,r.Injectable)(),i("design:paramtypes",[a.AbstractStorage,String])],l),t.DefaultTokenManager=l},390:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(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.RefreshHttpClient=void 0;const i=n(318),o=n(854),r=i.Errors.TOKEN_EXPIRED().name,a=i.Errors.INVALID_TOKEN().name;class RefreshHttpClient extends o.DefaultHttpClient{constructor(e,t,n,s=2,i=200,o){super(e,t,s,i,o),this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.maxRetryCount=s,this.delayMsBetweenRetry=i,this.storage=o,this.refreshing=!1,this.refreshQueue=[],this.tokenQueue=[]}getRefreshedAccessToken(){return s(this,void 0,void 0,(function*(){throw i.Errors.INVALID_TOKEN()}))}reauthenticate(){return s(this,void 0,void 0,(function*(){throw i.Errors.INVALID_CREDENTIALS()}))}getAuthorization(){return s(this,void 0,void 0,(function*(){if(this.refreshing){return new Promise((e=>{this.tokenQueue.push(e)}))}{const e=yield this.tokenManager.getAccessToken();return(null==e?void 0:e.token)||""}}))}refreshToken(e){return s(this,void 0,void 0,(function*(){if(this.refreshing)return this.logger.debug("Awaiting refresh token, queued"),yield new Promise((e=>{this.refreshQueue.push(e)}));if(!(e=e||(yield this.tokenManager.getAccessToken()))||!e.refreshToken)return yield this.reauthenticate();try{this.refreshing=!0,e=yield this.getRefreshedAccessToken(),yield this.tokenManager.setAccessToken(e),this.logger.debug("Access token was refreshed")}finally{this.refreshing=!1;for(const e of this.refreshQueue)e();for(const t of this.tokenQueue)t(e.token);this.refreshQueue=[],this.tokenQueue=[]}}))}errorHandler(e,t){return s(this,void 0,void 0,(function*(){const n=t.name;if(n===r)return yield this.refreshToken().catch((()=>this.reauthenticate())).catch((()=>{throw i.Errors.SESSION_EXPIRED()})).then((()=>e())).catch((e=>{var t;throw(null===(t=e.response)||void 0===t?void 0:t.data)||i.Errors.HTTP_REQUEST_ERROR()}));if(n===a)return yield this.reauthenticate().catch((()=>{throw i.Errors.SESSION_EXPIRED()})).then((()=>e())).catch((e=>{var t;throw(null===(t=e.response)||void 0===t?void 0:t.data)||i.Errors.HTTP_REQUEST_ERROR()}));throw t}))}}t.RefreshHttpClient=RefreshHttpClient},341:function(e,t,n){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(533),t),i(n(390),t),i(n(854),t),i(n(560),t),i(n(422),t),i(n(548),t),i(n(259),t),i(n(182),t),i(n(332),t),i(n(628),t),i(n(999),t),i(n(23),t),i(n(359),t),i(n(805),t),i(n(819),t),i(n(375),t),i(n(814),t)},332:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},628:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},359:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},23:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},999:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},422:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},38:(e,t)=>{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)}}},548:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(318),i=n(422),o=n(38);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.Errors.SYSTEM_ERROR("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.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;switch(this.logger.debug("Raw receive",e),e.type){case s.MessageType.READY:this.handleConnect();break;case s.MessageType.PING_PONG:this.accumulatedPing=0;const n=e.data;if(n){const e=this.pingpong.find((e=>e.id===n));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)}}create(){const e=new o.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=>{this.socket=e,this.socket.onopen((()=>{this.socketConnected=!0,this.logger.debug("Physic link connected, sending & waiting for READY message"),this.sendRawMessage({type:s.MessageType.READY,data:""})})),this.socket.onmessage((e=>{const t=JSON.parse(e);t&&t.type?this.handleMessage(t):this.logger.debug("Invalid mesasge structure",e)})),this.socket.onclose((e=>{this.handleDisconnect(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},819:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},259:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},533:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(318);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},182:function(e,t,n){var s=this&&this.__decorate||function(e,t,n,s){var i,o=arguments.length,r=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,n,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(r=(o<3?i(r):o>3?i(t,n,r):i(t,n))||r);return o>3&&r&&Object.defineProperty(t,n,r),r},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},o=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function fulfilled(e){try{step(s.next(e))}catch(e){o(e)}}function rejected(e){try{step(s.throw(e))}catch(e){o(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 r=n(318),a=/{([_a-zA-Z][a-zA-Z0-9_]*)}/g;let c=class Translator{constructor(e){this.logger=e,this.translations={},this.translationLoadings={}}setTranslations(e){const t=Object.keys(e);this.translationProviders=e;for(const e of t)this.translations[e]=null}awaitingTranslations(e){return o(this,void 0,void 0,(function*(){if(null!==this.translations[e])return Promise.resolve();if(this.translationLoadings[e]){let resolver=()=>{};const t=new Promise((e=>resolver=e));return this.translationLoadings[e].push(resolver),t}if(this.translationLoadings[e]=[],this.translationProviders&&this.translationProviders[e])try{const t=yield this.translationProviders[e];this.translations[e]=t.default}catch(t){this.logger.error("Error loading translation",t),this.translations[e]=void 0}else this.translations[e]=void 0;for(const t of this.translationLoadings[e]||[])t();this.translationLoadings[e]=[]}))}translate(e,t,n){if(!this.translationProviders||!this.translationProviders[e])return this.translateText(t,n);const s=this.translations[e];return s&&s[t]?this.translateText(s[t],n):this.translateText(t,n)}translateText(e,t){let n="";if(e){const s=e.matchAll(a);let i=0;for(const o of s){const s=o[1];n+=e.slice(i,o.index),t&&"string"==typeof t[s]?n+=t[s]:n+=o[0],i=(o.index||0)+o[0].length}i<e.length&&(n+=e.slice(i))}return n}};c=s([(0,r.Injectable)(),i("design:paramtypes",[r.AbstractLogger])],c),t.Translator=c},318:e=>{e.exports=require("@clairejs/core")},167:e=>{e.exports=require("axios")}},t={};var n=function __webpack_require__(n){var s=t[n];if(void 0!==s)return s.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,__webpack_require__),i.exports}(341),s=exports;for(var i in n)s[i]=n[i];n.__esModule&&Object.defineProperty(s,"__esModule",{value:!0})})();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://@clairejs/client/./src/api/AbstractHttpClient.ts","webpack://@clairejs/client/./src/api/AbstractTokenManager.ts","webpack://@clairejs/client/./src/api/CrudApi.ts","webpack://@clairejs/client/./src/api/DefaultHttpClient.ts","webpack://@clairejs/client/./src/api/DefaultTokenManager.ts","webpack://@clairejs/client/./src/api/RefreshHttpClient.ts","webpack://@clairejs/client/./src/index.ts","webpack://@clairejs/client/./src/routing/AbstractErrorHandler.ts","webpack://@clairejs/client/./src/routing/AbstractViewMiddleware.ts","webpack://@clairejs/client/./src/socket/AbstractClientSocketManager.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocket.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocketManager.ts","webpack://@clairejs/client/./src/system/AbstractStorage.ts","webpack://@clairejs/client/./src/system/ClaireClient.ts","webpack://@clairejs/client/./src/translation/Translator.ts","webpack://@clairejs/client/external commonjs \"@clairejs/core\"","webpack://@clairejs/client/external commonjs \"axios\"","webpack://@clairejs/client/webpack/bootstrap","webpack://@clairejs/client/webpack/startup"],"sourcesContent":["export interface RequestOptions {\n noAuthorization?: boolean;\n withCredentials?: boolean;\n noErrorHandling?: boolean;\n}\n\nexport abstract class AbstractHttpClient {\n protected issuedGetRequests: Record<string, boolean> = {};\n\n /*\n Keep track off all get request had been sent and allow decache (using regex pattern) those requests\n so next request will not get from cache\n */\n resetCache(pattern: string) {\n const regex = new RegExp(pattern);\n Object.keys(this.issuedGetRequests)\n .filter((key) => key.match(regex))\n .forEach((key) => (this.issuedGetRequests[key] = false));\n }\n\n protected abstract doGet<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined>;\n\n //-- normally T will be returned or error will throw, but in case undefined is returned, that is because error handler\n //-- has intercepted and decided to return nothing\n async get<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined> {\n const shouldUseCache = this.issuedGetRequests[url];\n\n const result = await this.doGet(\n url,\n { ...headers, ...(shouldUseCache ? {} : { \"cache-control\": \"no-cache\" }) },\n options,\n );\n this.issuedGetRequests[url] = true;\n\n return result;\n }\n abstract post<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined>;\n abstract put<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined>;\n abstract delete<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined>;\n}\n","import { AccessToken } from \"@clairejs/core\";\n\nexport abstract class AbstractTokenManager {\n abstract getAccessToken(): Promise<AccessToken | undefined>;\n abstract setAccessToken(token?: AccessToken): Promise<void>;\n}\n","import {\n AbstractModel,\n Constructor,\n CreateManyRequestBody,\n CreateManyResponseBody,\n deepMerge,\n DeepPartial,\n GetManyQueries,\n GetManyResponseBody,\n getModelById,\n getObjectMetadata,\n Identifiable,\n ModelMetadata,\n uniqueReducer,\n UpdateManyBody,\n UpdateManyQueries,\n UpdateManyResponse,\n} from \"@clairejs/core\";\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\n\nexport const stringifyQueries = (queries: Record<string, any>) => {\n const keys = Object.keys(queries).filter((key) => queries[key] !== undefined);\n return keys.reduce(\n (collector, key) =>\n collector + `&${encodeURIComponent(key)}=${encodeURIComponent(JSON.stringify(queries[key]))}`,\n \"\",\n );\n};\n\nexport const removeInstances = <T extends Identifiable>(target: T[], source: T[]) => {\n const result = target.slice();\n for (const instance of source) {\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\n if (index >= 0) {\n result.splice(index, 1);\n }\n }\n return result;\n};\n\nexport const mergeInstances = <T extends Identifiable>(\n model: Constructor<T>,\n target: readonly T[],\n source: readonly DeepPartial<T>[] | undefined,\n syncTarget?: boolean,\n) => {\n const result = (\n syncTarget ? target.filter((i) => (source || []).some((newI) => i.id && newI.id && i.id === newI.id)) : target\n ).map((i) => ({ ...i }));\n\n const metadata = getObjectMetadata<ModelMetadata>(model);\n\n for (const instance of source || []) {\n const index = result.findIndex((i) => i.id && instance.id && i.id === instance.id);\n if (index < 0) {\n result.push(Object.assign(new model(), instance));\n } else {\n const targetObj = result[index] as any;\n const sourceObject = instance as any;\n\n const fields = Object.keys(targetObj)\n .concat(Object.keys(instance))\n .reduce(uniqueReducer, [] as string[]);\n\n for (const field of fields) {\n //-- check if we are merging hasMany field\n const fieldMeta = metadata?.fields.find((f) => f.name === field);\n let mergeByModel = false;\n if (fieldMeta?.hasMany) {\n const targetModel = getModelById(fieldMeta.hasMany.relationDto.id);\n if (targetModel) {\n mergeByModel = true;\n if (targetObj[field] === null || targetObj[field] === undefined) {\n if (sourceObject[field] !== undefined) {\n targetObj[field] = sourceObject[field];\n }\n } else {\n if (fieldMeta.hasMany.single) {\n targetObj[field] = mergeInstances(\n targetModel,\n [targetObj[field]],\n [sourceObject[field]],\n true,\n );\n } else {\n targetObj[field] = mergeInstances(\n targetModel,\n targetObj[field],\n sourceObject[field],\n true,\n );\n }\n }\n }\n }\n\n if (!mergeByModel) {\n if (\n typeof targetObj[field] === \"object\" &&\n !Array.isArray(targetObj[field]) &&\n targetObj[field] !== null\n ) {\n //-- call deep merge to merge object\n deepMerge(targetObj[field], sourceObject[field]);\n } else {\n //-- direct assign\n if (sourceObject[field] !== undefined) {\n targetObj[field] = sourceObject[field];\n }\n }\n }\n }\n }\n }\n\n return result;\n};\n\nexport class CrudApi<T extends AbstractModel> {\n private dirty = true;\n\n constructor(readonly model: Constructor<T>, readonly httpClient: AbstractHttpClient) {}\n\n protected getEndpointBaseUrl() {\n return `/${this.model.name.toLowerCase()}`;\n }\n\n async getMany(queries?: GetManyQueries<T>, useCache = true): Promise<GetManyResponseBody<T> | undefined> {\n const noCache = !useCache || this.dirty;\n const result = await this.httpClient.get(\n `${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`,\n noCache\n ? {\n \"cache-control\": \"no-cache\",\n }\n : undefined,\n );\n this.dirty = false;\n return result;\n }\n\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T> | undefined> {\n this.dirty = true;\n return await this.httpClient.put(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`, body);\n }\n\n async deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T> | undefined> {\n this.dirty = true;\n return await this.httpClient.delete(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\n }\n\n async createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T> | undefined> {\n this.dirty = true;\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\n }\n}\n","import axios, { Method } from \"axios\";\nimport { AbstractLogger, Errors } from \"@clairejs/core\";\n\nimport { AbstractHttpClient, RequestOptions } from \"./AbstractHttpClient\";\nimport { AbstractStorage } from \"../system/AbstractStorage\";\n\nexport interface RequestData {\n method: Method;\n url: string;\n body?: any;\n headers?: object;\n options?: RequestOptions;\n}\n\ninterface CacheData {\n data: any;\n expiration: number;\n}\n\nexport class DefaultHttpClient extends AbstractHttpClient {\n private readonly api = axios.create();\n\n constructor(\n protected readonly apiServerUrl: string,\n protected readonly logger: AbstractLogger,\n protected readonly maxRetryCount = 2,\n protected readonly delayMsBetweenRetry = 200,\n protected readonly storage?: AbstractStorage,\n ) {\n super();\n\n if (this.storage) {\n //-- setup axios cache\n this.api.interceptors.request.use(async (config) => {\n if (config.method === \"get\") {\n const cacheKey = config.url || \"\";\n const cachedData = await this.storage!.getItem<CacheData>(cacheKey);\n if (cachedData) {\n if (Date.now() < cachedData.expiration) {\n return cachedData.data;\n } else {\n await this.storage!.deleteItem(cacheKey);\n }\n }\n }\n return config;\n });\n\n // add a response interceptor to cache response data\n this.api.interceptors.response.use(async (response) => {\n if (response.config.method === \"get\") {\n const cacheKey = response.config.url || \"\";\n const maxAgeMatch = response.headers[\"Cache-Control\"]?.toString()?.match(/max-age=(\\d+)/);\n const maxAge = maxAgeMatch ? parseInt(maxAgeMatch[1]) : 0;\n\n if (maxAge) {\n const dataToCache: CacheData = {\n data: response.data,\n expiration: Date.now() + maxAge * 1000,\n };\n await this.storage!.setItem(cacheKey, dataToCache);\n }\n }\n return response;\n });\n }\n }\n\n protected async resolveUrl(url: string): Promise<string> {\n return this.apiServerUrl + url;\n }\n\n protected async getAuthorization(): Promise<string> {\n return \"\";\n }\n\n protected async errorHandler<T = any>(operation: () => Promise<T>, err: any): Promise<T | undefined> {\n throw err;\n }\n\n protected async retry<T = any>(apiCall: () => Promise<T>, retryCount: number = 0): Promise<T | undefined> {\n try {\n return await apiCall();\n } catch (err: any) {\n //-- if error is 503 or has empty body then retry\n if (\n (!err.response ||\n err.response.status === 503 ||\n err.response.data?.message === \"Service Unavailable\") &&\n retryCount < this.maxRetryCount\n ) {\n this.logger.debug(\n `unknown error encountered, retrying request ${retryCount + 1}/${this.maxRetryCount} after ${\n this.delayMsBetweenRetry\n }ms`,\n );\n await new Promise<void>((resolve) => setTimeout(resolve, this.delayMsBetweenRetry));\n\n return await this.retry(apiCall, retryCount + 1);\n }\n\n throw err;\n }\n }\n\n protected async performRequest<T = any>(data: RequestData): Promise<T | undefined> {\n const finalUrl = await this.resolveUrl(data.url);\n\n const operation = async () => {\n const authHeader = !data.options?.noAuthorization ? { authorization: await this.getAuthorization() } : {};\n\n const result = await this.api({\n method: data.method,\n url: finalUrl,\n data: data.body,\n headers: {\n ...data.headers,\n ...authHeader,\n },\n withCredentials: data.options?.withCredentials,\n });\n\n return result.data as T;\n };\n\n try {\n return await this.retry(operation);\n } catch (err: any) {\n if (data.options?.noErrorHandling) {\n throw err;\n }\n\n return await this.errorHandler(operation, err.response?.data || Errors.HTTP_REQUEST_ERROR());\n }\n }\n\n protected async doGet<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined> {\n return await this.performRequest({ method: \"GET\", url, headers, options });\n }\n\n async post<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined> {\n return await this.performRequest({\n method: \"POST\",\n url,\n headers,\n options,\n body,\n });\n }\n\n async put<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined> {\n return await this.performRequest({\n method: \"PUT\",\n url,\n headers,\n options,\n body,\n });\n }\n\n async delete<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined> {\n return await this.performRequest({\n method: \"DELETE\",\n url,\n headers,\n options,\n });\n }\n}\n","import { Injectable, AccessToken } from \"@clairejs/core\";\n\nimport { AbstractStorage } from \"../system/AbstractStorage\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\n\n@Injectable()\nexport class DefaultTokenManager extends AbstractTokenManager {\n private accessToken?: AccessToken = null!;\n\n constructor(protected readonly storage: AbstractStorage, protected readonly storageKey: string = \"ACCESS_TOKEN\") {\n super();\n }\n\n async getAccessToken(): Promise<AccessToken | undefined> {\n if (this.accessToken === null) {\n this.accessToken = await this.storage.getItem(this.storageKey);\n }\n return this.accessToken;\n }\n\n async setAccessToken(token?: AccessToken): Promise<void> {\n if (token) {\n await this.storage.setItem(this.storageKey, token);\n } else {\n await this.storage.deleteItem(this.storageKey);\n }\n this.accessToken = token;\n }\n}\n","import { AbstractLogger, AccessToken, Errors } from \"@clairejs/core\";\n\nimport { AbstractStorage } from \"../system/AbstractStorage\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\n\nconst tokenExpiredError = Errors.TOKEN_EXPIRED().name;\nconst invalidTokenError = Errors.INVALID_TOKEN().name;\n\nexport class RefreshHttpClient extends DefaultHttpClient {\n private refreshing = false;\n private refreshQueue: {\n resolver: () => void;\n }[] = [];\n\n constructor(\n protected readonly apiServerUrl: string,\n protected readonly logger: AbstractLogger,\n protected readonly tokenManager: AbstractTokenManager,\n protected readonly maxRetryCount = 2,\n protected readonly delayMsBetweenRetry = 200,\n protected readonly storage?: AbstractStorage,\n ) {\n super(apiServerUrl, logger, maxRetryCount, delayMsBetweenRetry, storage);\n }\n\n protected async getRefreshedAccessToken(): Promise<AccessToken> {\n throw Errors.INVALID_TOKEN();\n }\n\n protected async reauthenticate(): Promise<void> {\n throw Errors.INVALID_CREDENTIALS();\n }\n\n protected async getAuthorization() {\n const accessToken = await this.tokenManager.getAccessToken();\n return accessToken?.token || \"\";\n }\n\n protected async refreshToken(oldToken?: AccessToken): Promise<void> {\n if (this.refreshing) {\n this.logger.debug(\"Awaiting refresh token, queued\");\n return await new Promise<void>((resolver) => {\n this.refreshQueue.push({ resolver });\n });\n }\n\n oldToken = oldToken || (await this.tokenManager.getAccessToken());\n //-- call to api server to refresh token\n if (!oldToken || !oldToken.refreshToken) {\n //-- there is no refresh token to refresh\n return await this.reauthenticate();\n }\n\n try {\n this.refreshing = true;\n const newToken = await this.getRefreshedAccessToken();\n await this.tokenManager.setAccessToken(newToken);\n this.logger.debug(\"Access token was refreshed\");\n } finally {\n this.refreshing = false;\n for (const refresh of this.refreshQueue) {\n refresh.resolver();\n }\n //-- clear queue\n this.refreshQueue = [];\n }\n }\n\n protected async errorHandler<T = any>(operation: () => Promise<T>, err: any): Promise<T | undefined> {\n const errorName = err.name;\n\n if (errorName === tokenExpiredError) {\n return await this.refreshToken()\n .catch(() => this.reauthenticate())\n .catch(() => {\n throw Errors.SESSION_EXPIRED();\n })\n .then(() => operation())\n .catch((err) => {\n throw err.response?.data || Errors.HTTP_REQUEST_ERROR();\n });\n } else if (errorName === invalidTokenError) {\n return await this.reauthenticate()\n .catch(() => {\n throw Errors.SESSION_EXPIRED();\n })\n .then(() => operation())\n .catch((err) => {\n throw err.response?.data || Errors.HTTP_REQUEST_ERROR();\n });\n }\n\n throw err;\n }\n}\n","export * from \"./system/ClaireClient\";\nexport * from \"./api/RefreshHttpClient\";\nexport * from \"./api/DefaultHttpClient\";\nexport * from \"./api/AbstractHttpClient\";\nexport * from \"./socket/AbstractClientSocketManager\";\nexport * from \"./socket/DefaultClientSocketManager\";\nexport * from \"./system/AbstractStorage\";\nexport * from \"./translation/Translator\";\nexport * from \"./routing/AbstractErrorHandler\";\nexport * from \"./routing/AbstractViewMiddleware\";\nexport * from \"./routing/UrlInfo\";\nexport * from \"./routing/RouterConfig\";\nexport * from \"./routing/ComponentInfo\";\nexport * from \"./api/AbstractTokenManager\";\nexport * from \"./socket/IWebSocket\";\nexport * from \"./api/DefaultTokenManager\";\nexport * from \"./api/CrudApi\";\n","export abstract class AbstractErrorHandler {\n public abstract handle(err: any, component?: any): void;\n}\n","import { UrlInfo } from \"./UrlInfo\";\nexport abstract class AbstractViewMiddleware {\n public abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;\n}\n","import { IClientSocket } from \"@clairejs/core\";\n\nexport abstract class AbstractClientSocketManager {\n abstract create(): IClientSocket;\n abstract joinChannels(channels: string[]): void;\n abstract leaveChannels(channels: string[]): void;\n abstract getPingMs(): number;\n}\n","import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from \"@clairejs/core\";\nimport { DefaultClientSocketManager } from \"./DefaultClientSocketManager\";\n\nexport class DefaultClientSocket implements IClientSocket {\n constructor(readonly socketManager: DefaultClientSocketManager) {}\n\n joinChannels(channels: string[]): void {\n this.socketManager.subChannels(this, channels);\n }\n\n leaveChannels(channels: string[]): void {\n this.socketManager.unsubChannels(this, channels);\n }\n\n close(): void {\n this.socketManager.removeSocket(this);\n }\n\n onReconnect(handler: ReconnectionHandler): void {\n this.socketManager.registerReconnectionHandler(this, handler);\n }\n\n onDisconnect(handler: DisconnectionHandler): void {\n this.socketManager.registerDisconnectionHandler(this, handler);\n }\n\n onMessage(handler: PlainMessageHandler): void {\n this.socketManager.registerMessageHandler(this, handler);\n }\n\n send(message: any, channel?: string): void {\n this.socketManager.sendPlainMessageToChannel(message, channel);\n }\n}\n","import {\n AbstractLogger,\n Errors,\n MessageType,\n SocketMessage,\n DisconnectionHandler,\n IClientSocket,\n PlainMessageHandler,\n ReconnectionHandler,\n} from \"@clairejs/core\";\n\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\nimport { SocketConfig } from \"./SocketConfig\";\nimport { DefaultClientSocket } from \"./DefaultClientSocket\";\nimport { IWebSocket } from \"./IWebSocket\";\n\nconst pingpongMaxCount = 10;\n\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\n private socket?: IWebSocket;\n\n private allSockets: {\n socket: DefaultClientSocket;\n registeredChannels: string[];\n reconnectionHandler?: ReconnectionHandler;\n disconnectionHandler?: DisconnectionHandler;\n messageHandler?: PlainMessageHandler;\n }[] = [];\n\n private allChannels: { channel: string; connected: boolean; pendingMessages: any[] }[] = [];\n\n private socketConnected?: boolean;\n private pingIntervalId?: any;\n private retryTimeoutId?: any;\n private accumulatedPing = 0;\n private retryDelay = 0;\n private intendedDisconnection?: boolean;\n private pingpongId = 0;\n\n public pingpong: { id: number; sentTimestamp: number; receivedTimestamp?: number }[] = [];\n\n constructor(\n private readonly wsProvider: () => Promise<IWebSocket>,\n private readonly logger: AbstractLogger,\n private readonly config?: SocketConfig,\n ) {\n super();\n }\n\n getPingMs(): number {\n const candidates = this.pingpong.filter((pp) => pp.sentTimestamp && pp.receivedTimestamp);\n if (!candidates.length) {\n return 0;\n }\n return (\n candidates.map((pp) => pp.receivedTimestamp! - pp.sentTimestamp).reduce((total, diff) => total + diff, 0) /\n candidates.length\n );\n }\n\n subChannels(socket: IClientSocket, channels: string[]) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (!info) {\n this.logger.debug(\"Socket not found\");\n return;\n }\n\n //-- un-connected channels\n const unconnectedChannels: string[] = [];\n for (const channel of channels) {\n if (!info.registeredChannels.includes(channel)) {\n info.registeredChannels.push(channel);\n }\n const foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel || !foundChannel.connected) {\n unconnectedChannels.push(channel);\n }\n }\n\n this.joinChannels(unconnectedChannels);\n }\n\n unsubChannels(socket: IClientSocket, channels: string[]) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (!info) {\n this.logger.debug(\"Socket not found\");\n return;\n }\n\n info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));\n\n //-- check if no one is subscribing these channel then remove\n const removedChannels: string[] = [];\n for (const channel of channels) {\n //-- no one is listening\n if (!this.allSockets.find((socket) => socket.registeredChannels.includes(channel))) {\n removedChannels.push(channel);\n }\n }\n\n this.leaveChannels(removedChannels);\n }\n\n removeSocket(socket: DefaultClientSocket) {\n const socketInfo = this.allSockets.find((s) => s.socket === socket);\n if (socketInfo && socketInfo.disconnectionHandler) {\n socketInfo.disconnectionHandler();\n }\n\n this.allSockets = this.allSockets.filter((s) => s.socket !== socket);\n if (!this.allSockets.length) {\n this.forceDisconnect();\n }\n }\n\n registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.reconnectionHandler = handler;\n }\n }\n\n registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.disconnectionHandler = handler;\n }\n }\n\n registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.messageHandler = handler;\n }\n }\n\n sendPlainMessageToChannel(message: any, channel?: string) {\n if (channel) {\n //-- check if channel has been connected\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n if (foundChannel.connected) {\n //-- send\n this.sendRawMessage({\n type: MessageType.PLAIN,\n data: { channel, message },\n });\n } else {\n foundChannel.pendingMessages.push(message);\n }\n } else {\n this.sendRawMessage({\n type: MessageType.PLAIN,\n data: {\n message,\n },\n });\n }\n }\n\n joinChannels(channels: string[]) {\n if (!channels.length) {\n return;\n }\n\n if (!this.socket || !this.socketConnected) {\n //-- create pending channels\n for (const channel of channels) {\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n\n ///-- this channel is already connected, skip\n if (foundChannel.connected) {\n continue;\n }\n }\n } else {\n this.sendRawMessage({\n type: MessageType.CHANNEL_JOIN,\n data: channels,\n });\n }\n }\n\n leaveChannels(channels: string[]) {\n if (!channels.length) {\n return;\n }\n\n this.handleChannelLeave(channels);\n\n if (this.socket && this.socketConnected) {\n this.sendRawMessage({\n type: MessageType.CHANNEL_LEAVE,\n data: channels,\n });\n }\n }\n\n private sendPingPong() {\n this.pingpongId += 1;\n this.pingpongId %= 100;\n const pingpongInfo = { id: this.pingpongId, sentTimestamp: Date.now() };\n this.pingpong.push(pingpongInfo);\n\n if (this.pingpong.length > pingpongMaxCount) {\n this.pingpong.shift();\n }\n\n this.sendRawMessage({\n type: MessageType.PING_PONG,\n data: pingpongInfo.id,\n });\n }\n\n private sendRawMessage(message: SocketMessage) {\n if (!this.socket || !this.socketConnected) {\n throw Errors.SYSTEM_ERROR(\"Socket not available\");\n }\n this.socket.send(message);\n this.logger.debug(\"Raw send\", message);\n }\n\n private handleChannelJoin(channels: string[]) {\n this.logger.debug(\"Joinning channels\", channels);\n for (const channel of channels) {\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n foundChannel.connected = true;\n\n //-- flush messages\n if (foundChannel.pendingMessages.length) {\n this.logger.debug(`Flushing ${foundChannel.pendingMessages.length} message`);\n for (const message of foundChannel.pendingMessages) {\n this.sendPlainMessageToChannel(message, foundChannel.channel);\n }\n foundChannel.pendingMessages = [];\n }\n }\n }\n\n private handleChannelLeave(channels: string[]) {\n this.logger.debug(\"Leaving channels\", channels);\n this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));\n }\n\n private handlePlainMessage(message: any, channel?: string) {\n for (const socket of this.allSockets) {\n socket.messageHandler && socket.messageHandler(message, channel);\n }\n }\n\n private handleConnect() {\n this.logger.debug(\"Socket connected\");\n\n //-- socket open, set interval\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.accumulatedPing = 0;\n this.pingIntervalId = setInterval(() => {\n this.accumulatedPing += 1;\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreshold || 3)) {\n //-- socket connection lost, not intended\n this.intendedDisconnection = false;\n this.socket?.close();\n } else {\n this.sendPingPong();\n }\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\n\n this.intendedDisconnection = false;\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n this.retryTimeoutId = undefined;\n }\n\n for (const socket of this.allSockets) {\n socket.reconnectionHandler && socket.reconnectionHandler();\n }\n\n //-- try join pending channels\n const pendingChannels = this.allChannels.filter((c) => !c.connected).map((c) => c.channel);\n this.joinChannels(pendingChannels);\n }\n\n private handleDisconnect(err?: any) {\n if (err) {\n this.intendedDisconnection = true;\n }\n\n this.logger.debug(\"Socket connnection closed, error: \", err);\n\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.socket = undefined;\n this.socketConnected = false;\n\n for (const socket of this.allSockets) {\n socket.disconnectionHandler && socket.disconnectionHandler(err);\n }\n\n if (this.intendedDisconnection) {\n //-- remove all channels\n this.allSockets = [];\n this.allChannels = [];\n this.logger.debug(\"Socket connection terminated\");\n } else {\n //-- disconnect all channels to be reconnected when the socket is connected again\n this.allChannels = this.allChannels.map((c) => ({ ...c, connected: false }));\n if (!this.retryTimeoutId) {\n this.retryDelay = 0;\n this.retry();\n }\n }\n }\n\n private handleMessage(message: SocketMessage) {\n this.logger.debug(\"Raw receive\", message);\n switch (message.type) {\n case MessageType.READY:\n this.handleConnect();\n break;\n case MessageType.PING_PONG:\n this.accumulatedPing = 0;\n const id = message.data;\n if (id) {\n const pong = this.pingpong.find((pp) => pp.id === id);\n if (pong) {\n pong.receivedTimestamp = Date.now();\n }\n }\n break;\n case MessageType.CHANNEL_JOIN:\n if (message.data?.error) {\n this.logger.error(\"Join channel error\", message.data.error);\n } else {\n this.handleChannelJoin(message.data);\n }\n break;\n case MessageType.CHANNEL_LEAVE:\n this.handleChannelLeave(message.data);\n break;\n case MessageType.PLAIN:\n this.handlePlainMessage(message.data.message, message.data.channel);\n break;\n }\n }\n\n create(): IClientSocket {\n const socket = new DefaultClientSocket(this);\n\n this.allSockets.push({ socket, registeredChannels: [] });\n\n if (this.allSockets.length === 1) {\n this.forceReconnect();\n }\n\n return socket;\n }\n\n forceDisconnect() {\n this.intendedDisconnection = true;\n if (this.socket) {\n this.socket.close();\n this.socket = undefined;\n }\n\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n }\n }\n\n forceReconnect(): void {\n this.intendedDisconnection = false;\n if (this.socketConnected) {\n this.socket?.close();\n } else {\n this.retryDelay = 0;\n if (this.socket === undefined) {\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n this.retryTimeoutId = undefined;\n }\n this.physicConnect();\n }\n }\n }\n\n private physicConnect() {\n this.wsProvider().then((socket) => {\n this.socket = socket;\n\n this.socket.onopen(() => {\n this.socketConnected = true;\n this.logger.debug(\"Physic link connected, sending & waiting for READY message\");\n this.sendRawMessage({\n type: MessageType.READY,\n data: \"\",\n });\n });\n\n this.socket.onmessage((data) => {\n const message: SocketMessage = JSON.parse(data);\n if (!message || !message.type) {\n this.logger.debug(\"Invalid mesasge structure\", data);\n return;\n }\n\n this.handleMessage(message);\n });\n\n this.socket.onclose((err) => {\n this.handleDisconnect(err);\n });\n });\n }\n\n private retry() {\n this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`);\n this.physicConnect();\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\n this.retryTimeoutId = setTimeout(() => {\n if (!this.socketConnected && !this.intendedDisconnection) {\n this.retry();\n }\n }, this.retryDelay);\n }\n}\n","export abstract class AbstractStorage {\n public abstract getItem<T>(key: string): Promise<T | undefined>;\n public abstract setItem<T>(key: string, value: T): Promise<void>;\n public abstract deleteItem(key: string): Promise<void>;\n}\n","import { ClaireApp } from \"@clairejs/core\";\n\nexport class ClaireClient extends ClaireApp {}\n","import { AbstractLogger, Injectable } from \"@clairejs/core\";\n\nexport type TranslationObject = Record<string, string>;\nexport type TranslationProvider = Promise<{ default: TranslationObject }>;\nexport type TranslationData = Record<string, string>;\n\nconst dataKeyRegex = /{([_a-zA-Z][a-zA-Z0-9_]*)}/g;\n\n@Injectable()\nexport class Translator {\n private translationProviders?: Record<string, TranslationProvider>;\n private translations: Record<string, TranslationObject | undefined> = {};\n private translationLoadings: Record<string, (() => void)[]> = {};\n\n constructor(readonly logger: AbstractLogger) {}\n\n setTranslations(translationProviders: Record<string, TranslationProvider>) {\n const langKeys = Object.keys(translationProviders);\n this.translationProviders = translationProviders;\n for (const lang of langKeys) {\n this.translations[lang] = null!;\n }\n }\n\n async awaitingTranslations(lang: string): Promise<void> {\n if (this.translations[lang] === null) {\n if (!this.translationLoadings[lang]) {\n //-- first request to load translation\n this.translationLoadings[lang] = [];\n\n if (!this.translationProviders || !this.translationProviders[lang]) {\n this.translations[lang] = undefined;\n } else {\n //-- get the translation\n try {\n const trans = await this.translationProviders[lang];\n this.translations[lang] = trans.default;\n } catch (err) {\n //-- error loading translation\n this.logger.error(\"Error loading translation\", err);\n this.translations[lang] = undefined;\n }\n }\n\n //-- resolve all pending promises\n for (const resolver of this.translationLoadings[lang] || []) {\n resolver();\n }\n\n this.translationLoadings[lang] = [];\n } else {\n let resolver = () => {};\n const promise = new Promise<void>((resolve) => (resolver = resolve));\n this.translationLoadings[lang].push(resolver);\n return promise;\n }\n } else {\n return Promise.resolve();\n }\n }\n\n translate(lang: string, template: string, data?: TranslationData) {\n //-- if provider not found for current lang then use default language\n if (!this.translationProviders || !this.translationProviders[lang]) {\n return this.translateText(template, data);\n }\n\n const translation = this.translations[lang];\n if (!translation || !translation[template]) {\n return this.translateText(template, data);\n }\n return this.translateText(translation[template], data);\n }\n\n protected translateText(template: string, data?: TranslationData) {\n let result = \"\";\n if (template) {\n const matchAll = template.matchAll(dataKeyRegex);\n\n let lastIndex = 0;\n for (const match of matchAll) {\n //-- remove brackets\n const key = match[1];\n\n result += template.slice(lastIndex, match.index);\n if (data && typeof data[key] === \"string\") {\n result += data[key];\n } else {\n result += match[0];\n }\n lastIndex = (match.index || 0) + match[0].length;\n }\n\n if (lastIndex < template.length) {\n result += template.slice(lastIndex);\n }\n }\n\n return result;\n }\n}\n","module.exports = require(\"@clairejs/core\");","module.exports = require(\"axios\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(341);\n"],"names":["AbstractHttpClient","issuedGetRequests","resetCache","pattern","regex","RegExp","Object","keys","this","filter","key","match","forEach","get","url","headers","options","shouldUseCache","result","doGet","AbstractTokenManager","stringifyQueries","queries","undefined","reduce","collector","encodeURIComponent","JSON","stringify","removeInstances","target","source","slice","instance","index","findIndex","i","id","splice","mergeInstances","model","syncTarget","some","newI","map","metadata","getObjectMetadata","push","assign","targetObj","sourceObject","fields","concat","uniqueReducer","field","fieldMeta","find","f","name","mergeByModel","hasMany","targetModel","getModelById","relationDto","single","Array","isArray","deepMerge","CrudApi","constructor","httpClient","dirty","getEndpointBaseUrl","toLowerCase","getMany","useCache","noCache","updateMany","body","put","deleteMany","delete","createMany","post","DefaultHttpClient","apiServerUrl","logger","maxRetryCount","delayMsBetweenRetry","storage","super","api","create","interceptors","request","use","config","method","cacheKey","cachedData","getItem","Date","now","expiration","data","deleteItem","response","maxAgeMatch","toString","maxAge","parseInt","dataToCache","setItem","resolveUrl","getAuthorization","errorHandler","operation","err","retry","apiCall","retryCount","status","message","debug","Promise","resolve","setTimeout","performRequest","finalUrl","authHeader","noAuthorization","authorization","withCredentials","noErrorHandling","Errors","HTTP_REQUEST_ERROR","DefaultTokenManager","storageKey","accessToken","getAccessToken","setAccessToken","token","Injectable","AbstractStorage","tokenExpiredError","TOKEN_EXPIRED","invalidTokenError","INVALID_TOKEN","RefreshHttpClient","tokenManager","refreshing","refreshQueue","getRefreshedAccessToken","reauthenticate","INVALID_CREDENTIALS","refreshToken","oldToken","resolver","newToken","refresh","errorName","catch","SESSION_EXPIRED","then","AbstractErrorHandler","AbstractViewMiddleware","AbstractClientSocketManager","DefaultClientSocket","socketManager","joinChannels","channels","subChannels","leaveChannels","unsubChannels","close","removeSocket","onReconnect","handler","registerReconnectionHandler","onDisconnect","registerDisconnectionHandler","onMessage","registerMessageHandler","send","channel","sendPlainMessageToChannel","DefaultClientSocketManager","wsProvider","allSockets","allChannels","accumulatedPing","retryDelay","pingpongId","pingpong","getPingMs","candidates","pp","sentTimestamp","receivedTimestamp","length","total","diff","socket","info","s","unconnectedChannels","registeredChannels","includes","foundChannel","c","connected","removedChannels","socketInfo","disconnectionHandler","forceDisconnect","reconnectionHandler","messageHandler","pendingMessages","sendRawMessage","type","MessageType","PLAIN","socketConnected","CHANNEL_JOIN","handleChannelLeave","CHANNEL_LEAVE","sendPingPong","pingpongInfo","shift","PING_PONG","SYSTEM_ERROR","handleChannelJoin","handlePlainMessage","handleConnect","pingIntervalId","clearInterval","setInterval","keepAlive","deadThreshold","intendedDisconnection","pingIntervalMs","retryTimeoutId","clearTimeout","pendingChannels","handleDisconnect","handleMessage","READY","pong","error","forceReconnect","physicConnect","onopen","onmessage","parse","onclose","reconnectTimeDeltaMs","ClaireClient","ClaireApp","dataKeyRegex","Translator","translations","translationLoadings","setTranslations","translationProviders","langKeys","lang","awaitingTranslations","promise","trans","default","translate","template","translateText","translation","matchAll","lastIndex","AbstractLogger","module","exports","require","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://@clairejs/client/./src/api/AbstractHttpClient.ts","webpack://@clairejs/client/./src/api/AbstractTokenManager.ts","webpack://@clairejs/client/./src/api/CrudApi.ts","webpack://@clairejs/client/./src/api/DefaultHttpClient.ts","webpack://@clairejs/client/./src/api/DefaultTokenManager.ts","webpack://@clairejs/client/./src/api/RefreshHttpClient.ts","webpack://@clairejs/client/./src/index.ts","webpack://@clairejs/client/./src/routing/AbstractErrorHandler.ts","webpack://@clairejs/client/./src/routing/AbstractViewMiddleware.ts","webpack://@clairejs/client/./src/socket/AbstractClientSocketManager.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocket.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocketManager.ts","webpack://@clairejs/client/./src/system/AbstractStorage.ts","webpack://@clairejs/client/./src/system/ClaireClient.ts","webpack://@clairejs/client/./src/translation/Translator.ts","webpack://@clairejs/client/external commonjs \"@clairejs/core\"","webpack://@clairejs/client/external commonjs \"axios\"","webpack://@clairejs/client/webpack/bootstrap","webpack://@clairejs/client/webpack/startup"],"sourcesContent":["export interface RequestOptions {\n noAuthorization?: boolean;\n withCredentials?: boolean;\n noErrorHandling?: boolean;\n}\n\nexport abstract class AbstractHttpClient {\n protected issuedGetRequests: Record<string, boolean> = {};\n\n /*\n Keep track off all get request had been sent and allow decache (using regex pattern) those requests\n so next request will not get from cache\n */\n resetCache(pattern: string) {\n const regex = new RegExp(pattern);\n Object.keys(this.issuedGetRequests)\n .filter((key) => key.match(regex))\n .forEach((key) => (this.issuedGetRequests[key] = false));\n }\n\n protected abstract doGet<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined>;\n\n //-- normally T will be returned or error will throw, but in case undefined is returned, that is because error handler\n //-- has intercepted and decided to return nothing\n async get<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined> {\n const shouldUseCache = this.issuedGetRequests[url];\n\n const result = await this.doGet(\n url,\n { ...headers, ...(shouldUseCache ? {} : { \"cache-control\": \"no-cache\" }) },\n options,\n );\n this.issuedGetRequests[url] = true;\n\n return result;\n }\n abstract post<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined>;\n abstract put<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined>;\n abstract delete<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined>;\n}\n","import { AccessToken } from \"@clairejs/core\";\n\nexport abstract class AbstractTokenManager {\n abstract getAccessToken(): Promise<AccessToken | undefined>;\n abstract setAccessToken(token?: AccessToken): Promise<void>;\n}\n","import {\n AbstractModel,\n Constructor,\n CreateManyRequestBody,\n CreateManyResponseBody,\n deepMerge,\n DeepPartial,\n GetManyQueries,\n GetManyResponseBody,\n getModelById,\n getObjectMetadata,\n Identifiable,\n ModelMetadata,\n uniqueReducer,\n UpdateManyBody,\n UpdateManyQueries,\n UpdateManyResponse,\n} from \"@clairejs/core\";\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\n\nexport const stringifyQueries = (queries: Record<string, any>) => {\n const keys = Object.keys(queries).filter((key) => queries[key] !== undefined);\n return keys.reduce(\n (collector, key) =>\n collector + `&${encodeURIComponent(key)}=${encodeURIComponent(JSON.stringify(queries[key]))}`,\n \"\",\n );\n};\n\nexport const removeInstances = <T extends Identifiable>(target: T[], source: T[]) => {\n const result = target.slice();\n for (const instance of source) {\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\n if (index >= 0) {\n result.splice(index, 1);\n }\n }\n return result;\n};\n\nexport const mergeInstances = <T extends Identifiable>(\n model: Constructor<T>,\n target: readonly T[],\n source: readonly DeepPartial<T>[] | undefined,\n syncTarget?: boolean,\n) => {\n const result = (\n syncTarget ? target.filter((i) => (source || []).some((newI) => i.id && newI.id && i.id === newI.id)) : target\n ).map((i) => ({ ...i }));\n\n const metadata = getObjectMetadata<ModelMetadata>(model);\n\n for (const instance of source || []) {\n const index = result.findIndex((i) => i.id && instance.id && i.id === instance.id);\n if (index < 0) {\n result.push(Object.assign(new model(), instance));\n } else {\n const targetObj = result[index] as any;\n const sourceObject = instance as any;\n\n const fields = Object.keys(targetObj)\n .concat(Object.keys(instance))\n .reduce(uniqueReducer, [] as string[]);\n\n for (const field of fields) {\n //-- check if we are merging hasMany field\n const fieldMeta = metadata?.fields.find((f) => f.name === field);\n let mergeByModel = false;\n if (fieldMeta?.hasMany) {\n const targetModel = getModelById(fieldMeta.hasMany.relationDto.id);\n if (targetModel) {\n mergeByModel = true;\n if (targetObj[field] === null || targetObj[field] === undefined) {\n if (sourceObject[field] !== undefined) {\n targetObj[field] = sourceObject[field];\n }\n } else {\n if (fieldMeta.hasMany.single) {\n targetObj[field] = mergeInstances(\n targetModel,\n [targetObj[field]],\n [sourceObject[field]],\n true,\n );\n } else {\n targetObj[field] = mergeInstances(\n targetModel,\n targetObj[field],\n sourceObject[field],\n true,\n );\n }\n }\n }\n }\n\n if (!mergeByModel) {\n if (\n typeof targetObj[field] === \"object\" &&\n !Array.isArray(targetObj[field]) &&\n targetObj[field] !== null\n ) {\n //-- call deep merge to merge object\n deepMerge(targetObj[field], sourceObject[field]);\n } else {\n //-- direct assign\n if (sourceObject[field] !== undefined) {\n targetObj[field] = sourceObject[field];\n }\n }\n }\n }\n }\n }\n\n return result;\n};\n\nexport class CrudApi<T extends AbstractModel> {\n private dirty = true;\n\n constructor(readonly model: Constructor<T>, readonly httpClient: AbstractHttpClient) {}\n\n protected getEndpointBaseUrl() {\n return `/${this.model.name.toLowerCase()}`;\n }\n\n async getMany(queries?: GetManyQueries<T>, useCache = true): Promise<GetManyResponseBody<T> | undefined> {\n const noCache = !useCache || this.dirty;\n const result = await this.httpClient.get(\n `${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`,\n noCache\n ? {\n \"cache-control\": \"no-cache\",\n }\n : undefined,\n );\n this.dirty = false;\n return result;\n }\n\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T> | undefined> {\n this.dirty = true;\n return await this.httpClient.put(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`, body);\n }\n\n async deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T> | undefined> {\n this.dirty = true;\n return await this.httpClient.delete(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\n }\n\n async createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T> | undefined> {\n this.dirty = true;\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\n }\n}\n","import axios, { Method } from \"axios\";\nimport { AbstractLogger, Errors } from \"@clairejs/core\";\n\nimport { AbstractHttpClient, RequestOptions } from \"./AbstractHttpClient\";\nimport { AbstractStorage } from \"../system/AbstractStorage\";\n\nexport interface RequestData {\n method: Method;\n url: string;\n body?: any;\n headers?: object;\n options?: RequestOptions;\n}\n\ninterface CacheData {\n data: any;\n expiration: number;\n}\n\nexport class DefaultHttpClient extends AbstractHttpClient {\n private readonly api = axios.create();\n\n constructor(\n protected readonly apiServerUrl: string,\n protected readonly logger: AbstractLogger,\n protected readonly maxRetryCount = 2,\n protected readonly delayMsBetweenRetry = 200,\n protected readonly storage?: AbstractStorage,\n ) {\n super();\n\n if (this.storage) {\n //-- setup axios cache\n this.api.interceptors.request.use(async (config) => {\n if (config.method === \"get\") {\n const cacheKey = config.url || \"\";\n const cachedData = await this.storage!.getItem<CacheData>(cacheKey);\n if (cachedData) {\n if (Date.now() < cachedData.expiration) {\n return cachedData.data;\n } else {\n await this.storage!.deleteItem(cacheKey);\n }\n }\n }\n return config;\n });\n\n // add a response interceptor to cache response data\n this.api.interceptors.response.use(async (response) => {\n if (response.config.method === \"get\") {\n const cacheKey = response.config.url || \"\";\n const maxAgeMatch = response.headers[\"Cache-Control\"]?.toString()?.match(/max-age=(\\d+)/);\n const maxAge = maxAgeMatch ? parseInt(maxAgeMatch[1]) : 0;\n\n if (maxAge) {\n const dataToCache: CacheData = {\n data: response.data,\n expiration: Date.now() + maxAge * 1000,\n };\n await this.storage!.setItem(cacheKey, dataToCache);\n }\n }\n return response;\n });\n }\n }\n\n protected async resolveUrl(url: string): Promise<string> {\n return this.apiServerUrl + url;\n }\n\n protected async getAuthorization(): Promise<string> {\n return \"\";\n }\n\n protected async errorHandler<T = any>(operation: () => Promise<T>, err: any): Promise<T | undefined> {\n throw err;\n }\n\n protected async retry<T = any>(apiCall: () => Promise<T>, retryCount: number = 0): Promise<T | undefined> {\n try {\n return await apiCall();\n } catch (err: any) {\n //-- if error is 503 or has empty body then retry\n if (\n (!err.response ||\n err.response.status === 503 ||\n err.response.data?.message === \"Service Unavailable\") &&\n retryCount < this.maxRetryCount\n ) {\n this.logger.debug(\n `unknown error encountered, retrying request ${retryCount + 1}/${this.maxRetryCount} after ${\n this.delayMsBetweenRetry\n }ms`,\n );\n await new Promise<void>((resolve) => setTimeout(resolve, this.delayMsBetweenRetry));\n\n return await this.retry(apiCall, retryCount + 1);\n }\n\n throw err;\n }\n }\n\n protected async performRequest<T = any>(data: RequestData): Promise<T | undefined> {\n const finalUrl = await this.resolveUrl(data.url);\n\n const operation = async () => {\n const authHeader = !data.options?.noAuthorization ? { authorization: await this.getAuthorization() } : {};\n\n const result = await this.api({\n method: data.method,\n url: finalUrl,\n data: data.body,\n headers: {\n ...data.headers,\n ...authHeader,\n },\n withCredentials: data.options?.withCredentials,\n });\n\n return result.data as T;\n };\n\n try {\n return await this.retry(operation);\n } catch (err: any) {\n if (data.options?.noErrorHandling) {\n throw err;\n }\n\n return await this.errorHandler(operation, err.response?.data || Errors.HTTP_REQUEST_ERROR());\n }\n }\n\n protected async doGet<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined> {\n return await this.performRequest({ method: \"GET\", url, headers, options });\n }\n\n async post<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined> {\n return await this.performRequest({\n method: \"POST\",\n url,\n headers,\n options,\n body,\n });\n }\n\n async put<T = any, R = any>(\n url: string,\n body: R,\n headers?: object,\n options?: RequestOptions,\n ): Promise<T | undefined> {\n return await this.performRequest({\n method: \"PUT\",\n url,\n headers,\n options,\n body,\n });\n }\n\n async delete<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined> {\n return await this.performRequest({\n method: \"DELETE\",\n url,\n headers,\n options,\n });\n }\n}\n","import { Injectable, AccessToken } from \"@clairejs/core\";\n\nimport { AbstractStorage } from \"../system/AbstractStorage\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\n\n@Injectable()\nexport class DefaultTokenManager extends AbstractTokenManager {\n private accessToken?: AccessToken = null!;\n\n constructor(protected readonly storage: AbstractStorage, protected readonly storageKey: string = \"ACCESS_TOKEN\") {\n super();\n }\n\n async getAccessToken(): Promise<AccessToken | undefined> {\n if (this.accessToken === null) {\n this.accessToken = await this.storage.getItem(this.storageKey);\n }\n return this.accessToken;\n }\n\n async setAccessToken(token?: AccessToken): Promise<void> {\n if (token) {\n await this.storage.setItem(this.storageKey, token);\n } else {\n await this.storage.deleteItem(this.storageKey);\n }\n this.accessToken = token;\n }\n}\n","import { AbstractLogger, AccessToken, Errors } from \"@clairejs/core\";\n\nimport { AbstractStorage } from \"../system/AbstractStorage\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\n\nconst tokenExpiredError = Errors.TOKEN_EXPIRED().name;\nconst invalidTokenError = Errors.INVALID_TOKEN().name;\n\nexport class RefreshHttpClient extends DefaultHttpClient {\n private refreshing = false;\n\n private refreshQueue: (() => void)[] = [];\n\n private tokenQueue: ((token: string) => void)[] = [];\n\n constructor(\n protected readonly apiServerUrl: string,\n protected readonly logger: AbstractLogger,\n protected readonly tokenManager: AbstractTokenManager,\n protected readonly maxRetryCount = 2,\n protected readonly delayMsBetweenRetry = 200,\n protected readonly storage?: AbstractStorage,\n ) {\n super(apiServerUrl, logger, maxRetryCount, delayMsBetweenRetry, storage);\n }\n\n protected async getRefreshedAccessToken(): Promise<AccessToken> {\n throw Errors.INVALID_TOKEN();\n }\n\n protected async reauthenticate(): Promise<void> {\n throw Errors.INVALID_CREDENTIALS();\n }\n\n protected async getAuthorization() {\n if (this.refreshing) {\n const promise = new Promise<string>((resolver) => {\n this.tokenQueue.push(resolver);\n });\n return promise;\n } else {\n const accessToken = await this.tokenManager.getAccessToken();\n return accessToken?.token || \"\";\n }\n }\n\n protected async refreshToken(token?: AccessToken): Promise<void> {\n if (this.refreshing) {\n this.logger.debug(\"Awaiting refresh token, queued\");\n return await new Promise<void>((resolver) => {\n this.refreshQueue.push(resolver);\n });\n }\n\n token = token || (await this.tokenManager.getAccessToken());\n //-- call to api server to refresh token\n if (!token || !token.refreshToken) {\n //-- there is no refresh token to refresh\n return await this.reauthenticate();\n }\n\n try {\n this.refreshing = true;\n token = await this.getRefreshedAccessToken();\n await this.tokenManager.setAccessToken(token);\n this.logger.debug(\"Access token was refreshed\");\n } finally {\n this.refreshing = false;\n\n for (const resolver of this.refreshQueue) {\n resolver();\n }\n\n for (const resolver of this.tokenQueue) {\n resolver(token.token);\n }\n\n //-- clear queue\n this.refreshQueue = [];\n this.tokenQueue = [];\n }\n }\n\n protected async errorHandler<T = any>(operation: () => Promise<T>, err: any): Promise<T | undefined> {\n const errorName = err.name;\n\n if (errorName === tokenExpiredError) {\n return await this.refreshToken()\n .catch(() => this.reauthenticate())\n .catch(() => {\n throw Errors.SESSION_EXPIRED();\n })\n .then(() => operation())\n .catch((err) => {\n throw err.response?.data || Errors.HTTP_REQUEST_ERROR();\n });\n } else if (errorName === invalidTokenError) {\n return await this.reauthenticate()\n .catch(() => {\n throw Errors.SESSION_EXPIRED();\n })\n .then(() => operation())\n .catch((err) => {\n throw err.response?.data || Errors.HTTP_REQUEST_ERROR();\n });\n }\n\n throw err;\n }\n}\n","export * from \"./system/ClaireClient\";\nexport * from \"./api/RefreshHttpClient\";\nexport * from \"./api/DefaultHttpClient\";\nexport * from \"./api/AbstractHttpClient\";\nexport * from \"./socket/AbstractClientSocketManager\";\nexport * from \"./socket/DefaultClientSocketManager\";\nexport * from \"./system/AbstractStorage\";\nexport * from \"./translation/Translator\";\nexport * from \"./routing/AbstractErrorHandler\";\nexport * from \"./routing/AbstractViewMiddleware\";\nexport * from \"./routing/UrlInfo\";\nexport * from \"./routing/RouterConfig\";\nexport * from \"./routing/ComponentInfo\";\nexport * from \"./api/AbstractTokenManager\";\nexport * from \"./socket/IWebSocket\";\nexport * from \"./api/DefaultTokenManager\";\nexport * from \"./api/CrudApi\";\n","export abstract class AbstractErrorHandler {\n public abstract handle(err: any, component?: any): void;\n}\n","import { UrlInfo } from \"./UrlInfo\";\nexport abstract class AbstractViewMiddleware {\n public abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;\n}\n","import { IClientSocket } from \"@clairejs/core\";\n\nexport abstract class AbstractClientSocketManager {\n abstract create(): IClientSocket;\n abstract joinChannels(channels: string[]): void;\n abstract leaveChannels(channels: string[]): void;\n abstract getPingMs(): number;\n}\n","import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from \"@clairejs/core\";\nimport { DefaultClientSocketManager } from \"./DefaultClientSocketManager\";\n\nexport class DefaultClientSocket implements IClientSocket {\n constructor(readonly socketManager: DefaultClientSocketManager) {}\n\n joinChannels(channels: string[]): void {\n this.socketManager.subChannels(this, channels);\n }\n\n leaveChannels(channels: string[]): void {\n this.socketManager.unsubChannels(this, channels);\n }\n\n close(): void {\n this.socketManager.removeSocket(this);\n }\n\n onReconnect(handler: ReconnectionHandler): void {\n this.socketManager.registerReconnectionHandler(this, handler);\n }\n\n onDisconnect(handler: DisconnectionHandler): void {\n this.socketManager.registerDisconnectionHandler(this, handler);\n }\n\n onMessage(handler: PlainMessageHandler): void {\n this.socketManager.registerMessageHandler(this, handler);\n }\n\n send(message: any, channel?: string): void {\n this.socketManager.sendPlainMessageToChannel(message, channel);\n }\n}\n","import {\n AbstractLogger,\n Errors,\n MessageType,\n SocketMessage,\n DisconnectionHandler,\n IClientSocket,\n PlainMessageHandler,\n ReconnectionHandler,\n} from \"@clairejs/core\";\n\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\nimport { SocketConfig } from \"./SocketConfig\";\nimport { DefaultClientSocket } from \"./DefaultClientSocket\";\nimport { IWebSocket } from \"./IWebSocket\";\n\nconst pingpongMaxCount = 10;\n\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\n private socket?: IWebSocket;\n\n private allSockets: {\n socket: DefaultClientSocket;\n registeredChannels: string[];\n reconnectionHandler?: ReconnectionHandler;\n disconnectionHandler?: DisconnectionHandler;\n messageHandler?: PlainMessageHandler;\n }[] = [];\n\n private allChannels: { channel: string; connected: boolean; pendingMessages: any[] }[] = [];\n\n private socketConnected?: boolean;\n private pingIntervalId?: any;\n private retryTimeoutId?: any;\n private accumulatedPing = 0;\n private retryDelay = 0;\n private intendedDisconnection?: boolean;\n private pingpongId = 0;\n\n public pingpong: { id: number; sentTimestamp: number; receivedTimestamp?: number }[] = [];\n\n constructor(\n private readonly wsProvider: () => Promise<IWebSocket>,\n private readonly logger: AbstractLogger,\n private readonly config?: SocketConfig,\n ) {\n super();\n }\n\n getPingMs(): number {\n const candidates = this.pingpong.filter((pp) => pp.sentTimestamp && pp.receivedTimestamp);\n if (!candidates.length) {\n return 0;\n }\n return (\n candidates.map((pp) => pp.receivedTimestamp! - pp.sentTimestamp).reduce((total, diff) => total + diff, 0) /\n candidates.length\n );\n }\n\n subChannels(socket: IClientSocket, channels: string[]) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (!info) {\n this.logger.debug(\"Socket not found\");\n return;\n }\n\n //-- un-connected channels\n const unconnectedChannels: string[] = [];\n for (const channel of channels) {\n if (!info.registeredChannels.includes(channel)) {\n info.registeredChannels.push(channel);\n }\n const foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel || !foundChannel.connected) {\n unconnectedChannels.push(channel);\n }\n }\n\n this.joinChannels(unconnectedChannels);\n }\n\n unsubChannels(socket: IClientSocket, channels: string[]) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (!info) {\n this.logger.debug(\"Socket not found\");\n return;\n }\n\n info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));\n\n //-- check if no one is subscribing these channel then remove\n const removedChannels: string[] = [];\n for (const channel of channels) {\n //-- no one is listening\n if (!this.allSockets.find((socket) => socket.registeredChannels.includes(channel))) {\n removedChannels.push(channel);\n }\n }\n\n this.leaveChannels(removedChannels);\n }\n\n removeSocket(socket: DefaultClientSocket) {\n const socketInfo = this.allSockets.find((s) => s.socket === socket);\n if (socketInfo && socketInfo.disconnectionHandler) {\n socketInfo.disconnectionHandler();\n }\n\n this.allSockets = this.allSockets.filter((s) => s.socket !== socket);\n if (!this.allSockets.length) {\n this.forceDisconnect();\n }\n }\n\n registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.reconnectionHandler = handler;\n }\n }\n\n registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.disconnectionHandler = handler;\n }\n }\n\n registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.messageHandler = handler;\n }\n }\n\n sendPlainMessageToChannel(message: any, channel?: string) {\n if (channel) {\n //-- check if channel has been connected\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n if (foundChannel.connected) {\n //-- send\n this.sendRawMessage({\n type: MessageType.PLAIN,\n data: { channel, message },\n });\n } else {\n foundChannel.pendingMessages.push(message);\n }\n } else {\n this.sendRawMessage({\n type: MessageType.PLAIN,\n data: {\n message,\n },\n });\n }\n }\n\n joinChannels(channels: string[]) {\n if (!channels.length) {\n return;\n }\n\n if (!this.socket || !this.socketConnected) {\n //-- create pending channels\n for (const channel of channels) {\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n\n ///-- this channel is already connected, skip\n if (foundChannel.connected) {\n continue;\n }\n }\n } else {\n this.sendRawMessage({\n type: MessageType.CHANNEL_JOIN,\n data: channels,\n });\n }\n }\n\n leaveChannels(channels: string[]) {\n if (!channels.length) {\n return;\n }\n\n this.handleChannelLeave(channels);\n\n if (this.socket && this.socketConnected) {\n this.sendRawMessage({\n type: MessageType.CHANNEL_LEAVE,\n data: channels,\n });\n }\n }\n\n private sendPingPong() {\n this.pingpongId += 1;\n this.pingpongId %= 100;\n const pingpongInfo = { id: this.pingpongId, sentTimestamp: Date.now() };\n this.pingpong.push(pingpongInfo);\n\n if (this.pingpong.length > pingpongMaxCount) {\n this.pingpong.shift();\n }\n\n this.sendRawMessage({\n type: MessageType.PING_PONG,\n data: pingpongInfo.id,\n });\n }\n\n private sendRawMessage(message: SocketMessage) {\n if (!this.socket || !this.socketConnected) {\n throw Errors.SYSTEM_ERROR(\"Socket not available\");\n }\n this.socket.send(message);\n this.logger.debug(\"Raw send\", message);\n }\n\n private handleChannelJoin(channels: string[]) {\n this.logger.debug(\"Joinning channels\", channels);\n for (const channel of channels) {\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n foundChannel.connected = true;\n\n //-- flush messages\n if (foundChannel.pendingMessages.length) {\n this.logger.debug(`Flushing ${foundChannel.pendingMessages.length} message`);\n for (const message of foundChannel.pendingMessages) {\n this.sendPlainMessageToChannel(message, foundChannel.channel);\n }\n foundChannel.pendingMessages = [];\n }\n }\n }\n\n private handleChannelLeave(channels: string[]) {\n this.logger.debug(\"Leaving channels\", channels);\n this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));\n }\n\n private handlePlainMessage(message: any, channel?: string) {\n for (const socket of this.allSockets) {\n socket.messageHandler && socket.messageHandler(message, channel);\n }\n }\n\n private handleConnect() {\n this.logger.debug(\"Socket connected\");\n\n //-- socket open, set interval\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.accumulatedPing = 0;\n this.pingIntervalId = setInterval(() => {\n this.accumulatedPing += 1;\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreshold || 3)) {\n //-- socket connection lost, not intended\n this.intendedDisconnection = false;\n this.socket?.close();\n } else {\n this.sendPingPong();\n }\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\n\n this.intendedDisconnection = false;\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n this.retryTimeoutId = undefined;\n }\n\n for (const socket of this.allSockets) {\n socket.reconnectionHandler && socket.reconnectionHandler();\n }\n\n //-- try join pending channels\n const pendingChannels = this.allChannels.filter((c) => !c.connected).map((c) => c.channel);\n this.joinChannels(pendingChannels);\n }\n\n private handleDisconnect(err?: any) {\n if (err) {\n this.intendedDisconnection = true;\n }\n\n this.logger.debug(\"Socket connnection closed, error: \", err);\n\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.socket = undefined;\n this.socketConnected = false;\n\n for (const socket of this.allSockets) {\n socket.disconnectionHandler && socket.disconnectionHandler(err);\n }\n\n if (this.intendedDisconnection) {\n //-- remove all channels\n this.allSockets = [];\n this.allChannels = [];\n this.logger.debug(\"Socket connection terminated\");\n } else {\n //-- disconnect all channels to be reconnected when the socket is connected again\n this.allChannels = this.allChannels.map((c) => ({ ...c, connected: false }));\n if (!this.retryTimeoutId) {\n this.retryDelay = 0;\n this.retry();\n }\n }\n }\n\n private handleMessage(message: SocketMessage) {\n this.logger.debug(\"Raw receive\", message);\n switch (message.type) {\n case MessageType.READY:\n this.handleConnect();\n break;\n case MessageType.PING_PONG:\n this.accumulatedPing = 0;\n const id = message.data;\n if (id) {\n const pong = this.pingpong.find((pp) => pp.id === id);\n if (pong) {\n pong.receivedTimestamp = Date.now();\n }\n }\n break;\n case MessageType.CHANNEL_JOIN:\n if (message.data?.error) {\n this.logger.error(\"Join channel error\", message.data.error);\n } else {\n this.handleChannelJoin(message.data);\n }\n break;\n case MessageType.CHANNEL_LEAVE:\n this.handleChannelLeave(message.data);\n break;\n case MessageType.PLAIN:\n this.handlePlainMessage(message.data.message, message.data.channel);\n break;\n }\n }\n\n create(): IClientSocket {\n const socket = new DefaultClientSocket(this);\n\n this.allSockets.push({ socket, registeredChannels: [] });\n\n if (this.allSockets.length === 1) {\n this.forceReconnect();\n }\n\n return socket;\n }\n\n forceDisconnect() {\n this.intendedDisconnection = true;\n if (this.socket) {\n this.socket.close();\n this.socket = undefined;\n }\n\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n }\n }\n\n forceReconnect(): void {\n this.intendedDisconnection = false;\n if (this.socketConnected) {\n this.socket?.close();\n } else {\n this.retryDelay = 0;\n if (this.socket === undefined) {\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n this.retryTimeoutId = undefined;\n }\n this.physicConnect();\n }\n }\n }\n\n private physicConnect() {\n this.wsProvider().then((socket) => {\n this.socket = socket;\n\n this.socket.onopen(() => {\n this.socketConnected = true;\n this.logger.debug(\"Physic link connected, sending & waiting for READY message\");\n this.sendRawMessage({\n type: MessageType.READY,\n data: \"\",\n });\n });\n\n this.socket.onmessage((data) => {\n const message: SocketMessage = JSON.parse(data);\n if (!message || !message.type) {\n this.logger.debug(\"Invalid mesasge structure\", data);\n return;\n }\n\n this.handleMessage(message);\n });\n\n this.socket.onclose((err) => {\n this.handleDisconnect(err);\n });\n });\n }\n\n private retry() {\n this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`);\n this.physicConnect();\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\n this.retryTimeoutId = setTimeout(() => {\n if (!this.socketConnected && !this.intendedDisconnection) {\n this.retry();\n }\n }, this.retryDelay);\n }\n}\n","export abstract class AbstractStorage {\n public abstract getItem<T>(key: string): Promise<T | undefined>;\n public abstract setItem<T>(key: string, value: T): Promise<void>;\n public abstract deleteItem(key: string): Promise<void>;\n}\n","import { ClaireApp } from \"@clairejs/core\";\n\nexport class ClaireClient extends ClaireApp {}\n","import { AbstractLogger, Injectable } from \"@clairejs/core\";\n\nexport type TranslationObject = Record<string, string>;\nexport type TranslationProvider = Promise<{ default: TranslationObject }>;\nexport type TranslationData = Record<string, string>;\n\nconst dataKeyRegex = /{([_a-zA-Z][a-zA-Z0-9_]*)}/g;\n\n@Injectable()\nexport class Translator {\n private translationProviders?: Record<string, TranslationProvider>;\n private translations: Record<string, TranslationObject | undefined> = {};\n private translationLoadings: Record<string, (() => void)[]> = {};\n\n constructor(readonly logger: AbstractLogger) {}\n\n setTranslations(translationProviders: Record<string, TranslationProvider>) {\n const langKeys = Object.keys(translationProviders);\n this.translationProviders = translationProviders;\n for (const lang of langKeys) {\n this.translations[lang] = null!;\n }\n }\n\n async awaitingTranslations(lang: string): Promise<void> {\n if (this.translations[lang] === null) {\n if (!this.translationLoadings[lang]) {\n //-- first request to load translation\n this.translationLoadings[lang] = [];\n\n if (!this.translationProviders || !this.translationProviders[lang]) {\n this.translations[lang] = undefined;\n } else {\n //-- get the translation\n try {\n const trans = await this.translationProviders[lang];\n this.translations[lang] = trans.default;\n } catch (err) {\n //-- error loading translation\n this.logger.error(\"Error loading translation\", err);\n this.translations[lang] = undefined;\n }\n }\n\n //-- resolve all pending promises\n for (const resolver of this.translationLoadings[lang] || []) {\n resolver();\n }\n\n this.translationLoadings[lang] = [];\n } else {\n let resolver = () => {};\n const promise = new Promise<void>((resolve) => (resolver = resolve));\n this.translationLoadings[lang].push(resolver);\n return promise;\n }\n } else {\n return Promise.resolve();\n }\n }\n\n translate(lang: string, template: string, data?: TranslationData) {\n //-- if provider not found for current lang then use default language\n if (!this.translationProviders || !this.translationProviders[lang]) {\n return this.translateText(template, data);\n }\n\n const translation = this.translations[lang];\n if (!translation || !translation[template]) {\n return this.translateText(template, data);\n }\n return this.translateText(translation[template], data);\n }\n\n protected translateText(template: string, data?: TranslationData) {\n let result = \"\";\n if (template) {\n const matchAll = template.matchAll(dataKeyRegex);\n\n let lastIndex = 0;\n for (const match of matchAll) {\n //-- remove brackets\n const key = match[1];\n\n result += template.slice(lastIndex, match.index);\n if (data && typeof data[key] === \"string\") {\n result += data[key];\n } else {\n result += match[0];\n }\n lastIndex = (match.index || 0) + match[0].length;\n }\n\n if (lastIndex < template.length) {\n result += template.slice(lastIndex);\n }\n }\n\n return result;\n }\n}\n","module.exports = require(\"@clairejs/core\");","module.exports = require(\"axios\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(341);\n"],"names":["AbstractHttpClient","issuedGetRequests","resetCache","pattern","regex","RegExp","Object","keys","this","filter","key","match","forEach","get","url","headers","options","shouldUseCache","result","doGet","AbstractTokenManager","stringifyQueries","queries","undefined","reduce","collector","encodeURIComponent","JSON","stringify","removeInstances","target","source","slice","instance","index","findIndex","i","id","splice","mergeInstances","model","syncTarget","some","newI","map","metadata","getObjectMetadata","push","assign","targetObj","sourceObject","fields","concat","uniqueReducer","field","fieldMeta","find","f","name","mergeByModel","hasMany","targetModel","getModelById","relationDto","single","Array","isArray","deepMerge","CrudApi","constructor","httpClient","dirty","getEndpointBaseUrl","toLowerCase","getMany","useCache","noCache","updateMany","body","put","deleteMany","delete","createMany","post","DefaultHttpClient","apiServerUrl","logger","maxRetryCount","delayMsBetweenRetry","storage","super","api","create","interceptors","request","use","config","method","cacheKey","cachedData","getItem","Date","now","expiration","data","deleteItem","response","maxAgeMatch","toString","maxAge","parseInt","dataToCache","setItem","resolveUrl","getAuthorization","errorHandler","operation","err","retry","apiCall","retryCount","status","message","debug","Promise","resolve","setTimeout","performRequest","finalUrl","authHeader","noAuthorization","authorization","withCredentials","noErrorHandling","Errors","HTTP_REQUEST_ERROR","DefaultTokenManager","storageKey","accessToken","getAccessToken","setAccessToken","token","Injectable","AbstractStorage","tokenExpiredError","TOKEN_EXPIRED","invalidTokenError","INVALID_TOKEN","RefreshHttpClient","tokenManager","refreshing","refreshQueue","tokenQueue","getRefreshedAccessToken","reauthenticate","INVALID_CREDENTIALS","resolver","refreshToken","errorName","catch","SESSION_EXPIRED","then","AbstractErrorHandler","AbstractViewMiddleware","AbstractClientSocketManager","DefaultClientSocket","socketManager","joinChannels","channels","subChannels","leaveChannels","unsubChannels","close","removeSocket","onReconnect","handler","registerReconnectionHandler","onDisconnect","registerDisconnectionHandler","onMessage","registerMessageHandler","send","channel","sendPlainMessageToChannel","DefaultClientSocketManager","wsProvider","allSockets","allChannels","accumulatedPing","retryDelay","pingpongId","pingpong","getPingMs","candidates","pp","sentTimestamp","receivedTimestamp","length","total","diff","socket","info","s","unconnectedChannels","registeredChannels","includes","foundChannel","c","connected","removedChannels","socketInfo","disconnectionHandler","forceDisconnect","reconnectionHandler","messageHandler","pendingMessages","sendRawMessage","type","MessageType","PLAIN","socketConnected","CHANNEL_JOIN","handleChannelLeave","CHANNEL_LEAVE","sendPingPong","pingpongInfo","shift","PING_PONG","SYSTEM_ERROR","handleChannelJoin","handlePlainMessage","handleConnect","pingIntervalId","clearInterval","setInterval","keepAlive","deadThreshold","intendedDisconnection","pingIntervalMs","retryTimeoutId","clearTimeout","pendingChannels","handleDisconnect","handleMessage","READY","pong","error","forceReconnect","physicConnect","onopen","onmessage","parse","onclose","reconnectTimeDeltaMs","ClaireClient","ClaireApp","dataKeyRegex","Translator","translations","translationLoadings","setTranslations","translationProviders","langKeys","lang","awaitingTranslations","promise","trans","default","translate","template","translateText","translation","matchAll","lastIndex","AbstractLogger","module","exports","require","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clairejs/client",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.29",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"scripts": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"axios": "^1.3.4"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@clairejs/core": "^3.
|
|
15
|
+
"@clairejs/core": "^3.4.0"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@types/mocha": "^8.2.2",
|
package/webpack.config.js
CHANGED