airdcpp-apisocket 3.0.0-beta.6 → 3.0.0-beta.8

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.
Files changed (34) hide show
  1. package/dist-es/SocketBase.js +8 -9
  2. package/dist-es/SocketBase.js.map +1 -1
  3. package/dist-es/SocketRequestHandler.js +3 -5
  4. package/dist-es/SocketRequestHandler.js.map +1 -1
  5. package/dist-es/tests/mocks/index.d.ts +3 -0
  6. package/dist-es/tests/mocks/index.js +4 -0
  7. package/dist-es/tests/mocks/index.js.map +1 -0
  8. package/dist-es/tests/mocks/mock-data.d.ts +24 -0
  9. package/dist-es/tests/mocks/mock-data.js +25 -0
  10. package/dist-es/tests/mocks/mock-data.js.map +1 -0
  11. package/dist-es/tests/mocks/mock-server.d.ts +39 -0
  12. package/dist-es/tests/{mock-server.js → mocks/mock-server.js} +19 -83
  13. package/dist-es/tests/mocks/mock-server.js.map +1 -0
  14. package/dist-es/tests/mocks/mock-socket.d.ts +23 -0
  15. package/dist-es/tests/mocks/mock-socket.js +31 -0
  16. package/dist-es/tests/mocks/mock-socket.js.map +1 -0
  17. package/dist-es/tests/test-utils.d.ts +7 -0
  18. package/dist-es/tests/test-utils.js +23 -0
  19. package/dist-es/tests/test-utils.js.map +1 -1
  20. package/dist-es/types/public_helpers_internal.d.ts +2 -2
  21. package/package.json +2 -2
  22. package/src/SocketBase.ts +9 -10
  23. package/src/SocketRequestHandler.ts +3 -5
  24. package/src/tests/Socket.test.ts +63 -57
  25. package/src/tests/mocks/index.ts +3 -0
  26. package/src/tests/mocks/mock-data.ts +26 -0
  27. package/src/tests/{mock-server.ts → mocks/mock-server.ts} +35 -121
  28. package/src/tests/mocks/mock-socket.ts +68 -0
  29. package/src/tests/public_helpers.test.ts +4 -2
  30. package/src/tests/test-utils.ts +27 -1
  31. package/src/types/api_internal.ts +0 -1
  32. package/src/types/public_helpers_internal.ts +2 -2
  33. package/dist-es/tests/mock-server.d.ts +0 -96
  34. package/dist-es/tests/mock-server.js.map +0 -1
@@ -1,131 +1,41 @@
1
- import { Socket } from '../NodeSocket.js';
2
1
  import { Client, Server, WebSocket } from 'mock-socket';
3
- import { jest } from '@jest/globals';
4
2
 
5
- import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../types/api_internal.js';
6
- import * as Options from '../types/options.js';
7
- import ApiConstants from '../ApiConstants.js';
3
+ import { OutgoingRequest, RequestSuccessResponse, RequestErrorResponse } from '../../types/api_internal.js';
8
4
  import { EventEmitter } from 'events';
5
+ import { DEFAULT_CONNECT_PARAMS } from './mock-data.js';
9
6
 
