@clairejs/client 3.3.2 → 3.4.0
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 +6 -1
- package/dist/api/DefaultHttpClient.d.ts +3 -3
- package/dist/api/DefaultHttpClient.js +2 -2
- package/dist/api/RefreshHttpClient.d.ts +3 -3
- package/dist/api/RefreshHttpClient.js +6 -6
- package/dist/socket/DefaultClientSocketManager.d.ts +3 -3
- package/dist/socket/DefaultClientSocketManager.js +15 -15
- package/dist/translation/Translator.d.ts +3 -3
- package/dist/translation/Translator.js +4 -18
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Method } from "axios";
|
|
2
|
-
import {
|
|
2
|
+
import { LogHandler } from "@clairejs/core";
|
|
3
3
|
import { AbstractHttpClient, RequestOptions } from "./AbstractHttpClient";
|
|
4
4
|
import { AbstractStorage } from "../system/AbstractStorage";
|
|
5
5
|
export interface RequestData {
|
|
@@ -11,12 +11,12 @@ export interface RequestData {
|
|
|
11
11
|
}
|
|
12
12
|
export declare class DefaultHttpClient extends AbstractHttpClient {
|
|
13
13
|
protected readonly apiServerUrl: string;
|
|
14
|
-
protected readonly logger
|
|
14
|
+
protected readonly logger?: LogHandler | undefined;
|
|
15
15
|
protected readonly maxRetryCount: number;
|
|
16
16
|
protected readonly delayMsBetweenRetry: number;
|
|
17
17
|
protected readonly storage?: AbstractStorage | undefined;
|
|
18
18
|
private readonly api;
|
|
19
|
-
constructor(apiServerUrl: string, logger
|
|
19
|
+
constructor(apiServerUrl: string, logger?: LogHandler | undefined, maxRetryCount?: number, delayMsBetweenRetry?: number, storage?: AbstractStorage | undefined);
|
|
20
20
|
protected resolveUrl(url: string): Promise<string>;
|
|
21
21
|
protected getAuthorization(): Promise<string>;
|
|
22
22
|
protected errorHandler<T = any>(_operation: () => Promise<T>, err: any): Promise<T | undefined>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
|
-
import { Errors } from "@clairejs/core";
|
|
2
|
+
import { Errors, LogLevel } from "@clairejs/core";
|
|
3
3
|
import { AbstractHttpClient } from "./AbstractHttpClient";
|
|
4
4
|
export class DefaultHttpClient extends AbstractHttpClient {
|
|
5
5
|
apiServerUrl;
|
|
@@ -69,7 +69,7 @@ export class DefaultHttpClient extends AbstractHttpClient {
|
|
|
69
69
|
err.response.status === 503 ||
|
|
70
70
|
err.response.data?.message === "Service Unavailable") &&
|
|
71
71
|
retryCount < this.maxRetryCount) {
|
|
72
|
-
this.logger.
|
|
72
|
+
this.logger?.log(LogLevel.DEBUG, `unknown error encountered, retrying request ${retryCount + 1}/${this.maxRetryCount} after ${this.delayMsBetweenRetry}ms`);
|
|
73
73
|
await new Promise((resolve) => setTimeout(resolve, this.delayMsBetweenRetry));
|
|
74
74
|
return await this.retry(apiCall, retryCount + 1);
|
|
75
75
|
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AccessToken, LogHandler } from "@clairejs/core";
|
|
2
2
|
import { AbstractStorage } from "../system/AbstractStorage";
|
|
3
3
|
import { AbstractTokenManager } from "./AbstractTokenManager";
|
|
4
4
|
import { DefaultHttpClient } from "./DefaultHttpClient";
|
|
5
5
|
export declare class RefreshHttpClient extends DefaultHttpClient {
|
|
6
6
|
protected readonly apiServerUrl: string;
|
|
7
|
-
protected readonly logger: AbstractLogger;
|
|
8
7
|
protected readonly tokenManager: AbstractTokenManager;
|
|
8
|
+
protected readonly logger?: LogHandler | undefined;
|
|
9
9
|
protected readonly maxRetryCount: number;
|
|
10
10
|
protected readonly delayMsBetweenRetry: number;
|
|
11
11
|
protected readonly storage?: AbstractStorage | undefined;
|
|
12
12
|
private refreshing;
|
|
13
13
|
private refreshQueue;
|
|
14
14
|
private tokenQueue;
|
|
15
|
-
constructor(apiServerUrl: string,
|
|
15
|
+
constructor(apiServerUrl: string, tokenManager: AbstractTokenManager, logger?: LogHandler | undefined, maxRetryCount?: number, delayMsBetweenRetry?: number, storage?: AbstractStorage | undefined);
|
|
16
16
|
protected getRefreshedAccessToken(): Promise<AccessToken>;
|
|
17
17
|
protected reauthenticate(): Promise<void>;
|
|
18
18
|
protected getAuthorization(): Promise<string>;
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { Errors } from "@clairejs/core";
|
|
1
|
+
import { Errors, LogLevel } from "@clairejs/core";
|
|
2
2
|
import { DefaultHttpClient } from "./DefaultHttpClient";
|
|
3
3
|
const tokenExpiredError = Errors.TOKEN_EXPIRED().name;
|
|
4
4
|
const invalidTokenError = Errors.INVALID_TOKEN().name;
|
|
5
5
|
export class RefreshHttpClient extends DefaultHttpClient {
|
|
6
6
|
apiServerUrl;
|
|
7
|
-
logger;
|
|
8
7
|
tokenManager;
|
|
8
|
+
logger;
|
|
9
9
|
maxRetryCount;
|
|
10
10
|
delayMsBetweenRetry;
|
|
11
11
|
storage;
|
|
12
12
|
refreshing = false;
|
|
13
13
|
refreshQueue = [];
|
|
14
14
|
tokenQueue = [];
|
|
15
|
-
constructor(apiServerUrl,
|
|
15
|
+
constructor(apiServerUrl, tokenManager, logger, maxRetryCount = 2, delayMsBetweenRetry = 200, storage) {
|
|
16
16
|
super(apiServerUrl, logger, maxRetryCount, delayMsBetweenRetry, storage);
|
|
17
17
|
this.apiServerUrl = apiServerUrl;
|
|
18
|
-
this.logger = logger;
|
|
19
18
|
this.tokenManager = tokenManager;
|
|
19
|
+
this.logger = logger;
|
|
20
20
|
this.maxRetryCount = maxRetryCount;
|
|
21
21
|
this.delayMsBetweenRetry = delayMsBetweenRetry;
|
|
22
22
|
this.storage = storage;
|
|
@@ -41,7 +41,7 @@ export class RefreshHttpClient extends DefaultHttpClient {
|
|
|
41
41
|
}
|
|
42
42
|
async refreshToken(token) {
|
|
43
43
|
if (this.refreshing) {
|
|
44
|
-
this.logger.
|
|
44
|
+
this.logger?.log(LogLevel.DEBUG, "Awaiting refresh token, queued");
|
|
45
45
|
return await new Promise((resolver) => {
|
|
46
46
|
this.refreshQueue.push(resolver);
|
|
47
47
|
});
|
|
@@ -56,7 +56,7 @@ export class RefreshHttpClient extends DefaultHttpClient {
|
|
|
56
56
|
this.refreshing = true;
|
|
57
57
|
token = await this.getRefreshedAccessToken();
|
|
58
58
|
await this.tokenManager.setAccessToken(token);
|
|
59
|
-
this.logger.
|
|
59
|
+
this.logger?.log(LogLevel.DEBUG, "Access token was refreshed");
|
|
60
60
|
}
|
|
61
61
|
finally {
|
|
62
62
|
this.refreshing = false;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DisconnectionHandler, IClientSocket, PlainMessageHandler, ReconnectionHandler, LogHandler } from "@clairejs/core";
|
|
2
2
|
import { AbstractClientSocketManager } from "./AbstractClientSocketManager";
|
|
3
3
|
import { SocketConfig } from "./SocketConfig";
|
|
4
4
|
import { DefaultClientSocket } from "./DefaultClientSocket";
|
|
5
5
|
import { IWebSocket } from "./IWebSocket";
|
|
6
6
|
export declare class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
7
7
|
private readonly wsProvider;
|
|
8
|
-
private readonly logger
|
|
8
|
+
private readonly logger?;
|
|
9
9
|
private readonly config?;
|
|
10
10
|
private socket?;
|
|
11
11
|
private allSockets;
|
|
@@ -22,7 +22,7 @@ export declare class DefaultClientSocketManager extends AbstractClientSocketMana
|
|
|
22
22
|
sentTimestamp: number;
|
|
23
23
|
receivedTimestamp?: number;
|
|
24
24
|
}[];
|
|
25
|
-
constructor(wsProvider: () => Promise<IWebSocket>, logger
|
|
25
|
+
constructor(wsProvider: () => Promise<IWebSocket>, logger?: LogHandler | undefined, config?: SocketConfig | undefined);
|
|
26
26
|
getPingMs(): number;
|
|
27
27
|
subChannels(socket: IClientSocket, channels: string[]): void;
|
|
28
28
|
unsubChannels(socket: IClientSocket, channels: string[]): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Errors, MessageType, } from "@clairejs/core";
|
|
1
|
+
import { LogLevel, Errors, MessageType, } from "@clairejs/core";
|
|
2
2
|
import { AbstractClientSocketManager } from "./AbstractClientSocketManager";
|
|
3
3
|
import { DefaultClientSocket } from "./DefaultClientSocket";
|
|
4
4
|
const pingpongMaxCount = 10;
|
|
@@ -34,7 +34,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
34
34
|
subChannels(socket, channels) {
|
|
35
35
|
const info = this.allSockets.find((s) => s.socket === socket);
|
|
36
36
|
if (!info) {
|
|
37
|
-
this.logger.
|
|
37
|
+
this.logger?.log(LogLevel.DEBUG, "Socket not found");
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
//-- un-connected channels
|
|
@@ -53,7 +53,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
53
53
|
unsubChannels(socket, channels) {
|
|
54
54
|
const info = this.allSockets.find((s) => s.socket === socket);
|
|
55
55
|
if (!info) {
|
|
56
|
-
this.logger.
|
|
56
|
+
this.logger?.log(LogLevel.DEBUG, "Socket not found");
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
59
59
|
info.registeredChannels = info.registeredChannels.filter((c) => !channels.includes(c));
|
|
@@ -178,10 +178,10 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
178
178
|
throw Errors.SYSTEM_ERROR("Socket not available");
|
|
179
179
|
}
|
|
180
180
|
this.socket.send(message);
|
|
181
|
-
this.logger.
|
|
181
|
+
this.logger?.log(LogLevel.DEBUG, "Raw send", message);
|
|
182
182
|
}
|
|
183
183
|
handleChannelJoin(channels) {
|
|
184
|
-
this.logger.
|
|
184
|
+
this.logger?.log(LogLevel.DEBUG, "Joinning channels", channels);
|
|
185
185
|
for (const channel of channels) {
|
|
186
186
|
let foundChannel = this.allChannels.find((c) => c.channel === channel);
|
|
187
187
|
if (!foundChannel) {
|
|
@@ -191,7 +191,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
191
191
|
foundChannel.connected = true;
|
|
192
192
|
//-- flush messages
|
|
193
193
|
if (foundChannel.pendingMessages.length) {
|
|
194
|
-
this.logger.
|
|
194
|
+
this.logger?.log(LogLevel.DEBUG, `Flushing ${foundChannel.pendingMessages.length} message`);
|
|
195
195
|
for (const message of foundChannel.pendingMessages) {
|
|
196
196
|
this.sendPlainMessageToChannel(message, foundChannel.channel);
|
|
197
197
|
}
|
|
@@ -200,7 +200,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
handleChannelLeave(channels) {
|
|
203
|
-
this.logger.
|
|
203
|
+
this.logger?.log(LogLevel.DEBUG, "Leaving channels", channels);
|
|
204
204
|
this.allChannels = this.allChannels.filter((c) => !channels.includes(c.channel));
|
|
205
205
|
}
|
|
206
206
|
handlePlainMessage(message, channel) {
|
|
@@ -209,7 +209,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
handleConnect() {
|
|
212
|
-
this.logger.
|
|
212
|
+
this.logger?.log(LogLevel.DEBUG, "Socket connected");
|
|
213
213
|
//-- socket open, set interval
|
|
214
214
|
if (this.pingIntervalId) {
|
|
215
215
|
clearInterval(this.pingIntervalId);
|
|
@@ -242,7 +242,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
242
242
|
if (err) {
|
|
243
243
|
this.intendedDisconnection = true;
|
|
244
244
|
}
|
|
245
|
-
this.logger.
|
|
245
|
+
this.logger?.log(LogLevel.DEBUG, "Socket connnection closed, error: ", err);
|
|
246
246
|
if (this.pingIntervalId) {
|
|
247
247
|
clearInterval(this.pingIntervalId);
|
|
248
248
|
}
|
|
@@ -255,7 +255,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
255
255
|
//-- remove all channels
|
|
256
256
|
this.allSockets = [];
|
|
257
257
|
this.allChannels = [];
|
|
258
|
-
this.logger.
|
|
258
|
+
this.logger?.log(LogLevel.DEBUG, "Socket connection terminated");
|
|
259
259
|
}
|
|
260
260
|
else {
|
|
261
261
|
//-- disconnect all channels to be reconnected when the socket is connected again
|
|
@@ -267,7 +267,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
handleMessage(message) {
|
|
270
|
-
this.logger.
|
|
270
|
+
this.logger?.log(LogLevel.DEBUG, "Raw receive", message);
|
|
271
271
|
switch (message.type) {
|
|
272
272
|
case MessageType.READY:
|
|
273
273
|
this.handleConnect();
|
|
@@ -284,7 +284,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
284
284
|
break;
|
|
285
285
|
case MessageType.CHANNEL_JOIN:
|
|
286
286
|
if (message.data?.error) {
|
|
287
|
-
this.logger.
|
|
287
|
+
this.logger?.log(LogLevel.ERROR, "Join channel error", message.data.error);
|
|
288
288
|
}
|
|
289
289
|
else {
|
|
290
290
|
this.handleChannelJoin(message.data);
|
|
@@ -337,7 +337,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
337
337
|
this.socket = socket;
|
|
338
338
|
this.socket.onopen(() => {
|
|
339
339
|
this.socketConnected = true;
|
|
340
|
-
this.logger.
|
|
340
|
+
this.logger?.log(LogLevel.DEBUG, "Physic link connected, sending & waiting for READY message");
|
|
341
341
|
this.sendRawMessage({
|
|
342
342
|
type: MessageType.READY,
|
|
343
343
|
data: "",
|
|
@@ -346,7 +346,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
346
346
|
this.socket.onmessage((data) => {
|
|
347
347
|
const message = JSON.parse(data);
|
|
348
348
|
if (!message || !message.type) {
|
|
349
|
-
this.logger.
|
|
349
|
+
this.logger?.log(LogLevel.DEBUG, "Invalid mesasge structure", data);
|
|
350
350
|
return;
|
|
351
351
|
}
|
|
352
352
|
this.handleMessage(message);
|
|
@@ -357,7 +357,7 @@ export class DefaultClientSocketManager extends AbstractClientSocketManager {
|
|
|
357
357
|
});
|
|
358
358
|
}
|
|
359
359
|
retry() {
|
|
360
|
-
this.logger.
|
|
360
|
+
this.logger?.log(LogLevel.DEBUG, `Socket connection retrying in ${this.retryDelay}ms`);
|
|
361
361
|
this.physicConnect();
|
|
362
362
|
this.retryDelay += this.config?.reconnectTimeDeltaMs || 3000;
|
|
363
363
|
this.retryTimeoutId = setTimeout(() => {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LogHandler } from "@clairejs/core";
|
|
2
2
|
export type TranslationObject = Record<string, string>;
|
|
3
3
|
export type TranslationProvider = Promise<TranslationObject>;
|
|
4
4
|
export type TranslationData = Record<string, string>;
|
|
5
5
|
export declare class Translator {
|
|
6
|
-
readonly logger
|
|
6
|
+
protected readonly logger?: LogHandler | undefined;
|
|
7
7
|
private translationProviders?;
|
|
8
8
|
private translations;
|
|
9
9
|
private translationLoadings;
|
|
10
|
-
constructor(logger
|
|
10
|
+
constructor(logger?: LogHandler | undefined);
|
|
11
11
|
setTranslations(translationProviders: Record<string, TranslationProvider>): void;
|
|
12
12
|
awaitingTranslations(lang: string): Promise<void>;
|
|
13
13
|
translate(lang: string, template: string, data?: TranslationData): string;
|
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import { AbstractLogger, Injectable } from "@clairejs/core";
|
|
1
|
+
import { LogLevel } from "@clairejs/core";
|
|
11
2
|
const dataKeyRegex = /{([_a-zA-Z][a-zA-Z0-9_]*)}/g;
|
|
12
|
-
|
|
3
|
+
export class Translator {
|
|
13
4
|
logger;
|
|
14
5
|
translationProviders;
|
|
15
6
|
translations = {};
|
|
@@ -40,7 +31,7 @@ let Translator = class Translator {
|
|
|
40
31
|
}
|
|
41
32
|
catch (err) {
|
|
42
33
|
//-- error loading translation
|
|
43
|
-
this.logger.
|
|
34
|
+
this.logger?.log(LogLevel.ERROR, "Error loading translation", err);
|
|
44
35
|
this.translations[lang] = undefined;
|
|
45
36
|
}
|
|
46
37
|
}
|
|
@@ -95,9 +86,4 @@ let Translator = class Translator {
|
|
|
95
86
|
}
|
|
96
87
|
return result;
|
|
97
88
|
}
|
|
98
|
-
}
|
|
99
|
-
Translator = __decorate([
|
|
100
|
-
Injectable(),
|
|
101
|
-
__metadata("design:paramtypes", [AbstractLogger])
|
|
102
|
-
], Translator);
|
|
103
|
-
export { Translator };
|
|
89
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clairejs/client",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"axios": "^1.3.4"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"@clairejs/core": "^3.5
|
|
16
|
+
"@clairejs/core": "^3.6.5"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/mocha": "^10.0.1",
|