airdcpp-apisocket 3.0.0-beta.12 → 3.0.0-beta.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,18 @@
|
|
1
1
|
import { WebSocket } from 'mock-socket';
|
2
2
|
import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../../types/api_internal.js';
|
3
3
|
import { EventEmitter } from 'events';
|
4
|
+
import { LoggerOptions } from '../../NodeSocket.js';
|
4
5
|
interface MockFunctionCreator {
|
5
6
|
fn: (...args: any[]) => any;
|
6
7
|
}
|
7
8
|
type RequestCallback = (requestData: object) => void;
|
8
|
-
|
9
|
+
type DelayF = () => number;
|
10
|
+
export interface MockServerOptions {
|
9
11
|
url: string;
|
10
12
|
reportMissingListeners?: boolean;
|
11
13
|
mockF: MockFunctionCreator;
|
14
|
+
delayMs: number | DelayF;
|
15
|
+
loggerOptions: LoggerOptions;
|
12
16
|
}
|
13
17
|
type MockRequestResponseDataObject<DataT extends object | undefined> = Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>;
|
14
18
|
type MockRequestResponseDataHandler<DataT extends object | undefined> = (request: OutgoingRequest, s: WebSocket) => MockRequestResponseDataObject<DataT>;
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { Server } from 'mock-socket';
|
2
2
|
import { EventEmitter } from 'events';
|
3
3
|
import { MOCK_SERVER_URL } from './mock-data.js';
|
4
|
+
import Logger from '../../SocketLogger.js';
|
4
5
|
;
|
5
6
|
const toEmitId = (path, method) => {
|
6
7
|
return `${path}_${method}`;
|
@@ -12,12 +13,18 @@ const DEFAULT_MOCK_SERVER_OPTIONS = {
|
|
12
13
|
url: MOCK_SERVER_URL,
|
13
14
|
reportMissingListeners: true,
|
14
15
|
mockF: getDefaultMockCreatorF(),
|
16
|
+
delayMs: 0,
|
17
|
+
loggerOptions: {
|
18
|
+
logLevel: 'warn',
|
19
|
+
logOutput: console,
|
20
|
+
}
|
15
21
|
};
|
16
22
|
const getMockServer = (initialOptions = {}) => {
|
17
|
-
const { url, reportMissingListeners, mockF } = {
|
23
|
+
const { url, reportMissingListeners, mockF, delayMs, loggerOptions } = {
|
18
24
|
...DEFAULT_MOCK_SERVER_OPTIONS,
|
19
25
|
...initialOptions,
|
20
26
|
};
|
27
|
+
const logger = Logger(loggerOptions);
|
21
28
|
const mockServer = new Server(url);
|
22
29
|
let socket;
|
23
30
|
const emitter = new EventEmitter();
|
@@ -28,9 +35,6 @@ const getMockServer = (initialOptions = {}) => {
|
|
28
35
|
const handlers = new Map();
|
29
36
|
const addServerHandler = (method, path, responseData, subscriptionCallback) => {
|
30
37
|
const requestHandler = (request, s) => {
|
31
|
-
if (subscriptionCallback) {
|
32
|
-
subscriptionCallback(request);
|
33
|
-
}
|
34
38
|
const data = typeof responseData === 'function' ? responseData(request, s) : responseData;
|
35
39
|
if (!data || !data.code) {
|
36
40
|
throw new Error(`Mock server: response handler for path ${path} must return a status code`);
|
@@ -39,7 +43,14 @@ const getMockServer = (initialOptions = {}) => {
|
|
39
43
|
callback_id: request.callback_id,
|
40
44
|
...data,
|
41
45
|
};
|
42
|
-
|
46
|
+
const delay = typeof delayMs === 'function' ? delayMs() : delayMs;
|
47
|
+
setTimeout(() => {
|
48
|
+
logger.verbose(`Mock server: sending response for request ${request.callback_id} (${method} ${path}):`, data);
|
49
|
+
if (subscriptionCallback) {
|
50
|
+
subscriptionCallback(request);
|
51
|
+
}
|
52
|
+
s.send(JSON.stringify(response));
|
53
|
+
}, delay);
|
43
54
|
};
|
44
55
|
// Don't add duplicates
|
45
56
|
const emitId = toEmitId(path, method);
|
@@ -86,6 +97,12 @@ const getMockServer = (initialOptions = {}) => {
|
|
86
97
|
const subscribeRemove = addRequestHandler('POST', path, undefined, subscribeFn);
|
87
98
|
const unsubscribeRemove = addRequestHandler('DELETE', path, undefined, unsubscribeFn);
|
88
99
|
const fire = (data, entityId) => {
|
100
|
+
if (entityId) {
|
101
|
+
logger.verbose(`Mock server: firing subscriber ${moduleName} ${listenerName} for entity ${entityId}:`, data);
|
102
|
+
}
|
103
|
+
else {
|
104
|
+
logger.verbose(`Mock server: firing subscriber ${moduleName} ${listenerName}:`, data);
|
105
|
+
}
|
89
106
|
send({
|
90
107
|
event: listenerName,
|
91
108
|
data,
|
@@ -119,6 +136,7 @@ const getMockServer = (initialOptions = {}) => {
|
|
119
136
|
rejectRemove();
|
120
137
|
};
|
121
138
|
const fire = (data) => {
|
139
|
+
logger.verbose(`Mock server: firing hook ${moduleName} ${listenerName}:`, data);
|
122
140
|
send({
|
123
141
|
event: listenerName,
|
124
142
|
data,
|
@@ -143,7 +161,7 @@ const getMockServer = (initialOptions = {}) => {
|
|
143
161
|
const emitId = toEmitId(request.path, request.method);
|
144
162
|
const processed = emitter.emit(emitId, request, s);
|
145
163
|
if (reportMissingListeners && !processed) {
|
146
|
-
|
164
|
+
logger.warn(`Mock server: no listeners for event ${request.method} ${request.path}`);
|
147
165
|
}
|
148
166
|
});
|
149
167
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../../src/tests/mocks/mock-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAa,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
1
|
+
{"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../../src/tests/mocks/mock-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/tests/Socket.test.ts
CHANGED
@@ -248,6 +248,7 @@ describe('socket', () => {
|
|
248
248
|
jest.runOnlyPendingTimers();
|
249
249
|
jest.runOnlyPendingTimers();
|
250
250
|
jest.runOnlyPendingTimers();
|
251
|
+
jest.runOnlyPendingTimers();
|
251
252
|
|
252
253
|
expect(socket.isConnected()).toEqual(true);
|
253
254
|
expect(mockConsole.warn.mock.calls.length).toBe(0);
|
@@ -4,6 +4,9 @@ import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '.
|
|
4
4
|
import { EventEmitter } from 'events';
|
5
5
|
import { MOCK_SERVER_URL } from './mock-data.js';
|
6
6
|
|
7
|
+
import Logger from '../../SocketLogger.js';
|
8
|
+
import { LoggerOptions } from '../../NodeSocket.js';
|
9
|
+
|
7
10
|
interface MockFunctionCreator {
|
8
11
|
fn: (...args: any[]) => any;
|
9
12
|
};
|
@@ -18,16 +21,25 @@ const getDefaultMockCreatorF = () => ({
|
|
18
21
|
fn: () => {},
|
19
22
|
});
|
20
23
|
|
21
|
-
|
24
|
+
type DelayF = () => number;
|
25
|
+
|
26
|
+
export interface MockServerOptions {
|
22
27
|
url: string;
|
23
28
|
reportMissingListeners?: boolean;
|
24
29
|
mockF: MockFunctionCreator;
|
30
|
+
delayMs: number | DelayF;
|
31
|
+
loggerOptions: LoggerOptions;
|
25
32
|
}
|
26
33
|
|
27
34
|
const DEFAULT_MOCK_SERVER_OPTIONS: MockServerOptions = {
|
28
35
|
url: MOCK_SERVER_URL,
|
29
36
|
reportMissingListeners: true,
|
30
37
|
mockF: getDefaultMockCreatorF(),
|
38
|
+
delayMs: 0,
|
39
|
+
loggerOptions: {
|
40
|
+
logLevel: 'warn',
|
41
|
+
logOutput: console,
|
42
|
+
}
|
31
43
|
}
|
32
44
|
|
33
45
|
type MockRequestResponseDataObject<DataT extends object | undefined> = Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>;
|
@@ -35,11 +47,12 @@ type MockRequestResponseDataHandler<DataT extends object | undefined> = (request
|
|
35
47
|
type MockRequestResponseData<DataT extends object | undefined> = MockRequestResponseDataObject<DataT> | MockRequestResponseDataHandler<DataT>;
|
36
48
|
|
37
49
|
const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
38
|
-
const { url, reportMissingListeners, mockF }: MockServerOptions = {
|
50
|
+
const { url, reportMissingListeners, mockF, delayMs, loggerOptions }: MockServerOptions = {
|
39
51
|
...DEFAULT_MOCK_SERVER_OPTIONS,
|
40
52
|
...initialOptions,
|
41
53
|
};
|
42
54
|
|
55
|
+
const logger = Logger(loggerOptions);
|
43
56
|
const mockServer = new Server(url);
|
44
57
|
let socket: Client;
|
45
58
|
const emitter = new EventEmitter();
|
@@ -58,10 +71,6 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
58
71
|
subscriptionCallback?: RequestCallback,
|
59
72
|
) => {
|
60
73
|
const requestHandler = (request: OutgoingRequest, s: WebSocket) => {
|
61
|
-
if (subscriptionCallback) {
|
62
|
-
subscriptionCallback(request);
|
63
|
-
}
|
64
|
-
|
65
74
|
const data = typeof responseData === 'function' ? responseData(request, s) : responseData;
|
66
75
|
if (!data ||!data.code) {
|
67
76
|
throw new Error(`Mock server: response handler for path ${path} must return a status code`);
|
@@ -72,7 +81,15 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
72
81
|
...data,
|
73
82
|
};
|
74
83
|
|
75
|
-
|
84
|
+
const delay = typeof delayMs === 'function' ? delayMs() : delayMs;
|
85
|
+
setTimeout(() => {
|
86
|
+
logger.verbose(`Mock server: sending response for request ${request.callback_id} (${method} ${path}):`, data);
|
87
|
+
if (subscriptionCallback) {
|
88
|
+
subscriptionCallback(request);
|
89
|
+
}
|
90
|
+
|
91
|
+
s.send(JSON.stringify(response));
|
92
|
+
}, delay);
|
76
93
|
};
|
77
94
|
|
78
95
|
// Don't add duplicates
|
@@ -161,6 +178,12 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
161
178
|
const unsubscribeRemove = addRequestHandler('DELETE', path, undefined, unsubscribeFn);
|
162
179
|
|
163
180
|
const fire = (data: object, entityId?: string | number) => {
|
181
|
+
if (entityId) {
|
182
|
+
logger.verbose(`Mock server: firing subscriber ${moduleName} ${listenerName} for entity ${entityId}:`, data);
|
183
|
+
} else {
|
184
|
+
logger.verbose(`Mock server: firing subscriber ${moduleName} ${listenerName}:`, data);
|
185
|
+
}
|
186
|
+
|
164
187
|
send({
|
165
188
|
event: listenerName,
|
166
189
|
data,
|
@@ -223,6 +246,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
223
246
|
}
|
224
247
|
|
225
248
|
const fire = (data: object) => {
|
249
|
+
logger.verbose(`Mock server: firing hook ${moduleName} ${listenerName}:`, data);
|
226
250
|
send({
|
227
251
|
event: listenerName,
|
228
252
|
data,
|
@@ -253,7 +277,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
|
|
253
277
|
const emitId = toEmitId(request.path, request.method);
|
254
278
|
const processed = emitter.emit(emitId, request, s);
|
255
279
|
if (reportMissingListeners && !processed) {
|
256
|
-
|
280
|
+
logger.warn(`Mock server: no listeners for event ${request.method} ${request.path}`);
|
257
281
|
}
|
258
282
|
});
|
259
283
|
});
|