10
- const VERBOSE = false;
11
-
12
- export const getMockConsole = () => ({
13
- log: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
14
- if (VERBOSE) {
15
- console.log(a1, a2, a3, a4);
16
- }
17
- }),
18
- info: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
19
- if (VERBOSE) {
20
- console.info(a1, a2, a3, a4);
21
- }
22
- }),
23
- warn: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
24
- console.warn(a1, a2, a3, a4);
25
- }),
26
- error: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
27
- console.error(a1, a2, a3, a4);
28
- }),
29
- });
30
-
31
- const DEFAULT_CONNECT_PARAMS = {
32
- username: 'test',
33
- password: 'test',
34
- url: 'ws://localhost:7171/api/v1/',
35
- };
36
-
37
- const getDefaultSocketOptions = (mockConsole: Options.LogOutput): Options.APISocketOptions => ({
38
- ...DEFAULT_CONNECT_PARAMS,
39
- logOutput: mockConsole,
40
- logLevel: VERBOSE ? 'verbose' : 'warn',
41
- });
42
-
43
- const DEFAULT_AUTH_RESPONSE = {
44
- auth_token: 'b823187f-4aab-4b71-9764-e63e88401a26',
45
- refresh_token: '5124faasf-4aab-4b71-9764-e63e88401a26',
46
- user: {
47
- permissions: [ 'admin' ],
48
- username: 'test',
49
- active_sessions: 1,
50
- last_login: 0,
51
- },
52
- system: {
53
- cid: 'AHLUODI2YZ2U7FDWMHFNJU65ERGKUN4MH7GW5LY',
54
- hostname: 'ubuntu-htpc',
55
- network_type: 'private',
56
- path_separator: '/',
57
- platform: 'other',
58
- language: 'fi',
59
- },
60
- wizard_pending: false,
7
+ interface MockFunctionCreator {
8
+ fn: (...args: any[]) => any;
61
9
  };
62
10
 
63
- export type MockSocketOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
64
- username?: string;
65
- password?: string;
66
- url?: string;
67
- };
68
-
69
- const getSocket = (socketOptions: MockSocketOptions = {}, mockConsole = getMockConsole()) => {
70
- const socket = Socket(
71
- {
72
- ...getDefaultSocketOptions(mockConsole),
73
- ...socketOptions,
74
- },
75
- WebSocket as any
76
- );
77
-
78
- return { socket, mockConsole };
79
- };
80
-
81
-
82
- type Callback = (requestData: object) => void;
83
-
84
- interface ConnectOptions {
85
- socketOptions?: MockSocketOptions;
86
- authCallback?: Callback;
87
- authResponse?: object;
88
- console?: ReturnType<typeof getMockConsole>;
89
- }
90
-
91
- const getDefaultConnectOptions = () => ({
92
- console: getMockConsole(),
93
- authResponse: DEFAULT_AUTH_RESPONSE,
94
- });
95
-
96
- const getConnectedSocket = async (
97
- server: ReturnType<typeof getMockServer>,
98
- userOptions?: ConnectOptions,
99
- ) => {
100
- const options = {
101
- ...getDefaultConnectOptions(),
102
- ...userOptions,
103
- };
104
-
105
- server.addRequestHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
106
-
107
- const { socket, mockConsole } = getSocket(options.socketOptions, options.console);
108
- await socket.connect();
109
-
110
- return { socket, mockConsole };
111
- };
11
+ type RequestCallback = (requestData: object) => void;
112
12
 
113
13
  const toEmitId = (path: string, method: string) => {
114
14
  return `${path}_${method}`;
115
15
  };
116
16
 
17
+ const getDefaultMockCreatorF = () => ({
18
+ fn: () => {},
19
+ });
20
+
117
21
  interface MockServerOptions {
118
22
  url: string;
119
23
  reportMissingListeners?: boolean;
24
+ mockF: MockFunctionCreator;
120
25
  }
121
26
 
122
27
  const DEFAULT_MOCK_SERVER_OPTIONS: MockServerOptions = {
123
28
  url: DEFAULT_CONNECT_PARAMS.url,
124
29
  reportMissingListeners: true,
30
+ mockF: getDefaultMockCreatorF(),
125
31
  }
126
32
 
33
+ type MockRequestResponseDataObject<DataT extends object | undefined> = Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>;
34
+ type MockRequestResponseDataHandler<DataT extends object | undefined> = (request: OutgoingRequest, s: WebSocket) => MockRequestResponseDataObject<DataT>;
35
+ type MockRequestResponseData<DataT extends object | undefined> = MockRequestResponseDataObject<DataT> | MockRequestResponseDataHandler<DataT>;
36
+
127
37
  const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
