@clairejs/client 3.0.14 → 3.0.15

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.
@@ -1,20 +1,20 @@
1
- import { AbstractLogger, AccessToken } from "@clairejs/core";
2
- import { AbstractTokenManager } from "./AbstractTokenManager";
3
- export declare abstract class AbstractHttpClient {
4
- readonly apiServerUrl: string;
5
- readonly logger: AbstractLogger;
6
- readonly tokenManager: AbstractTokenManager;
7
- private refreshing;
8
- private refreshQueue;
9
- constructor(apiServerUrl: string, logger: AbstractLogger, tokenManager: AbstractTokenManager);
10
- protected abstract getRefreshedAccessToken(): Promise<AccessToken>;
11
- protected resolveUrl(url: string): string;
12
- protected resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any>;
13
- private resolveHeaders;
14
- refreshToken(oldToken?: AccessToken): Promise<void>;
15
- abstract get<T = any>(url: string, headers?: any): Promise<T>;
16
- abstract post<T = any, R = any>(url: string, body: R, headers?: any): Promise<T>;
17
- abstract put<T = any, R = any>(url: string, body: R, headers?: any): Promise<T>;
18
- abstract delete<T = any>(url: string, headers?: any): Promise<T>;
19
- }
1
+ import { AbstractLogger, AccessToken } from "@clairejs/core";
2
+ import { AbstractTokenManager } from "./AbstractTokenManager";
3
+ export declare abstract class AbstractHttpClient {
4
+ readonly apiServerUrl: string;
5
+ readonly logger: AbstractLogger;
6
+ readonly tokenManager: AbstractTokenManager;
7
+ private refreshing;
8
+ private refreshQueue;
9
+ constructor(apiServerUrl: string, logger: AbstractLogger, tokenManager: AbstractTokenManager);
10
+ protected abstract getRefreshedAccessToken(): Promise<AccessToken>;
11
+ protected resolveUrl(url: string): string;
12
+ protected resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any>;
13
+ private resolveHeaders;
14
+ refreshToken(oldToken?: AccessToken): Promise<void>;
15
+ abstract get<T = any>(url: string, headers?: any): Promise<T>;
16
+ abstract post<T = any, R = any>(url: string, body: R, headers?: any): Promise<T>;
17
+ abstract put<T = any, R = any>(url: string, body: R, headers?: any): Promise<T>;
18
+ abstract delete<T = any>(url: string, headers?: any): Promise<T>;
19
+ }
20
20
  //# sourceMappingURL=AbstractHttpClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/AbstractHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,8BAAsB,kBAAkB;IAOhC,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc;IAC/B,QAAQ,CAAC,YAAY,EAAE,oBAAoB;IAR/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAEX;gBAGI,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB;IAG/C,SAAS,CAAC,QAAQ,CAAC,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC;IAElE,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;cAIzB,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;YAatF,cAAc;IAKtB,YAAY,CAAC,QAAQ,CAAC,EAAE,WAAW;IAkCzC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAChF,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAC/E,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;CACnE"}
1
+ {"version":3,"file":"AbstractHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/AbstractHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,8BAAsB,kBAAkB;IAOhC,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc;IAC/B,QAAQ,CAAC,YAAY,EAAE,oBAAoB;IAR/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAEX;gBAGI,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB;IAG/C,SAAS,CAAC,QAAQ,CAAC,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC;IAElE,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;cAIzB,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;YAatF,cAAc;IAatB,YAAY,CAAC,QAAQ,CAAC,EAAE,WAAW;IAkCzC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAChF,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAC/E,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;CACnE"}
@@ -1,6 +1,6 @@
1
- import { AccessToken } from "@clairejs/core";
2
- export declare abstract class AbstractTokenManager {
3
- abstract getAccessToken(): Promise<AccessToken | undefined>;
4
- abstract setAccessToken(token?: AccessToken): Promise<void>;
5
- }
1
+ import { AccessToken } from "@clairejs/core";
2
+ export declare abstract class AbstractTokenManager {
3
+ abstract getAccessToken(): Promise<AccessToken | undefined>;
4
+ abstract setAccessToken(token?: AccessToken): Promise<void>;
5
+ }
6
6
  //# sourceMappingURL=AbstractTokenManager.d.ts.map
@@ -1,15 +1,15 @@
1
- import { AbstractLogger, AccessToken } from "@clairejs/core";
2
- import { AbstractHttpClient } from "./AbstractHttpClient";
3
- import { AbstractTokenManager } from "./AbstractTokenManager";
4
- export declare class AxiosApiClient extends AbstractHttpClient {
5
- readonly apiServerUrl: string;
6
- readonly logger: AbstractLogger;
7
- readonly tokenManager: AbstractTokenManager;
8
- constructor(apiServerUrl: string, logger: AbstractLogger, tokenManager: AbstractTokenManager);
9
- protected getRefreshedAccessToken(): Promise<AccessToken>;
10
- get<R>(url: string, headers?: any): Promise<R>;
11
- post<T, R>(url: string, body: T, headers?: any): Promise<R>;
12
- put<T, R>(url: string, body: T, headers?: any): Promise<R>;
13
- delete<R>(url: string, headers?: any): Promise<R>;
14
- }
1
+ import { AbstractLogger, AccessToken } from "@clairejs/core";
2
+ import { AbstractHttpClient } from "./AbstractHttpClient";
3
+ import { AbstractTokenManager } from "./AbstractTokenManager";
4
+ export declare class AxiosApiClient extends AbstractHttpClient {
5
+ readonly apiServerUrl: string;
6
+ readonly logger: AbstractLogger;
7
+ readonly tokenManager: AbstractTokenManager;
8
+ constructor(apiServerUrl: string, logger: AbstractLogger, tokenManager: AbstractTokenManager);
9
+ protected getRefreshedAccessToken(): Promise<AccessToken>;
10
+ get<R>(url: string, headers?: any): Promise<R>;
11
+ post<T, R>(url: string, body: T, headers?: any): Promise<R>;
12
+ put<T, R>(url: string, body: T, headers?: any): Promise<R>;
13
+ delete<R>(url: string, headers?: any): Promise<R>;
14
+ }
15
15
  //# sourceMappingURL=AxiosApiClient.d.ts.map
@@ -1,16 +1,16 @@
1
- import { AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, GetManyQueries, GetManyResponseBody, UpdateManyBody, UpdateManyQueries, UpdateManyResponse } from "@clairejs/core";
2
- import { AbstractHttpClient } from "./AbstractHttpClient";
3
- export declare const stringifyQueries: (queries: Record<string, any>) => string;
4
- export declare const removeInstances: <T extends AbstractModel>(target: T[], source: T[]) => T[];
5
- export declare const mergeInstances: <T extends AbstractModel>(model: Constructor<T>, target: T[], source: Partial<T>[]) => T[];
6
- export declare class CrudApi<T extends AbstractModel> {
7
- readonly model: Constructor<T>;
8
- readonly httpClient: AbstractHttpClient;
9
- constructor(model: Constructor<T>, httpClient: AbstractHttpClient);
10
- protected getEndpointBaseUrl(): string;
11
- getMany(queries?: GetManyQueries<T>): Promise<GetManyResponseBody<T>>;
12
- updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>>;
13
- deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>>;
14
- createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>>;
15
- }
1
+ import { AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, GetManyQueries, GetManyResponseBody, UpdateManyBody, UpdateManyQueries, UpdateManyResponse } from "@clairejs/core";
2
+ import { AbstractHttpClient } from "./AbstractHttpClient";
3
+ export declare const stringifyQueries: (queries: Record<string, any>) => string;
4
+ export declare const removeInstances: <T extends AbstractModel>(target: T[], source: T[]) => T[];
5
+ export declare const mergeInstances: <T extends AbstractModel>(model: Constructor<T>, target: T[], source: Partial<T>[]) => T[];
6
+ export declare class CrudApi<T extends AbstractModel> {
7
+ readonly model: Constructor<T>;
8
+ readonly httpClient: AbstractHttpClient;
9
+ constructor(model: Constructor<T>, httpClient: AbstractHttpClient);
10
+ protected getEndpointBaseUrl(): string;
11
+ getMany(queries?: GetManyQueries<T>): Promise<GetManyResponseBody<T>>;
12
+ updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>>;
13
+ deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>>;
14
+ createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>>;
15
+ }
16
16
  //# sourceMappingURL=CrudApi.d.ts.map
@@ -1,12 +1,12 @@
1
- import { AccessToken } from "@clairejs/core";
2
- import { AbstractStorage } from "../system/AbstractStorage";
3
- import { AbstractTokenManager } from "./AbstractTokenManager";
4
- export declare class DefaultTokenManager extends AbstractTokenManager {
5
- readonly storage: AbstractStorage;
6
- readonly storageKey: string;
7
- private accessToken?;
8
- constructor(storage: AbstractStorage, storageKey?: string);
9
- getAccessToken(): Promise<AccessToken | undefined>;
10
- setAccessToken(token?: AccessToken): Promise<void>;
11
- }
1
+ import { AccessToken } from "@clairejs/core";
2
+ import { AbstractStorage } from "../system/AbstractStorage";
3
+ import { AbstractTokenManager } from "./AbstractTokenManager";
4
+ export declare class DefaultTokenManager extends AbstractTokenManager {
5
+ readonly storage: AbstractStorage;
6
+ readonly storageKey: string;
7
+ private accessToken?;
8
+ constructor(storage: AbstractStorage, storageKey?: string);
9
+ getAccessToken(): Promise<AccessToken | undefined>;
10
+ setAccessToken(token?: AccessToken): Promise<void>;
11
+ }
12
12
  //# sourceMappingURL=DefaultTokenManager.d.ts.map
@@ -1,3 +1,3 @@
1
- export declare const SYSTEM_LANGUAGES = "SYSTEM_LANGUAGES";
2
- export declare const CURRENT_LANGUAGE = "CURRENT_LANGUAGE";
1
+ export declare const SYSTEM_LANGUAGES = "SYSTEM_LANGUAGES";
2
+ export declare const CURRENT_LANGUAGE = "CURRENT_LANGUAGE";
3
3
  //# sourceMappingURL=constants.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,19 +1,19 @@
