@clairejs/client 3.1.13 → 3.1.16
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/.browserslistrc +3 -3
- package/.prettierrc +8 -8
- package/README.md +437 -425
- package/dist/api/AbstractHttpClient.d.ts +10 -10
- package/dist/api/AbstractTokenManager.d.ts +5 -5
- package/dist/api/CrudApi.d.ts +16 -15
- package/dist/api/CrudApi.d.ts.map +1 -1
- package/dist/api/DefaultHttpClient.d.ts +13 -7
- package/dist/api/DefaultHttpClient.d.ts.map +1 -1
- package/dist/api/DefaultTokenManager.d.ts +11 -11
- package/dist/api/RefreshHttpClient.d.ts +18 -19
- package/dist/api/RefreshHttpClient.d.ts.map +1 -1
- package/dist/constants.d.ts +2 -2
- package/dist/index.d.ts +18 -18
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/routing/AbstractErrorHandler.d.ts +3 -3
- package/dist/routing/AbstractViewMiddleware.d.ts +4 -4
- package/dist/routing/ComponentInfo.d.ts +4 -4
- package/dist/routing/RouterConfig.d.ts +13 -13
- package/dist/routing/UrlInfo.d.ts +10 -10
- package/dist/socket/AbstractClientSocketManager.d.ts +7 -7
- package/dist/socket/DefaultClientSocket.d.ts +13 -13
- package/dist/socket/DefaultClientSocketManager.d.ts +49 -49
- package/dist/socket/IWebSocket.d.ts +7 -7
- package/dist/socket/SocketConfig.d.ts +16 -16
- package/dist/system/AbstractStorage.d.ts +5 -5
- package/dist/system/ClaireClient.d.ts +3 -3
- package/dist/translation/Translator.d.ts +21 -21
- package/dist/translation/types.d.ts +6 -6
- package/package.json +32 -32
- package/tsconfig-build.json +10 -10
- package/webpack.config.js +46 -46
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 {\n constructor(readonly apiServerUrl: string) {}\n\n protected async resolveHeaders(headers?: object): Promise<object | undefined> {\n return headers;\n }\n\n protected async resolveUrl(url: string): Promise<string> {\n return this.apiServerUrl + url;\n }\n\n abstract get<T = any>(url: string, headers?: object): Promise<T>;\n abstract post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\n abstract put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T>;\n abstract delete<T = any>(url: string, headers?: object): Promise<T>;\n}\n","import { AccessToken } from \"@clairejs/core\";\n\nexport abstract class AbstractTokenManager {\n abstract getAccessToken(): Promise<AccessToken | undefined>;\n abstract setAccessToken(token?: AccessToken): Promise<void>;\n}\n","import {\n AbstractModel,\n Constructor,\n CreateManyRequestBody,\n CreateManyResponseBody,\n GetManyQueries,\n GetManyResponseBody,\n UpdateManyBody,\n UpdateManyQueries,\n UpdateManyResponse,\n} from \"@clairejs/core\";\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\n\nexport const stringifyQueries = (queries: Record<string, any>) => {\n const keys = Object.keys(queries);\n return keys.reduce((collector, key) => collector + `${key}=${JSON.stringify(queries[key])}&`, \"\");\n};\n\nexport const removeInstances = <T extends AbstractModel>(target: T[], source: T[]) => {\n const result = target.slice();\n for (const instance of source) {\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\n if (index >= 0) {\n result.splice(index, 1);\n }\n }\n return result;\n};\n\nexport const mergeInstances = <T extends AbstractModel>(model: Constructor<T>, target: T[], source: Partial<T>[]) => {\n const result = target.slice();\n for (const instance of source) {\n const index = result.findIndex((i) => !!i.id && !!instance.id && i.id === instance.id);\n if (index < 0) {\n result.push(Object.assign(new model(), instance));\n } else {\n Object.assign(result[index], instance);\n }\n }\n return result;\n};\n\nexport class CrudApi<T extends AbstractModel> {\n constructor(readonly model: Constructor<T>, readonly httpClient: AbstractHttpClient) {}\n\n protected getEndpointBaseUrl() {\n return `/${this.model.name.toLowerCase()}`;\n }\n\n async getMany(queries?: GetManyQueries<T>): Promise<GetManyResponseBody<T>> {\n return await this.httpClient.get(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\n }\n\n async updateMany(body: UpdateManyBody<T>, queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\n return await this.httpClient.put(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`, body);\n }\n\n async deleteMany(queries?: UpdateManyQueries<T>): Promise<UpdateManyResponse<T>> {\n return await this.httpClient.delete(`${this.getEndpointBaseUrl()}?${stringifyQueries(queries || {})}`);\n }\n\n async createMany(body: CreateManyRequestBody<T>): Promise<CreateManyResponseBody<T>> {\n return await this.httpClient.post(`${this.getEndpointBaseUrl()}`, body);\n }\n}\n","import { AbstractHttpClient } from \"./AbstractHttpClient\";\nimport axios from \"axios\";\n\nexport class DefaultHttpClient extends AbstractHttpClient {\n async get<T = any>(url: string, headers?: object): Promise<T> {\n const finalUrl = await this.resolveUrl(url);\n const finalHeaders = await this.resolveHeaders(headers);\n const result = await axios.get(finalUrl, { headers: finalHeaders });\n return result.data;\n }\n\n async post<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\n const finalUrl = await this.resolveUrl(url);\n const finalHeaders = await this.resolveHeaders(headers);\n const result = await axios.post(finalUrl, body, { headers: finalHeaders });\n return result.data;\n }\n\n async put<T = any, R = any>(url: string, body: R, headers?: object): Promise<T> {\n const finalUrl = await this.resolveUrl(url);\n const finalHeaders = await this.resolveHeaders(headers);\n const result = await axios.put(finalUrl, body, { headers: finalHeaders });\n return result.data;\n }\n\n async delete<T = any>(url: string, headers?: object): Promise<T> {\n const finalUrl = await this.resolveUrl(url);\n const finalHeaders = await this.resolveHeaders(headers);\n const result = await axios.delete(finalUrl, { headers: finalHeaders });\n return result.data;\n }\n}\n","import { Injectable, AccessToken } from \"@clairejs/core\";\nimport { AbstractStorage } from \"../system/AbstractStorage\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\n\n@Injectable()\nexport class DefaultTokenManager extends AbstractTokenManager {\n private accessToken?: AccessToken = null!;\n\n constructor(readonly storage: AbstractStorage, readonly storageKey: string = \"ACCESS_TOKEN\") {\n super();\n }\n\n async getAccessToken(): Promise<AccessToken | undefined> {\n if (this.accessToken === null) {\n this.accessToken = await this.storage.getItem(this.storageKey);\n }\n return this.accessToken;\n }\n\n async setAccessToken(token?: AccessToken): Promise<void> {\n if (token) {\n await this.storage.setItem(this.storageKey, token);\n } else {\n await this.storage.deleteItem(this.storageKey);\n }\n this.accessToken = token;\n }\n}\n","import { AbstractLogger, AccessToken } from \"@clairejs/core\";\nimport axios from \"axios\";\n\nimport { AbstractHttpClient } from \"./AbstractHttpClient\";\nimport { AbstractTokenManager } from \"./AbstractTokenManager\";\n\nexport class RefreshHttpClient extends AbstractHttpClient {\n private refreshing = false;\n private refreshQueue: {\n resolver: () => void;\n }[] = [];\n\n public constructor(\n readonly apiServerUrl: string,\n readonly logger: AbstractLogger,\n readonly tokenManager: AbstractTokenManager,\n ) {\n super(apiServerUrl);\n }\n\n protected async getRefreshedAccessToken(): Promise<AccessToken | undefined> {\n return undefined;\n }\n\n protected async resolveResult(apiCall: (headers?: any) => Promise<any>, headers?: any): Promise<any> {\n //-- request does not explicitely provide authorization header, resolve automatically\n if (!headers || !Object.keys(headers).map((k) => k.toLowerCase().includes(\"authorization\"))) {\n const accessToken = await this.tokenManager.getAccessToken();\n //-- 30s buffer\n if (accessToken && accessToken.expiration < Date.now() + 30000) {\n await this.refreshToken(accessToken);\n }\n }\n const finalHeaders = await this.finalHeaders(headers);\n return (await apiCall(finalHeaders)).data;\n }\n\n private async finalHeaders(headers: object): Promise<any> {\n const accessToken = await this.tokenManager.getAccessToken();\n const userHeaders = await this.resolveHeaders(headers);\n return { headers: { authorization: accessToken?.token || \"\", ...userHeaders } };\n }\n\n async refreshToken(oldToken?: AccessToken) {\n if (this.refreshing) {\n this.logger.debug(\"Awaiting refresh token, queued\");\n await new Promise<void>((resolve) => {\n this.refreshQueue.push({ resolver: resolve });\n });\n } else {\n oldToken = oldToken || (await this.tokenManager.getAccessToken());\n //-- call to api server to refresh token\n if (!oldToken || !oldToken.refreshToken) {\n //-- there is no refresh token to refresh\n return;\n }\n\n try {\n this.refreshing = true;\n const newToken = await this.getRefreshedAccessToken();\n await this.tokenManager.setAccessToken(newToken);\n this.logger.debug(\"Access token was refreshed\");\n } catch (err) {\n //-- cannot refresh access token, clear old token\n this.logger.debug(\"Cannot refresh access token, clear local token\");\n await this.tokenManager.setAccessToken();\n } finally {\n this.refreshing = false;\n for (const refresh of this.refreshQueue) {\n refresh.resolver();\n }\n //-- clear queue\n this.refreshQueue = [];\n }\n }\n }\n\n public async get<R>(url: string, headers?: any): Promise<R> {\n const finalUrl = await this.resolveUrl(url);\n this.logger.debug(\"[GET] \", finalUrl);\n return this.resolveResult(async (headers) => axios.get(finalUrl, headers), headers);\n }\n public async post<T, R>(url: string, body: T, headers?: any): Promise<R> {\n const finalUrl = await this.resolveUrl(url);\n this.logger.debug(\"[POST] \", finalUrl);\n return this.resolveResult(async (headers) => axios.post(finalUrl, body, headers), headers);\n }\n public async put<T, R>(url: string, body: T, headers?: any): Promise<R> {\n const finalUrl = await this.resolveUrl(url);\n this.logger.debug(\"[PUT] \", finalUrl);\n return this.resolveResult(async (headers) => axios.put(finalUrl, body, headers), headers);\n }\n\n public async delete<R>(url: string, headers?: any): Promise<R> {\n const finalUrl = await this.resolveUrl(url);\n this.logger.debug(\"[DEL] \", finalUrl);\n return this.resolveResult(async (headers) => axios.delete(finalUrl, headers), headers);\n }\n}\n","export const SYSTEM_LANGUAGES = \"SYSTEM_LANGUAGES\";\nexport const CURRENT_LANGUAGE = \"CURRENT_LANGUAGE\";\n","export * from \"./system/ClaireClient\";\nexport * from \"./api/RefreshHttpClient\";\nexport * from \"./api/DefaultHttpClient\";\nexport * from \"./api/AbstractHttpClient\";\nexport * from \"./socket/AbstractClientSocketManager\";\nexport * from \"./socket/DefaultClientSocketManager\";\nexport * from \"./system/AbstractStorage\";\nexport * from \"./translation/Translator\";\nexport * from \"./routing/AbstractErrorHandler\";\nexport * from \"./routing/AbstractViewMiddleware\";\nexport * from \"./routing/UrlInfo\";\nexport * from \"./routing/RouterConfig\";\nexport * from \"./routing/ComponentInfo\";\nexport * from \"./api/AbstractTokenManager\";\nexport * from \"./socket/IWebSocket\";\nexport * from \"./translation/types\";\nexport * from \"./api/DefaultTokenManager\";\nexport * from \"./api/CrudApi\";\n","export abstract class AbstractErrorHandler {\n public abstract handle(err: any, component?: any): void;\n}\n","import { UrlInfo } from \"./UrlInfo\";\nexport abstract class AbstractViewMiddleware {\n public abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;\n}\n","import { IClientSocket } from \"@clairejs/core\";\n\nexport abstract class AbstractClientSocketManager {\n abstract create(): IClientSocket;\n abstract joinChannels(channels: string[]): void;\n abstract leaveChannels(channels: string[]): void;\n abstract getPingMs(): number;\n}\n","import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from \"@clairejs/core\";\nimport { DefaultClientSocketManager } from \"./DefaultClientSocketManager\";\n\nexport class DefaultClientSocket implements IClientSocket {\n constructor(readonly socketManager: DefaultClientSocketManager) {}\n\n joinChannels(channels: string[]): void {\n this.socketManager.subChannels(this, channels);\n }\n\n leaveChannels(channels: string[]): void {\n this.socketManager.unsubChannels(this, channels);\n }\n\n close(): void {\n this.socketManager.removeSocket(this);\n }\n\n onReconnect(handler: ReconnectionHandler): void {\n this.socketManager.registerReconnectionHandler(this, handler);\n }\n\n onDisconnect(handler: DisconnectionHandler): void {\n this.socketManager.registerDisconnectionHandler(this, handler);\n }\n\n onMessage(handler: PlainMessageHandler): void {\n this.socketManager.registerMessageHandler(this, handler);\n }\n\n send(message: any, channel?: string): void {\n this.socketManager.sendPlainMessageToChannel(message, channel);\n }\n}\n","import {\n AbstractLogger,\n ErrorBuilder,\n Errors,\n MessageType,\n SocketMessage,\n DisconnectionHandler,\n IClientSocket,\n PlainMessageHandler,\n ReconnectionHandler,\n} from \"@clairejs/core\";\n\nimport { AbstractClientSocketManager } from \"./AbstractClientSocketManager\";\nimport { SocketConfig } from \"./SocketConfig\";\nimport { DefaultClientSocket } from \"./DefaultClientSocket\";\nimport { IWebSocket } from \"./IWebSocket\";\n\nconst pingpongMaxCount = 10;\n\nexport class DefaultClientSocketManager extends AbstractClientSocketManager {\n private socket?: IWebSocket;\n\n private allSockets: {\n socket: DefaultClientSocket;\n registeredChannels: string[];\n reconnectionHandler?: ReconnectionHandler;\n disconnectionHandler?: DisconnectionHandler;\n messageHandler?: PlainMessageHandler;\n }[] = [];\n\n private allChannels: { channel: string; connected: boolean; pendingMessages: any[] }[] = [];\n\n private socketConnected?: boolean;\n private pingIntervalId?: any;\n private retryTimeoutId?: any;\n private accumulatedPing = 0;\n private retryDelay = 0;\n private intendedDisconnection?: boolean;\n private pingpongId = 0;\n\n public pingpong: { id: number; sentTimestamp: number; receivedTimestamp?: number }[] = [];\n\n constructor(\n private readonly wsProvider: () => Promise<IWebSocket>,\n private readonly logger: AbstractLogger,\n private readonly config?: SocketConfig,\n ) {\n super();\n }\n\n getPingMs(): number {\n const candidates = this.pingpong.filter((pp) => pp.sentTimestamp && pp.receivedTimestamp);\n if (!candidates.length) {\n return 0;\n }\n return (\n candidates.map((pp) => pp.receivedTimestamp! - pp.sentTimestamp).reduce((total, diff) => total + diff, 0) /\n candidates.length\n );\n }\n\n subChannels(socket: IClientSocket, channels: string[]) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (!info) {\n this.logger.debug(\"Socket not found\");\n return;\n }\n\n //-- un-connected channels\n const unconnectedChannels: string[] = [];\n for (const channel of channels) {\n if (!info.registeredChannels.includes(channel)) {\n info.registeredChannels.push(channel);\n }\n const foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel || !foundChannel.connected) {\n unconnectedChannels.push(channel);\n }\n }\n\n this.joinChannels(unconnectedChannels);\n }\n\n unsubChannels(socket: IClientSocket, channels: string[]) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (!info) {\n this.logger.debug(\"Socket not found\");\n return;\n }\n\n info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));\n\n //-- check if no one is subscribing these channel then remove\n const removedChannels: string[] = [];\n for (const channel of channels) {\n //-- no one is listening\n if (!this.allSockets.find((socket) => socket.registeredChannels.includes(channel))) {\n removedChannels.push(channel);\n }\n }\n\n this.leaveChannels(removedChannels);\n }\n\n removeSocket(socket: DefaultClientSocket) {\n const socketInfo = this.allSockets.find((s) => s.socket === socket);\n if (socketInfo && socketInfo.disconnectionHandler) {\n socketInfo.disconnectionHandler();\n }\n\n this.allSockets = this.allSockets.filter((s) => s.socket !== socket);\n if (!this.allSockets.length) {\n this.forceDisconnect();\n }\n }\n\n registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.reconnectionHandler = handler;\n }\n }\n\n registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.disconnectionHandler = handler;\n }\n }\n\n registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler) {\n const info = this.allSockets.find((s) => s.socket === socket);\n if (info) {\n info.messageHandler = handler;\n }\n }\n\n sendPlainMessageToChannel(message: any, channel?: string) {\n if (channel) {\n //-- check if channel has been connected\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n if (foundChannel.connected) {\n //-- send\n this.sendRawMessage({\n type: MessageType.PLAIN,\n data: { channel, message },\n });\n } else {\n foundChannel.pendingMessages.push(message);\n }\n } else {\n this.sendRawMessage({\n type: MessageType.PLAIN,\n data: {\n message,\n },\n });\n }\n }\n\n joinChannels(channels: string[]) {\n if (!channels.length) {\n return;\n }\n\n if (!this.socket || !this.socketConnected) {\n //-- create pending channels\n for (const channel of channels) {\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n\n ///-- this channel is already connected, skip\n if (foundChannel.connected) {\n continue;\n }\n }\n } else {\n this.sendRawMessage({\n type: MessageType.CHANNEL_JOIN,\n data: channels,\n });\n }\n }\n\n leaveChannels(channels: string[]) {\n if (!channels.length) {\n return;\n }\n\n this.handleChannelLeave(channels);\n\n if (this.socket && this.socketConnected) {\n this.sendRawMessage({\n type: MessageType.CHANNEL_LEAVE,\n data: channels,\n });\n }\n }\n\n private sendPingPong() {\n this.pingpongId += 1;\n this.pingpongId %= 100;\n const pingpongInfo = { id: this.pingpongId, sentTimestamp: Date.now() };\n this.pingpong.push(pingpongInfo);\n\n if (this.pingpong.length > pingpongMaxCount) {\n this.pingpong.shift();\n }\n\n this.sendRawMessage({\n type: MessageType.PING_PONG,\n data: pingpongInfo.id,\n });\n }\n\n private sendRawMessage(message: SocketMessage) {\n if (!this.socket || !this.socketConnected) {\n throw ErrorBuilder.error(Errors.BAD_STATE, \"Socket not available\");\n }\n this.socket.send(message);\n this.logger.debug(\"Raw send\", message);\n }\n\n private handleChannelJoin(channels: string[]) {\n this.logger.debug(\"Joinning channels\", channels);\n for (const channel of channels) {\n let foundChannel = this.allChannels.find((c) => c.channel === channel);\n\n if (!foundChannel) {\n foundChannel = { channel, connected: false, pendingMessages: [] };\n this.allChannels.push(foundChannel);\n }\n foundChannel.connected = true;\n\n //-- flush messages\n if (foundChannel.pendingMessages.length) {\n this.logger.debug(`Flushing ${foundChannel.pendingMessages.length} message`);\n for (const message of foundChannel.pendingMessages) {\n this.sendPlainMessageToChannel(message, foundChannel.channel);\n }\n foundChannel.pendingMessages = [];\n }\n }\n }\n\n private handleChannelLeave(channels: string[]) {\n this.logger.debug(\"Leaving channels\", channels);\n this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));\n }\n\n private handlePlainMessage(message: any, channel?: string) {\n for (const socket of this.allSockets) {\n socket.messageHandler && socket.messageHandler(message, channel);\n }\n }\n\n private handleConnect() {\n this.logger.debug(\"Socket connected\");\n\n //-- socket open, set interval\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.accumulatedPing = 0;\n this.pingIntervalId = setInterval(() => {\n this.accumulatedPing += 1;\n if (this.accumulatedPing > (this.config?.keepAlive?.deadThreshold || 3)) {\n //-- socket connection lost, not intended\n this.intendedDisconnection = false;\n this.socket?.close();\n } else {\n this.sendPingPong();\n }\n }, this.config?.keepAlive?.pingIntervalMs || 10000);\n\n this.intendedDisconnection = false;\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n this.retryTimeoutId = undefined;\n }\n\n for (const socket of this.allSockets) {\n socket.reconnectionHandler && socket.reconnectionHandler();\n }\n\n //-- try join pending channels\n const pendingChannels = this.allChannels.filter((c) => !c.connected).map((c) => c.channel);\n this.joinChannels(pendingChannels);\n }\n\n private handleDisconnect(err?: any) {\n if (err) {\n this.intendedDisconnection = true;\n }\n\n this.logger.debug(\"Socket connnection closed, error: \", err);\n\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n }\n\n this.socket = undefined;\n this.socketConnected = false;\n\n for (const socket of this.allSockets) {\n socket.disconnectionHandler && socket.disconnectionHandler(err);\n }\n\n if (this.intendedDisconnection) {\n //-- remove all channels\n this.allSockets = [];\n this.allChannels = [];\n this.logger.debug(\"Socket connection terminated\");\n } else {\n //-- disconnect all channels to be reconnected when the socket is connected again\n this.allChannels = this.allChannels.map((c) => ({ ...c, connected: false }));\n if (!this.retryTimeoutId) {\n this.retryDelay = 0;\n this.retry();\n }\n }\n }\n\n private handleMessage(message: SocketMessage) {\n this.logger.debug(\"Raw receive\", message);\n switch (message.type) {\n case MessageType.READY:\n this.handleConnect();\n break;\n case MessageType.PING_PONG:\n this.accumulatedPing = 0;\n const id = message.data;\n if (id) {\n const pong = this.pingpong.find((pp) => pp.id === id);\n if (pong) {\n pong.receivedTimestamp = Date.now();\n }\n }\n break;\n case MessageType.CHANNEL_JOIN:\n if (message.data?.error) {\n this.logger.error(\"Join channel error\", message.data.error);\n } else {\n this.handleChannelJoin(message.data);\n }\n break;\n case MessageType.CHANNEL_LEAVE:\n this.handleChannelLeave(message.data);\n break;\n case MessageType.PLAIN:\n this.handlePlainMessage(message.data.message, message.data.channel);\n break;\n }\n }\n\n create(): IClientSocket {\n const socket = new DefaultClientSocket(this);\n\n this.allSockets.push({ socket, registeredChannels: [] });\n\n if (this.allSockets.length === 1) {\n this.forceReconnect();\n }\n\n return socket;\n }\n\n forceDisconnect() {\n this.intendedDisconnection = true;\n if (this.socket) {\n this.socket.close();\n this.socket = undefined;\n }\n\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n }\n }\n\n forceReconnect(): void {\n this.intendedDisconnection = false;\n if (this.socketConnected) {\n this.socket?.close();\n } else {\n this.retryDelay = 0;\n if (this.socket === undefined) {\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n this.retryTimeoutId = undefined;\n }\n this.physicConnect();\n }\n }\n }\n\n private physicConnect() {\n this.wsProvider().then((socket) => {\n this.socket = socket;\n\n this.socket.onopen(() => {\n this.socketConnected = true;\n this.logger.debug(\"Physic link connected, sending & waiting for READY message\");\n this.sendRawMessage({\n type: MessageType.READY,\n data: \"\",\n });\n });\n\n this.socket.onmessage((data) => {\n const message: SocketMessage = JSON.parse(data);\n if (!message || !message.type) {\n this.logger.debug(\"Invalid mesasge structure\", data);\n return;\n }\n\n this.handleMessage(message);\n });\n\n this.socket.onclose((err) => {\n this.handleDisconnect(err);\n });\n });\n }\n\n private retry() {\n this.logger.debug(`Socket connection retrying in ${this.retryDelay}ms`);\n this.physicConnect();\n this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;\n this.retryTimeoutId = setTimeout(() => {\n if (!this.socketConnected && !this.intendedDisconnection) {\n this.retry();\n }\n }, this.retryDelay);\n }\n}\n","export abstract class AbstractStorage {\n public abstract getItem<T>(key: string): Promise<T | undefined>;\n public abstract setItem<T>(key: string, value: T): Promise<void>;\n public abstract deleteItem(key: string): Promise<void>;\n}\n","import { ClaireApp } from \"@clairejs/core\";\n\nexport class ClaireClient extends ClaireApp {}\n","import { IInit, Initable, Injectable } from \"@clairejs/core\";\nimport { CURRENT_LANGUAGE, SYSTEM_LANGUAGES } from \"../constants\";\nimport { AbstractStorage } from \"../system/AbstractStorage\";\nimport { TranslationMap } from \"./types\";\n\nconst keyResolver = (key: string) => `__${key}__`;\ntype LangSubscriber = (lang: string) => void;\n\n@Injectable()\n@Initable()\nexport class Translator implements IInit {\n allLangs: string[] = null!;\n currentLang?: string = null!;\n subscribers: LangSubscriber[] = [];\n\n constructor(readonly storage: AbstractStorage) {}\n\n async init(): Promise<void> {\n const allLangs = await this.storage.getItem(SYSTEM_LANGUAGES);\n this.allLangs = (allLangs || []) as string[];\n\n const keyValue = (await this.storage.getItem(CURRENT_LANGUAGE)) as string;\n if (keyValue && this.allLangs.includes(keyValue)) {\n this.currentLang = keyValue;\n }\n }\n\n exit(): void {}\n\n addLangSubscriber(subscriber: LangSubscriber) {\n this.subscribers.push(subscriber);\n }\n\n removeLangSubscriber(subscriber: LangSubscriber) {\n this.subscribers = this.subscribers.filter((s) => s !== subscriber);\n }\n\n async getCurrentLanguage() {\n if (this.currentLang === null) {\n this.currentLang = await this.storage.getItem(CURRENT_LANGUAGE);\n }\n return this.currentLang;\n }\n\n async setCurrentLanguage(lang: string) {\n this.currentLang = lang;\n await this.storage.setItem(CURRENT_LANGUAGE, lang);\n for (const sub of this.subscribers) {\n sub(lang);\n }\n }\n\n async getLanguages() {\n if (this.allLangs == null) {\n this.allLangs = (await this.storage.getItem(SYSTEM_LANGUAGES)) as string[];\n }\n return this.allLangs;\n }\n\n async setLanguages(languages: string[]) {\n await this.storage.setItem(SYSTEM_LANGUAGES, languages);\n this.allLangs = languages;\n if (this.currentLang === null && languages.length) {\n await this.setCurrentLanguage(languages[0]);\n }\n }\n\n getTranslationObject(translationMap: TranslationMap) {\n const _this = this;\n const locales = Object.keys(translationMap);\n const translation: any = {};\n\n const resolveTranslation = (translationsObject: any, translationValues: any[]): void => {\n //-- get all keys of languages\n const keys = translationValues.reduce((collector, t) => {\n Object.keys(t).forEach((key) => {\n if (!collector.includes(key)) {\n collector.push(key);\n }\n });\n return collector;\n }, [] as string[]);\n\n //-- create getters / setters for those keys\n for (const key of keys) {\n const isObject = translationValues.every((value) => typeof value[key] === \"object\");\n if (isObject) {\n translationsObject[key] = {};\n resolveTranslation(\n translationsObject[key],\n translationValues.map((value) => value[key]),\n );\n } else {\n const tKey = keyResolver(key);\n translationsObject[tKey] = translationValues.map((value) => value[key]);\n Object.defineProperty(translationsObject, key, {\n value: function (...args: any[]): string {\n const currentLocale = _this.currentLang || locales[0];\n if (!currentLocale) {\n return \"\";\n }\n\n let translation = this[tKey][locales.indexOf(currentLocale)];\n if (typeof translation === \"string\") {\n return translation;\n } else if (typeof translation === \"function\") {\n return translation(...args);\n } else {\n return tKey;\n }\n },\n configurable: false,\n writable: false,\n });\n }\n }\n };\n\n resolveTranslation(translation, Object.values(translationMap));\n return translation;\n }\n}\n","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","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 { 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","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":""}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare abstract class AbstractErrorHandler {
|
|
2
|
-
abstract handle(err: any, component?: any): void;
|
|
3
|
-
}
|
|
1
|
+
export declare abstract class AbstractErrorHandler {
|
|
2
|
+
abstract handle(err: any, component?: any): void;
|
|
3
|
+
}
|
|
4
4
|
//# sourceMappingURL=AbstractErrorHandler.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UrlInfo } from "./UrlInfo";
|
|
2
|
-
export declare abstract class AbstractViewMiddleware {
|
|
3
|
-
abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;
|
|
4
|
-
}
|
|
1
|
+
import { UrlInfo } from "./UrlInfo";
|
|
2
|
+
export declare abstract class AbstractViewMiddleware {
|
|
3
|
+
abstract intercept(from: UrlInfo | undefined, to: UrlInfo): Promise<Partial<UrlInfo> | undefined>;
|
|
4
|
+
}
|
|
5
5
|
//# sourceMappingURL=AbstractViewMiddleware.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export interface ComponentInfo {
|
|
2
|
-
view: any;
|
|
3
|
-
props?: any;
|
|
4
|
-
}
|
|
1
|
+
export interface ComponentInfo {
|
|
2
|
+
view: any;
|
|
3
|
+
props?: any;
|
|
4
|
+
}
|
|
5
5
|
//# sourceMappingURL=ComponentInfo.d.ts.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { AbstractConstructor } from "@clairejs/core";
|
|
2
|
-
import { ComponentInfo } from "./ComponentInfo";
|
|
3
|
-
import { AbstractViewMiddleware } from "./AbstractViewMiddleware";
|
|
4
|
-
export interface RouterConfig {
|
|
5
|
-
path: string;
|
|
6
|
-
component?: ComponentInfo;
|
|
7
|
-
components?: {
|
|
8
|
-
[name: string]: ComponentInfo;
|
|
9
|
-
};
|
|
10
|
-
middleware?: AbstractConstructor<AbstractViewMiddleware>[];
|
|
11
|
-
children?: RouterConfig[];
|
|
12
|
-
redirect?: string;
|
|
13
|
-
}
|
|
1
|
+
import { AbstractConstructor } from "@clairejs/core";
|
|
2
|
+
import { ComponentInfo } from "./ComponentInfo";
|
|
3
|
+
import { AbstractViewMiddleware } from "./AbstractViewMiddleware";
|
|
4
|
+
export interface RouterConfig {
|
|
5
|
+
path: string;
|
|
6
|
+
component?: ComponentInfo;
|
|
7
|
+
components?: {
|
|
8
|
+
[name: string]: ComponentInfo;
|
|
9
|
+
};
|
|
10
|
+
middleware?: AbstractConstructor<AbstractViewMiddleware>[];
|
|
11
|
+
children?: RouterConfig[];
|
|
12
|
+
redirect?: string;
|
|
13
|
+
}
|
|
14
14
|
//# sourceMappingURL=RouterConfig.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export interface UrlInfo {
|
|
2
|
-
path: string;
|
|
3
|
-
hash: string;
|
|
4
|
-
params: {
|
|
5
|
-
[key: string]: string;
|
|
6
|
-
};
|
|
7
|
-
query: {
|
|
8
|
-
[key: string]: string;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
1
|
+
export interface UrlInfo {
|
|
2
|
+
path: string;
|
|
3
|
+
hash: string;
|
|
4
|
+
params: {
|
|
5
|
+
[key: string]: string;
|
|
6
|
+
};
|
|
7
|
+
query: {
|
|
8
|
+
[key: string]: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
11
|
//# sourceMappingURL=UrlInfo.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { IClientSocket } from "@clairejs/core";
|
|
2
|
-
export declare abstract class AbstractClientSocketManager {
|
|
3
|
-
abstract create(): IClientSocket;
|
|
4
|
-
abstract joinChannels(channels: string[]): void;
|
|
5
|
-
abstract leaveChannels(channels: string[]): void;
|
|
6
|
-
abstract getPingMs(): number;
|
|
7
|
-
}
|
|
1
|
+
import { IClientSocket } from "@clairejs/core";
|
|
2
|
+
export declare abstract class AbstractClientSocketManager {
|
|
3
|
+
abstract create(): IClientSocket;
|
|
4
|
+
abstract joinChannels(channels: string[]): void;
|
|
5
|
+
abstract leaveChannels(channels: string[]): void;
|
|
6
|
+
abstract getPingMs(): number;
|
|
7
|
+
}
|
|
8
8
|
//# sourceMappingURL=AbstractClientSocketManager.d.ts.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from "@clairejs/core";
|
|
2
|
-
import { DefaultClientSocketManager } from "./DefaultClientSocketManager";
|
|
3
|
-
export declare class DefaultClientSocket implements IClientSocket {
|
|
4
|
-
readonly socketManager: DefaultClientSocketManager;
|
|
5
|
-
constructor(socketManager: DefaultClientSocketManager);
|
|
6
|
-
joinChannels(channels: string[]): void;
|
|
7
|
-
leaveChannels(channels: string[]): void;
|
|
8
|
-
close(): void;
|
|
9
|
-
onReconnect(handler: ReconnectionHandler): void;
|
|
10
|
-
onDisconnect(handler: DisconnectionHandler): void;
|
|
11
|
-
onMessage(handler: PlainMessageHandler): void;
|
|
12
|
-
send(message: any, channel?: string): void;
|
|
13
|
-
}
|
|
1
|
+
import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from "@clairejs/core";
|
|
2
|
+
import { DefaultClientSocketManager } from "./DefaultClientSocketManager";
|
|
3
|
+
export declare class DefaultClientSocket implements IClientSocket {
|
|
4
|
+
readonly socketManager: DefaultClientSocketManager;
|
|
5
|
+
constructor(socketManager: DefaultClientSocketManager);
|
|
6
|
+
joinChannels(channels: string[]): void;
|
|
7
|
+
leaveChannels(channels: string[]): void;
|
|
8
|
+
close(): void;
|
|
9
|
+
onReconnect(handler: ReconnectionHandler): void;
|
|
10
|
+
onDisconnect(handler: DisconnectionHandler): void;
|
|
11
|
+
onMessage(handler: PlainMessageHandler): void;
|
|
12
|
+
send(message: any, channel?: string): void;
|
|
13
|
+
}
|
|
14
14
|
//# sourceMappingURL=DefaultClientSocket.d.ts.map
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import { AbstractLogger, DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from "@clairejs/core";
|
|
2
|
-
import { AbstractClientSocketManager } from "./AbstractClientSocketManager";
|
|
3
|
-
import { SocketConfig } from "./SocketConfig";
|
|
4
|
-
import { DefaultClientSocket } from "./DefaultClientSocket";
|
|
5
|
-
import { IWebSocket } from "./IWebSocket";
|
|
6
|
-
export declare class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
7
|
-
private readonly wsProvider;
|
|
8
|
-
private readonly logger;
|
|
9
|
-
private readonly config?;
|
|
10
|
-
private socket?;
|
|
11
|
-
private allSockets;
|
|
12
|
-
private allChannels;
|
|
13
|
-
private socketConnected?;
|
|
14
|
-
private pingIntervalId?;
|
|
15
|
-
private retryTimeoutId?;
|
|
16
|
-
private accumulatedPing;
|
|
17
|
-
private retryDelay;
|
|
18
|
-
private intendedDisconnection?;
|
|
19
|
-
private pingpongId;
|
|
20
|
-
pingpong: {
|
|
21
|
-
id: number;
|
|
22
|
-
sentTimestamp: number;
|
|
23
|
-
receivedTimestamp?: number;
|
|
24
|
-
}[];
|
|
25
|
-
constructor(wsProvider: () => Promise<IWebSocket>, logger: AbstractLogger, config?: SocketConfig | undefined);
|
|
26
|
-
getPingMs(): number;
|
|
27
|
-
subChannels(socket: IClientSocket, channels: string[]): void;
|
|
28
|
-
unsubChannels(socket: IClientSocket, channels: string[]): void;
|
|
29
|
-
removeSocket(socket: DefaultClientSocket): void;
|
|
30
|
-
registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler): void;
|
|
31
|
-
registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler): void;
|
|
32
|
-
registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler): void;
|
|
33
|
-
sendPlainMessageToChannel(message: any, channel?: string): void;
|
|
34
|
-
joinChannels(channels: string[]): void;
|
|
35
|
-
leaveChannels(channels: string[]): void;
|
|
36
|
-
private sendPingPong;
|
|
37
|
-
private sendRawMessage;
|
|
38
|
-
private handleChannelJoin;
|
|
39
|
-
private handleChannelLeave;
|
|
40
|
-
private handlePlainMessage;
|
|
41
|
-
private handleConnect;
|
|
42
|
-
private handleDisconnect;
|
|
43
|
-
private handleMessage;
|
|
44
|
-
create(): IClientSocket;
|
|
45
|
-
forceDisconnect(): void;
|
|
46
|
-
forceReconnect(): void;
|
|
47
|
-
private physicConnect;
|
|
48
|
-
private retry;
|
|
49
|
-
}
|
|
1
|
+
import { AbstractLogger, DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler } from "@clairejs/core";
|
|
2
|
+
import { AbstractClientSocketManager } from "./AbstractClientSocketManager";
|
|
3
|
+
import { SocketConfig } from "./SocketConfig";
|
|
4
|
+
import { DefaultClientSocket } from "./DefaultClientSocket";
|
|
5
|
+
import { IWebSocket } from "./IWebSocket";
|
|
6
|
+
export declare class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
7
|
+
private readonly wsProvider;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private readonly config?;
|
|
10
|
+
private socket?;
|
|
11
|
+
private allSockets;
|
|
12
|
+
private allChannels;
|
|
13
|
+
private socketConnected?;
|
|
14
|
+
private pingIntervalId?;
|
|
15
|
+
private retryTimeoutId?;
|
|
16
|
+
private accumulatedPing;
|
|
17
|
+
private retryDelay;
|
|
18
|
+
private intendedDisconnection?;
|
|
19
|
+
private pingpongId;
|
|
20
|
+
pingpong: {
|
|
21
|
+
id: number;
|
|
22
|
+
sentTimestamp: number;
|
|
23
|
+
receivedTimestamp?: number;
|
|
24
|
+
}[];
|
|
25
|
+
constructor(wsProvider: () => Promise<IWebSocket>, logger: AbstractLogger, config?: SocketConfig | undefined);
|
|
26
|
+
getPingMs(): number;
|
|
27
|
+
subChannels(socket: IClientSocket, channels: string[]): void;
|
|
28
|
+
unsubChannels(socket: IClientSocket, channels: string[]): void;
|
|
29
|
+
removeSocket(socket: DefaultClientSocket): void;
|
|
30
|
+
registerReconnectionHandler(socket: DefaultClientSocket, handler: ReconnectionHandler): void;
|
|
31
|
+
registerDisconnectionHandler(socket: DefaultClientSocket, handler: DisconnectionHandler): void;
|
|
32
|
+
registerMessageHandler(socket: DefaultClientSocket, handler: PlainMessageHandler): void;
|
|
33
|
+
sendPlainMessageToChannel(message: any, channel?: string): void;
|
|
34
|
+
joinChannels(channels: string[]): void;
|
|
35
|
+
leaveChannels(channels: string[]): void;
|
|
36
|
+
private sendPingPong;
|
|
37
|
+
private sendRawMessage;
|
|
38
|
+
private handleChannelJoin;
|
|
39
|
+
private handleChannelLeave;
|
|
40
|
+
private handlePlainMessage;
|
|
41
|
+
private handleConnect;
|
|
42
|
+
private handleDisconnect;
|
|
43
|
+
private handleMessage;
|
|
44
|
+
create(): IClientSocket;
|
|
45
|
+
forceDisconnect(): void;
|
|
46
|
+
forceReconnect(): void;
|
|
47
|
+
private physicConnect;
|
|
48
|
+
private retry;
|
|
49
|
+
}
|
|
50
50
|
//# sourceMappingURL=DefaultClientSocketManager.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export interface IWebSocket {
|
|
2
|
-
onopen(listener: () => void): void;
|
|
3
|
-
onmessage(listener: (data: any) => void): void;
|
|
4
|
-
onclose(listener: (err?: any) => void): void;
|
|
5
|
-
close(): void;
|
|
6
|
-
send(data: any): void;
|
|
7
|
-
}
|
|
1
|
+
export interface IWebSocket {
|
|
2
|
+
onopen(listener: () => void): void;
|
|
3
|
+
onmessage(listener: (data: any) => void): void;
|
|
4
|
+
onclose(listener: (err?: any) => void): void;
|
|
5
|
+
close(): void;
|
|
6
|
+
send(data: any): void;
|
|
7
|
+
}
|
|
8
8
|
//# sourceMappingURL=IWebSocket.d.ts.map
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
export interface SocketConfig {
|
|
2
|
-
keepAlive?: {
|
|
3
|
-
/**
|
|
4
|
-
* the interval between ping request
|
|
5
|
-
*/
|
|
6
|
-
pingIntervalMs: number;
|
|
7
|
-
/**
|
|
8
|
-
* maximum number of accumulated pingpong to tell that the connection has closed
|
|
9
|
-
*/
|
|
10
|
-
deadThreshold: number;
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* the additional time between reconnection requests in case of connection interruption
|
|
14
|
-
*/
|
|
15
|
-
reconnectTimeDeltaMs?: number;
|
|
16
|
-
}
|
|
1
|
+
export interface SocketConfig {
|
|
2
|
+
keepAlive?: {
|
|
3
|
+
/**
|
|
4
|
+
* the interval between ping request
|
|
5
|
+
*/
|
|
6
|
+
pingIntervalMs: number;
|
|
7
|
+
/**
|
|
8
|
+
* maximum number of accumulated pingpong to tell that the connection has closed
|
|
9
|
+
*/
|
|
10
|
+
deadThreshold: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* the additional time between reconnection requests in case of connection interruption
|
|
14
|
+
*/
|
|
15
|
+
reconnectTimeDeltaMs?: number;
|
|
16
|
+
}
|
|
17
17
|
//# sourceMappingURL=SocketConfig.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export declare abstract class AbstractStorage {
|
|
2
|
-
abstract getItem<T>(key: string): Promise<T | undefined>;
|
|
3
|
-
abstract setItem<T>(key: string, value: T): Promise<void>;
|
|
4
|
-
abstract deleteItem(key: string): Promise<void>;
|
|
5
|
-
}
|
|
1
|
+
export declare abstract class AbstractStorage {
|
|
2
|
+
abstract getItem<T>(key: string): Promise<T | undefined>;
|
|
3
|
+
abstract setItem<T>(key: string, value: T): Promise<void>;
|
|
4
|
+
abstract deleteItem(key: string): Promise<void>;
|
|
5
|
+
}
|
|
6
6
|
//# sourceMappingURL=AbstractStorage.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClaireApp } from "@clairejs/core";
|
|
2
|
-
export declare class ClaireClient extends ClaireApp {
|
|
3
|
-
}
|
|
1
|
+
import { ClaireApp } from "@clairejs/core";
|
|
2
|
+
export declare class ClaireClient extends ClaireApp {
|
|
3
|
+
}
|
|
4
4
|
//# sourceMappingURL=ClaireClient.d.ts.map
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { IInit } from "@clairejs/core";
|
|
2
|
-
import { AbstractStorage } from "../system/AbstractStorage";
|
|
3
|
-
import { TranslationMap } from "./types";
|
|
4
|
-
declare type LangSubscriber = (lang: string) => void;
|
|
5
|
-
export declare class Translator implements IInit {
|
|
6
|
-
readonly storage: AbstractStorage;
|
|
7
|
-
allLangs: string[];
|
|
8
|
-
currentLang?: string;
|
|
9
|
-
subscribers: LangSubscriber[];
|
|
10
|
-
constructor(storage: AbstractStorage);
|
|
11
|
-
init(): Promise<void>;
|
|
12
|
-
exit(): void;
|
|
13
|
-
addLangSubscriber(subscriber: LangSubscriber): void;
|
|
14
|
-
removeLangSubscriber(subscriber: LangSubscriber): void;
|
|
15
|
-
getCurrentLanguage(): Promise<string | undefined>;
|
|
16
|
-
setCurrentLanguage(lang: string): Promise<void>;
|
|
17
|
-
getLanguages(): Promise<string[]>;
|
|
18
|
-
setLanguages(languages: string[]): Promise<void>;
|
|
19
|
-
getTranslationObject(translationMap: TranslationMap): any;
|
|
20
|
-
}
|
|
21
|
-
export {};
|
|
1
|
+
import { IInit } from "@clairejs/core";
|
|
2
|
+
import { AbstractStorage } from "../system/AbstractStorage";
|
|
3
|
+
import { TranslationMap } from "./types";
|
|
4
|
+
declare type LangSubscriber = (lang: string) => void;
|
|
5
|
+
export declare class Translator implements IInit {
|
|
6
|
+
readonly storage: AbstractStorage;
|
|
7
|
+
allLangs: string[];
|
|
8
|
+
currentLang?: string;
|
|
9
|
+
subscribers: LangSubscriber[];
|
|
10
|
+
constructor(storage: AbstractStorage);
|
|
11
|
+
init(): Promise<void>;
|
|
12
|
+
exit(): void;
|
|
13
|
+
addLangSubscriber(subscriber: LangSubscriber): void;
|
|
14
|
+
removeLangSubscriber(subscriber: LangSubscriber): void;
|
|
15
|
+
getCurrentLanguage(): Promise<string | undefined>;
|
|
16
|
+
setCurrentLanguage(lang: string): Promise<void>;
|
|
17
|
+
getLanguages(): Promise<string[]>;
|
|
18
|
+
setLanguages(languages: string[]): Promise<void>;
|
|
19
|
+
getTranslationObject(translationMap: TranslationMap): any;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
22
|
//# sourceMappingURL=Translator.d.ts.map
|