@clairejs/client 3.1.14 → 3.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/api/CrudApi.d.ts +5 -4
- package/dist/api/CrudApi.d.ts.map +1 -1
- package/dist/api/DefaultHttpClient.d.ts +6 -0
- package/dist/api/DefaultHttpClient.d.ts.map +1 -1
- package/dist/api/RefreshHttpClient.d.ts +5 -8
- package/dist/api/RefreshHttpClient.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
## Change Log
|
|
2
2
|
|
|
3
|
+
#### 3.1.17:
|
|
4
|
+
|
|
5
|
+
- fix HttpClient, allow get with cache, allow retry when get 503 error
|
|
6
|
+
|
|
7
|
+
#### 3.1.15:
|
|
8
|
+
|
|
9
|
+
- mergeInstance accept Identifiable class instead of AbstractModel
|
|
10
|
+
|
|
3
11
|
#### 3.1.14:
|
|
4
12
|
|
|
5
13
|
- using deepMerge for mergeInstances
|
package/dist/api/CrudApi.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, GetManyQueries, GetManyResponseBody, UpdateManyBody, UpdateManyQueries, UpdateManyResponse } from "@clairejs/core";
|
|
1
|
+
import { AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, GetManyQueries, GetManyResponseBody, Identifiable, UpdateManyBody, UpdateManyQueries, UpdateManyResponse } from "@clairejs/core";
|
|
2
2
|
import { AbstractHttpClient } from "./AbstractHttpClient";
|
|
3
3
|
export declare const stringifyQueries: (queries: Record<string, any>) => string;
|
|
4
|
-
export declare const removeInstances: <T extends
|
|
5
|
-
export declare const mergeInstances: <T extends
|
|
4
|
+
export declare const removeInstances: <T extends Identifiable>(target: T[], source: T[]) => T[];
|
|
5
|
+
export declare const mergeInstances: <T extends Identifiable>(model: Constructor<T>, target: T[], source: Partial<T>[]) => T[];
|
|
6
6
|
export declare class CrudApi<T extends AbstractModel> {
|
|
7
7
|
readonly model: Constructor<T>;
|
|
8
8
|
readonly httpClient: AbstractHttpClient;
|
|
9
|
+
private dirty;
|
|
9
10
|
constructor(model: Constructor<T>, httpClient: AbstractHttpClient);
|
|
10
11
|
protected getEndpointBaseUrl(): string;
|
|
11
|
-
getMany(queries?: GetManyQueries<T
|
|
12
|
+
getMany(queries?: GetManyQueries<T>, useCache?: boolean): Promise<GetManyResponseBody<T>>;
|
|
12
13
|
updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>>;
|
|
13
14
|
deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>>;
|
|
14
15
|
createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrudApi.d.ts","sourceRoot":"","sources":["../../src/api/CrudApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EAEtB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,eAAO,MAAM,gBAAgB,YAAa,OAAO,MAAM,EAAE,GAAG,CAAC,WAG5D,CAAC;AAEF,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"CrudApi.d.ts","sourceRoot":"","sources":["../../src/api/CrudApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EAEtB,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,eAAO,MAAM,gBAAgB,YAAa,OAAO,MAAM,EAAE,GAAG,CAAC,WAG5D,CAAC;AAEF,eAAO,MAAM,eAAe,2DAS3B,CAAC;AAEF,eAAO,MAAM,cAAc,2FAW1B,CAAC;AAEF,qBAAa,OAAO,CAAC,CAAC,SAAS,aAAa;IAG5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAAE,QAAQ,CAAC,UAAU,EAAE,kBAAkB;IAFnF,OAAO,CAAC,KAAK,CAAS;gBAED,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAW,UAAU,EAAE,kBAAkB;IAEnF,SAAS,CAAC,kBAAkB;IAItB,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,UAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAatF,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAKnG,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAK1E,UAAU,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;CAIvF"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
import { AbstractLogger } from "@clairejs/core";
|
|
1
2
|
import { AbstractHttpClient } from "./AbstractHttpClient";
|
|
2
3
|
export declare class DefaultHttpClient extends AbstractHttpClient {
|
|
4
|
+
readonly apiServerUrl: string;
|
|
5
|
+
readonly logger: AbstractLogger;
|
|
6
|
+
readonly maxRetryCount: number;
|
|
7
|
+
constructor(apiServerUrl: string, logger: AbstractLogger, maxRetryCount?: number);
|
|
8
|
+
protected retry(apiCall: () => Promise<any>, retryCount?: number): Promise<any>;
|
|
3
9
|
get<T = any>(url: string, headers?: object): Promise<T>;
|
|
4
10
|
post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;
|
|
5
11
|
put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/DefaultHttpClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DefaultHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/DefaultHttpClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,iBAAkB,SAAQ,kBAAkB;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc;IAAE,QAAQ,CAAC,aAAa;gBAA7E,YAAY,EAAE,MAAM,EAAW,MAAM,EAAE,cAAc,EAAW,aAAa,SAAI;cAItF,KAAK,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,GAAE,MAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAelF,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAOvD,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAO1E,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAOzE,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAMnE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AbstractLogger, AccessToken } from "@clairejs/core";
|
|
2
|
-
import { AbstractHttpClient } from "./AbstractHttpClient";
|
|
3
2
|
import { AbstractTokenManager } from "./AbstractTokenManager";
|
|
4
|
-
|
|
3
|
+
import { DefaultHttpClient } from "./DefaultHttpClient";
|
|
4
|
+
export declare class RefreshHttpClient extends DefaultHttpClient {
|
|
5
5
|
readonly apiServerUrl: string;
|
|
6
6
|
readonly logger: AbstractLogger;
|
|
7
7
|
readonly tokenManager: AbstractTokenManager;
|
|
@@ -9,12 +9,9 @@ export declare class RefreshHttpClient extends AbstractHttpClient {
|
|
|
9
9
|
private refreshQueue;
|
|
10
10
|
constructor(apiServerUrl: string, logger: AbstractLogger, tokenManager: AbstractTokenManager);
|
|
11
11
|
protected getRefreshedAccessToken(): Promise<AccessToken | undefined>;
|
|
12
|
-
protected
|
|
13
|
-
|
|
12
|
+
protected resolveHeaders(headers?: object): Promise<{
|
|
13
|
+
authorization: string;
|
|
14
|
+
}>;
|
|
14
15
|
refreshToken(oldToken?: AccessToken): Promise<void>;
|
|
15
|
-
get<R>(url: string, headers?: any): Promise<R>;
|
|
16
|
-
post<T, R>(url: string, body: T, headers?: any): Promise<R>;
|
|
17
|
-
put<T, R>(url: string, body: T, headers?: any): Promise<R>;
|
|
18
|
-
delete<R>(url: string, headers?: any): Promise<R>;
|
|
19
16
|
}
|
|
20
17
|
//# sourceMappingURL=RefreshHttpClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RefreshHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/RefreshHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"RefreshHttpClient.d.ts","sourceRoot":"","sources":["../../src/api/RefreshHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,iBAAkB,SAAQ,iBAAiB;IAOhD,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;cAK/B,uBAAuB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;cAI3D,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM;;;IAczC,YAAY,CAAC,QAAQ,CAAC,EAAE,WAAW;CAiC5C"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{"use strict";var e={560:function(e,t){var n=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractHttpClient=void 0;t.AbstractHttpClient=class AbstractHttpClient{constructor(e){this.apiServerUrl=e}resolveHeaders(e){return n(this,void 0,void 0,(function*(){return e}))}resolveUrl(e){return n(this,void 0,void 0,(function*(){return this.apiServerUrl+e}))}}},805:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},814:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CrudApi=t.mergeInstances=t.removeInstances=t.stringifyQueries=void 0;const i=n(318);t.stringifyQueries=e=>Object.keys(e).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)):(0,i.deepMerge)(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)}))}}},854:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultHttpClient=void 0;const r=n(560),o=i(n(167));class DefaultHttpClient extends r.AbstractHttpClient{get(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield o.default.get(n,{headers:s})).data}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield o.default.post(s,t,{headers:i})).data}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield o.default.put(s,t,{headers:i})).data}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield o.default.delete(n,{headers:s})).data}))}}t.DefaultHttpClient=DefaultHttpClient},375:function(e,t,n){var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultTokenManager=void 0;const o=n(318),a=n(259),l=n(805);let c=class DefaultTokenManager extends l.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}))}};c=s([(0,o.Injectable)(),i("design:paramtypes",[a.AbstractStorage,String])],c),t.DefaultTokenManager=c},390:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.RefreshHttpClient=void 0;const r=i(n(167)),o=n(560);class RefreshHttpClient extends o.AbstractHttpClient{constructor(e,t,n){super(e),this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.refreshing=!1,this.refreshQueue=[]}getRefreshedAccessToken(){return s(this,void 0,void 0,(function*(){}))}resolveResult(e,t){return s(this,void 0,void 0,(function*(){if(!t||!Object.keys(t).map((e=>e.toLowerCase().includes("authorization")))){const e=yield this.tokenManager.getAccessToken();e&&e.expiration<Date.now()+3e4&&(yield this.refreshToken(e))}const n=yield this.finalHeaders(t);return(yield e(n)).data}))}finalHeaders(e){return s(this,void 0,void 0,(function*(){const t=yield this.tokenManager.getAccessToken(),n=yield this.resolveHeaders(e);return{headers:Object.assign({authorization:(null==t?void 0:t.token)||""},n)}}))}refreshToken(e){return s(this,void 0,void 0,(function*(){if(this.refreshing)this.logger.debug("Awaiting refresh token, queued"),yield new Promise((e=>{this.refreshQueue.push({resolver:e})}));else{if(!(e=e||(yield this.tokenManager.getAccessToken()))||!e.refreshToken)return;try{this.refreshing=!0;const e=yield this.getRefreshedAccessToken();yield this.tokenManager.setAccessToken(e),this.logger.debug("Access token was refreshed")}catch(e){this.logger.debug("Cannot refresh access token, clear local token"),yield this.tokenManager.setAccessToken()}finally{this.refreshing=!1;for(const e of this.refreshQueue)e.resolver();this.refreshQueue=[]}}}))}get(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e);return this.logger.debug("[GET] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.get(n,e)}))),t)}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e);return this.logger.debug("[POST] ",i),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.post(i,t,e)}))),n)}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const i=yield this.resolveUrl(e);return this.logger.debug("[PUT] ",i),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.put(i,t,e)}))),n)}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e);return this.logger.debug("[DEL] ",n),this.resolveResult((e=>s(this,void 0,void 0,(function*(){return r.default.delete(n,e)}))),t)}))}}t.RefreshHttpClient=RefreshHttpClient},396:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CURRENT_LANGUAGE=t.SYSTEM_LANGUAGES=void 0,t.SYSTEM_LANGUAGES="SYSTEM_LANGUAGES",t.CURRENT_LANGUAGE="CURRENT_LANGUAGE"},341:function(e,t,n){var s=this&&this.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,s,i)}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),i(n(533),t),i(n(390),t),i(n(854),t),i(n(560),t),i(n(422),t),i(n(548),t),i(n(259),t),i(n(182),t),i(n(332),t),i(n(628),t),i(n(999),t),i(n(23),t),i(n(359),t),i(n(805),t),i(n(819),t),i(n(416),t),i(n(375),t),i(n(814),t)},332:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},628:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},359:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},23:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},999:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},422:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},38:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocket=void 0;t.DefaultClientSocket=class DefaultClientSocket{constructor(e){this.socketManager=e}joinChannels(e){this.socketManager.subChannels(this,e)}leaveChannels(e){this.socketManager.unsubChannels(this,e)}close(){this.socketManager.removeSocket(this)}onReconnect(e){this.socketManager.registerReconnectionHandler(this,e)}onDisconnect(e){this.socketManager.registerDisconnectionHandler(this,e)}onMessage(e){this.socketManager.registerMessageHandler(this,e)}send(e,t){this.socketManager.sendPlainMessageToChannel(e,t)}}},548:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(318),i=n(422),r=n(38);class DefaultClientSocketManager extends i.AbstractClientSocketManager{constructor(e,t,n){super(),this.wsProvider=e,this.logger=t,this.config=n,this.allSockets=[],this.allChannels=[],this.accumulatedPing=0,this.retryDelay=0,this.pingpongId=0,this.pingpong=[]}getPingMs(){const e=this.pingpong.filter((e=>e.sentTimestamp&&e.receivedTimestamp));return e.length?e.map((e=>e.receivedTimestamp-e.sentTimestamp)).reduce(((e,t)=>e+t),0)/e.length:0}subChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");const s=[];for(const e of t){n.registeredChannels.includes(e)||n.registeredChannels.push(e);const t=this.allChannels.find((t=>t.channel===e));t&&t.connected||s.push(e)}this.joinChannels(s)}unsubChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");n.registeredChannels=n.registeredChannels.filter((e=>!t.includes(e)));const s=[];for(const e of t)this.allSockets.find((t=>t.registeredChannels.includes(e)))||s.push(e);this.leaveChannels(s)}removeSocket(e){const t=this.allSockets.find((t=>t.socket===e));t&&t.disconnectionHandler&&t.disconnectionHandler(),this.allSockets=this.allSockets.filter((t=>t.socket!==e)),this.allSockets.length||this.forceDisconnect()}registerReconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.reconnectionHandler=t)}registerDisconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.disconnectionHandler=t)}registerMessageHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.messageHandler=t)}sendPlainMessageToChannel(e,t){if(t){let n=this.allChannels.find((e=>e.channel===t));n||(n={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(n)),n.connected?this.sendRawMessage({type:s.MessageType.PLAIN,data:{channel:t,message:e}}):n.pendingMessages.push(e)}else this.sendRawMessage({type:s.MessageType.PLAIN,data:{message:e}})}joinChannels(e){if(e.length)if(this.socket&&this.socketConnected)this.sendRawMessage({type:s.MessageType.CHANNEL_JOIN,data:e});else for(const t of e){let e=this.allChannels.find((e=>e.channel===t));e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected}}leaveChannels(e){e.length&&(this.handleChannelLeave(e),this.socket&&this.socketConnected&&this.sendRawMessage({type:s.MessageType.CHANNEL_LEAVE,data:e}))}sendPingPong(){this.pingpongId+=1,this.pingpongId%=100;const e={id:this.pingpongId,sentTimestamp:Date.now()};this.pingpong.push(e),this.pingpong.length>10&&this.pingpong.shift(),this.sendRawMessage({type:s.MessageType.PING_PONG,data:e.id})}sendRawMessage(e){if(!this.socket||!this.socketConnected)throw s.ErrorBuilder.error(s.Errors.BAD_STATE,"Socket not available");this.socket.send(e),this.logger.debug("Raw send",e)}handleChannelJoin(e){this.logger.debug("Joinning channels",e);for(const t of e){let e=this.allChannels.find((e=>e.channel===t));if(e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected=!0,e.pendingMessages.length){this.logger.debug(`Flushing ${e.pendingMessages.length} message`);for(const t of e.pendingMessages)this.sendPlainMessageToChannel(t,e.channel);e.pendingMessages=[]}}}handleChannelLeave(e){this.logger.debug("Leaving channels",e),this.allChannels=this.allChannels.filter((t=>!e.includes(t.channel)))}handlePlainMessage(e,t){for(const n of this.allSockets)n.messageHandler&&n.messageHandler(e,t)}handleConnect(){var e,t;this.logger.debug("Socket connected"),this.pingIntervalId&&clearInterval(this.pingIntervalId),this.accumulatedPing=0,this.pingIntervalId=setInterval((()=>{var e,t,n;this.accumulatedPing+=1,this.accumulatedPing>((null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.deadThreshold)||3)?(this.intendedDisconnection=!1,null===(n=this.socket)||void 0===n||n.close()):this.sendPingPong()}),(null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.pingIntervalMs)||1e4),this.intendedDisconnection=!1,this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0);for(const e of this.allSockets)e.reconnectionHandler&&e.reconnectionHandler();const n=this.allChannels.filter((e=>!e.connected)).map((e=>e.channel));this.joinChannels(n)}handleDisconnect(e){e&&(this.intendedDisconnection=!0),this.logger.debug("Socket connnection closed, error: ",e),this.pingIntervalId&&clearInterval(this.pingIntervalId),this.socket=void 0,this.socketConnected=!1;for(const t of this.allSockets)t.disconnectionHandler&&t.disconnectionHandler(e);this.intendedDisconnection?(this.allSockets=[],this.allChannels=[],this.logger.debug("Socket connection terminated")):(this.allChannels=this.allChannels.map((e=>Object.assign(Object.assign({},e),{connected:!1}))),this.retryTimeoutId||(this.retryDelay=0,this.retry()))}handleMessage(e){var t;switch(this.logger.debug("Raw receive",e),e.type){case s.MessageType.READY:this.handleConnect();break;case s.MessageType.PING_PONG:this.accumulatedPing=0;const n=e.data;if(n){const e=this.pingpong.find((e=>e.id===n));e&&(e.receivedTimestamp=Date.now())}break;case s.MessageType.CHANNEL_JOIN:(null===(t=e.data)||void 0===t?void 0:t.error)?this.logger.error("Join channel error",e.data.error):this.handleChannelJoin(e.data);break;case s.MessageType.CHANNEL_LEAVE:this.handleChannelLeave(e.data);break;case s.MessageType.PLAIN:this.handlePlainMessage(e.data.message,e.data.channel)}}create(){const e=new r.DefaultClientSocket(this);return this.allSockets.push({socket:e,registeredChannels:[]}),1===this.allSockets.length&&this.forceReconnect(),e}forceDisconnect(){this.intendedDisconnection=!0,this.socket&&(this.socket.close(),this.socket=void 0),this.retryTimeoutId&&clearTimeout(this.retryTimeoutId)}forceReconnect(){var e;this.intendedDisconnection=!1,this.socketConnected?null===(e=this.socket)||void 0===e||e.close():(this.retryDelay=0,void 0===this.socket&&(this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0),this.physicConnect()))}physicConnect(){this.wsProvider().then((e=>{this.socket=e,this.socket.onopen((()=>{this.socketConnected=!0,this.logger.debug("Physic link connected, sending & waiting for READY message"),this.sendRawMessage({type:s.MessageType.READY,data:""})})),this.socket.onmessage((e=>{const t=JSON.parse(e);t&&t.type?this.handleMessage(t):this.logger.debug("Invalid mesasge structure",e)})),this.socket.onclose((e=>{this.handleDisconnect(e)}))}))}retry(){var e;this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`),this.physicConnect(),this.retryDelay+=(null===(e=this.config)||void 0===e?void 0:e.reconnectTimeDeltaMs)||3e3,this.retryTimeoutId=setTimeout((()=>{this.socketConnected||this.intendedDisconnection||this.retry()}),this.retryDelay)}}t.DefaultClientSocketManager=DefaultClientSocketManager},819:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},259:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},533:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(318);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},182:function(e,t,n){var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Translator=void 0;const o=n(318),a=n(396),l=n(259),keyResolver=e=>`__${e}__`;let c=class Translator{constructor(e){this.storage=e,this.allLangs=null,this.currentLang=null,this.subscribers=[]}init(){return r(this,void 0,void 0,(function*(){const e=yield this.storage.getItem(a.SYSTEM_LANGUAGES);this.allLangs=e||[];const t=yield this.storage.getItem(a.CURRENT_LANGUAGE);t&&this.allLangs.includes(t)&&(this.currentLang=t)}))}exit(){}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(a.CURRENT_LANGUAGE)),this.currentLang}))}setCurrentLanguage(e){return r(this,void 0,void 0,(function*(){this.currentLang=e,yield this.storage.setItem(a.CURRENT_LANGUAGE,e);for(const t of this.subscribers)t(e)}))}getLanguages(){return r(this,void 0,void 0,(function*(){return null==this.allLangs&&(this.allLangs=yield this.storage.getItem(a.SYSTEM_LANGUAGES)),this.allLangs}))}setLanguages(e){return r(this,void 0,void 0,(function*(){yield this.storage.setItem(a.SYSTEM_LANGUAGES,e),this.allLangs=e,null===this.currentLang&&e.length&&(yield this.setCurrentLanguage(e[0]))}))}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}};c=s([(0,o.Injectable)(),(0,o.Initable)(),i("design:paramtypes",[l.AbstractStorage])],c),t.Translator=c},416:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},318:e=>{e.exports=require("@clairejs/core")},167:e=>{e.exports=require("axios")}},t={};var n=function __webpack_require__(n){var s=t[n];if(void 0!==s)return s.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,__webpack_require__),i.exports}(341),s=exports;for(var i in n)s[i]=n[i];n.__esModule&&Object.defineProperty(s,"__esModule",{value:!0})})();
|
|
1
|
+
(()=>{"use strict";var e={560:function(e,t){var n=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractHttpClient=void 0;t.AbstractHttpClient=class AbstractHttpClient{constructor(e){this.apiServerUrl=e}resolveHeaders(e){return n(this,void 0,void 0,(function*(){return e}))}resolveUrl(e){return n(this,void 0,void 0,(function*(){return this.apiServerUrl+e}))}}},805:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractTokenManager=void 0;t.AbstractTokenManager=class AbstractTokenManager{}},814:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CrudApi=t.mergeInstances=t.removeInstances=t.stringifyQueries=void 0;const i=n(318);t.stringifyQueries=e=>Object.keys(e).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)):(0,i.deepMerge)(s[n],t)}return s};t.CrudApi=class CrudApi{constructor(e,t){this.model=e,this.httpClient=t,this.dirty=!1}getEndpointBaseUrl(){return`/${this.model.name.toLowerCase()}`}getMany(e,n=!0){return s(this,void 0,void 0,(function*(){const s=!n||this.dirty;return this.dirty=!1,yield this.httpClient.get(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`,s?{"cache-control":"no-cache"}:void 0)}))}updateMany(e,n){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.put(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(n||{})}`,e)}))}deleteMany(e){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.delete(`${this.getEndpointBaseUrl()}?${(0,t.stringifyQueries)(e||{})}`)}))}createMany(e){return s(this,void 0,void 0,(function*(){return this.dirty=!0,yield this.httpClient.post(`${this.getEndpointBaseUrl()}`,e)}))}}},854:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultHttpClient=void 0;const r=i(n(167)),o=n(560);class DefaultHttpClient extends o.AbstractHttpClient{constructor(e,t,n=1){super(e),this.apiServerUrl=e,this.logger=t,this.maxRetryCount=n}retry(e,t=0){var n;return s(this,void 0,void 0,(function*(){try{return yield e()}catch(s){if(503===(null===(n=s.response)||void 0===n?void 0:n.status)&&t<this.maxRetryCount)return this.logger.debug(`503 error encountered, retrying request ${t+1}`),yield this.retry(e,t+1);throw s}}))}get(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield this.retry((()=>r.default.get(n,{headers:s})))).data}))}post(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield this.retry((()=>r.default.post(s,t,{headers:i})))).data}))}put(e,t,n){return s(this,void 0,void 0,(function*(){const s=yield this.resolveUrl(e),i=yield this.resolveHeaders(n);return(yield this.retry((()=>r.default.put(s,t,{headers:i})))).data}))}delete(e,t){return s(this,void 0,void 0,(function*(){const n=yield this.resolveUrl(e),s=yield this.resolveHeaders(t);return(yield this.retry((()=>r.default.delete(n,{headers:s})))).data}))}}t.DefaultHttpClient=DefaultHttpClient},375:function(e,t,n){var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultTokenManager=void 0;const o=n(318),a=n(259),c=n(805);let l=class DefaultTokenManager extends c.AbstractTokenManager{constructor(e,t="ACCESS_TOKEN"){super(),this.storage=e,this.storageKey=t,this.accessToken=null}getAccessToken(){return r(this,void 0,void 0,(function*(){return null===this.accessToken&&(this.accessToken=yield this.storage.getItem(this.storageKey)),this.accessToken}))}setAccessToken(e){return r(this,void 0,void 0,(function*(){e?yield this.storage.setItem(this.storageKey,e):yield this.storage.deleteItem(this.storageKey),this.accessToken=e}))}};l=s([(0,o.Injectable)(),i("design:paramtypes",[a.AbstractStorage,String])],l),t.DefaultTokenManager=l},390:function(e,t,n){var s=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.RefreshHttpClient=void 0;const i=n(854);class RefreshHttpClient extends i.DefaultHttpClient{constructor(e,t,n){super(e,t),this.apiServerUrl=e,this.logger=t,this.tokenManager=n,this.refreshing=!1,this.refreshQueue=[]}getRefreshedAccessToken(){return s(this,void 0,void 0,(function*(){}))}resolveHeaders(e){const t=Object.create(null,{resolveHeaders:{get:()=>super.resolveHeaders}});return s(this,void 0,void 0,(function*(){if(!e||!Object.keys(e).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.tokenManager.getAccessToken(),s=yield t.resolveHeaders.call(this,e);return Object.assign({authorization:(null==n?void 0:n.token)||""},s)}))}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=[]}}}))}}t.RefreshHttpClient=RefreshHttpClient},396:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CURRENT_LANGUAGE=t.SYSTEM_LANGUAGES=void 0,t.SYSTEM_LANGUAGES="SYSTEM_LANGUAGES",t.CURRENT_LANGUAGE="CURRENT_LANGUAGE"},341:function(e,t,n){var s=this&&this.__createBinding||(Object.create?function(e,t,n,s){void 0===s&&(s=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,s,i)}:function(e,t,n,s){void 0===s&&(s=n),e[s]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||s(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),i(n(533),t),i(n(390),t),i(n(854),t),i(n(560),t),i(n(422),t),i(n(548),t),i(n(259),t),i(n(182),t),i(n(332),t),i(n(628),t),i(n(999),t),i(n(23),t),i(n(359),t),i(n(805),t),i(n(819),t),i(n(416),t),i(n(375),t),i(n(814),t)},332:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractErrorHandler=void 0;t.AbstractErrorHandler=class AbstractErrorHandler{}},628:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractViewMiddleware=void 0;t.AbstractViewMiddleware=class AbstractViewMiddleware{}},359:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},23:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},999:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},422:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractClientSocketManager=void 0;t.AbstractClientSocketManager=class AbstractClientSocketManager{}},38:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocket=void 0;t.DefaultClientSocket=class DefaultClientSocket{constructor(e){this.socketManager=e}joinChannels(e){this.socketManager.subChannels(this,e)}leaveChannels(e){this.socketManager.unsubChannels(this,e)}close(){this.socketManager.removeSocket(this)}onReconnect(e){this.socketManager.registerReconnectionHandler(this,e)}onDisconnect(e){this.socketManager.registerDisconnectionHandler(this,e)}onMessage(e){this.socketManager.registerMessageHandler(this,e)}send(e,t){this.socketManager.sendPlainMessageToChannel(e,t)}}},548:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultClientSocketManager=void 0;const s=n(318),i=n(422),r=n(38);class DefaultClientSocketManager extends i.AbstractClientSocketManager{constructor(e,t,n){super(),this.wsProvider=e,this.logger=t,this.config=n,this.allSockets=[],this.allChannels=[],this.accumulatedPing=0,this.retryDelay=0,this.pingpongId=0,this.pingpong=[]}getPingMs(){const e=this.pingpong.filter((e=>e.sentTimestamp&&e.receivedTimestamp));return e.length?e.map((e=>e.receivedTimestamp-e.sentTimestamp)).reduce(((e,t)=>e+t),0)/e.length:0}subChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");const s=[];for(const e of t){n.registeredChannels.includes(e)||n.registeredChannels.push(e);const t=this.allChannels.find((t=>t.channel===e));t&&t.connected||s.push(e)}this.joinChannels(s)}unsubChannels(e,t){const n=this.allSockets.find((t=>t.socket===e));if(!n)return void this.logger.debug("Socket not found");n.registeredChannels=n.registeredChannels.filter((e=>!t.includes(e)));const s=[];for(const e of t)this.allSockets.find((t=>t.registeredChannels.includes(e)))||s.push(e);this.leaveChannels(s)}removeSocket(e){const t=this.allSockets.find((t=>t.socket===e));t&&t.disconnectionHandler&&t.disconnectionHandler(),this.allSockets=this.allSockets.filter((t=>t.socket!==e)),this.allSockets.length||this.forceDisconnect()}registerReconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.reconnectionHandler=t)}registerDisconnectionHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.disconnectionHandler=t)}registerMessageHandler(e,t){const n=this.allSockets.find((t=>t.socket===e));n&&(n.messageHandler=t)}sendPlainMessageToChannel(e,t){if(t){let n=this.allChannels.find((e=>e.channel===t));n||(n={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(n)),n.connected?this.sendRawMessage({type:s.MessageType.PLAIN,data:{channel:t,message:e}}):n.pendingMessages.push(e)}else this.sendRawMessage({type:s.MessageType.PLAIN,data:{message:e}})}joinChannels(e){if(e.length)if(this.socket&&this.socketConnected)this.sendRawMessage({type:s.MessageType.CHANNEL_JOIN,data:e});else for(const t of e){let e=this.allChannels.find((e=>e.channel===t));e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected}}leaveChannels(e){e.length&&(this.handleChannelLeave(e),this.socket&&this.socketConnected&&this.sendRawMessage({type:s.MessageType.CHANNEL_LEAVE,data:e}))}sendPingPong(){this.pingpongId+=1,this.pingpongId%=100;const e={id:this.pingpongId,sentTimestamp:Date.now()};this.pingpong.push(e),this.pingpong.length>10&&this.pingpong.shift(),this.sendRawMessage({type:s.MessageType.PING_PONG,data:e.id})}sendRawMessage(e){if(!this.socket||!this.socketConnected)throw s.ErrorBuilder.error(s.Errors.BAD_STATE,"Socket not available");this.socket.send(e),this.logger.debug("Raw send",e)}handleChannelJoin(e){this.logger.debug("Joinning channels",e);for(const t of e){let e=this.allChannels.find((e=>e.channel===t));if(e||(e={channel:t,connected:!1,pendingMessages:[]},this.allChannels.push(e)),e.connected=!0,e.pendingMessages.length){this.logger.debug(`Flushing ${e.pendingMessages.length} message`);for(const t of e.pendingMessages)this.sendPlainMessageToChannel(t,e.channel);e.pendingMessages=[]}}}handleChannelLeave(e){this.logger.debug("Leaving channels",e),this.allChannels=this.allChannels.filter((t=>!e.includes(t.channel)))}handlePlainMessage(e,t){for(const n of this.allSockets)n.messageHandler&&n.messageHandler(e,t)}handleConnect(){var e,t;this.logger.debug("Socket connected"),this.pingIntervalId&&clearInterval(this.pingIntervalId),this.accumulatedPing=0,this.pingIntervalId=setInterval((()=>{var e,t,n;this.accumulatedPing+=1,this.accumulatedPing>((null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.deadThreshold)||3)?(this.intendedDisconnection=!1,null===(n=this.socket)||void 0===n||n.close()):this.sendPingPong()}),(null===(t=null===(e=this.config)||void 0===e?void 0:e.keepAlive)||void 0===t?void 0:t.pingIntervalMs)||1e4),this.intendedDisconnection=!1,this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0);for(const e of this.allSockets)e.reconnectionHandler&&e.reconnectionHandler();const n=this.allChannels.filter((e=>!e.connected)).map((e=>e.channel));this.joinChannels(n)}handleDisconnect(e){e&&(this.intendedDisconnection=!0),this.logger.debug("Socket connnection closed, error: ",e),this.pingIntervalId&&clearInterval(this.pingIntervalId),this.socket=void 0,this.socketConnected=!1;for(const t of this.allSockets)t.disconnectionHandler&&t.disconnectionHandler(e);this.intendedDisconnection?(this.allSockets=[],this.allChannels=[],this.logger.debug("Socket connection terminated")):(this.allChannels=this.allChannels.map((e=>Object.assign(Object.assign({},e),{connected:!1}))),this.retryTimeoutId||(this.retryDelay=0,this.retry()))}handleMessage(e){var t;switch(this.logger.debug("Raw receive",e),e.type){case s.MessageType.READY:this.handleConnect();break;case s.MessageType.PING_PONG:this.accumulatedPing=0;const n=e.data;if(n){const e=this.pingpong.find((e=>e.id===n));e&&(e.receivedTimestamp=Date.now())}break;case s.MessageType.CHANNEL_JOIN:(null===(t=e.data)||void 0===t?void 0:t.error)?this.logger.error("Join channel error",e.data.error):this.handleChannelJoin(e.data);break;case s.MessageType.CHANNEL_LEAVE:this.handleChannelLeave(e.data);break;case s.MessageType.PLAIN:this.handlePlainMessage(e.data.message,e.data.channel)}}create(){const e=new r.DefaultClientSocket(this);return this.allSockets.push({socket:e,registeredChannels:[]}),1===this.allSockets.length&&this.forceReconnect(),e}forceDisconnect(){this.intendedDisconnection=!0,this.socket&&(this.socket.close(),this.socket=void 0),this.retryTimeoutId&&clearTimeout(this.retryTimeoutId)}forceReconnect(){var e;this.intendedDisconnection=!1,this.socketConnected?null===(e=this.socket)||void 0===e||e.close():(this.retryDelay=0,void 0===this.socket&&(this.retryTimeoutId&&(clearTimeout(this.retryTimeoutId),this.retryTimeoutId=void 0),this.physicConnect()))}physicConnect(){this.wsProvider().then((e=>{this.socket=e,this.socket.onopen((()=>{this.socketConnected=!0,this.logger.debug("Physic link connected, sending & waiting for READY message"),this.sendRawMessage({type:s.MessageType.READY,data:""})})),this.socket.onmessage((e=>{const t=JSON.parse(e);t&&t.type?this.handleMessage(t):this.logger.debug("Invalid mesasge structure",e)})),this.socket.onclose((e=>{this.handleDisconnect(e)}))}))}retry(){var e;this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`),this.physicConnect(),this.retryDelay+=(null===(e=this.config)||void 0===e?void 0:e.reconnectTimeDeltaMs)||3e3,this.retryTimeoutId=setTimeout((()=>{this.socketConnected||this.intendedDisconnection||this.retry()}),this.retryDelay)}}t.DefaultClientSocketManager=DefaultClientSocketManager},819:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},259:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AbstractStorage=void 0;t.AbstractStorage=class AbstractStorage{}},533:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClaireClient=void 0;const s=n(318);class ClaireClient extends s.ClaireApp{}t.ClaireClient=ClaireClient},182:function(e,t,n){var s=this&&this.__decorate||function(e,t,n,s){var i,r=arguments.length,o=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,n):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__awaiter||function(e,t,n,s){return new(n||(n=Promise))((function(i,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){e.done?i(e.value):function adopt(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.Translator=void 0;const o=n(318),a=n(396),c=n(259),keyResolver=e=>`__${e}__`;let l=class Translator{constructor(e){this.storage=e,this.allLangs=null,this.currentLang=null,this.subscribers=[]}init(){return r(this,void 0,void 0,(function*(){const e=yield this.storage.getItem(a.SYSTEM_LANGUAGES);this.allLangs=e||[];const t=yield this.storage.getItem(a.CURRENT_LANGUAGE);t&&this.allLangs.includes(t)&&(this.currentLang=t)}))}exit(){}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(a.CURRENT_LANGUAGE)),this.currentLang}))}setCurrentLanguage(e){return r(this,void 0,void 0,(function*(){this.currentLang=e,yield this.storage.setItem(a.CURRENT_LANGUAGE,e);for(const t of this.subscribers)t(e)}))}getLanguages(){return r(this,void 0,void 0,(function*(){return null==this.allLangs&&(this.allLangs=yield this.storage.getItem(a.SYSTEM_LANGUAGES)),this.allLangs}))}setLanguages(e){return r(this,void 0,void 0,(function*(){yield this.storage.setItem(a.SYSTEM_LANGUAGES,e),this.allLangs=e,null===this.currentLang&&e.length&&(yield this.setCurrentLanguage(e[0]))}))}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)(),(0,o.Initable)(),i("design:paramtypes",[c.AbstractStorage])],l),t.Translator=l},416:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},318:e=>{e.exports=require("@clairejs/core")},167:e=>{e.exports=require("axios")}},t={};var n=function __webpack_require__(n){var s=t[n];if(void 0!==s)return s.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,__webpack_require__),i.exports}(341),s=exports;for(var i in n)s[i]=n[i];n.__esModule&&Object.defineProperty(s,"__esModule",{value:!0})})();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://@clairejs/client/./src/api/AbstractHttpClient.ts","webpack://@clairejs/client/./src/api/AbstractTokenManager.ts","webpack://@clairejs/client/./src/api/CrudApi.ts","webpack://@clairejs/client/./src/api/DefaultHttpClient.ts","webpack://@clairejs/client/./src/api/DefaultTokenManager.ts","webpack://@clairejs/client/./src/api/RefreshHttpClient.ts","webpack://@clairejs/client/./src/constants.ts","webpack://@clairejs/client/./src/index.ts","webpack://@clairejs/client/./src/routing/AbstractErrorHandler.ts","webpack://@clairejs/client/./src/routing/AbstractViewMiddleware.ts","webpack://@clairejs/client/./src/socket/AbstractClientSocketManager.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocket.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocketManager.ts","webpack://@clairejs/client/./src/system/AbstractStorage.ts","webpack://@clairejs/client/./src/system/ClaireClient.ts","webpack://@clairejs/client/./src/translation/Translator.ts","webpack://@clairejs/client/external commonjs \"@clairejs/core\"","webpack://@clairejs/client/external commonjs \"axios\"","webpack://@clairejs/client/webpack/bootstrap","webpack://@clairejs/client/webpack/startup"],"sourcesContent":["export abstract class AbstractHttpClient {\r\n constructor(readonly apiServerUrl: string) {}\r\n\r\n protected async resolveHeaders(headers?: object): Promise<object | undefined> {\r\n return headers;\r\n }\r\n\r\n protected async resolveUrl(url: string): Promise<string> {\r\n return this.apiServerUrl + url;\r\n }\r\n\r\n abstract get<T = any>(url: string, headers?: object): Promise<T>;\r\n abstract post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract delete<T = any>(url: string, headers?: object): Promise<T>;\r\n}\r\n","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","import {\r\n AbstractModel,\r\n Constructor,\r\n CreateManyRequestBody,\r\n CreateManyResponseBody,\r\n deepMerge,\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 deepMerge(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","import { AbstractHttpClient } from \"./AbstractHttpClient\";\r\nimport axios from \"axios\";\r\n\r\nexport class DefaultHttpClient extends AbstractHttpClient {\r\n async get<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.get(finalUrl, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.post(finalUrl, body, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.put(finalUrl, body, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n\r\n async delete<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await axios.delete(finalUrl, { headers: finalHeaders });\r\n return result.data;\r\n }\r\n}\r\n","import { 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 { AbstractLogger, AccessToken } from \"@clairejs/core\";\r\nimport axios from \"axios\";\r\n\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\n\r\nexport class RefreshHttpClient extends AbstractHttpClient {\r\n private refreshing = false;\r\n private refreshQueue: {\r\n resolver: () => void;\r\n }[] = [];\r\n\r\n public constructor(\r\n readonly apiServerUrl: string,\r\n readonly logger: AbstractLogger,\r\n readonly tokenManager: AbstractTokenManager,\r\n ) {\r\n super(apiServerUrl);\r\n }\r\n\r\n protected async getRefreshedAccessToken(): Promise<AccessToken | undefined> {\r\n return undefined;\r\n }\r\n\r\n protected async resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any> {\r\n //-- request does not explicitely provide authorization header, resolve automatically\r\n if (!headers || !Object.keys(headers).map((k) => k.toLowerCase().includes(\"authorization\"))) {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n //-- 30s buffer\r\n if (accessToken && accessToken.expiration < Date.now() + 30000) {\r\n await this.refreshToken(accessToken);\r\n }\r\n }\r\n const finalHeaders = await this.finalHeaders(headers);\r\n return (await apiCall(finalHeaders)).data;\r\n }\r\n\r\n private async finalHeaders(headers: object): Promise<any> {\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n const userHeaders = await this.resolveHeaders(headers);\r\n return { headers: { authorization: accessToken?.token || \"\", ...userHeaders } };\r\n }\r\n\r\n async refreshToken(oldToken?: AccessToken) {\r\n if (this.refreshing) {\r\n this.logger.debug(\"Awaiting refresh token, queued\");\r\n await new Promise<void>((resolve) => {\r\n this.refreshQueue.push({ resolver: resolve });\r\n });\r\n } else {\r\n oldToken = oldToken || (await this.tokenManager.getAccessToken());\r\n //-- call to api server to refresh token\r\n if (!oldToken || !oldToken.refreshToken) {\r\n //-- there is no refresh token to refresh\r\n return;\r\n }\r\n\r\n try {\r\n this.refreshing = true;\r\n const newToken = await this.getRefreshedAccessToken();\r\n await this.tokenManager.setAccessToken(newToken);\r\n this.logger.debug(\"Access token was refreshed\");\r\n } catch (err) {\r\n //-- cannot refresh access token, clear old token\r\n this.logger.debug(\"Cannot refresh access token, clear local token\");\r\n await this.tokenManager.setAccessToken();\r\n } finally {\r\n this.refreshing = false;\r\n for (const refresh of this.refreshQueue) {\r\n refresh.resolver();\r\n }\r\n //-- clear queue\r\n this.refreshQueue = [];\r\n }\r\n }\r\n }\r\n\r\n public async get<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[GET] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.get(finalUrl, headers), headers);\r\n }\r\n public async post<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[POST] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.post(finalUrl, body, headers), headers);\r\n }\r\n public async put<T, R>(url: string, body: T, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[PUT] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.put(finalUrl, body, headers), headers);\r\n }\r\n\r\n public async delete<R>(url: string, headers?: any): Promise<R> {\r\n const finalUrl = await this.resolveUrl(url);\r\n this.logger.debug(\"[DEL] \", finalUrl);\r\n return this.resolveResult(async (headers) => axios.delete(finalUrl, headers), headers);\r\n }\r\n}\r\n","export const SYSTEM_LANGUAGES = \"SYSTEM_LANGUAGES\";\r\nexport const CURRENT_LANGUAGE = \"CURRENT_LANGUAGE\";\r\n","export * from \"./system/ClaireClient\";\r\nexport * from \"./api/RefreshHttpClient\";\r\nexport * from \"./api/DefaultHttpClient\";\r\nexport * from \"./api/AbstractHttpClient\";\r\nexport * from \"./socket/AbstractClientSocketManager\";\r\nexport * from \"./socket/DefaultClientSocketManager\";\r\nexport * from \"./system/AbstractStorage\";\r\nexport * from \"./translation/Translator\";\r\nexport * from \"./routing/AbstractErrorHandler\";\r\nexport * from \"./routing/AbstractViewMiddleware\";\r\nexport * from \"./routing/UrlInfo\";\r\nexport * from \"./routing/RouterConfig\";\r\nexport * from \"./routing/ComponentInfo\";\r\nexport * from \"./api/AbstractTokenManager\";\r\nexport * from \"./socket/IWebSocket\";\r\nexport * from \"./translation/types\";\r\nexport * from \"./api/DefaultTokenManager\";\r\nexport * from \"./api/CrudApi\";\r\n","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 { IClientSocket } from \"@clairejs/core\";\r\n\r\nexport abstract class AbstractClientSocketManager {\r\n abstract create(): IClientSocket;\r\n abstract joinChannels(channels: string[]): void;\r\n abstract leaveChannels(channels: string[]): void;\r\n abstract getPingMs(): number;\r\n}\r\n","import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from \"@clairejs/core\";\r\nimport { DefaultClientSocketManager } from \"./DefaultClientSocketManager\";\r\n\r\nexport class DefaultClientSocket implements IClientSocket {\r\n constructor(readonly socketManager: DefaultClientSocketManager) {}\r\n\r\n joinChannels(channels: string[]): void {\r\n this.socketManager.subChannels(this, channels);\r\n }\r\n\r\n leaveChannels(channels: string[]): void {\r\n this.socketManager.unsubChannels(this, channels);\r\n }\r\n\r\n close(): void {\r\n this.socketManager.removeSocket(this);\r\n }\r\n\r\n onReconnect(handler: ReconnectionHandler): void {\r\n this.socketManager.registerReconnectionHandler(this, handler);\r\n }\r\n\r\n onDisconnect(handler: DisconnectionHandler): void {\r\n this.socketManager.registerDisconnectionHandler(this, handler);\r\n }\r\n\r\n onMessage(handler: PlainMessageHandler): void {\r\n this.socketManager.registerMessageHandler(this, handler);\r\n }\r\n\r\n send(message: any, channel?: string): void {\r\n this.socketManager.sendPlainMessageToChannel(message, channel);\r\n }\r\n}\r\n","import {\r\n AbstractLogger,\r\n ErrorBuilder,\r\n Errors,\r\n MessageType,\r\n SocketMessage,\r\n DisconnectionHandler,\r\n IClientSocket,\r\n PlainMessageHandler,\r\n ReconnectionHandler,\r\n} from \"@clairejs/core\";\r\n\r\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\r\nimport { SocketConfig } from \"./SocketConfig\";\r\nimport { DefaultClientSocket } from \"./DefaultClientSocket\";\r\nimport { IWebSocket } from \"./IWebSocket\";\r\n\r\nconst pingpongMaxCount = 10;\r\n\r\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\r\n private socket?: IWebSocket;\r\n\r\n private allSockets: {\r\n socket: DefaultClientSocket;\r\n registeredChannels: string[];\r\n reconnectionHandler?: ReconnectionHandler;\r\n disconnectionHandler?: DisconnectionHandler;\r\n messageHandler?: PlainMessageHandler;\r\n }[] = [];\r\n\r\n private allChannels: { channel: string; connected: boolean; pendingMessages: any[] }[] = [];\r\n\r\n private socketConnected?: boolean;\r\n private pingIntervalId?: any;\r\n private retryTimeoutId?: any;\r\n private accumulatedPing = 0;\r\n private retryDelay = 0;\r\n private intendedDisconnection?: boolean;\r\n private pingpongId = 0;\r\n\r\n public pingpong: { id: number; sentTimestamp: number; receivedTimestamp?: number }[] = [];\r\n\r\n constructor(\r\n private readonly wsProvider: () => Promise<IWebSocket>,\r\n private readonly logger: AbstractLogger,\r\n private readonly config?: SocketConfig,\r\n ) {\r\n super();\r\n }\r\n\r\n getPingMs(): number {\r\n const candidates = this.pingpong.filter((pp) => pp.sentTimestamp && pp.receivedTimestamp);\r\n if (!candidates.length) {\r\n return 0;\r\n }\r\n return (\r\n candidates.map((pp) => pp.receivedTimestamp! - pp.sentTimestamp).reduce((total, diff) => total + diff, 0) /\r\n candidates.length\r\n );\r\n }\r\n\r\n subChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n //-- un-connected channels\r\n const unconnectedChannels: string[] = [];\r\n for (const channel of channels) {\r\n if (!info.registeredChannels.includes(channel)) {\r\n info.registeredChannels.push(channel);\r\n }\r\n const foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel || !foundChannel.connected) {\r\n unconnectedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.joinChannels(unconnectedChannels);\r\n }\r\n\r\n unsubChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));\r\n\r\n //-- check if no one is subscribing these channel then remove\r\n const removedChannels: string[] = [];\r\n for (const channel of channels) {\r\n //-- no one is listening\r\n if (!this.allSockets.find((socket) => socket.registeredChannels.includes(channel))) {\r\n removedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.leaveChannels(removedChannels);\r\n }\r\n\r\n removeSocket(socket: DefaultClientSocket) {\r\n const socketInfo = this.allSockets.find((s) => s.socket === socket);\r\n if (socketInfo && socketInfo.disconnectionHandler) {\r\n socketInfo.disconnectionHandler();\r\n }\r\n\r\n this.allSockets = this.allSockets.filter((s) => s.socket !== socket);\r\n if (!this.allSockets.length) {\r\n this.forceDisconnect();\r\n }\r\n }\r\n\r\n registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.reconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.disconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.messageHandler = handler;\r\n }\r\n }\r\n\r\n sendPlainMessageToChannel(message: any, channel?: string) {\r\n if (channel) {\r\n //-- check if channel has been connected\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n if (foundChannel.connected) {\r\n //-- send\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: { channel, message },\r\n });\r\n } else {\r\n foundChannel.pendingMessages.push(message);\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: {\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n\r\n joinChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n if (!this.socket || !this.socketConnected) {\r\n //-- create pending channels\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n\r\n ///-- this channel is already connected, skip\r\n if (foundChannel.connected) {\r\n continue;\r\n }\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_JOIN,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n leaveChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n this.handleChannelLeave(channels);\r\n\r\n if (this.socket && this.socketConnected) {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_LEAVE,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n private sendPingPong() {\r\n this.pingpongId += 1;\r\n this.pingpongId %= 100;\r\n const pingpongInfo = { id: this.pingpongId, sentTimestamp: Date.now() };\r\n this.pingpong.push(pingpongInfo);\r\n\r\n if (this.pingpong.length > pingpongMaxCount) {\r\n this.pingpong.shift();\r\n }\r\n\r\n this.sendRawMessage({\r\n type: MessageType.PING_PONG,\r\n data: pingpongInfo.id,\r\n });\r\n }\r\n\r\n private sendRawMessage(message: SocketMessage) {\r\n if (!this.socket || !this.socketConnected) {\r\n throw ErrorBuilder.error(Errors.BAD_STATE, \"Socket not available\");\r\n }\r\n this.socket.send(message);\r\n this.logger.debug(\"Raw send\", message);\r\n }\r\n\r\n private handleChannelJoin(channels: string[]) {\r\n this.logger.debug(\"Joinning channels\", channels);\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n foundChannel.connected = true;\r\n\r\n //-- flush messages\r\n if (foundChannel.pendingMessages.length) {\r\n this.logger.debug(`Flushing ${foundChannel.pendingMessages.length} message`);\r\n for (const message of foundChannel.pendingMessages) {\r\n this.sendPlainMessageToChannel(message, foundChannel.channel);\r\n }\r\n foundChannel.pendingMessages = [];\r\n }\r\n }\r\n }\r\n\r\n private handleChannelLeave(channels: string[]) {\r\n this.logger.debug(\"Leaving channels\", channels);\r\n this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));\r\n }\r\n\r\n private handlePlainMessage(message: any, channel?: string) {\r\n for (const socket of this.allSockets) {\r\n socket.messageHandler && socket.messageHandler(message, channel);\r\n }\r\n }\r\n\r\n private handleConnect() {\r\n this.logger.debug(\"Socket connected\");\r\n\r\n //-- socket open, set interval\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.accumulatedPing = 0;\r\n this.pingIntervalId = setInterval(() => {\r\n this.accumulatedPing += 1;\r\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreshold || 3)) {\r\n //-- socket connection lost, not intended\r\n this.intendedDisconnection = false;\r\n this.socket?.close();\r\n } else {\r\n this.sendPingPong();\r\n }\r\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\r\n\r\n this.intendedDisconnection = false;\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n\r\n for (const socket of this.allSockets) {\r\n socket.reconnectionHandler && socket.reconnectionHandler();\r\n }\r\n\r\n //-- try join pending channels\r\n const pendingChannels = this.allChannels.filter((c) => !c.connected).map((c) => c.channel);\r\n this.joinChannels(pendingChannels);\r\n }\r\n\r\n private handleDisconnect(err?: any) {\r\n if (err) {\r\n this.intendedDisconnection = true;\r\n }\r\n\r\n this.logger.debug(\"Socket connnection closed, error: \", err);\r\n\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.socket = undefined;\r\n this.socketConnected = false;\r\n\r\n for (const socket of this.allSockets) {\r\n socket.disconnectionHandler && socket.disconnectionHandler(err);\r\n }\r\n\r\n if (this.intendedDisconnection) {\r\n //-- remove all channels\r\n this.allSockets = [];\r\n this.allChannels = [];\r\n this.logger.debug(\"Socket connection terminated\");\r\n } else {\r\n //-- disconnect all channels to be reconnected when the socket is connected again\r\n this.allChannels = this.allChannels.map((c) => ({ ...c, connected: false }));\r\n if (!this.retryTimeoutId) {\r\n this.retryDelay = 0;\r\n this.retry();\r\n }\r\n }\r\n }\r\n\r\n private handleMessage(message: SocketMessage) {\r\n this.logger.debug(\"Raw receive\", message);\r\n switch (message.type) {\r\n case MessageType.READY:\r\n this.handleConnect();\r\n break;\r\n case MessageType.PING_PONG:\r\n this.accumulatedPing = 0;\r\n const id = message.data;\r\n if (id) {\r\n const pong = this.pingpong.find((pp) => pp.id === id);\r\n if (pong) {\r\n pong.receivedTimestamp = Date.now();\r\n }\r\n }\r\n break;\r\n case MessageType.CHANNEL_JOIN:\r\n if (message.data?.error) {\r\n this.logger.error(\"Join channel error\", message.data.error);\r\n } else {\r\n this.handleChannelJoin(message.data);\r\n }\r\n break;\r\n case MessageType.CHANNEL_LEAVE:\r\n this.handleChannelLeave(message.data);\r\n break;\r\n case MessageType.PLAIN:\r\n this.handlePlainMessage(message.data.message, message.data.channel);\r\n break;\r\n }\r\n }\r\n\r\n create(): IClientSocket {\r\n const socket = new DefaultClientSocket(this);\r\n\r\n this.allSockets.push({ socket, registeredChannels: [] });\r\n\r\n if (this.allSockets.length === 1) {\r\n this.forceReconnect();\r\n }\r\n\r\n return socket;\r\n }\r\n\r\n forceDisconnect() {\r\n this.intendedDisconnection = true;\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n }\r\n }\r\n\r\n forceReconnect(): void {\r\n this.intendedDisconnection = false;\r\n if (this.socketConnected) {\r\n this.socket?.close();\r\n } else {\r\n this.retryDelay = 0;\r\n if (this.socket === undefined) {\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n this.physicConnect();\r\n }\r\n }\r\n }\r\n\r\n private physicConnect() {\r\n this.wsProvider().then((socket) => {\r\n this.socket = socket;\r\n\r\n this.socket.onopen(() => {\r\n this.socketConnected = true;\r\n this.logger.debug(\"Physic link connected, sending & waiting for READY message\");\r\n this.sendRawMessage({\r\n type: MessageType.READY,\r\n data: \"\",\r\n });\r\n });\r\n\r\n this.socket.onmessage((data) => {\r\n const message: SocketMessage = JSON.parse(data);\r\n if (!message || !message.type) {\r\n this.logger.debug(\"Invalid mesasge structure\", data);\r\n return;\r\n }\r\n\r\n this.handleMessage(message);\r\n });\r\n\r\n this.socket.onclose((err) => {\r\n this.handleDisconnect(err);\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.physicConnect();\r\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\r\n this.retryTimeoutId = setTimeout(() => {\r\n if (!this.socketConnected && !this.intendedDisconnection) {\r\n this.retry();\r\n }\r\n }, this.retryDelay);\r\n }\r\n}\r\n","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 { ClaireApp } from \"@clairejs/core\";\r\n\r\nexport class ClaireClient extends ClaireApp {}\r\n","import { IInit, Initable, 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\n@Initable()\r\nexport class Translator implements IInit {\r\n allLangs: string[] = null!;\r\n currentLang?: string = null!;\r\n subscribers: LangSubscriber[] = [];\r\n\r\n constructor(readonly storage: AbstractStorage) {}\r\n\r\n async init(): Promise<void> {\r\n const allLangs = await this.storage.getItem(SYSTEM_LANGUAGES);\r\n this.allLangs = (allLangs || []) as string[];\r\n\r\n const keyValue = (await this.storage.getItem(CURRENT_LANGUAGE)) as string;\r\n if (keyValue && this.allLangs.includes(keyValue)) {\r\n this.currentLang = keyValue;\r\n }\r\n }\r\n\r\n exit(): void {}\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);\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 if (this.allLangs == null) {\r\n this.allLangs = (await this.storage.getItem(SYSTEM_LANGUAGES)) as string[];\r\n }\r\n return this.allLangs;\r\n }\r\n\r\n async setLanguages(languages: string[]) {\r\n await this.storage.setItem(SYSTEM_LANGUAGES, languages);\r\n this.allLangs = languages;\r\n if (this.currentLang === null && languages.length) {\r\n await this.setCurrentLanguage(languages[0]);\r\n }\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","module.exports = require(\"@clairejs/core\");","module.exports = require(\"axios\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(341);\n"],"names":["AbstractHttpClient","constructor","apiServerUrl","resolveHeaders","headers","resolveUrl","url","this","AbstractTokenManager","stringifyQueries","queries","Object","keys","reduce","collector","key","JSON","stringify","removeInstances","target","source","result","slice","instance","index","findIndex","i","id","splice","mergeInstances","model","push","assign","deepMerge","CrudApi","httpClient","getEndpointBaseUrl","name","toLowerCase","getMany","get","updateMany","body","put","deleteMany","delete","createMany","post","DefaultHttpClient","finalUrl","finalHeaders","data","DefaultTokenManager","storage","storageKey","super","accessToken","getAccessToken","getItem","setAccessToken","token","setItem","deleteItem","Injectable","AbstractStorage","RefreshHttpClient","logger","tokenManager","refreshing","refreshQueue","getRefreshedAccessToken","resolveResult","apiCall","map","k","includes","expiration","Date","now","refreshToken","userHeaders","authorization","oldToken","debug","Promise","resolve","resolver","newToken","err","refresh","SYSTEM_LANGUAGES","CURRENT_LANGUAGE","AbstractErrorHandler","AbstractViewMiddleware","AbstractClientSocketManager","DefaultClientSocket","socketManager","joinChannels","channels","subChannels","leaveChannels","unsubChannels","close","removeSocket","onReconnect","handler","registerReconnectionHandler","onDisconnect","registerDisconnectionHandler","onMessage","registerMessageHandler","send","message","channel","sendPlainMessageToChannel","DefaultClientSocketManager","wsProvider","config","allSockets","allChannels","accumulatedPing","retryDelay","pingpongId","pingpong","getPingMs","candidates","filter","pp","sentTimestamp","receivedTimestamp","length","total","diff","socket","info","find","s","unconnectedChannels","registeredChannels","foundChannel","c","connected","removedChannels","socketInfo","disconnectionHandler","forceDisconnect","reconnectionHandler","messageHandler","pendingMessages","sendRawMessage","type","MessageType","PLAIN","socketConnected","CHANNEL_JOIN","handleChannelLeave","CHANNEL_LEAVE","sendPingPong","pingpongInfo","shift","PING_PONG","ErrorBuilder","error","Errors","BAD_STATE","handleChannelJoin","handlePlainMessage","handleConnect","pingIntervalId","clearInterval","setInterval","keepAlive","deadThreshold","intendedDisconnection","pingIntervalMs","retryTimeoutId","clearTimeout","undefined","pendingChannels","handleDisconnect","retry","handleMessage","READY","pong","create","forceReconnect","physicConnect","then","onopen","onmessage","parse","onclose","reconnectTimeDeltaMs","setTimeout","ClaireClient","ClaireApp","keyResolver","Translator","allLangs","currentLang","subscribers","init","keyValue","exit","addLangSubscriber","subscriber","removeLangSubscriber","getCurrentLanguage","setCurrentLanguage","lang","sub","getLanguages","setLanguages","languages","getTranslationObject","translationMap","_this","locales","translation","resolveTranslation","translationsObject","translationValues","t","forEach","every","value","tKey","defineProperty","args","currentLocale","indexOf","configurable","writable","values","Initable","module","exports","require","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://@clairejs/client/./src/api/AbstractHttpClient.ts","webpack://@clairejs/client/./src/api/AbstractTokenManager.ts","webpack://@clairejs/client/./src/api/CrudApi.ts","webpack://@clairejs/client/./src/api/DefaultHttpClient.ts","webpack://@clairejs/client/./src/api/DefaultTokenManager.ts","webpack://@clairejs/client/./src/api/RefreshHttpClient.ts","webpack://@clairejs/client/./src/constants.ts","webpack://@clairejs/client/./src/index.ts","webpack://@clairejs/client/./src/routing/AbstractErrorHandler.ts","webpack://@clairejs/client/./src/routing/AbstractViewMiddleware.ts","webpack://@clairejs/client/./src/socket/AbstractClientSocketManager.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocket.ts","webpack://@clairejs/client/./src/socket/DefaultClientSocketManager.ts","webpack://@clairejs/client/./src/system/AbstractStorage.ts","webpack://@clairejs/client/./src/system/ClaireClient.ts","webpack://@clairejs/client/./src/translation/Translator.ts","webpack://@clairejs/client/external commonjs \"@clairejs/core\"","webpack://@clairejs/client/external commonjs \"axios\"","webpack://@clairejs/client/webpack/bootstrap","webpack://@clairejs/client/webpack/startup"],"sourcesContent":["export abstract class AbstractHttpClient {\r\n constructor(readonly apiServerUrl: string) {}\r\n\r\n protected async resolveHeaders(headers?: object): Promise<object | undefined> {\r\n return headers;\r\n }\r\n\r\n protected async resolveUrl(url: string): Promise<string> {\r\n return this.apiServerUrl + url;\r\n }\r\n\r\n abstract get<T = any>(url: string, headers?: object): Promise<T>;\r\n abstract post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\r\n abstract delete<T = any>(url: string, headers?: object): Promise<T>;\r\n}\r\n","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","import {\r\n AbstractModel,\r\n Constructor,\r\n CreateManyRequestBody,\r\n CreateManyResponseBody,\r\n deepMerge,\r\n GetManyQueries,\r\n GetManyResponseBody,\r\n Identifiable,\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 Identifiable>(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 Identifiable>(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 deepMerge(result[index], instance);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport class CrudApi<T extends AbstractModel> {\r\n private dirty = false;\r\n\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>, useCache = true): Promise<GetManyResponseBody<T>> {\r\n const noCache = !useCache || this.dirty;\r\n this.dirty = false;\r\n return await this.httpClient.get(\r\n `${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`,\r\n noCache\r\n ? {\r\n \"cache-control\": \"no-cache\",\r\n }\r\n : undefined,\r\n );\r\n }\r\n\r\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\r\n this.dirty = true;\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 this.dirty = true;\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 this.dirty = true;\r\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\r\n }\r\n}\r\n","import axios from \"axios\";\r\nimport { AbstractLogger } from \"@clairejs/core\";\r\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\r\n\r\nexport class DefaultHttpClient extends AbstractHttpClient {\r\n constructor(readonly apiServerUrl: string, readonly logger: AbstractLogger, readonly maxRetryCount = 1) {\r\n super(apiServerUrl);\r\n }\r\n\r\n protected async retry(apiCall: () => Promise<any>, retryCount: number = 0): Promise<any> {\r\n try {\r\n const result = await apiCall();\r\n return result;\r\n } catch (err) {\r\n //-- if error is 503 then retry\r\n if (err.response?.status === 503 && retryCount < this.maxRetryCount) {\r\n this.logger.debug(`503 error encountered, retrying request ${retryCount + 1}`);\r\n return await this.retry(apiCall, retryCount + 1);\r\n } else {\r\n throw err;\r\n }\r\n }\r\n }\r\n\r\n async get<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await this.retry(() => axios.get(finalUrl, { headers: finalHeaders }));\r\n return result.data;\r\n }\r\n\r\n async post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await this.retry(() => axios.post(finalUrl, body, { headers: finalHeaders }));\r\n return result.data;\r\n }\r\n\r\n async put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await this.retry(() => axios.put(finalUrl, body, { headers: finalHeaders }));\r\n return result.data;\r\n }\r\n\r\n async delete<T = any>(url: string, headers?: object): Promise<T> {\r\n const finalUrl = await this.resolveUrl(url);\r\n const finalHeaders = await this.resolveHeaders(headers);\r\n const result = await this.retry(() => axios.delete(finalUrl, { headers: finalHeaders }));\r\n return result.data;\r\n }\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 { AbstractLogger, AccessToken } from \"@clairejs/core\";\r\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\r\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\n\r\nexport class RefreshHttpClient extends DefaultHttpClient {\r\n private refreshing = false;\r\n private refreshQueue: {\r\n resolver: () => void;\r\n }[] = [];\r\n\r\n public constructor(\r\n readonly apiServerUrl: string,\r\n readonly logger: AbstractLogger,\r\n readonly tokenManager: AbstractTokenManager,\r\n ) {\r\n super(apiServerUrl, logger);\r\n }\r\n\r\n protected async getRefreshedAccessToken(): Promise<AccessToken | undefined> {\r\n return undefined;\r\n }\r\n\r\n protected async resolveHeaders(headers?: object) {\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\r\n const accessToken = await this.tokenManager.getAccessToken();\r\n const userHeaders = await super.resolveHeaders(headers);\r\n return { authorization: accessToken?.token || \"\", ...userHeaders };\r\n }\r\n\r\n async refreshToken(oldToken?: AccessToken) {\r\n if (this.refreshing) {\r\n this.logger.debug(\"Awaiting refresh token, queued\");\r\n await new Promise<void>((resolve) => {\r\n this.refreshQueue.push({ resolver: resolve });\r\n });\r\n } else {\r\n oldToken = oldToken || (await this.tokenManager.getAccessToken());\r\n //-- call to api server to refresh token\r\n if (!oldToken || !oldToken.refreshToken) {\r\n //-- there is no refresh token to refresh\r\n return;\r\n }\r\n\r\n try {\r\n this.refreshing = true;\r\n const newToken = await this.getRefreshedAccessToken();\r\n await this.tokenManager.setAccessToken(newToken);\r\n this.logger.debug(\"Access token was refreshed\");\r\n } catch (err) {\r\n //-- cannot refresh access token, clear old token\r\n this.logger.debug(\"Cannot refresh access token, clear local token\");\r\n await this.tokenManager.setAccessToken();\r\n } finally {\r\n this.refreshing = false;\r\n for (const refresh of this.refreshQueue) {\r\n refresh.resolver();\r\n }\r\n //-- clear queue\r\n this.refreshQueue = [];\r\n }\r\n }\r\n }\r\n}\r\n","export const SYSTEM_LANGUAGES = \"SYSTEM_LANGUAGES\";\r\nexport const CURRENT_LANGUAGE = \"CURRENT_LANGUAGE\";\r\n","export * from \"./system/ClaireClient\";\r\nexport * from \"./api/RefreshHttpClient\";\r\nexport * from \"./api/DefaultHttpClient\";\r\nexport * from \"./api/AbstractHttpClient\";\r\nexport * from \"./socket/AbstractClientSocketManager\";\r\nexport * from \"./socket/DefaultClientSocketManager\";\r\nexport * from \"./system/AbstractStorage\";\r\nexport * from \"./translation/Translator\";\r\nexport * from \"./routing/AbstractErrorHandler\";\r\nexport * from \"./routing/AbstractViewMiddleware\";\r\nexport * from \"./routing/UrlInfo\";\r\nexport * from \"./routing/RouterConfig\";\r\nexport * from \"./routing/ComponentInfo\";\r\nexport * from \"./api/AbstractTokenManager\";\r\nexport * from \"./socket/IWebSocket\";\r\nexport * from \"./translation/types\";\r\nexport * from \"./api/DefaultTokenManager\";\r\nexport * from \"./api/CrudApi\";\r\n","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 { IClientSocket } from \"@clairejs/core\";\r\n\r\nexport abstract class AbstractClientSocketManager {\r\n abstract create(): IClientSocket;\r\n abstract joinChannels(channels: string[]): void;\r\n abstract leaveChannels(channels: string[]): void;\r\n abstract getPingMs(): number;\r\n}\r\n","import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from \"@clairejs/core\";\r\nimport { DefaultClientSocketManager } from \"./DefaultClientSocketManager\";\r\n\r\nexport class DefaultClientSocket implements IClientSocket {\r\n constructor(readonly socketManager: DefaultClientSocketManager) {}\r\n\r\n joinChannels(channels: string[]): void {\r\n this.socketManager.subChannels(this, channels);\r\n }\r\n\r\n leaveChannels(channels: string[]): void {\r\n this.socketManager.unsubChannels(this, channels);\r\n }\r\n\r\n close(): void {\r\n this.socketManager.removeSocket(this);\r\n }\r\n\r\n onReconnect(handler: ReconnectionHandler): void {\r\n this.socketManager.registerReconnectionHandler(this, handler);\r\n }\r\n\r\n onDisconnect(handler: DisconnectionHandler): void {\r\n this.socketManager.registerDisconnectionHandler(this, handler);\r\n }\r\n\r\n onMessage(handler: PlainMessageHandler): void {\r\n this.socketManager.registerMessageHandler(this, handler);\r\n }\r\n\r\n send(message: any, channel?: string): void {\r\n this.socketManager.sendPlainMessageToChannel(message, channel);\r\n }\r\n}\r\n","import {\r\n AbstractLogger,\r\n ErrorBuilder,\r\n Errors,\r\n MessageType,\r\n SocketMessage,\r\n DisconnectionHandler,\r\n IClientSocket,\r\n PlainMessageHandler,\r\n ReconnectionHandler,\r\n} from \"@clairejs/core\";\r\n\r\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\r\nimport { SocketConfig } from \"./SocketConfig\";\r\nimport { DefaultClientSocket } from \"./DefaultClientSocket\";\r\nimport { IWebSocket } from \"./IWebSocket\";\r\n\r\nconst pingpongMaxCount = 10;\r\n\r\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\r\n private socket?: IWebSocket;\r\n\r\n private allSockets: {\r\n socket: DefaultClientSocket;\r\n registeredChannels: string[];\r\n reconnectionHandler?: ReconnectionHandler;\r\n disconnectionHandler?: DisconnectionHandler;\r\n messageHandler?: PlainMessageHandler;\r\n }[] = [];\r\n\r\n private allChannels: { channel: string; connected: boolean; pendingMessages: any[] }[] = [];\r\n\r\n private socketConnected?: boolean;\r\n private pingIntervalId?: any;\r\n private retryTimeoutId?: any;\r\n private accumulatedPing = 0;\r\n private retryDelay = 0;\r\n private intendedDisconnection?: boolean;\r\n private pingpongId = 0;\r\n\r\n public pingpong: { id: number; sentTimestamp: number; receivedTimestamp?: number }[] = [];\r\n\r\n constructor(\r\n private readonly wsProvider: () => Promise<IWebSocket>,\r\n private readonly logger: AbstractLogger,\r\n private readonly config?: SocketConfig,\r\n ) {\r\n super();\r\n }\r\n\r\n getPingMs(): number {\r\n const candidates = this.pingpong.filter((pp) => pp.sentTimestamp && pp.receivedTimestamp);\r\n if (!candidates.length) {\r\n return 0;\r\n }\r\n return (\r\n candidates.map((pp) => pp.receivedTimestamp! - pp.sentTimestamp).reduce((total, diff) => total + diff, 0) /\r\n candidates.length\r\n );\r\n }\r\n\r\n subChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n //-- un-connected channels\r\n const unconnectedChannels: string[] = [];\r\n for (const channel of channels) {\r\n if (!info.registeredChannels.includes(channel)) {\r\n info.registeredChannels.push(channel);\r\n }\r\n const foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel || !foundChannel.connected) {\r\n unconnectedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.joinChannels(unconnectedChannels);\r\n }\r\n\r\n unsubChannels(socket: IClientSocket, channels: string[]) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (!info) {\r\n this.logger.debug(\"Socket not found\");\r\n return;\r\n }\r\n\r\n info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));\r\n\r\n //-- check if no one is subscribing these channel then remove\r\n const removedChannels: string[] = [];\r\n for (const channel of channels) {\r\n //-- no one is listening\r\n if (!this.allSockets.find((socket) => socket.registeredChannels.includes(channel))) {\r\n removedChannels.push(channel);\r\n }\r\n }\r\n\r\n this.leaveChannels(removedChannels);\r\n }\r\n\r\n removeSocket(socket: DefaultClientSocket) {\r\n const socketInfo = this.allSockets.find((s) => s.socket === socket);\r\n if (socketInfo && socketInfo.disconnectionHandler) {\r\n socketInfo.disconnectionHandler();\r\n }\r\n\r\n this.allSockets = this.allSockets.filter((s) => s.socket !== socket);\r\n if (!this.allSockets.length) {\r\n this.forceDisconnect();\r\n }\r\n }\r\n\r\n registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.reconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.disconnectionHandler = handler;\r\n }\r\n }\r\n\r\n registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler) {\r\n const info = this.allSockets.find((s) => s.socket === socket);\r\n if (info) {\r\n info.messageHandler = handler;\r\n }\r\n }\r\n\r\n sendPlainMessageToChannel(message: any, channel?: string) {\r\n if (channel) {\r\n //-- check if channel has been connected\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n if (foundChannel.connected) {\r\n //-- send\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: { channel, message },\r\n });\r\n } else {\r\n foundChannel.pendingMessages.push(message);\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.PLAIN,\r\n data: {\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n\r\n joinChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n if (!this.socket || !this.socketConnected) {\r\n //-- create pending channels\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n\r\n ///-- this channel is already connected, skip\r\n if (foundChannel.connected) {\r\n continue;\r\n }\r\n }\r\n } else {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_JOIN,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n leaveChannels(channels: string[]) {\r\n if (!channels.length) {\r\n return;\r\n }\r\n\r\n this.handleChannelLeave(channels);\r\n\r\n if (this.socket && this.socketConnected) {\r\n this.sendRawMessage({\r\n type: MessageType.CHANNEL_LEAVE,\r\n data: channels,\r\n });\r\n }\r\n }\r\n\r\n private sendPingPong() {\r\n this.pingpongId += 1;\r\n this.pingpongId %= 100;\r\n const pingpongInfo = { id: this.pingpongId, sentTimestamp: Date.now() };\r\n this.pingpong.push(pingpongInfo);\r\n\r\n if (this.pingpong.length > pingpongMaxCount) {\r\n this.pingpong.shift();\r\n }\r\n\r\n this.sendRawMessage({\r\n type: MessageType.PING_PONG,\r\n data: pingpongInfo.id,\r\n });\r\n }\r\n\r\n private sendRawMessage(message: SocketMessage) {\r\n if (!this.socket || !this.socketConnected) {\r\n throw ErrorBuilder.error(Errors.BAD_STATE, \"Socket not available\");\r\n }\r\n this.socket.send(message);\r\n this.logger.debug(\"Raw send\", message);\r\n }\r\n\r\n private handleChannelJoin(channels: string[]) {\r\n this.logger.debug(\"Joinning channels\", channels);\r\n for (const channel of channels) {\r\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\r\n\r\n if (!foundChannel) {\r\n foundChannel = { channel, connected: false, pendingMessages: [] };\r\n this.allChannels.push(foundChannel);\r\n }\r\n foundChannel.connected = true;\r\n\r\n //-- flush messages\r\n if (foundChannel.pendingMessages.length) {\r\n this.logger.debug(`Flushing ${foundChannel.pendingMessages.length} message`);\r\n for (const message of foundChannel.pendingMessages) {\r\n this.sendPlainMessageToChannel(message, foundChannel.channel);\r\n }\r\n foundChannel.pendingMessages = [];\r\n }\r\n }\r\n }\r\n\r\n private handleChannelLeave(channels: string[]) {\r\n this.logger.debug(\"Leaving channels\", channels);\r\n this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));\r\n }\r\n\r\n private handlePlainMessage(message: any, channel?: string) {\r\n for (const socket of this.allSockets) {\r\n socket.messageHandler && socket.messageHandler(message, channel);\r\n }\r\n }\r\n\r\n private handleConnect() {\r\n this.logger.debug(\"Socket connected\");\r\n\r\n //-- socket open, set interval\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.accumulatedPing = 0;\r\n this.pingIntervalId = setInterval(() => {\r\n this.accumulatedPing += 1;\r\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreshold || 3)) {\r\n //-- socket connection lost, not intended\r\n this.intendedDisconnection = false;\r\n this.socket?.close();\r\n } else {\r\n this.sendPingPong();\r\n }\r\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\r\n\r\n this.intendedDisconnection = false;\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n\r\n for (const socket of this.allSockets) {\r\n socket.reconnectionHandler && socket.reconnectionHandler();\r\n }\r\n\r\n //-- try join pending channels\r\n const pendingChannels = this.allChannels.filter((c) => !c.connected).map((c) => c.channel);\r\n this.joinChannels(pendingChannels);\r\n }\r\n\r\n private handleDisconnect(err?: any) {\r\n if (err) {\r\n this.intendedDisconnection = true;\r\n }\r\n\r\n this.logger.debug(\"Socket connnection closed, error: \", err);\r\n\r\n if (this.pingIntervalId) {\r\n clearInterval(this.pingIntervalId);\r\n }\r\n\r\n this.socket = undefined;\r\n this.socketConnected = false;\r\n\r\n for (const socket of this.allSockets) {\r\n socket.disconnectionHandler && socket.disconnectionHandler(err);\r\n }\r\n\r\n if (this.intendedDisconnection) {\r\n //-- remove all channels\r\n this.allSockets = [];\r\n this.allChannels = [];\r\n this.logger.debug(\"Socket connection terminated\");\r\n } else {\r\n //-- disconnect all channels to be reconnected when the socket is connected again\r\n this.allChannels = this.allChannels.map((c) => ({ ...c, connected: false }));\r\n if (!this.retryTimeoutId) {\r\n this.retryDelay = 0;\r\n this.retry();\r\n }\r\n }\r\n }\r\n\r\n private handleMessage(message: SocketMessage) {\r\n this.logger.debug(\"Raw receive\", message);\r\n switch (message.type) {\r\n case MessageType.READY:\r\n this.handleConnect();\r\n break;\r\n case MessageType.PING_PONG:\r\n this.accumulatedPing = 0;\r\n const id = message.data;\r\n if (id) {\r\n const pong = this.pingpong.find((pp) => pp.id === id);\r\n if (pong) {\r\n pong.receivedTimestamp = Date.now();\r\n }\r\n }\r\n break;\r\n case MessageType.CHANNEL_JOIN:\r\n if (message.data?.error) {\r\n this.logger.error(\"Join channel error\", message.data.error);\r\n } else {\r\n this.handleChannelJoin(message.data);\r\n }\r\n break;\r\n case MessageType.CHANNEL_LEAVE:\r\n this.handleChannelLeave(message.data);\r\n break;\r\n case MessageType.PLAIN:\r\n this.handlePlainMessage(message.data.message, message.data.channel);\r\n break;\r\n }\r\n }\r\n\r\n create(): IClientSocket {\r\n const socket = new DefaultClientSocket(this);\r\n\r\n this.allSockets.push({ socket, registeredChannels: [] });\r\n\r\n if (this.allSockets.length === 1) {\r\n this.forceReconnect();\r\n }\r\n\r\n return socket;\r\n }\r\n\r\n forceDisconnect() {\r\n this.intendedDisconnection = true;\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = undefined;\r\n }\r\n\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n }\r\n }\r\n\r\n forceReconnect(): void {\r\n this.intendedDisconnection = false;\r\n if (this.socketConnected) {\r\n this.socket?.close();\r\n } else {\r\n this.retryDelay = 0;\r\n if (this.socket === undefined) {\r\n if (this.retryTimeoutId) {\r\n clearTimeout(this.retryTimeoutId);\r\n this.retryTimeoutId = undefined;\r\n }\r\n this.physicConnect();\r\n }\r\n }\r\n }\r\n\r\n private physicConnect() {\r\n this.wsProvider().then((socket) => {\r\n this.socket = socket;\r\n\r\n this.socket.onopen(() => {\r\n this.socketConnected = true;\r\n this.logger.debug(\"Physic link connected, sending & waiting for READY message\");\r\n this.sendRawMessage({\r\n type: MessageType.READY,\r\n data: \"\",\r\n });\r\n });\r\n\r\n this.socket.onmessage((data) => {\r\n const message: SocketMessage = JSON.parse(data);\r\n if (!message || !message.type) {\r\n this.logger.debug(\"Invalid mesasge structure\", data);\r\n return;\r\n }\r\n\r\n this.handleMessage(message);\r\n });\r\n\r\n this.socket.onclose((err) => {\r\n this.handleDisconnect(err);\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.physicConnect();\r\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\r\n this.retryTimeoutId = setTimeout(() => {\r\n if (!this.socketConnected && !this.intendedDisconnection) {\r\n this.retry();\r\n }\r\n }, this.retryDelay);\r\n }\r\n}\r\n","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 { ClaireApp } from \"@clairejs/core\";\r\n\r\nexport class ClaireClient extends ClaireApp {}\r\n","import { IInit, Initable, 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\n@Initable()\r\nexport class Translator implements IInit {\r\n allLangs: string[] = null!;\r\n currentLang?: string = null!;\r\n subscribers: LangSubscriber[] = [];\r\n\r\n constructor(readonly storage: AbstractStorage) {}\r\n\r\n async init(): Promise<void> {\r\n const allLangs = await this.storage.getItem(SYSTEM_LANGUAGES);\r\n this.allLangs = (allLangs || []) as string[];\r\n\r\n const keyValue = (await this.storage.getItem(CURRENT_LANGUAGE)) as string;\r\n if (keyValue && this.allLangs.includes(keyValue)) {\r\n this.currentLang = keyValue;\r\n }\r\n }\r\n\r\n exit(): void {}\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);\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 if (this.allLangs == null) {\r\n this.allLangs = (await this.storage.getItem(SYSTEM_LANGUAGES)) as string[];\r\n }\r\n return this.allLangs;\r\n }\r\n\r\n async setLanguages(languages: string[]) {\r\n await this.storage.setItem(SYSTEM_LANGUAGES, languages);\r\n this.allLangs = languages;\r\n if (this.currentLang === null && languages.length) {\r\n await this.setCurrentLanguage(languages[0]);\r\n }\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","module.exports = require(\"@clairejs/core\");","module.exports = require(\"axios\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(341);\n"],"names":["AbstractHttpClient","constructor","apiServerUrl","resolveHeaders","headers","resolveUrl","url","this","AbstractTokenManager","stringifyQueries","queries","Object","keys","reduce","collector","key","JSON","stringify","removeInstances","target","source","result","slice","instance","index","findIndex","i","id","splice","mergeInstances","model","push","assign","deepMerge","CrudApi","httpClient","dirty","getEndpointBaseUrl","name","toLowerCase","getMany","useCache","noCache","get","undefined","updateMany","body","put","deleteMany","delete","createMany","post","DefaultHttpClient","logger","maxRetryCount","super","retry","apiCall","retryCount","err","response","status","debug","finalUrl","finalHeaders","data","DefaultTokenManager","storage","storageKey","accessToken","getAccessToken","getItem","setAccessToken","token","setItem","deleteItem","Injectable","AbstractStorage","RefreshHttpClient","tokenManager","refreshing","refreshQueue","getRefreshedAccessToken","map","k","includes","expiration","Date","now","refreshToken","userHeaders","authorization","oldToken","Promise","resolve","resolver","newToken","refresh","SYSTEM_LANGUAGES","CURRENT_LANGUAGE","AbstractErrorHandler","AbstractViewMiddleware","AbstractClientSocketManager","DefaultClientSocket","socketManager","joinChannels","channels","subChannels","leaveChannels","unsubChannels","close","removeSocket","onReconnect","handler","registerReconnectionHandler","onDisconnect","registerDisconnectionHandler","onMessage","registerMessageHandler","send","message","channel","sendPlainMessageToChannel","DefaultClientSocketManager","wsProvider","config","allSockets","allChannels","accumulatedPing","retryDelay","pingpongId","pingpong","getPingMs","candidates","filter","pp","sentTimestamp","receivedTimestamp","length","total","diff","socket","info","find","s","unconnectedChannels","registeredChannels","foundChannel","c","connected","removedChannels","socketInfo","disconnectionHandler","forceDisconnect","reconnectionHandler","messageHandler","pendingMessages","sendRawMessage","type","MessageType","PLAIN","socketConnected","CHANNEL_JOIN","handleChannelLeave","CHANNEL_LEAVE","sendPingPong","pingpongInfo","shift","PING_PONG","ErrorBuilder","error","Errors","BAD_STATE","handleChannelJoin","handlePlainMessage","handleConnect","pingIntervalId","clearInterval","setInterval","keepAlive","deadThreshold","intendedDisconnection","pingIntervalMs","retryTimeoutId","clearTimeout","pendingChannels","handleDisconnect","handleMessage","READY","pong","create","forceReconnect","physicConnect","then","onopen","onmessage","parse","onclose","reconnectTimeDeltaMs","setTimeout","ClaireClient","ClaireApp","keyResolver","Translator","allLangs","currentLang","subscribers","init","keyValue","exit","addLangSubscriber","subscriber","removeLangSubscriber","getCurrentLanguage","setCurrentLanguage","lang","sub","getLanguages","setLanguages","languages","getTranslationObject","translationMap","_this","locales","translation","resolveTranslation","translationsObject","translationValues","t","forEach","every","value","tKey","defineProperty","args","currentLocale","indexOf","configurable","writable","values","Initable","module","exports","require","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clairejs/client",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.17",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"scripts": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"rxjs": "^6.6.7"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"@clairejs/core": "^3.1.
|
|
16
|
+
"@clairejs/core": "^3.1.34"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/mocha": "^8.2.2",
|