1
- export * from "./system/ClaireClient";
2
- export * from "./api/AxiosApiClient";
3
- export * from "./api/AbstractHttpClient";
4
- export * from "./socket/AbstractClientSocketManager";
5
- export * from "./socket/IClientSocket";
6
- export * from "./socket/DefaultClientSocketManager";
7
- export * from "./system/AbstractStorage";
8
- export * from "./translation/Translator";
9
- export * from "./routing/AbstractErrorHandler";
10
- export * from "./routing/AbstractViewMiddleware";
11
- export * from "./routing/UrlInfo";
12
- export * from "./routing/RouterConfig";
13
- export * from "./routing/ComponentInfo";
14
- export * from "./api/AbstractTokenManager";
15
- export * from "./socket/IWebSocket";
16
- export * from "./translation/types";
17
- export * from "./api/DefaultTokenManager";
18
- export * from "./api/CrudApi";
1
+ export * from "./system/ClaireClient";
2
+ export * from "./api/AxiosApiClient";
3
+ export * from "./api/AbstractHttpClient";
4
+ export * from "./socket/AbstractClientSocketManager";
5
+ export * from "./socket/IClientSocket";
6
+ export * from "./socket/DefaultClientSocketManager";
7
+ export * from "./system/AbstractStorage";
8
+ export * from "./translation/Translator";
9
+ export * from "./routing/AbstractErrorHandler";
10
+ export * from "./routing/AbstractViewMiddleware";
11
+ export * from "./routing/UrlInfo";
12
+ export * from "./routing/RouterConfig";
13
+ export * from "./routing/ComponentInfo";
14
+ export * from "./api/AbstractTokenManager";
15
+ export * from "./socket/IWebSocket";
16
+ export * from "./translation/types";
17
+ export * from "./api/DefaultTokenManager";
18
+ export * from "./api/CrudApi";
19
19
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){for(var n in t)e[n]=t[n]}(exports,function(e){var t={};function __webpack_require__(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,__webpack_require__),s.l=!0,s.exports}return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.t=function(e,t){if(1&t&&(e=__webpack_require__(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(__webpack_require__.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)__webpack_require__.d(n,s,function(t){return e[t]}.bind(null,s));return n},__webpack_require__.n=function(e){var t=e&&e.__esModule?function getDefault(){return e.default}:function getModuleExports(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=5)}([function(e,t){e.exports=require("@clairejs/core")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractHttpClient=void 0;t.AbstractHttpClient=class AbstractHttpClient{constructor(e,t,n){this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.refreshing=!1,this.refreshQueue=[]}resolveUrl(e){return this.apiServerUrl+e}resolveResult(e,t){return s(this,void 0,void 0,(function*(){if(!t||!Object.keys(t).map((e=>e.toLowerCase().includes("authorization")))){const e=yield this.tokenManager.getAccessToken();e&&e.expiration<Date.now()+3e4&&(yield this.refreshToken(e))}const n=yield this.resolveHeaders(t);return(yield e(n)).data}))}resolveHeaders(e){return s(this,void 0,void 0,(function*(){const t=yield this.tokenManager.getAccessToken();return{headers:Object.assign({Authorization:(null==t?void 0:t.token)||""},e)}}))}refreshToken(e){return s(this,void 0,void 0,(function*(){if(this.refreshing)this.logger.debug("Awaiting refresh token, queued"),yield new Promise((e=>{this.refreshQueue.push({resolver:e})}));else{if(!(e=e||(yield this.tokenManager.getAccessToken()))||!e.refreshToken)return;try{this.refreshing=!0;const e=yield this.getRefreshedAccessToken();yield this.tokenManager.setAccessToken(e),this.logger.debug("Access token was refreshed")}catch(e){this.logger.debug("Cannot refresh access token, clear local token"),yield this.tokenManager.setAccessToken()}finally{this.refreshing=!1;for(const e of this.refreshQueue)e.resolver();this.refreshQueue=[]}}}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},function(e,t,n){"use strict";var s=this&&this.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,s,i)}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),i(n(6),t),i(n(7),t),i(n(2),t),i(n(3),t),i(n(9),t),i(n(10),t),i(n(1),t),i(n(13),t),i(n(15),t),i(n(16),t),i(n(17),t),i(n(18),t),i(n(19),t),i(n(4),t),i(n(20),t),i(n(21),t),i(n(22),t),i(n(23),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(0);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.AxiosApiClient=void 0;const r=i(n(8)),o=n(2);class AxiosApiClient extends o.AbstractHttpClient{constructor(e,t,n){super(e,t,n),this.apiServerUrl=e,this.logger=t,this.tokenManager=n}getRefreshedAccessToken(){throw"Refresh token not supported in default implementation"}get(e,t){return s(this,void 0,void 0,(function*(){const n=this.resolveUrl(e);return this.logger.debug("[GET] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.get(n,e)}))),t)}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const i=this.resolveUrl(e);return this.logger.debug("[POST] ",i),this.resolveResult((n=>s(this,void 0,void 0,(function*(){return r.default.post(this.resolveUrl(e),t,n)}))),n)}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const i=this.resolveUrl(e);return this.logger.debug("[PUT] ",i),this.resolveResult((n=>s(this,void 0,void 0,(function*(){return r.default.put(this.resolveUrl(e),t,n)}))),n)}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=this.resolveUrl(e);return this.logger.debug("[DEL] ",n),this.resolveResult((t=>s(this,void 0,void 0,(function*(){return r.default.delete(this.resolveUrl(e),t)}))),t)}))}}t.AxiosApiClient=AxiosApiClient},function(e,t){e.exports=require("axios")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(0),i=n(11),r=n(3),o=n(12);class DefaultClientSocketManager extends r.AbstractClientSocketManager{constructor(e,t,n,s,i){super(),this.wsProvider=e,this.tokenManager=t,this.httpClient=n,this.logger=s,this.config=i,this.allSockets=[],this.allChannels=[],this.accumulatedPing=0,this.retryDelay=0}create(e){const t=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in connectionObservable";t.connectionSubscriber=e})),n=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in messageReceiveingObservable";t.messageReceivingSubscriber=e})),r=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in messageSendingObservable";t.messageSendingSubscriber=e})),c=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in channelsObservable";t.channelsSubscriber=e})),a=new o.ClientSocket(n,t,(e=>{const t=this.getSocketInfo(a);if(!t||!t.messageSendingSubscriber)throw"Cannot resolve socket info in messageSendingSubscriber resolver";return t.messageSendingSubscriber}),(e=>{const t=this.getSocketInfo(e);if(!t)throw"Cannot resolve socket info in connection request";if(t.connected)return;if(!t.channelsObservable)throw"Channels observer not available";if(!t.messageSendingObservable)throw"Message sending observable not available";const n=t.channelsObservable.subscribe({next:e=>{if(!t.connected&&t.channels.every((t=>e.includes(t)))){if(t.connected=!0,!t.connectionSubscriber)throw"Connection subscriber not available";t.connectionSubscriber.next(t.connected)}else if(t.connected&&t.channels.some((t=>!e.includes(t)))){if(t.connected=!1,!t.connectionSubscriber)throw"Disconnection subscriber not available";t.connectionSubscriber.next(t.connected)}}});t.subscriptions.push(n),t.messageSendingObservable.subscribe({next:e=>{if(!t.connected)throw"Socket not connected";this.sendToChannel(s.SocketChannels.MESSAGE_CHANNEL,e)}});for(const e of t.channels){let t=this.allChannels.find((t=>t.channel===e));t||(t={channel:e,requested:!1,connected:!1},this.allChannels.push(t)),t.requested=!0}this.checkChannelRequests()}),(e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in disconnection request";t.subscriptions.forEach((e=>e.unsubscribe()));const n=this.allSockets.indexOf(t);n>=0&&this.allSockets.splice(n,1)}));return this.allSockets.push({socket:a,channels:e,messageSendingObservable:r,channelsObservable:c,subscriptions:[]}),a}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.connect()))}connect(){this.socket=this.wsProvider(),this.socket.onopen((()=>{this.pingIntervalId&&clearInterval(this.pingIntervalId),this.tokenManager.getAccessToken().then((e=>{this.sendToChannel(s.SocketChannels.AUTHENTICATION_CHANNEL,{authorizationData:null==e?void 0:e.token})})).catch((e=>{this.logger.error(e),this.forceReconnect()}))})),this.socket.onmessage((e=>{var t,n,i;if(!e)return;const{channel:r,message:o}=JSON.parse(e);switch(this.logger.debug("Receive",r,o),r){case s.SocketChannels.PING_PONG_CHANNEL:return void(this.accumulatedPing=0);case s.SocketChannels.AUTHENTICATION_CHANNEL:return this.logger.debug("Socket connection established",o),this.socketConnected=!0,this.pingIntervalId&&clearInterval(this.pingIntervalId),this.accumulatedPing=0,this.pingIntervalId=setInterval((()=>{var e,t,n;this.accumulatedPing+=1,this.accumulatedPing>((null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.deadThreashold)||3)?(this.intendedDisconnection=!1,null===(n=this.socket)||void 0===n||n.close()):this.sendToChannel(s.SocketChannels.PING_PONG_CHANNEL)}),(null===(n=null===(t=this.config)||void 0===t?void 0:t.keepAlive)||void 0===n?void 0:n.pingIntervalMs)||1e4),this.intendedDisconnection=!1,this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0),void this.checkChannelRequests();case s.SocketChannels.CHANNEL_JOIN_REQUEST:{const e=o;if(!e.success)return void this.logger.error(e.error);e.channels.forEach((e=>{const t=this.allChannels.find((t=>t.channel===e));t&&(t.connected=!0,t.requested=!1)})),this.notifyCurrentChannels()}return;case s.SocketChannels.CHANNEL_LEAVE_REQUEST:{const e=o;if(!e.success)return void this.logger.error(e.error);e.channels.forEach((e=>{const t=this.allChannels.find((t=>t.channel===e));t&&(t.connected=!1)})),this.notifyCurrentChannels()}return;case s.SocketChannels.MESSAGE_CHANNEL:{const e=o;this.allSockets.forEach((t=>{var n;t.channels.includes(e.channel)&&(null===(n=t.messageReceivingSubscriber)||void 0===n||n.next(e))}))}return;case s.SocketChannels.DISCONNECTION_CHANNEL:return void(o?(this.intendedDisconnection=!0,null===(i=this.socket)||void 0===i||i.close()):this.httpClient.refreshToken().then((()=>{this.socket?(this.intendedDisconnection=!1,this.socket.close()):this.forceReconnect()})).catch((e=>{var t;this.logger.debug(e),this.intendedDisconnection=!0,null===(t=this.socket)||void 0===t||t.close()})));default:return}})),this.socket.onclose((()=>{this.pingIntervalId&&clearInterval(this.pingIntervalId),this.socket=void 0,this.socketConnected=!1;for(const e of this.allChannels)e.connected=!1,e.requested=!0;this.notifyCurrentChannels(),this.logger.debug("Socket connnection closed, intended ",this.intendedDisconnection),this.intendedDisconnection?this.logger.debug("Socket connection terminated"):this.retryTimeoutId||(this.retryDelay=0,this.retry())}))}retry(){var e;this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`),this.connect(),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)}checkChannelRequests(){if(!this.socketConnected)return;const e=this.allChannels.filter((e=>e.requested)).map((e=>e.channel));e.length&&this.sendToChannel(s.SocketChannels.CHANNEL_JOIN_REQUEST,{channels:e})}notifyCurrentChannels(){const e=this.allChannels.filter((e=>e.connected)).map((e=>e.channel));this.allSockets.forEach((t=>{var n;return null===(n=t.channelsSubscriber)||void 0===n?void 0:n.next(e)}))}getSocketInfo(e){return this.allSockets.find((t=>t.socket===e))}sendToChannel(e,t){if(this.logger.debug("Send",e,t),!this.socket)throw"Socket not available";let n=JSON.stringify({channel:e,message:t});this.socket.send(n)}}t.DefaultClientSocketManager=DefaultClientSocketManager},function(e,t){e.exports=require("rxjs")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClientSocket=void 0;t.ClientSocket=class ClientSocket{constructor(e,t,n,s,i){this.messageReceivingObservable=e,this.connectionObservable=t,this.messsageSendingSubscriberResolver=n,this.initFn=s,this.destructorFn=i}send(e){this.messsageSendingSubscriber||(this.messsageSendingSubscriber=this.messsageSendingSubscriberResolver(this)),this.messsageSendingSubscriber.next(e)}onMessage(e){this.messageHandler=e}onDisconnect(e){this.disconnectHandler=e}onReconnect(e){this.reconnectHandler=e}connect(){this.connectionObservable.subscribe({next:e=>{e?this.reconnectHandler&&this.reconnectHandler():this.disconnectHandler&&this.disconnectHandler()}}),this.messageReceivingObservable.subscribe({next:e=>this.messageHandler&&this.messageHandler(e)}),this.initFn(this)}disconnect(){this.destructorFn(this)}}},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Translator=void 0;const o=n(0),c=n(14),a=n(1),keyResolver=e=>`__${e}__`;let l=class Translator{constructor(e){this.storage=e,this.currentLang=null,this.subscribers=[]}addLangSubscriber(e){this.subscribers.push(e)}removeLangSubscriber(e){this.subscribers=this.subscribers.filter((t=>t!==e))}getCurrentLanguage(){return r(this,void 0,void 0,(function*(){return null===this.currentLang&&(this.currentLang=(yield this.storage.getItem(c.CURRENT_LANGUAGE))||void 0),this.currentLang}))}setCurrentLanguage(e){return r(this,void 0,void 0,(function*(){this.currentLang=e,yield this.storage.setItem(c.CURRENT_LANGUAGE,e);for(const t of this.subscribers)t(e)}))}getLanguages(){return r(this,void 0,void 0,(function*(){return(yield this.storage.getItem(c.SYSTEM_LANGUAGES))||void 0}))}setLanguages(e){return r(this,void 0,void 0,(function*(){yield this.storage.setItem(c.SYSTEM_LANGUAGES,e)}))}getTranslationObject(e){const t=this,n=Object.keys(e),s={},resolveTranslation=(e,s)=>{const i=s.reduce(((e,t)=>(Object.keys(t).forEach((t=>{e.includes(t)||e.push(t)})),e)),[]);for(const r of i){if(s.every((e=>"object"==typeof e[r])))e[r]={},resolveTranslation(e[r],s.map((e=>e[r])));else{const i=keyResolver(r);e[i]=s.map((e=>e[r])),Object.defineProperty(e,r,{value:function(...e){const s=t.currentLang||n[0];if(!s)return"";let r=this[i][n.indexOf(s)];return"string"==typeof r?r:"function"==typeof r?r(...e):i},configurable:!1,writable:!1})}}};return resolveTranslation(s,Object.values(e)),s}};l=s([(0,o.Injectable)(),i("design:paramtypes",[a.AbstractStorage])],l),t.Translator=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CURRENT_LANGUAGE=t.SYSTEM_LANGUAGES=void 0,t.SYSTEM_LANGUAGES="SYSTEM_LANGUAGES",t.CURRENT_LANGUAGE="CURRENT_LANGUAGE"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultTokenManager=void 0;const o=n(0),c=n(1),a=n(4);let l=class DefaultTokenManager extends a.AbstractTokenManager{constructor(e,t="ACCESS_TOKEN"){super(),this.storage=e,this.storageKey=t,this.accessToken=null}getAccessToken(){return r(this,void 0,void 0,(function*(){return null===this.accessToken&&(this.accessToken=yield this.storage.getItem(this.storageKey)),this.accessToken}))}setAccessToken(e){return r(this,void 0,void 0,(function*(){e?yield this.storage.setItem(this.storageKey,e):yield this.storage.deleteItem(this.storageKey),this.accessToken=e}))}};l=s([(0,o.Injectable)(),i("design:paramtypes",[c.AbstractStorage,String])],l),t.DefaultTokenManager=l},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CrudApi=t.mergeInstances=t.removeInstances=t.stringifyQueries=void 0;t.stringifyQueries=e=>Object.keys(e).reduce(((t,n)=>t+`${n}=${JSON.stringify(e[n])}&`),"");t.removeInstances=(e,t)=>{const n=e.slice();for(const e of t){const t=n.findIndex((t=>!!t.id&&!!e.id&&t.id===e.id));t>=0&&n.splice(t,1)}return n};t.mergeInstances=(e,t,n)=>{const s=t.slice();for(const t of n){const n=s.findIndex((e=>!!e.id&&!!t.id&&e.id===t.id));n<0?s.push(Object.assign(new e,t)):Object.assign(s[n],t)}return s};t.CrudApi=class CrudApi{constructor(e,t){this.model=e,this.httpClient=t}getEndpointBaseUrl(){return`/${this.model.name.toLowerCase()}`}getMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.get(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}updateMany(e,n){return s(this,void 0,void 0,(function*(){return yield this.httpClient.put(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(n||{})}`,e)}))}deleteMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.delete(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}createMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.post(`${this.getEndpointBaseUrl()}`,e)}))}}}]));
1
+ !function(e,t){for(var n in t)e[n]=t[n]}(exports,function(e){var t={};function __webpack_require__(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,__webpack_require__),s.l=!0,s.exports}return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.t=function(e,t){if(1&t&&(e=__webpack_require__(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(__webpack_require__.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)__webpack_require__.d(n,s,function(t){return e[t]}.bind(null,s));return n},__webpack_require__.n=function(e){var t=e&&e.__esModule?function getDefault(){return e.default}:function getModuleExports(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=5)}([function(e,t){e.exports=require("@clairejs/core")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractHttpClient=void 0;t.AbstractHttpClient=class AbstractHttpClient{constructor(e,t,n){this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.refreshing=!1,this.refreshQueue=[]}resolveUrl(e){return this.apiServerUrl+e}resolveResult(e,t){return s(this,void 0,void 0,(function*(){if(!t||!Object.keys(t).map((e=>e.toLowerCase().includes("authorization")))){const e=yield this.tokenManager.getAccessToken();e&&e.expiration<Date.now()+3e4&&(yield this.refreshToken(e))}const n=yield this.resolveHeaders(t);return(yield e(n)).data}))}resolveHeaders(e){return s(this,void 0,void 0,(function*(){const t=yield this.tokenManager.getAccessToken();return{headers:Object.assign({authorization:(null==t?void 0:t.token)||""},Object.keys(e).reduce(((t,n)=>Object.assign(t,{[n.toLowerCase()]:e[n]})),{}))}}))}refreshToken(e){return s(this,void 0,void 0,(function*(){if(this.refreshing)this.logger.debug("Awaiting refresh token, queued"),yield new Promise((e=>{this.refreshQueue.push({resolver:e})}));else{if(!(e=e||(yield this.tokenManager.getAccessToken()))||!e.refreshToken)return;try{this.refreshing=!0;const e=yield this.getRefreshedAccessToken();yield this.tokenManager.setAccessToken(e),this.logger.debug("Access token was refreshed")}catch(e){this.logger.debug("Cannot refresh access token, clear local token"),yield this.tokenManager.setAccessToken()}finally{this.refreshing=!1;for(const e of this.refreshQueue)e.resolver();this.refreshQueue=[]}}}))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},function(e,t,n){"use strict";var s=this&&this.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,s,i)}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),i(n(6),t),i(n(7),t),i(n(2),t),i(n(3),t),i(n(9),t),i(n(10),t),i(n(1),t),i(n(13),t),i(n(15),t),i(n(16),t),i(n(17),t),i(n(18),t),i(n(19),t),i(n(4),t),i(n(20),t),i(n(21),t),i(n(22),t),i(n(23),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(0);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.AxiosApiClient=void 0;const r=i(n(8)),o=n(2);class AxiosApiClient extends o.AbstractHttpClient{constructor(e,t,n){super(e,t,n),this.apiServerUrl=e,this.logger=t,this.tokenManager=n}getRefreshedAccessToken(){throw"Refresh token not supported in default implementation"}get(e,t){return s(this,void 0,void 0,(function*(){const n=this.resolveUrl(e);return this.logger.debug("[GET] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.get(n,e)}))),t)}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const i=this.resolveUrl(e);return this.logger.debug("[POST] ",i),this.resolveResult((n=>s(this,void 0,void 0,(function*(){return r.default.post(this.resolveUrl(e),t,n)}))),n)}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const i=this.resolveUrl(e);return this.logger.debug("[PUT] ",i),this.resolveResult((n=>s(this,void 0,void 0,(function*(){return r.default.put(this.resolveUrl(e),t,n)}))),n)}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=this.resolveUrl(e);return this.logger.debug("[DEL] ",n),this.resolveResult((t=>s(this,void 0,void 0,(function*(){return r.default.delete(this.resolveUrl(e),t)}))),t)}))}}t.AxiosApiClient=AxiosApiClient},function(e,t){e.exports=require("axios")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(0),i=n(11),r=n(3),o=n(12);class DefaultClientSocketManager extends r.AbstractClientSocketManager{constructor(e,t,n,s,i){super(),this.wsProvider=e,this.tokenManager=t,this.httpClient=n,this.logger=s,this.config=i,this.allSockets=[],this.allChannels=[],this.accumulatedPing=0,this.retryDelay=0}create(e){const t=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in connectionObservable";t.connectionSubscriber=e})),n=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in messageReceiveingObservable";t.messageReceivingSubscriber=e})),r=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in messageSendingObservable";t.messageSendingSubscriber=e})),c=new i.Observable((e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in channelsObservable";t.channelsSubscriber=e})),a=new o.ClientSocket(n,t,(e=>{const t=this.getSocketInfo(a);if(!t||!t.messageSendingSubscriber)throw"Cannot resolve socket info in messageSendingSubscriber resolver";return t.messageSendingSubscriber}),(e=>{const t=this.getSocketInfo(e);if(!t)throw"Cannot resolve socket info in connection request";if(t.connected)return;if(!t.channelsObservable)throw"Channels observer not available";if(!t.messageSendingObservable)throw"Message sending observable not available";const n=t.channelsObservable.subscribe({next:e=>{if(!t.connected&&t.channels.every((t=>e.includes(t)))){if(t.connected=!0,!t.connectionSubscriber)throw"Connection subscriber not available";t.connectionSubscriber.next(t.connected)}else if(t.connected&&t.channels.some((t=>!e.includes(t)))){if(t.connected=!1,!t.connectionSubscriber)throw"Disconnection subscriber not available";t.connectionSubscriber.next(t.connected)}}});t.subscriptions.push(n),t.messageSendingObservable.subscribe({next:e=>{if(!t.connected)throw"Socket not connected";this.sendToChannel(s.SocketChannels.MESSAGE_CHANNEL,e)}});for(const e of t.channels){let t=this.allChannels.find((t=>t.channel===e));t||(t={channel:e,requested:!1,connected:!1},this.allChannels.push(t)),t.requested=!0}this.checkChannelRequests()}),(e=>{const t=this.getSocketInfo(a);if(!t)throw"Cannot resolve socket info in disconnection request";t.subscriptions.forEach((e=>e.unsubscribe()));const n=this.allSockets.indexOf(t);n>=0&&this.allSockets.splice(n,1)}));return this.allSockets.push({socket:a,channels:e,messageSendingObservable:r,channelsObservable:c,subscriptions:[]}),a}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.connect()))}connect(){this.socket=this.wsProvider(),this.socket.onopen((()=>{this.pingIntervalId&&clearInterval(this.pingIntervalId),this.tokenManager.getAccessToken().then((e=>{this.sendToChannel(s.SocketChannels.AUTHENTICATION_CHANNEL,{authorizationData:null==e?void 0:e.token})})).catch((e=>{this.logger.error(e),this.forceReconnect()}))})),this.socket.onmessage((e=>{var t,n,i;if(!e)return;const{channel:r,message:o}=JSON.parse(e);switch(this.logger.debug("Receive",r,o),r){case s.SocketChannels.PING_PONG_CHANNEL:return void(this.accumulatedPing=0);case s.SocketChannels.AUTHENTICATION_CHANNEL:return this.logger.debug("Socket connection established",o),this.socketConnected=!0,this.pingIntervalId&&clearInterval(this.pingIntervalId),this.accumulatedPing=0,this.pingIntervalId=setInterval((()=>{var e,t,n;this.accumulatedPing+=1,this.accumulatedPing>((null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.deadThreashold)||3)?(this.intendedDisconnection=!1,null===(n=this.socket)||void 0===n||n.close()):this.sendToChannel(s.SocketChannels.PING_PONG_CHANNEL)}),(null===(n=null===(t=this.config)||void 0===t?void 0:t.keepAlive)||void 0===n?void 0:n.pingIntervalMs)||1e4),this.intendedDisconnection=!1,this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0),void this.checkChannelRequests();case s.SocketChannels.CHANNEL_JOIN_REQUEST:{const e=o;if(!e.success)return void this.logger.error(e.error);e.channels.forEach((e=>{const t=this.allChannels.find((t=>t.channel===e));t&&(t.connected=!0,t.requested=!1)})),this.notifyCurrentChannels()}return;case s.SocketChannels.CHANNEL_LEAVE_REQUEST:{const e=o;if(!e.success)return void this.logger.error(e.error);e.channels.forEach((e=>{const t=this.allChannels.find((t=>t.channel===e));t&&(t.connected=!1)})),this.notifyCurrentChannels()}return;case s.SocketChannels.MESSAGE_CHANNEL:{const e=o;this.allSockets.forEach((t=>{var n;t.channels.includes(e.channel)&&(null===(n=t.messageReceivingSubscriber)||void 0===n||n.next(e))}))}return;case s.SocketChannels.DISCONNECTION_CHANNEL:return void(o?(this.intendedDisconnection=!0,null===(i=this.socket)||void 0===i||i.close()):this.httpClient.refreshToken().then((()=>{this.socket?(this.intendedDisconnection=!1,this.socket.close()):this.forceReconnect()})).catch((e=>{var t;this.logger.debug(e),this.intendedDisconnection=!0,null===(t=this.socket)||void 0===t||t.close()})));default:return}})),this.socket.onclose((()=>{this.pingIntervalId&&clearInterval(this.pingIntervalId),this.socket=void 0,this.socketConnected=!1;for(const e of this.allChannels)e.connected=!1,e.requested=!0;this.notifyCurrentChannels(),this.logger.debug("Socket connnection closed, intended ",this.intendedDisconnection),this.intendedDisconnection?this.logger.debug("Socket connection terminated"):this.retryTimeoutId||(this.retryDelay=0,this.retry())}))}retry(){var e;this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`),this.connect(),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)}checkChannelRequests(){if(!this.socketConnected)return;const e=this.allChannels.filter((e=>e.requested)).map((e=>e.channel));e.length&&this.sendToChannel(s.SocketChannels.CHANNEL_JOIN_REQUEST,{channels:e})}notifyCurrentChannels(){const e=this.allChannels.filter((e=>e.connected)).map((e=>e.channel));this.allSockets.forEach((t=>{var n;return null===(n=t.channelsSubscriber)||void 0===n?void 0:n.next(e)}))}getSocketInfo(e){return this.allSockets.find((t=>t.socket===e))}sendToChannel(e,t){if(this.logger.debug("Send",e,t),!this.socket)throw"Socket not available";let n=JSON.stringify({channel:e,message:t});this.socket.send(n)}}t.DefaultClientSocketManager=DefaultClientSocketManager},function(e,t){e.exports=require("rxjs")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClientSocket=void 0;t.ClientSocket=class ClientSocket{constructor(e,t,n,s,i){this.messageReceivingObservable=e,this.connectionObservable=t,this.messsageSendingSubscriberResolver=n,this.initFn=s,this.destructorFn=i}send(e){this.messsageSendingSubscriber||(this.messsageSendingSubscriber=this.messsageSendingSubscriberResolver(this)),this.messsageSendingSubscriber.next(e)}onMessage(e){this.messageHandler=e}onDisconnect(e){this.disconnectHandler=e}onReconnect(e){this.reconnectHandler=e}connect(){this.connectionObservable.subscribe({next:e=>{e?this.reconnectHandler&&this.reconnectHandler():this.disconnectHandler&&this.disconnectHandler()}}),this.messageReceivingObservable.subscribe({next:e=>this.messageHandler&&this.messageHandler(e)}),this.initFn(this)}disconnect(){this.destructorFn(this)}}},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Translator=void 0;const o=n(0),c=n(14),a=n(1),keyResolver=e=>`__${e}__`;let l=class Translator{constructor(e){this.storage=e,this.currentLang=null,this.subscribers=[]}addLangSubscriber(e){this.subscribers.push(e)}removeLangSubscriber(e){this.subscribers=this.subscribers.filter((t=>t!==e))}getCurrentLanguage(){return r(this,void 0,void 0,(function*(){return null===this.currentLang&&(this.currentLang=(yield this.storage.getItem(c.CURRENT_LANGUAGE))||void 0),this.currentLang}))}setCurrentLanguage(e){return r(this,void 0,void 0,(function*(){this.currentLang=e,yield this.storage.setItem(c.CURRENT_LANGUAGE,e);for(const t of this.subscribers)t(e)}))}getLanguages(){return r(this,void 0,void 0,(function*(){return(yield this.storage.getItem(c.SYSTEM_LANGUAGES))||void 0}))}setLanguages(e){return r(this,void 0,void 0,(function*(){yield this.storage.setItem(c.SYSTEM_LANGUAGES,e)}))}getTranslationObject(e){const t=this,n=Object.keys(e),s={},resolveTranslation=(e,s)=>{const i=s.reduce(((e,t)=>(Object.keys(t).forEach((t=>{e.includes(t)||e.push(t)})),e)),[]);for(const r of i){if(s.every((e=>"object"==typeof e[r])))e[r]={},resolveTranslation(e[r],s.map((e=>e[r])));else{const i=keyResolver(r);e[i]=s.map((e=>e[r])),Object.defineProperty(e,r,{value:function(...e){const s=t.currentLang||n[0];if(!s)return"";let r=this[i][n.indexOf(s)];return"string"==typeof r?r:"function"==typeof r?r(...e):i},configurable:!1,writable:!1})}}};return resolveTranslation(s,Object.values(e)),s}};l=s([(0,o.Injectable)(),i("design:paramtypes",[a.AbstractStorage])],l),t.Translator=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CURRENT_LANGUAGE=t.SYSTEM_LANGUAGES=void 0,t.SYSTEM_LANGUAGES="SYSTEM_LANGUAGES",t.CURRENT_LANGUAGE="CURRENT_LANGUAGE"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultTokenManager=void 0;const o=n(0),c=n(1),a=n(4);let l=class DefaultTokenManager extends a.AbstractTokenManager{constructor(e,t="ACCESS_TOKEN"){super(),this.storage=e,this.storageKey=t,this.accessToken=null}getAccessToken(){return r(this,void 0,void 0,(function*(){return null===this.accessToken&&(this.accessToken=yield this.storage.getItem(this.storageKey)),this.accessToken}))}setAccessToken(e){return r(this,void 0,void 0,(function*(){e?yield this.storage.setItem(this.storageKey,e):yield this.storage.deleteItem(this.storageKey),this.accessToken=e}))}};l=s([(0,o.Injectable)(),i("design:paramtypes",[c.AbstractStorage,String])],l),t.DefaultTokenManager=l},function(e,t,n){"use strict";var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CrudApi=t.mergeInstances=t.removeInstances=t.stringifyQueries=void 0;t.stringifyQueries=e=>Object.keys(e).reduce(((t,n)=>t+`${n}=${JSON.stringify(e[n])}&`),"");t.removeInstances=(e,t)=>{const n=e.slice();for(const e of t){const t=n.findIndex((t=>!!t.id&&!!e.id&&t.id===e.id));t>=0&&n.splice(t,1)}return n};t.mergeInstances=(e,t,n)=>{const s=t.slice();for(const t of n){const n=s.findIndex((e=>!!e.id&&!!t.id&&e.id===t.id));n<0?s.push(Object.assign(new e,t)):Object.assign(s[n],t)}return s};t.CrudApi=class CrudApi{constructor(e,t){this.model=e,this.httpClient=t}getEndpointBaseUrl(){return`/${this.model.name.toLowerCase()}`}getMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.get(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}updateMany(e,n){return s(this,void 0,void 0,(function*(){return yield this.httpClient.put(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(n||{})}`,e)}))}deleteMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.delete(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}createMany(e){return s(this,void 0,void 0,(function*(){return yield this.httpClient.post(`${this.getEndpointBaseUrl()}`,e)}))}}}]));
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"@clairejs/core\"","webpack:///./src/system/AbstractStorage.ts","webpack:///./src/api/AbstractHttpClient.ts","webpack:///./src/socket/AbstractClientSocketManager.ts","webpack:///./src/api/AbstractTokenManager.ts","webpack:///./src/index.ts","webpack:///./src/system/ClaireClient.ts","webpack:///./src/api/AxiosApiClient.ts","webpack:///external \"axios\"","webpack:///./src/socket/DefaultClientSocketManager.ts","webpack:///external \"rxjs\"","webpack:///./src/socket/ClientSocket.ts","webpack:///./src/translation/Translator.ts","webpack:///./src/constants.ts","webpack:///./src/routing/AbstractErrorHandler.ts","webpack:///./src/routing/AbstractViewMiddleware.ts","webpack:///./src/api/DefaultTokenManager.ts","webpack:///./src/api/CrudApi.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","require","AbstractStorage","AbstractHttpClient","apiServerUrl","logger","tokenManager","refreshing","refreshQueue","url","this","apiCall","headers","keys","map","k","toLowerCase","includes","accessToken","getAccessToken","expiration","Date","now","refreshToken","finalHeaders","resolveHeaders","data","Authorization","token","oldToken","debug","Promise","resolve","push","resolver","newToken","getRefreshedAccessToken","setAccessToken","err","refresh","AbstractClientSocketManager","AbstractTokenManager","ClaireClient","ClaireApp","AxiosApiClient","super","finalUrl","resolveUrl","resolveResult","body","post","put","delete","DefaultClientSocketManager","wsProvider","httpClient","config","allSockets","allChannels","accumulatedPing","retryDelay","channels","connectionObservable","Observable","subscriber","socketInfo","getSocketInfo","socket","connectionSubscriber","messageReceiveingObservable","messageReceivingSubscriber","messageSendingObservable","messageSendingSubscriber","channelsObservable","channelsSubscriber","ClientSocket","_socket","connected","sub","subscribe","next","availableChannels","every","some","subscriptions","message","sendToChannel","SocketChannels","MESSAGE_CHANNEL","channel","channelInfo","find","requested","checkChannelRequests","forEach","unsubscribe","index","indexOf","splice","intendedDisconnection","close","undefined","retryTimeoutId","clearTimeout","socketConnected","connect","onopen","pingIntervalId","clearInterval","then","AUTHENTICATION_CHANNEL","authorizationData","catch","error","forceReconnect","onmessage","JSON","parse","PING_PONG_CHANNEL","setInterval","keepAlive","deadThreashold","pingIntervalMs","CHANNEL_JOIN_REQUEST","receivedMessage","success","info","notifyCurrentChannels","CHANNEL_LEAVE_REQUEST","DISCONNECTION_CHANNEL","onclose","retry","reconnectTimeDeltaMs","setTimeout","pendingChannels","filter","length","boundChannels","stringify","send","messageReceivingObservable","messsageSendingSubscriberResolver","initFn","destructorFn","messsageSendingSubscriber","handler","messageHandler","disconnectHandler","reconnectHandler","keyResolver","Translator","storage","currentLang","subscribers","getItem","CURRENT_LANGUAGE","lang","setItem","SYSTEM_LANGUAGES","languages","translationMap","_this","locales","translation","resolveTranslation","translationsObject","translationValues","reduce","collector","tKey","args","currentLocale","configurable","writable","values","Injectable","AbstractErrorHandler","AbstractViewMiddleware","DefaultTokenManager","storageKey","deleteItem","stringifyQueries","queries","removeInstances","target","source","result","slice","instance","findIndex","id","mergeInstances","model","assign","CrudApi","getEndpointBaseUrl"],"mappings":"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","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 5);\n","module.exports = require(\"@clairejs/core\");","export abstract class AbstractStorage {\r\n public abstract getItem<T>(key: string): Promise<T | undefined>;\r\n public abstract setItem<T>(key: string, value: T): Promise<void>;\r\n public abstract deleteItem(key: string): Promise<void>;\r\n}\r\n","import { AbstractLogger, AccessToken } from \"@clairejs/core\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\nexport abstract class AbstractHttpClient {\r\n private refreshing = false;\r\n private refreshQueue: {\r\n resolver: () => void;\r\n }[] = [];\r\n\r\n constructor(\r\n readonly apiServerUrl: string,\r\n readonly logger: AbstractLogger,\r\n readonly tokenManager: AbstractTokenManager\r\n ) {}\r\n\r\n protected abstract getRefreshedAccessToken(): Promise<AccessToken>;\r\n\r\n protected resolveUrl(url: string): string {\r\n return this.apiServerUrl + url;\r\n }\r\n\r\n protected async resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any> {\r\n //-- request does not explicitely provide authorization header, resolve automatically\r\n if (!headers || !Object.keys(headers).map((k) => k.toLowerCase().includes(\"authorization\"))) {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n //-- 30s buffer\r\n if (accessToken && accessToken.expiration < Date.now() + 30000) {\r\n await this.refreshToken(accessToken);\r\n }\r\n }\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n return (await apiCall(finalHeaders)).data;\r\n }\r\n\r\n private async resolveHeaders(headers: object): Promise<any> {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n return { headers: { Authorization: accessToken?.token || \"\", ...headers } };\r\n }\r\n\r\n async refreshToken(oldToken?: AccessToken) {\r\n if (this.refreshing) {\r\n this.logger.debug(\"Awaiting refresh token, queued\");\r\n await new Promise<void>((resolve) => {\r\n this.refreshQueue.push({ resolver: resolve });\r\n });\r\n } else {\r\n oldToken = oldToken || (await this.tokenManager.getAccessToken());\r\n //-- call to api server to refresh token\r\n if (!oldToken || !oldToken.refreshToken) {\r\n //-- there is no refresh token to refresh\r\n return;\r\n }\r\n\r\n try {\r\n this.refreshing = true;\r\n const newToken = await this.getRefreshedAccessToken();\r\n await this.tokenManager.setAccessToken(newToken);\r\n this.logger.debug(\"Access token was refreshed\");\r\n } catch (err) {\r\n //-- cannot refresh access token, clear old token\r\n this.logger.debug(\"Cannot refresh access token, clear local token\");\r\n await this.tokenManager.setAccessToken();\r\n } finally {\r\n this.refreshing = false;\r\n for (const refresh of this.refreshQueue) {\r\n refresh.resolver();\r\n }\r\n //-- clear queue\r\n this.refreshQueue = [];\r\n }\r\n }\r\n }\r\n\r\n abstract get<T>(url: string, headers?: any): Promise<T>;\r\n abstract post<T extends any, R extends any>(url: string, body: R, headers?: any): Promise<T>;\r\n abstract put<T extends any, R extends any>(url: string, body: R, headers?: any): Promise<T>;\r\n abstract delete<T>(url: string, headers?: any): Promise<T>;\r\n}\r\n","import { IClientSocket } from \"./IClientSocket\";\r\n\r\nexport abstract class AbstractClientSocketManager {\r\n abstract create(channels: string[]): IClientSocket;\r\n\r\n abstract forceReconnect(): void;\r\n abstract forceDisconnect(): void;\r\n}\r\n","import { AccessToken } from \"@clairejs/core\";\r\n\r\nexport abstract class AbstractTokenManager {\r\n abstract getAccessToken(): Promise<AccessToken | undefined>;\r\n abstract setAccessToken(token?: AccessToken): Promise<void>;\r\n}\r\n","export * from \"./system/ClaireClient\";\r\nexport * from \"./api/AxiosApiClient\";\r\nexport * from \"./api/AbstractHttpClient\";\r\nexport * from \"./socket/AbstractClientSocketManager\";\r\nexport * from \"./socket/IClientSocket\";\r\nexport * from \"./socket/DefaultClientSocketManager\";\r\nexport * from \"./system/AbstractStorage\";\r\nexport * from \"./translation/Translator\";\r\nexport * from \"./routing/AbstractErrorHandler\";\r\nexport * from \"./routing/AbstractViewMiddleware\";\r\nexport * from \"./routing/UrlInfo\";\r\nexport * from \"./routing/RouterConfig\";\r\nexport * from \"./routing/ComponentInfo\";\r\nexport * from \"./api/AbstractTokenManager\";\r\nexport * from \"./socket/IWebSocket\";\r\nexport * from \"./translation/types\";\r\nexport * from \"./api/DefaultTokenManager\";\r\nexport * from \"./api/CrudApi\";\r\n","import { ClaireApp } from \"@clairejs/core\";\r\n\r\nexport class ClaireClient extends ClaireApp {}\r\n","import { AbstractLogger, AccessToken } from \"@clairejs/core\";\r\nimport axios from \"axios\";\r\n\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\nexport class AxiosApiClient extends AbstractHttpClient {\r\n public constructor(\r\n readonly apiServerUrl: string,\r\n readonly logger: AbstractLogger,\r\n readonly tokenManager: AbstractTokenManager\r\n ) {\r\n super(apiServerUrl, logger, tokenManager);\r\n }\r\n\r\n protected getRefreshedAccessToken(): Promise<AccessToken> {\r\n throw \"Refresh token not supported in default implementation\";\r\n }\r\n\r\n public async get<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = this.resolveUrl(url);\r\n this.logger.debug(\"[GET] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.get(finalUrl, headers), headers);\r\n }\r\n public async post<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = this.resolveUrl(url);\r\n this.logger.debug(\"[POST] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.post(this.resolveUrl(url), body, headers), headers);\r\n }\r\n public async put<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = this.resolveUrl(url);\r\n this.logger.debug(\"[PUT] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.put(this.resolveUrl(url), body, headers), headers);\r\n }\r\n\r\n public async delete<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = this.resolveUrl(url);\r\n this.logger.debug(\"[DEL] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.delete(this.resolveUrl(url), headers), headers);\r\n }\r\n}\r\n","module.exports = require(\"axios\");","import {\r\n AbstractLogger,\r\n SocketAuthenticationUpstreamMessage,\r\n SocketChannelRequestDownstreamMessage,\r\n SocketChannelRequestUpstreamMessage,\r\n SocketChannels,\r\n SocketPlainMessage,\r\n} from \"@clairejs/core\";\r\nimport { Observable, Subscriber, Subscription } from \"rxjs\";\r\n\r\nimport { AbstractTokenManager } from \"../api/AbstractTokenManager\";\r\nimport { AbstractHttpClient } from \"../api/AbstractHttpClient\";\r\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\r\nimport { SocketConfig } from \"./SocketConfig\";\r\nimport { ClientSocket } from \"./ClientSocket\";\r\nimport { IClientSocket } from \"./IClientSocket\";\r\nimport { IWebSocket } from \"./IWebSocket\";\r\n\r\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\r\n private socket?: IWebSocket;\r\n\r\n private allSockets: {\r\n socket: ClientSocket;\r\n connected?: boolean;\r\n channels: string[];\r\n subscriptions: Subscription[];\r\n\r\n connectionSubscriber?: Subscriber<boolean>;\r\n channelsSubscriber?: Subscriber<string[]>;\r\n messageReceivingSubscriber?: Subscriber<SocketPlainMessage>;\r\n messageSendingSubscriber?: Subscriber<SocketPlainMessage>;\r\n\r\n messageSendingObservable?: Observable<SocketPlainMessage>;\r\n channelsObservable?: Observable<string[]>;\r\n }[] = [];\r\n\r\n private allChannels: { channel: string; requested: boolean; connected: boolean }[] = [];\r\n\r\n private socketConnected?: boolean;\r\n private pingIntervalId?: any;\r\n private retryTimeoutId?: any;\r\n private accumulatedPing = 0;\r\n private retryDelay = 0;\r\n private intendedDisconnection?: boolean;\r\n\r\n constructor(\r\n private readonly wsProvider: () => IWebSocket,\r\n private readonly tokenManager: AbstractTokenManager,\r\n private readonly httpClient: AbstractHttpClient,\r\n private readonly logger: AbstractLogger,\r\n private readonly config?: SocketConfig\r\n ) {\r\n super();\r\n }\r\n\r\n create(channels: string[]): IClientSocket {\r\n const connectionObservable = new Observable<boolean>((subscriber) => {\r\n const socketInfo = this.getSocketInfo(socket);\r\n\r\n if (!socketInfo) {\r\n throw \"Cannot resolve socket info in connectionObservable\";\r\n }\r\n\r\n socketInfo.connectionSubscriber = subscriber;\r\n });\r\n\r\n const messageReceiveingObservable = new Observable<any>((subscriber) => {\r\n const socketInfo = this.getSocketInfo(socket);\r\n if (!socketInfo) {\r\n throw \"Cannot resolve socket info in messageReceiveingObservable\";\r\n }\r\n socketInfo.messageReceivingSubscriber = subscriber;\r\n });\r\n\r\n const messageSendingObservable = new Observable<any>((subscriber) => {\r\n const socketInfo = this.getSocketInfo(socket);\r\n if (!socketInfo) {\r\n throw \"Cannot resolve socket info in messageSendingObservable\";\r\n }\r\n socketInfo.messageSendingSubscriber = subscriber;\r\n });\r\n\r\n const channelsObservable = new Observable<string[]>((subscriber) => {\r\n const socketInfo = this.getSocketInfo(socket);\r\n if (!socketInfo) {\r\n throw \"Cannot resolve socket info in channelsObservable\";\r\n }\r\n socketInfo.channelsSubscriber = subscriber;\r\n });\r\n\r\n const socket = new ClientSocket(\r\n messageReceiveingObservable,\r\n connectionObservable,\r\n (_socket) => {\r\n const socketInfo = this.getSocketInfo(socket);\r\n if (!socketInfo || !socketInfo.messageSendingSubscriber) {\r\n throw \"Cannot resolve socket info in messageSendingSubscriber resolver\";\r\n }\r\n return socketInfo.messageSendingSubscriber;\r\n },\r\n (_socket) => {\r\n //-- socket request connection\r\n const socketInfo = this.getSocketInfo(_socket);\r\n if (!socketInfo) {\r\n throw \"Cannot resolve socket info in connection request\";\r\n }\r\n\r\n if (socketInfo.connected) {\r\n return;\r\n }\r\n\r\n if (!socketInfo.channelsObservable) {\r\n throw \"Channels observer not available\";\r\n }\r\n\r\n if (!socketInfo.messageSendingObservable) {\r\n throw \"Message sending observable not available\";\r\n }\r\n\r\n const sub = socketInfo.channelsObservable.subscribe({\r\n next: (availableChannels) => {\r\n if (!socketInfo.connected && socketInfo.channels.every((c) => availableChannels.includes(c))) {\r\n //-- socket connected\r\n socketInfo.connected = true;\r\n if (!socketInfo.connectionSubscriber) {\r\n throw \"Connection subscriber not available\";\r\n }\r\n socketInfo.connectionSubscriber.next(socketInfo.connected);\r\n } else if (\r\n socketInfo.connected &&\r\n socketInfo.channels.some((c) => !availableChannels.includes(c))\r\n ) {\r\n //-- socket disconnected\r\n socketInfo.connected = false;\r\n if (!socketInfo.connectionSubscriber) {\r\n throw \"Disconnection subscriber not available\";\r\n }\r\n socketInfo.connectionSubscriber.next(socketInfo.connected);\r\n }\r\n },\r\n });\r\n socketInfo.subscriptions.push(sub);\r\n\r\n socketInfo.messageSendingObservable.subscribe({\r\n next: (message) => {\r\n if (!socketInfo.connected) {\r\n throw \"Socket not connected\";\r\n }\r\n this.sendToChannel(SocketChannels.MESSAGE_CHANNEL, message);\r\n },\r\n });\r\n\r\n //-- register channel\r\n for (const channel of socketInfo.channels) {\r\n let channelInfo = this.allChannels.find((channelInfo) => channelInfo.channel === channel);\r\n if (!channelInfo) {\r\n channelInfo = { channel, requested: false, connected: false };\r\n this.allChannels.push(channelInfo);\r\n }\r\n channelInfo.requested = true;\r\n }\r\n\r\n //-- check and request for missing channels\r\n this.checkChannelRequests();\r\n },\r\n (_socket) => {\r\n //-- socket request disconnection\r\n const socketInfo = this.getSocketInfo(socket);\r\n if (!socketInfo) {\r\n throw \"Cannot resolve socket info in disconnection request\";\r\n }\r\n\r\n //-- remove socket\r\n socketInfo.subscriptions.forEach((sub) => sub.unsubscribe());\r\n\r\n const index = this.allSockets.indexOf(socketInfo);\r\n if (index >= 0) {\r\n this.allSockets.splice(index, 1);\r\n }\r\n }\r\n );\r\n\r\n this.allSockets.push({ socket, channels, messageSendingObservable, channelsObservable, subscriptions: [] });\r\n\r\n return socket;\r\n }\r\n\r\n forceDisconnect() {\r\n this.intendedDisconnection = true;\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n }\r\n }\r\n\r\n forceReconnect(): void {\r\n this.intendedDisconnection = false;\r\n if (this.socketConnected) {\r\n this.socket?.close();\r\n } else {\r\n this.retryDelay = 0;\r\n if (this.socket === undefined) {\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n this.connect();\r\n }\r\n }\r\n }\r\n\r\n private connect() {\r\n this.socket = this.wsProvider();\r\n\r\n this.socket.onopen(() => {\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.tokenManager\r\n .getAccessToken()\r\n .then((accessToken) => {\r\n this.sendToChannel(SocketChannels.AUTHENTICATION_CHANNEL, {\r\n authorizationData: accessToken?.token,\r\n } as SocketAuthenticationUpstreamMessage);\r\n })\r\n .catch((err) => {\r\n this.logger.error(err);\r\n this.forceReconnect();\r\n });\r\n });\r\n\r\n this.socket.onmessage((data) => {\r\n if (!data) {\r\n return;\r\n }\r\n\r\n const { channel, message } = JSON.parse(data) as { channel: string; message: any };\r\n this.logger.debug(\"Receive\", channel, message);\r\n\r\n switch (channel) {\r\n case SocketChannels.PING_PONG_CHANNEL:\r\n {\r\n this.accumulatedPing = 0;\r\n }\r\n return;\r\n\r\n case SocketChannels.AUTHENTICATION_CHANNEL:\r\n {\r\n this.logger.debug(\"Socket connection established\", message);\r\n //-- socket authenticated\r\n this.socketConnected = true;\r\n\r\n //-- socket open, set interval\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.accumulatedPing = 0;\r\n this.pingIntervalId = setInterval(() => {\r\n this.accumulatedPing += 1;\r\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreashold || 3)) {\r\n //-- socket connection lost, not intended\r\n this.intendedDisconnection = false;\r\n this.socket?.close();\r\n } else {\r\n this.sendToChannel(SocketChannels.PING_PONG_CHANNEL);\r\n }\r\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\r\n\r\n this.intendedDisconnection = false;\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n\r\n //-- check and send pending channel join requests\r\n this.checkChannelRequests();\r\n }\r\n return;\r\n\r\n case SocketChannels.CHANNEL_JOIN_REQUEST:\r\n {\r\n const receivedMessage = message as SocketChannelRequestDownstreamMessage;\r\n if (!receivedMessage.success) {\r\n this.logger.error(receivedMessage.error);\r\n return;\r\n }\r\n\r\n receivedMessage.channels.forEach((channel) => {\r\n const channelInfo = this.allChannels.find((info) => info.channel === channel);\r\n if (channelInfo) {\r\n channelInfo.connected = true;\r\n channelInfo.requested = false;\r\n }\r\n });\r\n\r\n this.notifyCurrentChannels();\r\n }\r\n return;\r\n\r\n case SocketChannels.CHANNEL_LEAVE_REQUEST:\r\n {\r\n const receivedMessage = message as SocketChannelRequestDownstreamMessage;\r\n if (!receivedMessage.success) {\r\n this.logger.error(receivedMessage.error);\r\n return;\r\n }\r\n\r\n receivedMessage.channels.forEach((channel) => {\r\n const channelInfo = this.allChannels.find((info) => info.channel === channel);\r\n if (channelInfo) {\r\n channelInfo.connected = false;\r\n }\r\n });\r\n\r\n this.notifyCurrentChannels();\r\n }\r\n return;\r\n\r\n case SocketChannels.MESSAGE_CHANNEL:\r\n {\r\n const receivedMessage = message as SocketPlainMessage;\r\n\r\n this.allSockets.forEach((socketInfo) => {\r\n if (!socketInfo.channels.includes(receivedMessage.channel)) {\r\n return;\r\n }\r\n socketInfo.messageReceivingSubscriber?.next(receivedMessage);\r\n });\r\n }\r\n return;\r\n\r\n case SocketChannels.DISCONNECTION_CHANNEL:\r\n {\r\n if (!message) {\r\n //-- retry once\r\n this.httpClient\r\n .refreshToken()\r\n .then(() => {\r\n if (!!this.socket) {\r\n this.intendedDisconnection = false;\r\n this.socket.close();\r\n } else {\r\n this.forceReconnect();\r\n }\r\n })\r\n .catch((err) => {\r\n this.logger.debug(err);\r\n this.intendedDisconnection = true;\r\n this.socket?.close();\r\n });\r\n } else {\r\n this.intendedDisconnection = true;\r\n this.socket?.close();\r\n }\r\n }\r\n return;\r\n default:\r\n return;\r\n }\r\n });\r\n\r\n this.socket.onclose(() => {\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.socket = undefined;\r\n this.socketConnected = false;\r\n\r\n //-- clear all channels and notify for disconnection\r\n for (const channel of this.allChannels) {\r\n channel.connected = false;\r\n channel.requested = true;\r\n }\r\n this.notifyCurrentChannels();\r\n\r\n this.logger.debug(\"Socket connnection closed, intended \", this.intendedDisconnection);\r\n\r\n //-- skip if retryDelay has been set\r\n if (this.intendedDisconnection) {\r\n //-- do nothing more\r\n this.logger.debug(\"Socket connection terminated\");\r\n } else {\r\n if (!this.retryTimeoutId) {\r\n this.retryDelay = 0;\r\n this.retry();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private retry() {\r\n this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`);\r\n this.connect();\r\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\r\n this.retryTimeoutId = setTimeout(() => {\r\n if (!this.socketConnected && !this.intendedDisconnection) {\r\n this.retry();\r\n }\r\n }, this.retryDelay);\r\n }\r\n\r\n private checkChannelRequests() {\r\n if (!this.socketConnected) {\r\n return;\r\n }\r\n\r\n const pendingChannels = this.allChannels.filter((c) => c.requested).map((c) => c.channel);\r\n pendingChannels.length &&\r\n this.sendToChannel(SocketChannels.CHANNEL_JOIN_REQUEST, {\r\n channels: pendingChannels,\r\n } as SocketChannelRequestUpstreamMessage);\r\n }\r\n\r\n private notifyCurrentChannels() {\r\n const boundChannels = this.allChannels.filter((c) => c.connected).map((c) => c.channel);\r\n this.allSockets.forEach((socketInfo) => socketInfo.channelsSubscriber?.next(boundChannels));\r\n }\r\n\r\n private getSocketInfo(socket: IClientSocket) {\r\n return this.allSockets.find((info) => info.socket === socket);\r\n }\r\n\r\n private sendToChannel(channel: string, message?: any) {\r\n this.logger.debug(\"Send\", channel, message);\r\n if (!this.socket) {\r\n throw \"Socket not available\";\r\n }\r\n let data = JSON.stringify({ channel, message });\r\n this.socket.send(data);\r\n }\r\n}\r\n","module.exports = require(\"rxjs\");","import { SocketPlainMessage } from \"@clairejs/core\";\r\nimport { Subscriber, Observable } from \"rxjs\";\r\n\r\nimport { IClientSocket } from \"./IClientSocket\";\r\n\r\nexport class ClientSocket implements IClientSocket {\r\n reconnectHandler?: () => void;\r\n disconnectHandler?: () => void;\r\n messageHandler?: (message: SocketPlainMessage) => void;\r\n messsageSendingSubscriber?: Subscriber<SocketPlainMessage>;\r\n\r\n public constructor(\r\n private readonly messageReceivingObservable: Observable<SocketPlainMessage>,\r\n private readonly connectionObservable: Observable<boolean>,\r\n private readonly messsageSendingSubscriberResolver: (socket: IClientSocket) => Subscriber<SocketPlainMessage>,\r\n private readonly initFn: (socket: IClientSocket) => void,\r\n private readonly destructorFn: (socket: IClientSocket) => void\r\n ) {}\r\n\r\n send(message: SocketPlainMessage): void {\r\n if (!this.messsageSendingSubscriber) {\r\n this.messsageSendingSubscriber = this.messsageSendingSubscriberResolver(this);\r\n }\r\n this.messsageSendingSubscriber.next(message);\r\n }\r\n\r\n onMessage(handler: (message: SocketPlainMessage) => void): void {\r\n this.messageHandler = handler;\r\n }\r\n\r\n onDisconnect(handler: () => void): void {\r\n this.disconnectHandler = handler;\r\n }\r\n\r\n onReconnect(handler: () => void): void {\r\n this.reconnectHandler = handler;\r\n }\r\n\r\n connect(): void {\r\n this.connectionObservable.subscribe({\r\n next: (connected) => {\r\n if (connected) {\r\n this.reconnectHandler && this.reconnectHandler();\r\n } else {\r\n this.disconnectHandler && this.disconnectHandler();\r\n }\r\n },\r\n });\r\n this.messageReceivingObservable.subscribe({ next: (message) => this.messageHandler && this.messageHandler(message) });\r\n this.initFn(this);\r\n }\r\n\r\n disconnect(): void {\r\n this.destructorFn(this);\r\n }\r\n}\r\n","import { Injectable } from \"@clairejs/core\";\r\nimport { CURRENT_LANGUAGE, SYSTEM_LANGUAGES } from \"../constants\";\r\nimport { AbstractStorage } from \"../system/AbstractStorage\";\r\nimport { TranslationMap } from \"./types\";\r\n\r\nconst keyResolver = (key: string) => `__${key}__`;\r\ntype LangSubscriber = (lang: string) => void;\r\n\r\n@Injectable()\r\nexport class Translator {\r\n currentLang?: string = null!;\r\n subscribers: LangSubscriber[] = [];\r\n\r\n constructor(readonly storage: AbstractStorage) {}\r\n\r\n addLangSubscriber(subscriber: LangSubscriber) {\r\n this.subscribers.push(subscriber);\r\n }\r\n\r\n removeLangSubscriber(subscriber: LangSubscriber) {\r\n this.subscribers = this.subscribers.filter((s) => s !== subscriber);\r\n }\r\n\r\n async getCurrentLanguage() {\r\n if (this.currentLang === null) {\r\n this.currentLang = ((await this.storage.getItem(CURRENT_LANGUAGE)) as any as string) || undefined;\r\n }\r\n return this.currentLang;\r\n }\r\n\r\n async setCurrentLanguage(lang: string) {\r\n this.currentLang = lang;\r\n await this.storage.setItem(CURRENT_LANGUAGE, lang);\r\n for (const sub of this.subscribers) {\r\n sub(lang);\r\n }\r\n }\r\n\r\n async getLanguages() {\r\n return ((await this.storage.getItem(SYSTEM_LANGUAGES)) as any as string[]) || undefined;\r\n }\r\n\r\n async setLanguages(languages: string[]) {\r\n await this.storage.setItem(SYSTEM_LANGUAGES, languages);\r\n }\r\n\r\n getTranslationObject(translationMap: TranslationMap) {\r\n const _this = this;\r\n const locales = Object.keys(translationMap);\r\n const translation: any = {};\r\n\r\n const resolveTranslation = (translationsObject: any, translationValues: any[]): void => {\r\n //-- get all keys of languages\r\n const keys = translationValues.reduce((collector, t) => {\r\n Object.keys(t).forEach((key) => {\r\n if (!collector.includes(key)) {\r\n collector.push(key);\r\n }\r\n });\r\n return collector;\r\n }, [] as string[]);\r\n\r\n //-- create getters / setters for those keys\r\n for (const key of keys) {\r\n const isObject = translationValues.every((value) => typeof value[key] === \"object\");\r\n if (isObject) {\r\n translationsObject[key] = {};\r\n resolveTranslation(\r\n translationsObject[key],\r\n translationValues.map((value) => value[key])\r\n );\r\n } else {\r\n const tKey = keyResolver(key);\r\n translationsObject[tKey] = translationValues.map((value) => value[key]);\r\n Object.defineProperty(translationsObject, key, {\r\n value: function (...args: any[]): string {\r\n const currentLocale = _this.currentLang || locales[0];\r\n if (!currentLocale) {\r\n return \"\";\r\n }\r\n\r\n let translation = this[tKey][locales.indexOf(currentLocale)];\r\n if (typeof translation === \"string\") {\r\n return translation;\r\n } else if (typeof translation === \"function\") {\r\n return translation(...args);\r\n } else {\r\n return tKey;\r\n }\r\n },\r\n configurable: false,\r\n writable: false,\r\n });\r\n }\r\n }\r\n };\r\n\r\n resolveTranslation(translation, Object.values(translationMap));\r\n return translation;\r\n }\r\n}\r\n","export const SYSTEM_LANGUAGES = \"SYSTEM_LANGUAGES\";\r\nexport const CURRENT_LANGUAGE = \"CURRENT_LANGUAGE\";\r\n","export abstract class AbstractErrorHandler {\r\n public abstract handle(err: any, component?: any): void;\r\n}\r\n","import { UrlInfo } from \"./UrlInfo\";\r\nexport abstract class AbstractViewMiddleware {\r\n public abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;\r\n}\r\n","import { Injectable, AccessToken } from \"@clairejs/core\";\r\nimport { AbstractStorage } from \"../system/AbstractStorage\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\n@Injectable()\r\nexport class DefaultTokenManager extends AbstractTokenManager {\r\n private accessToken?: AccessToken = null!;\r\n\r\n constructor(readonly storage: AbstractStorage, readonly storageKey: string = \"ACCESS_TOKEN\") {\r\n super();\r\n }\r\n\r\n async getAccessToken(): Promise<AccessToken | undefined> {\r\n if (this.accessToken === null) {\r\n this.accessToken = await this.storage.getItem(this.storageKey);\r\n }\r\n return this.accessToken;\r\n }\r\n\r\n async setAccessToken(token?: AccessToken): Promise<void> {\r\n if (token) {\r\n await this.storage.setItem(this.storageKey, token);\r\n } else {\r\n await this.storage.deleteItem(this.storageKey);\r\n }\r\n this.accessToken = token;\r\n }\r\n}\r\n","import {\r\n AbstractModel,\r\n Constructor,\r\n CreateManyRequestBody,\r\n CreateManyResponseBody,\r\n GetManyQueries,\r\n GetManyResponseBody,\r\n UpdateManyBody,\r\n UpdateManyQueries,\r\n UpdateManyResponse,\r\n} from \"@clairejs/core\";\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\n\r\nexport const stringifyQueries = (queries: Record<string, any>) => {\r\n const keys = Object.keys(queries);\r\n return keys.reduce((collector, key) => collector + `${key}=${JSON.stringify(queries[key])}&`, \"\");\r\n};\r\n\r\nexport const removeInstances = <T extends AbstractModel>(target: T[], source: T[]) => {\r\n const result = target.slice();\r\n for (const instance of source) {\r\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\r\n if (index >= 0) {\r\n result.splice(index, 1);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport const mergeInstances = <T extends AbstractModel>(model: Constructor<T>, target: T[], source: Partial<T>[]) => {\r\n const result = target.slice();\r\n for (const instance of source) {\r\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\r\n if (index < 0) {\r\n result.push(Object.assign(new model(), instance));\r\n } else {\r\n Object.assign(result[index], instance);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport class CrudApi<T extends AbstractModel> {\r\n constructor(readonly model: Constructor<T>, readonly httpClient: AbstractHttpClient) {}\r\n\r\n protected getEndpointBaseUrl() {\r\n return `/${this.model.name.toLowerCase()}`;\r\n }\r\n\r\n async getMany(queries?: GetManyQueries<T>): Promise<GetManyResponseBody<T>> {\r\n return await this.httpClient.get(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\r\n }\r\n\r\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\r\n return await this.httpClient.put(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`, body);\r\n }\r\n\r\n async deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\r\n return await this.httpClient.delete(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\r\n }\r\n\r\n async createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>> {\r\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\r\n }\r\n}\r\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"@clairejs/core\"","webpack:///./src/system/AbstractStorage.ts","webpack:///./src/api/AbstractHttpClient.ts","webpack:///./src/socket/AbstractClientSocketManager.ts","webpack:///./src/api/AbstractTokenManager.ts","webpack:///./src/index.ts","webpack:///./src/system/ClaireClient.ts","webpack:///./src/api/AxiosApiClient.ts","webpack:///external \"axios\"","webpack:///./src/socket/DefaultClientSocketManager.ts","webpack:///external \"rxjs\"","webpack:///./src/socket/ClientSocket.ts","webpack:///./src/translation/Translator.ts","webpack:///./src/constants.ts","webpack:///./src/routing/AbstractErrorHandler.ts","webpack:///./src/routing/AbstractViewMiddleware.ts","webpack:///./src/api/DefaultTokenManager.ts","webpack:///./src/api/CrudApi.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","require","AbstractStorage","AbstractHttpClient","apiServerUrl","logger","tokenManager","refreshing","refreshQueue","url","this","apiCall","headers","keys","map","k","toLowerCase","includes","accessToken","getAccessToken","expiration","Date","now","refreshToken","finalHeaders","resolveHeaders","data","authorization","token","reduce","collector","assign","oldToken","debug","Promise","resolve","push","resolver","newToken","getRefreshedAccessToken","setAccessToken","err","refresh","AbstractClientSocketManager","AbstractTokenManager","ClaireClient","ClaireApp","AxiosApiClient","super","finalUrl","resolveUrl","resolveResult","body","post","put","delete","DefaultClientSocketManager","wsProvider","httpClient","config","allSockets","allChannels","accumulatedPing","retryDelay","channels","connectionObservable","Observable","subscriber","socketInfo","getSocketInfo","socket","connectionSubscriber","messageReceiveingObservable","messageReceivingSubscriber","messageSendingObservable","messageSendingSubscriber","channelsObservable","channelsSubscriber","ClientSocket","_socket","connected","sub","subscribe","next","availableChannels","every","some","subscriptions","message","sendToChannel","SocketChannels","MESSAGE_CHANNEL","channel","channelInfo","find","requested","checkChannelRequests","forEach","unsubscribe","index","indexOf","splice","intendedDisconnection","close","undefined","retryTimeoutId","clearTimeout","socketConnected","connect","onopen","pingIntervalId","clearInterval","then","AUTHENTICATION_CHANNEL","authorizationData","catch","error","forceReconnect","onmessage","JSON","parse","PING_PONG_CHANNEL","setInterval","keepAlive","deadThreashold","pingIntervalMs","CHANNEL_JOIN_REQUEST","receivedMessage","success","info","notifyCurrentChannels","CHANNEL_LEAVE_REQUEST","DISCONNECTION_CHANNEL","onclose","retry","reconnectTimeDeltaMs","setTimeout","pendingChannels","filter","length","boundChannels","stringify","send","messageReceivingObservable","messsageSendingSubscriberResolver","initFn","destructorFn","messsageSendingSubscriber","handler","messageHandler","disconnectHandler","reconnectHandler","keyResolver","Translator","storage","currentLang","subscribers","getItem","CURRENT_LANGUAGE","lang","setItem","SYSTEM_LANGUAGES","languages","translationMap","_this","locales","translation","resolveTranslation","translationsObject","translationValues","tKey","args","currentLocale","configurable","writable","values","Injectable","AbstractErrorHandler","AbstractViewMiddleware","DefaultTokenManager","storageKey","deleteItem","stringifyQueries","queries","removeInstances","target","source","result","slice","instance","findIndex","id","mergeInstances","model","CrudApi","getEndpointBaseUrl"],"mappings":"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","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 5);\n","module.exports = require(\"@clairejs/core\");","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 { AbstractLogger, AccessToken } from \"@clairejs/core\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\n\nexport abstract class AbstractHttpClient {\n private refreshing = false;\n private refreshQueue: {\n resolver: () => void;\n }[] = [];\n\n constructor(\n readonly apiServerUrl: string,\n readonly logger: AbstractLogger,\n readonly tokenManager: AbstractTokenManager\n ) {}\n\n protected abstract getRefreshedAccessToken(): Promise<AccessToken>;\n\n protected resolveUrl(url: string): string {\n return this.apiServerUrl + url;\n }\n\n protected async resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any> {\n //-- request does not explicitely provide authorization header, resolve automatically\n if (!headers || !Object.keys(headers).map((k) => k.toLowerCase().includes(\"authorization\"))) {\n const accessToken = await this.tokenManager.getAccessToken();\n //-- 30s buffer\n if (accessToken && accessToken.expiration < Date.now() + 30000) {\n await this.refreshToken(accessToken);\n }\n }\n const finalHeaders = await this.resolveHeaders(headers);\n return (await apiCall(finalHeaders)).data;\n }\n\n private async resolveHeaders(headers: object): Promise<any> {\n const accessToken = await this.tokenManager.getAccessToken();\n return {\n headers: {\n authorization: accessToken?.token || \"\",\n ...Object.keys(headers).reduce(\n (collector, key) => Object.assign(collector, { [key.toLowerCase()]: (headers as any)[key] }),\n {}\n ),\n },\n };\n }\n\n async refreshToken(oldToken?: AccessToken) {\n if (this.refreshing) {\n this.logger.debug(\"Awaiting refresh token, queued\");\n await new Promise<void>((resolve) => {\n this.refreshQueue.push({ resolver: resolve });\n });\n } else {\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;\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 } catch (err) {\n //-- cannot refresh access token, clear old token\n this.logger.debug(\"Cannot refresh access token, clear local token\");\n await this.tokenManager.setAccessToken();\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\n abstract get<T = any>(url: string, headers?: any): Promise<T>;\n abstract post<T = any, R = any>(url: string, body: R, headers?: any): Promise<T>;\n abstract put<T = any, R = any>(url: string, body: R, headers?: any): Promise<T>;\n abstract delete<T = any>(url: string, headers?: any): Promise<T>;\n}\n","import { IClientSocket } from \"./IClientSocket\";\n\nexport abstract class AbstractClientSocketManager {\n abstract create(channels: string[]): IClientSocket;\n\n abstract forceReconnect(): void;\n abstract forceDisconnect(): void;\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","export * from \"./system/ClaireClient\";\nexport * from \"./api/AxiosApiClient\";\nexport * from \"./api/AbstractHttpClient\";\nexport * from \"./socket/AbstractClientSocketManager\";\nexport * from \"./socket/IClientSocket\";\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 \"./translation/types\";\nexport * from \"./api/DefaultTokenManager\";\nexport * from \"./api/CrudApi\";\n","import { ClaireApp } from \"@clairejs/core\";\n\nexport class ClaireClient extends ClaireApp {}\n","import { AbstractLogger, AccessToken } from \"@clairejs/core\";\nimport axios from \"axios\";\n\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\n\nexport class AxiosApiClient extends AbstractHttpClient {\n public constructor(\n readonly apiServerUrl: string,\n readonly logger: AbstractLogger,\n readonly tokenManager: AbstractTokenManager\n ) {\n super(apiServerUrl, logger, tokenManager);\n }\n\n protected getRefreshedAccessToken(): Promise<AccessToken> {\n throw \"Refresh token not supported in default implementation\";\n }\n\n public async get<R>(url: string, headers?: any): Promise<R> {\n const finalUrl = this.resolveUrl(url);\n this.logger.debug(\"[GET] \", finalUrl);\n return this.resolveResult(async (headers) => axios.get(finalUrl, headers), headers);\n }\n public async post<T, R>(url: string, body: T, headers?: any): Promise<R> {\n const finalUrl = this.resolveUrl(url);\n this.logger.debug(\"[POST] \", finalUrl);\n return this.resolveResult(async (headers) => axios.post(this.resolveUrl(url), body, headers), headers);\n }\n public async put<T, R>(url: string, body: T, headers?: any): Promise<R> {\n const finalUrl = this.resolveUrl(url);\n this.logger.debug(\"[PUT] \", finalUrl);\n return this.resolveResult(async (headers) => axios.put(this.resolveUrl(url), body, headers), headers);\n }\n\n public async delete<R>(url: string, headers?: any): Promise<R> {\n const finalUrl = this.resolveUrl(url);\n this.logger.debug(\"[DEL] \", finalUrl);\n return this.resolveResult(async (headers) => axios.delete(this.resolveUrl(url), headers), headers);\n }\n}\n","module.exports = require(\"axios\");","import {\n AbstractLogger,\n SocketAuthenticationUpstreamMessage,\n SocketChannelRequestDownstreamMessage,\n SocketChannelRequestUpstreamMessage,\n SocketChannels,\n SocketPlainMessage,\n} from \"@clairejs/core\";\nimport { Observable, Subscriber, Subscription } from \"rxjs\";\n\nimport { AbstractTokenManager } from \"../api/AbstractTokenManager\";\nimport { AbstractHttpClient } from \"../api/AbstractHttpClient\";\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\nimport { SocketConfig } from \"./SocketConfig\";\nimport { ClientSocket } from \"./ClientSocket\";\nimport { IClientSocket } from \"./IClientSocket\";\nimport { IWebSocket } from \"./IWebSocket\";\n\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\n private socket?: IWebSocket;\n\n private allSockets: {\n socket: ClientSocket;\n connected?: boolean;\n channels: string[];\n subscriptions: Subscription[];\n\n connectionSubscriber?: Subscriber<boolean>;\n channelsSubscriber?: Subscriber<string[]>;\n messageReceivingSubscriber?: Subscriber<SocketPlainMessage>;\n messageSendingSubscriber?: Subscriber<SocketPlainMessage>;\n\n messageSendingObservable?: Observable<SocketPlainMessage>;\n channelsObservable?: Observable<string[]>;\n }[] = [];\n\n private allChannels: { channel: string; requested: boolean; connected: boolean }[] = [];\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\n constructor(\n private readonly wsProvider: () => IWebSocket,\n private readonly tokenManager: AbstractTokenManager,\n private readonly httpClient: AbstractHttpClient,\n private readonly logger: AbstractLogger,\n private readonly config?: SocketConfig\n ) {\n super();\n }\n\n create(channels: string[]): IClientSocket {\n const connectionObservable = new Observable<boolean>((subscriber) => {\n const socketInfo = this.getSocketInfo(socket);\n\n if (!socketInfo) {\n throw \"Cannot resolve socket info in connectionObservable\";\n }\n\n socketInfo.connectionSubscriber = subscriber;\n });\n\n const messageReceiveingObservable = new Observable<any>((subscriber) => {\n const socketInfo = this.getSocketInfo(socket);\n if (!socketInfo) {\n throw \"Cannot resolve socket info in messageReceiveingObservable\";\n }\n socketInfo.messageReceivingSubscriber = subscriber;\n });\n\n const messageSendingObservable = new Observable<any>((subscriber) => {\n const socketInfo = this.getSocketInfo(socket);\n if (!socketInfo) {\n throw \"Cannot resolve socket info in messageSendingObservable\";\n }\n socketInfo.messageSendingSubscriber = subscriber;\n });\n\n const channelsObservable = new Observable<string[]>((subscriber) => {\n const socketInfo = this.getSocketInfo(socket);\n if (!socketInfo) {\n throw \"Cannot resolve socket info in channelsObservable\";\n }\n socketInfo.channelsSubscriber = subscriber;\n });\n\n const socket = new ClientSocket(\n messageReceiveingObservable,\n connectionObservable,\n (_socket) => {\n const socketInfo = this.getSocketInfo(socket);\n if (!socketInfo || !socketInfo.messageSendingSubscriber) {\n throw \"Cannot resolve socket info in messageSendingSubscriber resolver\";\n }\n return socketInfo.messageSendingSubscriber;\n },\n (_socket) => {\n //-- socket request connection\n const socketInfo = this.getSocketInfo(_socket);\n if (!socketInfo) {\n throw \"Cannot resolve socket info in connection request\";\n }\n\n if (socketInfo.connected) {\n return;\n }\n\n if (!socketInfo.channelsObservable) {\n throw \"Channels observer not available\";\n }\n\n if (!socketInfo.messageSendingObservable) {\n throw \"Message sending observable not available\";\n }\n\n const sub = socketInfo.channelsObservable.subscribe({\n next: (availableChannels) => {\n if (!socketInfo.connected && socketInfo.channels.every((c) => availableChannels.includes(c))) {\n //-- socket connected\n socketInfo.connected = true;\n if (!socketInfo.connectionSubscriber) {\n throw \"Connection subscriber not available\";\n }\n socketInfo.connectionSubscriber.next(socketInfo.connected);\n } else if (\n socketInfo.connected &&\n socketInfo.channels.some((c) => !availableChannels.includes(c))\n ) {\n //-- socket disconnected\n socketInfo.connected = false;\n if (!socketInfo.connectionSubscriber) {\n throw \"Disconnection subscriber not available\";\n }\n socketInfo.connectionSubscriber.next(socketInfo.connected);\n }\n },\n });\n socketInfo.subscriptions.push(sub);\n\n socketInfo.messageSendingObservable.subscribe({\n next: (message) => {\n if (!socketInfo.connected) {\n throw \"Socket not connected\";\n }\n this.sendToChannel(SocketChannels.MESSAGE_CHANNEL, message);\n },\n });\n\n //-- register channel\n for (const channel of socketInfo.channels) {\n let channelInfo = this.allChannels.find((channelInfo) => channelInfo.channel === channel);\n if (!channelInfo) {\n channelInfo = { channel, requested: false, connected: false };\n this.allChannels.push(channelInfo);\n }\n channelInfo.requested = true;\n }\n\n //-- check and request for missing channels\n this.checkChannelRequests();\n },\n (_socket) => {\n //-- socket request disconnection\n const socketInfo = this.getSocketInfo(socket);\n if (!socketInfo) {\n throw \"Cannot resolve socket info in disconnection request\";\n }\n\n //-- remove socket\n socketInfo.subscriptions.forEach((sub) => sub.unsubscribe());\n\n const index = this.allSockets.indexOf(socketInfo);\n if (index >= 0) {\n this.allSockets.splice(index, 1);\n }\n }\n );\n\n this.allSockets.push({ socket, channels, messageSendingObservable, channelsObservable, subscriptions: [] });\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.connect();\n }\n }\n }\n\n private connect() {\n this.socket = this.wsProvider();\n\n this.socket.onopen(() => {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.tokenManager\n .getAccessToken()\n .then((accessToken) => {\n this.sendToChannel(SocketChannels.AUTHENTICATION_CHANNEL, {\n authorizationData: accessToken?.token,\n } as SocketAuthenticationUpstreamMessage);\n })\n .catch((err) => {\n this.logger.error(err);\n this.forceReconnect();\n });\n });\n\n this.socket.onmessage((data) => {\n if (!data) {\n return;\n }\n\n const { channel, message } = JSON.parse(data) as { channel: string; message: any };\n this.logger.debug(\"Receive\", channel, message);\n\n switch (channel) {\n case SocketChannels.PING_PONG_CHANNEL:\n {\n this.accumulatedPing = 0;\n }\n return;\n\n case SocketChannels.AUTHENTICATION_CHANNEL:\n {\n this.logger.debug(\"Socket connection established\", message);\n //-- socket authenticated\n this.socketConnected = true;\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?.deadThreashold || 3)) {\n //-- socket connection lost, not intended\n this.intendedDisconnection = false;\n this.socket?.close();\n } else {\n this.sendToChannel(SocketChannels.PING_PONG_CHANNEL);\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 //-- check and send pending channel join requests\n this.checkChannelRequests();\n }\n return;\n\n case SocketChannels.CHANNEL_JOIN_REQUEST:\n {\n const receivedMessage = message as SocketChannelRequestDownstreamMessage;\n if (!receivedMessage.success) {\n this.logger.error(receivedMessage.error);\n return;\n }\n\n receivedMessage.channels.forEach((channel) => {\n const channelInfo = this.allChannels.find((info) => info.channel === channel);\n if (channelInfo) {\n channelInfo.connected = true;\n channelInfo.requested = false;\n }\n });\n\n this.notifyCurrentChannels();\n }\n return;\n\n case SocketChannels.CHANNEL_LEAVE_REQUEST:\n {\n const receivedMessage = message as SocketChannelRequestDownstreamMessage;\n if (!receivedMessage.success) {\n this.logger.error(receivedMessage.error);\n return;\n }\n\n receivedMessage.channels.forEach((channel) => {\n const channelInfo = this.allChannels.find((info) => info.channel === channel);\n if (channelInfo) {\n channelInfo.connected = false;\n }\n });\n\n this.notifyCurrentChannels();\n }\n return;\n\n case SocketChannels.MESSAGE_CHANNEL:\n {\n const receivedMessage = message as SocketPlainMessage;\n\n this.allSockets.forEach((socketInfo) => {\n if (!socketInfo.channels.includes(receivedMessage.channel)) {\n return;\n }\n socketInfo.messageReceivingSubscriber?.next(receivedMessage);\n });\n }\n return;\n\n case SocketChannels.DISCONNECTION_CHANNEL:\n {\n if (!message) {\n //-- retry once\n this.httpClient\n .refreshToken()\n .then(() => {\n if (!!this.socket) {\n this.intendedDisconnection = false;\n this.socket.close();\n } else {\n this.forceReconnect();\n }\n })\n .catch((err) => {\n this.logger.debug(err);\n this.intendedDisconnection = true;\n this.socket?.close();\n });\n } else {\n this.intendedDisconnection = true;\n this.socket?.close();\n }\n }\n return;\n default:\n return;\n }\n });\n\n this.socket.onclose(() => {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.socket = undefined;\n this.socketConnected = false;\n\n //-- clear all channels and notify for disconnection\n for (const channel of this.allChannels) {\n channel.connected = false;\n channel.requested = true;\n }\n this.notifyCurrentChannels();\n\n this.logger.debug(\"Socket connnection closed, intended \", this.intendedDisconnection);\n\n //-- skip if retryDelay has been set\n if (this.intendedDisconnection) {\n //-- do nothing more\n this.logger.debug(\"Socket connection terminated\");\n } else {\n if (!this.retryTimeoutId) {\n this.retryDelay = 0;\n this.retry();\n }\n }\n });\n }\n\n private retry() {\n this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`);\n this.connect();\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 private checkChannelRequests() {\n if (!this.socketConnected) {\n return;\n }\n\n const pendingChannels = this.allChannels.filter((c) => c.requested).map((c) => c.channel);\n pendingChannels.length &&\n this.sendToChannel(SocketChannels.CHANNEL_JOIN_REQUEST, {\n channels: pendingChannels,\n } as SocketChannelRequestUpstreamMessage);\n }\n\n private notifyCurrentChannels() {\n const boundChannels = this.allChannels.filter((c) => c.connected).map((c) => c.channel);\n this.allSockets.forEach((socketInfo) => socketInfo.channelsSubscriber?.next(boundChannels));\n }\n\n private getSocketInfo(socket: IClientSocket) {\n return this.allSockets.find((info) => info.socket === socket);\n }\n\n private sendToChannel(channel: string, message?: any) {\n this.logger.debug(\"Send\", channel, message);\n if (!this.socket) {\n throw \"Socket not available\";\n }\n let data = JSON.stringify({ channel, message });\n this.socket.send(data);\n }\n}\n","module.exports = require(\"rxjs\");","import { SocketPlainMessage } from \"@clairejs/core\";\nimport { Subscriber, Observable } from \"rxjs\";\n\nimport { IClientSocket } from \"./IClientSocket\";\n\nexport class ClientSocket implements IClientSocket {\n reconnectHandler?: () => void;\n disconnectHandler?: () => void;\n messageHandler?: (message: SocketPlainMessage) => void;\n messsageSendingSubscriber?: Subscriber<SocketPlainMessage>;\n\n public constructor(\n private readonly messageReceivingObservable: Observable<SocketPlainMessage>,\n private readonly connectionObservable: Observable<boolean>,\n private readonly messsageSendingSubscriberResolver: (socket: IClientSocket) => Subscriber<SocketPlainMessage>,\n private readonly initFn: (socket: IClientSocket) => void,\n private readonly destructorFn: (socket: IClientSocket) => void\n ) {}\n\n send(message: SocketPlainMessage): void {\n if (!this.messsageSendingSubscriber) {\n this.messsageSendingSubscriber = this.messsageSendingSubscriberResolver(this);\n }\n this.messsageSendingSubscriber.next(message);\n }\n\n onMessage(handler: (message: SocketPlainMessage) => void): void {\n this.messageHandler = handler;\n }\n\n onDisconnect(handler: () => void): void {\n this.disconnectHandler = handler;\n }\n\n onReconnect(handler: () => void): void {\n this.reconnectHandler = handler;\n }\n\n connect(): void {\n this.connectionObservable.subscribe({\n next: (connected) => {\n if (connected) {\n this.reconnectHandler && this.reconnectHandler();\n } else {\n this.disconnectHandler && this.disconnectHandler();\n }\n },\n });\n this.messageReceivingObservable.subscribe({ next: (message) => this.messageHandler && this.messageHandler(message) });\n this.initFn(this);\n }\n\n disconnect(): void {\n this.destructorFn(this);\n }\n}\n","import { Injectable } from \"@clairejs/core\";\nimport { CURRENT_LANGUAGE, SYSTEM_LANGUAGES } from \"../constants\";\nimport { AbstractStorage } from \"../system/AbstractStorage\";\nimport { TranslationMap } from \"./types\";\n\nconst keyResolver = (key: string) => `__${key}__`;\ntype LangSubscriber = (lang: string) => void;\n\n@Injectable()\nexport class Translator {\n currentLang?: string = null!;\n subscribers: LangSubscriber[] = [];\n\n constructor(readonly storage: AbstractStorage) {}\n\n addLangSubscriber(subscriber: LangSubscriber) {\n this.subscribers.push(subscriber);\n }\n\n removeLangSubscriber(subscriber: LangSubscriber) {\n this.subscribers = this.subscribers.filter((s) => s !== subscriber);\n }\n\n async getCurrentLanguage() {\n if (this.currentLang === null) {\n this.currentLang = ((await this.storage.getItem(CURRENT_LANGUAGE)) as any as string) || undefined;\n }\n return this.currentLang;\n }\n\n async setCurrentLanguage(lang: string) {\n this.currentLang = lang;\n await this.storage.setItem(CURRENT_LANGUAGE, lang);\n for (const sub of this.subscribers) {\n sub(lang);\n }\n }\n\n async getLanguages() {\n return ((await this.storage.getItem(SYSTEM_LANGUAGES)) as any as string[]) || undefined;\n }\n\n async setLanguages(languages: string[]) {\n await this.storage.setItem(SYSTEM_LANGUAGES, languages);\n }\n\n getTranslationObject(translationMap: TranslationMap) {\n const _this = this;\n const locales = Object.keys(translationMap);\n const translation: any = {};\n\n const resolveTranslation = (translationsObject: any, translationValues: any[]): void => {\n //-- get all keys of languages\n const keys = translationValues.reduce((collector, t) => {\n Object.keys(t).forEach((key) => {\n if (!collector.includes(key)) {\n collector.push(key);\n }\n });\n return collector;\n }, [] as string[]);\n\n //-- create getters / setters for those keys\n for (const key of keys) {\n const isObject = translationValues.every((value) => typeof value[key] === \"object\");\n if (isObject) {\n translationsObject[key] = {};\n resolveTranslation(\n translationsObject[key],\n translationValues.map((value) => value[key])\n );\n } else {\n const tKey = keyResolver(key);\n translationsObject[tKey] = translationValues.map((value) => value[key]);\n Object.defineProperty(translationsObject, key, {\n value: function (...args: any[]): string {\n const currentLocale = _this.currentLang || locales[0];\n if (!currentLocale) {\n return \"\";\n }\n\n let translation = this[tKey][locales.indexOf(currentLocale)];\n if (typeof translation === \"string\") {\n return translation;\n } else if (typeof translation === \"function\") {\n return translation(...args);\n } else {\n return tKey;\n }\n },\n configurable: false,\n writable: false,\n });\n }\n }\n };\n\n resolveTranslation(translation, Object.values(translationMap));\n return translation;\n }\n}\n","export const SYSTEM_LANGUAGES = \"SYSTEM_LANGUAGES\";\nexport const CURRENT_LANGUAGE = \"CURRENT_LANGUAGE\";\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 { Injectable, AccessToken } from \"@clairejs/core\";\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(readonly storage: AbstractStorage, 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 {\n AbstractModel,\n Constructor,\n CreateManyRequestBody,\n CreateManyResponseBody,\n GetManyQueries,\n GetManyResponseBody,\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);\n return keys.reduce((collector, key) => collector + `${key}=${JSON.stringify(queries[key])}&`, \"\");\n};\n\nexport const removeInstances = <T extends AbstractModel>(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 AbstractModel>(model: Constructor<T>, target: T[], source: Partial<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.push(Object.assign(new model(), instance));\n } else {\n Object.assign(result[index], instance);\n }\n }\n return result;\n};\n\nexport class CrudApi<T extends AbstractModel> {\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>): Promise<GetManyResponseBody<T>> {\n return await this.httpClient.get(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\n }\n\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\n return await this.httpClient.put(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`, body);\n }\n\n async deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\n return await this.httpClient.delete(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\n }\n\n async createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>> {\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\n }\n}\n"],"sourceRoot":""}
@@ -1,4 +1,4 @@
1
- export declare abstract class AbstractErrorHandler {
2
- abstract handle(err: any, component?: any): void;
3
- }
1
+ export declare abstract class AbstractErrorHandler {
2
+ abstract handle(err: any, component?: any): void;
3
+ }
4
4
  //# sourceMappingURL=AbstractErrorHandler.d.ts.map