128
- const { url, reportMissingListeners }: MockServerOptions = {
38
+ const { url, reportMissingListeners, mockF }: MockServerOptions = {
129
39
  ...DEFAULT_MOCK_SERVER_OPTIONS,
130
40
  ...initialOptions,
131
41
  };
@@ -141,8 +51,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
141
51
  const addServerHandler = <DataT extends object | undefined>(
142
52
  method: string,
143
53
  path: string,
144
- responseData: Omit<RequestSuccessResponse<DataT>, 'callback_id'> | Omit<RequestErrorResponse, 'callback_id'>,
145
- subscriptionCallback?: Callback
54
+ responseData: MockRequestResponseData<DataT>,
55
+ subscriptionCallback?: RequestCallback
146
56
  ) => {
147
57
  emitter.addListener(
148
58
  toEmitId(path, method),
@@ -151,9 +61,10 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
151
61
  subscriptionCallback(request);
152
62
  }
153
63
 
64
+ const data = typeof responseData === 'function' ? responseData(request, s) : responseData;
154
65
  const response: RequestSuccessResponse | RequestErrorResponse = {
155
66
  callback_id: request.callback_id,
156
- ...responseData,
67
+ ...data,
157
68
  };
158
69
 
159
70
  s.send(JSON.stringify(response));
@@ -173,15 +84,18 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
173
84
  const addRequestHandler = <DataT extends object | undefined>(
174
85
  method: string,
175
86
  path: string,
176
- data?: DataT,
177
- subscriptionCallback?: Callback
87
+ data?: DataT | MockRequestResponseDataHandler<DataT>,
88
+ subscriptionCallback?: RequestCallback
178
89
  ) => {
90
+ const handlerData = typeof data === 'function' ? data : {
91
+ data,
92
+ code: data ? 200 : 204,
93
+ }
94
+
179
95
  addServerHandler<DataT>(
180
96
  method,
181
- path, {
182
- data,
183
- code: 200,
184
- },
97
+ path,
98
+ handlerData,
185
99
  subscriptionCallback
186
100
  );
187
101
  }
@@ -191,7 +105,7 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
191
105
  path: string,
192
106
  errorStr: string | null,
193
107
  errorCode: number,
194
- subscriptionCallback?: Callback
108
+ subscriptionCallback?: RequestCallback
195
109
  ) => {
196
110
  addServerHandler(
197
111
  method,
@@ -212,8 +126,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
212
126
  listenerName: string,
213
127
  entityId?: string | number,
214
128
  ) => {
215
- const subscribeFn = jest.fn();
216
- const unsubscribeFn = jest.fn();
129
+ const subscribeFn = mockF.fn();
130
+ const unsubscribeFn = mockF.fn();
217
131
 
218
132
  const path = entityId ? `${moduleName}/${entityId}/${type}/${listenerName}` : `${moduleName}/${type}/${listenerName}`;
219
133
 
@@ -254,8 +168,8 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
254
168
  const subscriber = addSubscriptionHandlerImpl(moduleName, 'hooks', listenerName);
255
169
 
256
170
  const addResolver = (completionId: number) => {
257
- const resolveFn = jest.fn();
258
- const rejectFn = jest.fn();
171
+ const resolveFn = mockF.fn();
172
+ const rejectFn = mockF.fn();
259
173
 
260
174
  addRequestHandler(
261
175
  'POST',
@@ -325,4 +239,4 @@ const getMockServer = (initialOptions: Partial<MockServerOptions> = {}) => {
325
239
  };
326
240
  };
327
241
 
328
- export { getMockServer, getSocket, getConnectedSocket, DEFAULT_CONNECT_PARAMS, DEFAULT_AUTH_RESPONSE };
242
+ export { getMockServer };
@@ -0,0 +1,68 @@
1
+ import { Socket } from '../../NodeSocket.js';
2
+ import { WebSocket } from 'mock-socket';
3
+
4
+ import * as Options from '../../types/options.js';
5
+ import ApiConstants from '../../ApiConstants.js';
6
+
7
+ import { getMockServer } from './mock-server.js';
8
+ import { DEFAULT_AUTH_RESPONSE, DEFAULT_CONNECT_PARAMS } from './mock-data.js';
9
+
10
+ const getDefaultSocketOptions = (): Options.APISocketOptions => ({
11
+ ...DEFAULT_CONNECT_PARAMS,
12
+ logOutput: console,
13
+ logLevel: 'warn',
14
+ });
15
+
16
+ export type MockSocketConnectOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
17
+ username?: string;
18
+ password?: string;
19
+ url?: string;
20
+ };
21
+
22
+
23
+ type RequestCallback = (requestData: object) => void;
24
+
25
+ interface MockSocketOptions {
26
+ console: Options.LogOutput;
27
+ socketOptions?: MockSocketConnectOptions;
28
+ }
29
+
30
+ interface MockConnectedSocketOptions extends MockSocketOptions {
31
+ authCallback?: RequestCallback;
32
+ authResponse: object;
33
+ }
34
+
35
+
36
+ export const getSocket = (socketOptions: MockSocketConnectOptions = {}) => {
37
+ const socket = Socket(
38
+ {
39
+ ...getDefaultSocketOptions(),
40
+ ...socketOptions,
41
+ },
42
+ WebSocket as any
43
+ );
44
+
45
+ return { socket };
46
+ };
47
+
48
+ const getDefaultConnectOptions = () => ({
49
+ console,
50
+ authResponse: DEFAULT_AUTH_RESPONSE,
51
+ });
52
+
53
+ export const getConnectedSocket = async (
54
+ server: ReturnType<typeof getMockServer>,
55
+ userOptions?: Partial<MockConnectedSocketOptions>,
56
+ ) => {
57
+ const options: MockConnectedSocketOptions = {
58
+ ...getDefaultConnectOptions(),
59
+ ...userOptions,
60
+ };
61
+
62
+ server.addRequestHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
63
+
64
+ const { socket } = getSocket(options.socketOptions);
65
+ await socket.connect();
66
+
67
+ return { socket };
68
+ };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getMockServer,
3
3
  getConnectedSocket,
4
- } from './mock-server.js';
4
+ } from './mocks';
5
5
  import { waitForExpect } from './test-utils.js';
6
6
 
7
7
  import { jest } from '@jest/globals';
@@ -17,7 +17,9 @@ let server: ReturnType<typeof getMockServer>;
17
17
  describe('public helpers', () => {
18
18
 
19
19
  beforeEach(() => {
20
- server = getMockServer();
20
+ server = getMockServer({
21
+ mockF: jest,
22
+ });
21
23
  });
22
24
 
23
25
  afterEach(() => {
@@ -2,4 +2,30 @@ import waitForExpectOriginal from 'wait-for-expect';
2
2
 
3
3
  const EXCEPT_TIMEOUT = 1000;
4
4
  //@ts-ignore
5
- export const waitForExpect = (func: () => void | Promise<void>) => waitForExpectOriginal.default(func, EXCEPT_TIMEOUT);
5
+ export const waitForExpect = (func: () => void | Promise<void>) => waitForExpectOriginal.default(func, EXCEPT_TIMEOUT);
6
+
7
+
8
+ // This is a helper function that will suppress the error of a promise.
9
+ export const defusedPromise = (promise: Promise<any>) => {
10
+ promise.catch(() => {});
11
+ return promise;
12
+ }
13
+
14
+ export const getMockConsole = (verbose = false) => ({
15
+ log: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
16
+ if (verbose) {
17
+ console.log(a1, a2, a3, a4);
18
+ }
19
+ }),
20
+ info: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
21
+ if (verbose) {
22
+ console.info(a1, a2, a3, a4);
23
+ }
24
+ }),
25
+ warn: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
26
+ console.warn(a1, a2, a3, a4);
27
+ }),
28
+ error: jest.fn((a1: any, a2: any, a3: any, a4: any) => {
29
+ console.error(a1, a2, a3, a4);
30
+ }),
31
+ });
@@ -1,6 +1,5 @@
1
1
  // HELPERS
