@litert/televoke 1.2.0 → 1.3.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/CHANGES.md +16 -0
- package/docs/README.md +6 -0
- package/docs/Televoke_v2.1.md +499 -0
- package/docs/Televoke_v2.md +1 -1
- package/lib/client/Client.Constants.d.ts +5 -0
- package/lib/client/Client.Constants.d.ts.map +1 -0
- package/lib/client/Client.Constants.js +9 -0
- package/lib/client/Client.Constants.js.map +1 -0
- package/lib/client/Client.decl.d.ts +31 -1
- package/lib/client/Client.decl.d.ts.map +1 -1
- package/lib/client/JsonApiClient.impl.d.ts.map +1 -1
- package/lib/client/JsonApiClient.impl.js +29 -4
- package/lib/client/JsonApiClient.impl.js.map +1 -1
- package/lib/server/LegacyServerChannel.impl.d.ts +1 -1
- package/lib/server/LegacyServerChannel.impl.d.ts.map +1 -1
- package/lib/server/Server.decl.d.ts +17 -2
- package/lib/server/Server.decl.d.ts.map +1 -1
- package/lib/server/Server.impl.d.ts.map +1 -1
- package/lib/server/Server.impl.js +4 -3
- package/lib/server/Server.impl.js.map +1 -1
- package/lib/server/SimpleJsonApiRouter.d.ts +1 -1
- package/lib/server/SimpleJsonApiRouter.d.ts.map +1 -1
- package/lib/server/SimpleJsonApiRouter.js +8 -3
- package/lib/server/SimpleJsonApiRouter.js.map +1 -1
- package/lib/shared/Channel.impl.d.ts +1 -1
- package/lib/shared/Channel.impl.d.ts.map +1 -1
- package/lib/shared/Channel.impl.js +22 -10
- package/lib/shared/Channel.impl.js.map +1 -1
- package/lib/shared/Encodings/v2/Constants.v2.d.ts +13 -0
- package/lib/shared/Encodings/v2/Constants.v2.d.ts.map +1 -1
- package/lib/shared/Encodings/v2/Constants.v2.js +16 -1
- package/lib/shared/Encodings/v2/Constants.v2.js.map +1 -1
- package/lib/shared/Encodings/v2/DecoderV2.d.ts.map +1 -1
- package/lib/shared/Encodings/v2/DecoderV2.js +80 -6
- package/lib/shared/Encodings/v2/DecoderV2.js.map +1 -1
- package/lib/shared/Encodings/v2/EncoderV2.d.ts +2 -1
- package/lib/shared/Encodings/v2/EncoderV2.d.ts.map +1 -1
- package/lib/shared/Encodings/v2/EncoderV2.js +103 -24
- package/lib/shared/Encodings/v2/EncoderV2.js.map +1 -1
- package/lib/shared/Encodings/v2/Encoding.v2.decl.d.ts +69 -39
- package/lib/shared/Encodings/v2/Encoding.v2.decl.d.ts.map +1 -1
- package/lib/shared/Errors.d.ts +1 -0
- package/lib/shared/Errors.d.ts.map +1 -1
- package/lib/shared/Errors.js +1 -0
- package/lib/shared/Errors.js.map +1 -1
- package/lib/shared/Shared.decl.d.ts +15 -15
- package/lib/shared/Shared.decl.d.ts.map +1 -1
- package/lib/shared/Utils.d.ts +1 -1
- package/lib/shared/Utils.d.ts.map +1 -1
- package/lib/shared/Utils.js.map +1 -1
- package/lib/transporters/http-listener/Http.Decl.d.ts.map +1 -1
- package/lib/transporters/http-listener/Http.Decl.js +0 -1
- package/lib/transporters/http-listener/Http.Decl.js.map +1 -1
- package/lib/transporters/legacy-http/LegacyHttp.Client.Native.d.ts.map +1 -1
- package/lib/transporters/legacy-http/LegacyHttp.Client.Native.js +22 -6
- package/lib/transporters/legacy-http/LegacyHttp.Client.Native.js.map +1 -1
- package/lib/transporters/legacy-http/LegacyHttp.Server.js.map +1 -1
- package/lib/transporters/memory/Memory.Impl.js.map +1 -1
- package/lib/transporters/websocket/WebSocket.Server.d.ts.map +1 -1
- package/lib/transporters/websocket/WebSocket.Server.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/client/Client.Constants.ts +4 -0
- package/src/lib/client/Client.decl.ts +41 -1
- package/src/lib/client/JsonApiClient.impl.ts +58 -7
- package/src/lib/server/LegacyServerChannel.impl.ts +1 -1
- package/src/lib/server/Server.decl.ts +22 -1
- package/src/lib/server/Server.impl.ts +4 -3
- package/src/lib/server/SimpleJsonApiRouter.ts +16 -3
- package/src/lib/shared/Channel.impl.ts +42 -22
- package/src/lib/shared/Encodings/v2/Constants.v2.ts +19 -0
- package/src/lib/shared/Encodings/v2/DecoderV2.ts +136 -14
- package/src/lib/shared/Encodings/v2/EncoderV2.ts +159 -35
- package/src/lib/shared/Encodings/v2/Encoding.v2.decl.ts +95 -43
- package/src/lib/shared/Errors.ts +1 -0
- package/src/lib/shared/Shared.decl.ts +20 -15
- package/src/lib/shared/Utils.ts +2 -2
- package/src/lib/transporters/http-listener/Http.Decl.ts +0 -1
- package/src/lib/transporters/legacy-http/LegacyHttp.Client.Native.ts +30 -7
- package/src/lib/transporters/legacy-http/LegacyHttp.Server.ts +1 -1
- package/src/lib/transporters/memory/Memory.Impl.ts +3 -3
- package/src/lib/transporters/websocket/WebSocket.Server.ts +4 -3
|
@@ -17,122 +17,174 @@
|
|
|
17
17
|
import type * as CS from './Constants.v2';
|
|
18
18
|
import type { TelevokeError } from '../../Errors';
|
|
19
19
|
|
|
20
|
-
export type
|
|
20
|
+
export type IBinLike = Buffer | string;
|
|
21
21
|
|
|
22
|
-
export type
|
|
22
|
+
export type IBinLikeArray = IBinLike[];
|
|
23
|
+
|
|
24
|
+
export type IDecBinItem = Buffer[];
|
|
25
|
+
|
|
26
|
+
export type IEncBinItem = IBinLike | IBinLikeArray;
|
|
23
27
|
|
|
24
28
|
export interface ICommandPacket {
|
|
25
29
|
|
|
26
30
|
/**
|
|
27
31
|
* The command of this packet.
|
|
28
32
|
*/
|
|
29
|
-
|
|
33
|
+
cmd: CS.ECommand;
|
|
30
34
|
|
|
31
35
|
/**
|
|
32
36
|
* The type of this packet.
|
|
33
37
|
*/
|
|
34
|
-
|
|
38
|
+
typ: CS.EPacketType;
|
|
35
39
|
|
|
36
40
|
/**
|
|
37
41
|
* The sequence number of this packet.
|
|
38
42
|
*/
|
|
39
|
-
|
|
43
|
+
seq: number;
|
|
40
44
|
|
|
41
45
|
/**
|
|
42
46
|
* The content of this packet.
|
|
43
47
|
*/
|
|
44
|
-
|
|
48
|
+
ct: unknown;
|
|
45
49
|
}
|
|
46
50
|
|
|
47
51
|
export interface IRequestPacket extends ICommandPacket {
|
|
48
52
|
|
|
49
|
-
|
|
53
|
+
typ: CS.EPacketType.REQUEST;
|
|
50
54
|
}
|
|
51
55
|
|
|
52
|
-
export interface
|
|
56
|
+
export interface IErrorReplyPacket extends ICommandPacket {
|
|
53
57
|
|
|
54
|
-
|
|
58
|
+
typ: CS.EPacketType.ERROR_RESPONSE;
|
|
55
59
|
|
|
56
|
-
|
|
60
|
+
ct: TelevokeError;
|
|
57
61
|
}
|
|
58
62
|
|
|
59
|
-
export interface
|
|
63
|
+
export interface IOkReplyPacket extends ICommandPacket {
|
|
60
64
|
|
|
61
|
-
|
|
65
|
+
typ: CS.EPacketType.SUCCESS_RESPONSE;
|
|
62
66
|
}
|
|
63
67
|
|
|
64
|
-
export interface IApiRequestPacket extends IRequestPacket {
|
|
68
|
+
export interface IApiRequestPacket<TIsReq extends boolean> extends IRequestPacket {
|
|
65
69
|
|
|
66
|
-
|
|
70
|
+
cmd: CS.ECommand.API_CALL;
|
|
67
71
|
|
|
68
|
-
|
|
72
|
+
ct: {
|
|
69
73
|
|
|
70
74
|
/**
|
|
71
75
|
* The name of the API to be invoked.
|
|
72
76
|
*/
|
|
73
|
-
|
|
77
|
+
name: string;
|
|
74
78
|
|
|
75
79
|
/**
|
|
76
80
|
* The arguments of the API to be invoked.
|
|
77
81
|
*/
|
|
78
|
-
|
|
82
|
+
body: TIsReq extends true ? IEncBinItem : Buffer[];
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The encoding identifier of the body.
|
|
86
|
+
*
|
|
87
|
+
* @default 0 which means JSON
|
|
88
|
+
*/
|
|
89
|
+
bodyEnc?: number;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The extension binary chunks of the API to be invoked.
|
|
93
|
+
*/
|
|
94
|
+
binChunks?: TIsReq extends true ? IEncBinItem[] : Buffer[][];
|
|
79
95
|
};
|
|
80
96
|
}
|
|
81
97
|
|
|
82
|
-
export
|
|
98
|
+
export type IApiRequestPacketEncoding = IApiRequestPacket<true>;
|
|
99
|
+
|
|
100
|
+
export type IApiRequestPacketDecoded = IApiRequestPacket<false>;
|
|
101
|
+
|
|
102
|
+
export interface IApiReplyPacket<TIsReq extends boolean> extends IOkReplyPacket {
|
|
83
103
|
|
|
84
|
-
|
|
104
|
+
cmd: CS.ECommand.API_CALL;
|
|
85
105
|
|
|
86
|
-
|
|
106
|
+
ct: {
|
|
107
|
+
|
|
108
|
+
body: TIsReq extends true ? IEncBinItem : Buffer[];
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The extension binary chunks of the API to be invoked.
|
|
112
|
+
*/
|
|
113
|
+
binChunks?: TIsReq extends true ? IEncBinItem[] : Buffer[][];
|
|
114
|
+
};
|
|
87
115
|
}
|
|
88
116
|
|
|
89
|
-
export
|
|
117
|
+
export type IApiReplyPacketEncoding = IApiReplyPacket<true>;
|
|
90
118
|
|
|
91
|
-
|
|
119
|
+
export type IApiReplyPacketDecoded = IApiReplyPacket<false>;
|
|
92
120
|
|
|
93
|
-
|
|
121
|
+
// PING Command
|
|
122
|
+
|
|
123
|
+
export interface IPingRequestPacket<TIsReq extends boolean> extends IRequestPacket {
|
|
124
|
+
|
|
125
|
+
cmd: CS.ECommand.PING;
|
|
126
|
+
|
|
127
|
+
ct: TIsReq extends true ? IEncBinItem : IDecBinItem;
|
|
94
128
|
}
|
|
95
129
|
|
|
130
|
+
export type IPingRequestPacketEncoding = IPingRequestPacket<true>;
|
|
131
|
+
|
|
132
|
+
export type IPingRequestPacketDecoded = IPingRequestPacket<false>;
|
|
133
|
+
|
|
134
|
+
export interface IPingReplyPacket<TIsReq extends boolean> extends IOkReplyPacket {
|
|
135
|
+
|
|
136
|
+
cmd: CS.ECommand.PING;
|
|
137
|
+
|
|
138
|
+
ct: TIsReq extends true ? IEncBinItem : Buffer[];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export type IPingReplyPacketEncoding = IPingReplyPacket<true>;
|
|
142
|
+
|
|
143
|
+
export type IPingReplyPacketDecoded = IPingReplyPacket<false>;
|
|
144
|
+
|
|
145
|
+
// PUSH_MESSAGE Command
|
|
146
|
+
|
|
147
|
+
export interface IPushMessageRequestPacket<TIsReq extends boolean> extends IRequestPacket {
|
|
148
|
+
|
|
149
|
+
cmd: CS.ECommand.PUSH_MESSAGE;
|
|
150
|
+
|
|
151
|
+
ct: TIsReq extends true ? IEncBinItem : Buffer[];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export type IPushMessageRequestPacketEncoding = IPushMessageRequestPacket<true>;
|
|
155
|
+
|
|
156
|
+
export type IPushMessageRequestPacketDecoded = IPushMessageRequestPacket<false>;
|
|
157
|
+
|
|
96
158
|
export interface ICloseRequestPacket extends IRequestPacket {
|
|
97
159
|
|
|
98
|
-
|
|
160
|
+
cmd: CS.ECommand.CLOSE;
|
|
99
161
|
|
|
100
|
-
|
|
162
|
+
ct: null;
|
|
101
163
|
}
|
|
102
164
|
|
|
103
|
-
export interface IBinaryChunkRequestPacket extends IRequestPacket {
|
|
165
|
+
export interface IBinaryChunkRequestPacket<TIsReq extends boolean> extends IRequestPacket {
|
|
104
166
|
|
|
105
|
-
|
|
167
|
+
cmd: CS.ECommand.BINARY_CHUNK;
|
|
106
168
|
|
|
107
|
-
|
|
169
|
+
ct: {
|
|
108
170
|
|
|
109
171
|
/**
|
|
110
172
|
* The stream ID of this chunk should be sent to.
|
|
111
173
|
*/
|
|
112
|
-
|
|
174
|
+
streamId: number;
|
|
113
175
|
|
|
114
176
|
/**
|
|
115
177
|
* The index of this chunk in the stream.
|
|
116
178
|
*/
|
|
117
|
-
|
|
179
|
+
index: number;
|
|
118
180
|
|
|
119
181
|
/**
|
|
120
182
|
* The chunk data.
|
|
121
183
|
*/
|
|
122
|
-
|
|
184
|
+
body: TIsReq extends true ? IEncBinItem : Buffer[];
|
|
123
185
|
};
|
|
124
186
|
}
|
|
125
187
|
|
|
126
|
-
export
|
|
188
|
+
export type IBinaryChunkRequestPacketEncoding = IBinaryChunkRequestPacket<true>;
|
|
127
189
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
readonly ct: IDataChunkField;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export interface IPingResponsePacket extends ISuccessResponsePacket {
|
|
134
|
-
|
|
135
|
-
readonly cmd: CS.ECommand.PING;
|
|
136
|
-
|
|
137
|
-
readonly ct: IDataChunkField;
|
|
138
|
-
}
|
|
190
|
+
export type IBinaryChunkRequestPacketDecoded = IBinaryChunkRequestPacket<false>;
|
package/src/lib/shared/Errors.ts
CHANGED
|
@@ -69,6 +69,7 @@ const errorCtors = {
|
|
|
69
69
|
...defineProtocolError('channel_inactive'),
|
|
70
70
|
...defineProtocolError('channel_closed'),
|
|
71
71
|
...defineProtocolError('api_not_found'),
|
|
72
|
+
...defineProtocolError('unk_api_enc'),
|
|
72
73
|
...defineProtocolError('cmd_not_impl'),
|
|
73
74
|
...defineProtocolError('network_error'),
|
|
74
75
|
...defineProtocolError('stream_not_found'),
|
|
@@ -14,18 +14,23 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { Readable } from 'node:stream';
|
|
17
|
+
import type { Readable } from 'node:stream';
|
|
18
18
|
|
|
19
|
-
export type IFn<TArgs extends
|
|
19
|
+
export type IFn<TArgs extends unknown[], TRet> = (...args: TArgs) => TRet;
|
|
20
20
|
|
|
21
|
-
export type IVoidFn<TArgs extends any[]> = IFn<TArgs, void>;
|
|
21
|
+
export type IVoidFn<TArgs extends any[] = any[]> = IFn<TArgs, void>;
|
|
22
22
|
|
|
23
23
|
// eslint-disable-next-line @typescript-eslint/no-restricted-types, @typescript-eslint/consistent-type-definitions
|
|
24
24
|
export type IObject = {};
|
|
25
25
|
|
|
26
|
-
export type IfIsFn<T, TTrue = T, TFalse = never> = T extends IFn<any[],
|
|
26
|
+
export type IfIsFn<T, TTrue = T, TFalse = never> = T extends IFn<any[], unknown> ? TTrue : TFalse;
|
|
27
27
|
|
|
28
|
-
export type IfIsOfFn<
|
|
28
|
+
export type IfIsOfFn<
|
|
29
|
+
T,
|
|
30
|
+
TFn extends IFn<unknown[], unknown>,
|
|
31
|
+
TTrue = T,
|
|
32
|
+
TFalse = never
|
|
33
|
+
> = T extends TFn ? TTrue : TFalse;
|
|
29
34
|
|
|
30
35
|
export interface IEventListener<T extends IDefaultEvents> {
|
|
31
36
|
|
|
@@ -37,7 +42,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
37
42
|
* @param event The event name.
|
|
38
43
|
* @param listener The listener function.
|
|
39
44
|
*/
|
|
40
|
-
on<TKey extends keyof T>(event: TKey, listener: IfIsOfFn<T[TKey], IVoidFn
|
|
45
|
+
on<TKey extends keyof T>(event: TKey, listener: IfIsOfFn<T[TKey], IVoidFn>): this;
|
|
41
46
|
|
|
42
47
|
/**
|
|
43
48
|
* Register a listener for the given event.
|
|
@@ -47,7 +52,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
47
52
|
* @param event The event name.
|
|
48
53
|
* @param listener The listener function.
|
|
49
54
|
*/
|
|
50
|
-
on(event: string | symbol, listener: IVoidFn
|
|
55
|
+
on(event: string | symbol, listener: IVoidFn): this;
|
|
51
56
|
|
|
52
57
|
/**
|
|
53
58
|
* Register a one-time listener for the given event.
|
|
@@ -57,7 +62,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
57
62
|
* @param event The event name.
|
|
58
63
|
* @param listener The listener function.
|
|
59
64
|
*/
|
|
60
|
-
once<TKey extends keyof T>(event: TKey, listener: IfIsOfFn<T[TKey], IVoidFn
|
|
65
|
+
once<TKey extends keyof T>(event: TKey, listener: IfIsOfFn<T[TKey], IVoidFn>): this;
|
|
61
66
|
|
|
62
67
|
/**
|
|
63
68
|
* Register a one-time listener for the given event.
|
|
@@ -67,7 +72,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
67
72
|
* @param event The event name.
|
|
68
73
|
* @param listener The listener function.
|
|
69
74
|
*/
|
|
70
|
-
once(event: string | symbol, listener: IVoidFn
|
|
75
|
+
once(event: string | symbol, listener: IVoidFn): this;
|
|
71
76
|
|
|
72
77
|
/**
|
|
73
78
|
* Register a listener for the given event.
|
|
@@ -77,7 +82,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
77
82
|
* @param event The event name.
|
|
78
83
|
* @param listener The listener function.
|
|
79
84
|
*/
|
|
80
|
-
addListener<TKey extends keyof T>(event: TKey, listener: IfIsOfFn<T[TKey], IVoidFn
|
|
85
|
+
addListener<TKey extends keyof T>(event: TKey, listener: IfIsOfFn<T[TKey], IVoidFn>): this;
|
|
81
86
|
|
|
82
87
|
/**
|
|
83
88
|
* Register a listener for the given event.
|
|
@@ -87,7 +92,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
87
92
|
* @param event The event name.
|
|
88
93
|
* @param listener The listener function.
|
|
89
94
|
*/
|
|
90
|
-
addListener(event: string | symbol, listener: IVoidFn
|
|
95
|
+
addListener(event: string | symbol, listener: IVoidFn): this;
|
|
91
96
|
|
|
92
97
|
/**
|
|
93
98
|
* Remove the given listener for the given event.
|
|
@@ -97,7 +102,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
97
102
|
* @param event The event name.
|
|
98
103
|
* @param listener The listener function.
|
|
99
104
|
*/
|
|
100
|
-
removeListener<TKey extends keyof T>(event: TKey, listener: IVoidFn
|
|
105
|
+
removeListener<TKey extends keyof T>(event: TKey, listener: IVoidFn): this;
|
|
101
106
|
|
|
102
107
|
/**
|
|
103
108
|
* Remove the given listener for the given event.
|
|
@@ -107,7 +112,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
107
112
|
* @param event The event name.
|
|
108
113
|
* @param listener The listener function.
|
|
109
114
|
*/
|
|
110
|
-
removeListener(event: string | symbol, listener: IVoidFn
|
|
115
|
+
removeListener(event: string | symbol, listener: IVoidFn): this;
|
|
111
116
|
|
|
112
117
|
/**
|
|
113
118
|
* Remove the given listener for the given event.
|
|
@@ -117,7 +122,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
117
122
|
* @param event The event name.
|
|
118
123
|
* @param listener The listener function.
|
|
119
124
|
*/
|
|
120
|
-
off<TKey extends keyof T>(event: TKey, listener: IVoidFn
|
|
125
|
+
off<TKey extends keyof T>(event: TKey, listener: IVoidFn): this;
|
|
121
126
|
|
|
122
127
|
/**
|
|
123
128
|
* Remove the given listener for the given event.
|
|
@@ -127,7 +132,7 @@ export interface IEventListener<T extends IDefaultEvents> {
|
|
|
127
132
|
* @param event The event name.
|
|
128
133
|
* @param listener The listener function.
|
|
129
134
|
*/
|
|
130
|
-
off(event: string | symbol, listener: IVoidFn
|
|
135
|
+
off(event: string | symbol, listener: IVoidFn): this;
|
|
131
136
|
|
|
132
137
|
/**
|
|
133
138
|
* Remove all listeners for the given event.
|
package/src/lib/shared/Utils.ts
CHANGED
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
* @param fn The function to call.
|
|
21
21
|
* @returns The wrapped function.
|
|
22
22
|
*/
|
|
23
|
-
export function once<T extends (...args: any[]) =>
|
|
23
|
+
export function once<T extends (...args: any[]) => unknown>(fn: T): T {
|
|
24
24
|
|
|
25
25
|
let called = false;
|
|
26
|
-
let result:
|
|
26
|
+
let result: unknown;
|
|
27
27
|
|
|
28
28
|
return function(...args: any[]) {
|
|
29
29
|
|
|
@@ -67,7 +67,6 @@ const DEFAULT_REFUSE_STATUS_CODE = 400;
|
|
|
67
67
|
*/
|
|
68
68
|
export const DEFAULT_LEGACY_HTTP_API_PROCESSOR: ILegacyHttpApiProcessor = function(_req, resp): void {
|
|
69
69
|
|
|
70
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
71
70
|
resp.writeHead(DEFAULT_REFUSE_STATUS_CODE, {
|
|
72
71
|
'Content-Type': 'text/plain',
|
|
73
72
|
'Content-Length': DEFAULT_REFUSE_PAYLOAD.byteLength,
|
|
@@ -21,8 +21,9 @@ import * as Shared from '../../shared';
|
|
|
21
21
|
import * as v1 from '../../shared/Encodings/v1';
|
|
22
22
|
import { EventEmitter } from 'node:events';
|
|
23
23
|
|
|
24
|
-
const
|
|
25
|
-
const
|
|
24
|
+
const H_HDR_NAME_CONTENT_LENGTH = 'content-length';
|
|
25
|
+
const H_HDR_NAME_CONTENT_TYPE = 'content-type';
|
|
26
|
+
const H_HDR_NAME_TV_VER = 'x-tv-ver';
|
|
26
27
|
|
|
27
28
|
const DEFAULT_MAX_CONNECTIONS = 100;
|
|
28
29
|
const DEFAULT_TIMEOUT = 30_000;
|
|
@@ -40,6 +41,8 @@ export interface ILegacyHttpClient<T extends Shared.IObject> extends C.IClient<T
|
|
|
40
41
|
setHeaders(newHeaders: $Http.OutgoingHttpHeaders, append?: boolean): void;
|
|
41
42
|
}
|
|
42
43
|
|
|
44
|
+
const H_HDR_VAL_JSON_MIME = 'application/json';
|
|
45
|
+
|
|
43
46
|
class TvLegacyHttpClient extends EventEmitter implements ILegacyHttpClient<any> {
|
|
44
47
|
|
|
45
48
|
public onError!: any;
|
|
@@ -121,6 +124,25 @@ class TvLegacyHttpClient extends EventEmitter implements ILegacyHttpClient<any>
|
|
|
121
124
|
}
|
|
122
125
|
}
|
|
123
126
|
|
|
127
|
+
public async callApi(api: any, args: any[]): Promise<any> {
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
|
|
131
|
+
return await this._invoke(api, ...args);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
|
|
135
|
+
if (this._retryOnConnReset && (e as any)?.code === 'ECONNRESET') {
|
|
136
|
+
|
|
137
|
+
return this._invoke(api, ...args);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
|
|
141
|
+
throw e;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
124
146
|
private _invoke(api: any, ...args: any[]): Promise<any> {
|
|
125
147
|
|
|
126
148
|
const CST = Date.now();
|
|
@@ -149,8 +171,9 @@ class TvLegacyHttpClient extends EventEmitter implements ILegacyHttpClient<any>
|
|
|
149
171
|
method: 'POST',
|
|
150
172
|
headers: {
|
|
151
173
|
...this._opts.headers,
|
|
152
|
-
[
|
|
153
|
-
[
|
|
174
|
+
[H_HDR_NAME_CONTENT_TYPE]: H_HDR_VAL_JSON_MIME,
|
|
175
|
+
[H_HDR_NAME_CONTENT_LENGTH]: Buffer.byteLength(content),
|
|
176
|
+
[H_HDR_NAME_TV_VER]: 1
|
|
154
177
|
},
|
|
155
178
|
}, (resp) => {
|
|
156
179
|
|
|
@@ -164,14 +187,14 @@ class TvLegacyHttpClient extends EventEmitter implements ILegacyHttpClient<any>
|
|
|
164
187
|
return;
|
|
165
188
|
}
|
|
166
189
|
|
|
167
|
-
if (!resp.headers[
|
|
190
|
+
if (!resp.headers[H_HDR_NAME_CONTENT_LENGTH]) {
|
|
168
191
|
|
|
169
192
|
resp.socket.destroy();
|
|
170
193
|
reject(new Shared.errors.invalid_response({ reason: 'missing_content_length' }));
|
|
171
194
|
return;
|
|
172
195
|
}
|
|
173
196
|
|
|
174
|
-
const length = parseInt(resp.headers[
|
|
197
|
+
const length = parseInt(resp.headers[H_HDR_NAME_CONTENT_LENGTH]);
|
|
175
198
|
|
|
176
199
|
if (!Number.isSafeInteger(length) || length > v1.MAX_PACKET_SIZE) { // Maximum request packet is 64MB
|
|
177
200
|
|
|
@@ -208,7 +231,7 @@ class TvLegacyHttpClient extends EventEmitter implements ILegacyHttpClient<any>
|
|
|
208
231
|
|
|
209
232
|
try {
|
|
210
233
|
|
|
211
|
-
data = JSON.parse(buf as
|
|
234
|
+
data = JSON.parse(buf as unknown as string);
|
|
212
235
|
}
|
|
213
236
|
catch (e) {
|
|
214
237
|
|
|
@@ -33,9 +33,9 @@ function createRandomName(): string {
|
|
|
33
33
|
|
|
34
34
|
interface IMemoryExchangeEvents extends Shared.IDefaultEvents {
|
|
35
35
|
|
|
36
|
-
['data_a'](data:
|
|
36
|
+
['data_a'](data: unknown): void;
|
|
37
37
|
|
|
38
|
-
['data_b'](data:
|
|
38
|
+
['data_b'](data: unknown): void;
|
|
39
39
|
|
|
40
40
|
['end_a'](): void;
|
|
41
41
|
|
|
@@ -57,7 +57,7 @@ class MemoryExchange extends EventEmitter implements Shared.IEventListener<IMemo
|
|
|
57
57
|
super();
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
public send(targetEndpoint: 'a' | 'b', data:
|
|
60
|
+
public send(targetEndpoint: 'a' | 'b', data: unknown): void {
|
|
61
61
|
|
|
62
62
|
setImmediate(() => this.emit('data_' + targetEndpoint, data));
|
|
63
63
|
}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import * as LibWS from '@litert/websocket';
|
|
18
18
|
import type * as NodeHttp from 'node:http';
|
|
19
|
+
import type * as NodeNet from 'node:net';
|
|
19
20
|
import * as dWS from './WebSocket.decl';
|
|
20
21
|
import type * as Listener from '../http-listener';
|
|
21
22
|
import type * as dT from '../Transporter.decl';
|
|
@@ -71,7 +72,7 @@ class WebSocketGateway extends EventEmitter implements dT.IGateway {
|
|
|
71
72
|
|
|
72
73
|
this._wsServer.reject({
|
|
73
74
|
'request': req,
|
|
74
|
-
'socket': socket as
|
|
75
|
+
'socket': socket as unknown as NodeNet.Socket,
|
|
75
76
|
});
|
|
76
77
|
return;
|
|
77
78
|
}
|
|
@@ -85,14 +86,14 @@ class WebSocketGateway extends EventEmitter implements dT.IGateway {
|
|
|
85
86
|
|
|
86
87
|
this._wsServer.reject({
|
|
87
88
|
'request': req,
|
|
88
|
-
'socket': socket as
|
|
89
|
+
'socket': socket as unknown as NodeNet.Socket,
|
|
89
90
|
});
|
|
90
91
|
return;
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
const ws = this._wsServer.accept({
|
|
94
95
|
'request': req,
|
|
95
|
-
'socket': socket as
|
|
96
|
+
'socket': socket as unknown as NodeNet.Socket,
|
|
96
97
|
'subProtocol': dWS.WEBSOCKET_SUB_PROTOCOL,
|
|
97
98
|
});
|
|
98
99
|
|