2
2
  export type CompletionIdType = number;
3
- //export type SubscriptionIdType = string;
4
3
 
5
4
 
6
5
  // REQUESTS
@@ -20,8 +20,8 @@ export interface MenuItemListHookData<IdT, EntityIdT> {
20
20
  }
21
21
 
22
22
  export interface ResponseMenuItemCallbackFields {
23
- urls?: string[] | undefined;
24
- form_definitions?: object[] | undefined;
23
+ urls?: string[];
24
+ form_definitions?: object[];
25
25
  }
26
26
 
27
27
  export type ResponseMenuItem<IdT, EntityIdT> = Omit<ContextMenuItem<IdT, EntityIdT>, 'onClick' | 'filter' | 'urls' | 'form_definitions'> & ResponseMenuItemCallbackFields;
@@ -1,96 +0,0 @@
1
- import * as Options from '../types/options.js';
2
- export declare const getMockConsole: () => {
3
- log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
4
- info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
5
- warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
6
- error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
7
- };
8
- declare const DEFAULT_CONNECT_PARAMS: {
9
- username: string;
10
- password: string;
11
- url: string;
12
- };
13
- declare const DEFAULT_AUTH_RESPONSE: {
14
- auth_token: string;
15
- refresh_token: string;
16
- user: {
17
- permissions: string[];
18
- username: string;
19
- active_sessions: number;
20
- last_login: number;
21
- };
22
- system: {
23
- cid: string;
24
- hostname: string;
25
- network_type: string;
26
- path_separator: string;
27
- platform: string;
28
- language: string;
29
- };
30
- wizard_pending: boolean;
31
- };
32
- export type MockSocketOptions = Omit<Options.APISocketOptions, 'username' | 'password' | 'url'> & {
33
- username?: string;
34
- password?: string;
35
- url?: string;
36
- };
37
- declare const getSocket: (socketOptions?: MockSocketOptions, mockConsole?: {
38
- log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
39
- info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
40
- warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
41
- error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
42
- }) => {
43
- socket: import("../NodeSocket.js").APISocket;
44
- mockConsole: {
45
- log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
46
- info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
47
- warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
48
- error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
49
- };
50
- };
51
- type Callback = (requestData: object) => void;
52
- interface ConnectOptions {
53
- socketOptions?: MockSocketOptions;
54
- authCallback?: Callback;
55
- authResponse?: object;
56
- console?: ReturnType<typeof getMockConsole>;
57
- }
58
- declare const getConnectedSocket: (server: ReturnType<typeof getMockServer>, userOptions?: ConnectOptions) => Promise<{
59
- socket: import("../NodeSocket.js").APISocket;
60
- mockConsole: {
61
- log: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
62
- info: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
63
- warn: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
64
- error: import("jest-mock").Mock<(a1: any, a2: any, a3: any, a4: any) => void>;
65
- };
66
- }>;
67
- interface MockServerOptions {
68
- url: string;
69
- reportMissingListeners?: boolean;
70
- }
71
- declare const getMockServer: (initialOptions?: Partial<MockServerOptions>) => {
72
- addRequestHandler: <DataT extends object | undefined>(method: string, path: string, data?: DataT, subscriptionCallback?: Callback) => void;
73
- addErrorHandler: (method: string, path: string, errorStr: string | null, errorCode: number, subscriptionCallback?: Callback) => void;
74
- addSubscriptionHandler: (moduleName: string, listenerName: string, entityId?: string | number) => {
75
- fire: (data: object, entityId?: string | number) => void;
76
- subscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
77
- unsubscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
78
- path: string;
79
- };
80
- addHookHandler: (moduleName: string, listenerName: string) => {
81
- fire: (data: object, entityId?: string | number) => void;
82
- subscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
83
- unsubscribeFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
84
- path: string;
85
- addResolver: (completionId: number) => {
86
- fire: (data: object) => void;
87
- resolveFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
88
- rejectFn: import("jest-mock").Mock<import("jest-mock").UnknownFunction>;
89
- };
90
- };
91
- ignoreMissingHandler: (method: string, path: string) => void;
92
- stop: () => void;
93
- send: (data: object) => void;
94
- url: string;
95
- };
96
- export { getMockServer, getSocket, getConnectedSocket, DEFAULT_CONNECT_PARAMS, DEFAULT_AUTH_RESPONSE };
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/tests/mock-server.ts"],"names":[],"mappings":"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"}