airdcpp-apisocket 3.0.0-beta.1 → 3.0.0-beta.10

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 (41) hide show
  1. package/dist-es/PublicHelpers.js +21 -4
  2. package/dist-es/PublicHelpers.js.map +1 -1
  3. package/dist-es/SocketBase.js +13 -11
  4. package/dist-es/SocketBase.js.map +1 -1
  5. package/dist-es/SocketRequestHandler.js +3 -5
  6. package/dist-es/SocketRequestHandler.js.map +1 -1
  7. package/dist-es/tests/mocks/index.d.ts +3 -0
  8. package/dist-es/tests/mocks/index.js +4 -0
  9. package/dist-es/tests/mocks/index.js.map +1 -0
  10. package/dist-es/tests/mocks/mock-data.d.ts +54 -0
  11. package/dist-es/tests/mocks/mock-data.js +34 -0
  12. package/dist-es/tests/mocks/mock-data.js.map +1 -0
  13. package/dist-es/tests/mocks/mock-server.d.ts +43 -0
  14. package/dist-es/tests/mocks/mock-server.js +154 -0
  15. package/dist-es/tests/mocks/mock-server.js.map +1 -0
  16. package/dist-es/tests/mocks/mock-socket.d.ts +23 -0
  17. package/dist-es/tests/mocks/mock-socket.js +31 -0
  18. package/dist-es/tests/mocks/mock-socket.js.map +1 -0
  19. package/dist-es/tests/test-utils.d.ts +8 -0
  20. package/dist-es/tests/test-utils.js +28 -0
  21. package/dist-es/tests/test-utils.js.map +1 -0
  22. package/dist-es/types/public_helpers.d.ts +12 -3
  23. package/dist-es/types/public_helpers_internal.d.ts +4 -4
  24. package/dist-es/types/socket.d.ts +1 -0
  25. package/package.json +10 -7
  26. package/src/PublicHelpers.ts +22 -4
  27. package/src/SocketBase.ts +15 -12
  28. package/src/SocketRequestHandler.ts +3 -5
  29. package/src/tests/Socket.test.ts +107 -109
  30. package/src/tests/mocks/index.ts +3 -0
  31. package/src/tests/mocks/mock-data.ts +36 -0
  32. package/src/tests/mocks/mock-server.ts +269 -0
  33. package/src/tests/mocks/mock-socket.ts +68 -0
  34. package/src/tests/public_helpers.test.ts +63 -62
  35. package/src/tests/test-utils.ts +31 -0
  36. package/src/types/api_internal.ts +0 -1
  37. package/src/types/public_helpers.ts +11 -11
  38. package/src/types/public_helpers_internal.ts +4 -4
  39. package/src/types/socket.ts +1 -0
  40. package/tsconfig.json +1 -1
  41. package/src/tests/helpers.ts +0 -195
@@ -0,0 +1,31 @@
1
+ import { Socket } from '../../NodeSocket.js';
2
+ import { WebSocket } from 'mock-socket';
3
+ import ApiConstants from '../../ApiConstants.js';
4
+ import { DEFAULT_AUTH_RESPONSE, DEFAULT_CONNECT_PARAMS } from './mock-data.js';
5
+ const getDefaultSocketOptions = () => ({
6
+ ...DEFAULT_CONNECT_PARAMS,
7
+ logOutput: console,
8
+ logLevel: 'warn',
9
+ });
10
+ export const getSocket = (socketOptions = {}) => {
11
+ const socket = Socket({
12
+ ...getDefaultSocketOptions(),
13
+ ...socketOptions,
14
+ }, WebSocket);
15
+ return { socket };
16
+ };
17
+ const getDefaultConnectOptions = () => ({
18
+ console,
19
+ authResponse: DEFAULT_AUTH_RESPONSE,
20
+ });
21
+ export const getConnectedSocket = async (server, userOptions) => {
22
+ const options = {
23
+ ...getDefaultConnectOptions(),
24
+ ...userOptions,
25
+ };
26
+ server.addRequestHandler('POST', ApiConstants.LOGIN_URL, options.authResponse, options.authCallback);
27
+ const { socket } = getSocket(options.socketOptions);
28
+ await socket.connect();
29
+ return { socket };
30
+ };
31
+ //# sourceMappingURL=mock-socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-socket.js","sourceRoot":"","sources":["../../../src/tests/mocks/mock-socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,MAAM,uBAAuB,GAAG,GAA6B,EAAE,CAAC,CAAC;IAC/D,GAAG,sBAAsB;IACzB,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,MAAM;CACjB,CAAC,CAAC;AAsBH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,gBAA0C,EAAE,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,MAAM,CACnB;QACE,GAAG,uBAAuB,EAAE;QAC5B,GAAG,aAAa;KACjB,EACD,SAAgB,CACjB,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,GAAG,EAAE,CAAC,CAAC;IACtC,OAAO;IACP,YAAY,EAAE,qBAAqB;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,MAAwC,EACxC,WAAiD,EACjD,EAAE;IACF,MAAM,OAAO,GAA+B;QAC1C,GAAG,wBAAwB,EAAE;QAC7B,GAAG,WAAW;KACf,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAErG,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAEvB,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const waitForExpect: (func: () => void | Promise<void>) => Promise<{}>;
2
+ export declare const defusedPromise: (promise: Promise<any>) => Promise<any>;
3
+ export declare const getMockConsole: (verbose?: boolean) => {
4
+ log: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
5
+ info: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
6
+ warn: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
7
+ error: jest.Mock<void, [a1: any, a2: any, a3: any, a4: any], any>;
8
+ };
@@ -0,0 +1,28 @@
1
+ import waitForExpectOriginal from 'wait-for-expect';
2
+ const EXCEPT_TIMEOUT = 1000;
3
+ //@ts-ignore
4
+ export const waitForExpect = (func) => waitForExpectOriginal.default(func, EXCEPT_TIMEOUT);
5
+ // This is a helper function that will suppress the error of a promise.
6
+ export const defusedPromise = (promise) => {
7
+ promise.catch(() => { });
8
+ return promise;
9
+ };
10
+ export const getMockConsole = (verbose = false) => ({
11
+ log: jest.fn((a1, a2, a3, a4) => {
12
+ if (verbose) {
13
+ console.log(a1, a2, a3, a4);
14
+ }
15
+ }),
16
+ info: jest.fn((a1, a2, a3, a4) => {
17
+ if (verbose) {
18
+ console.info(a1, a2, a3, a4);
19
+ }
20
+ }),
21
+ warn: jest.fn((a1, a2, a3, a4) => {
22
+ console.warn(a1, a2, a3, a4);
23
+ }),
24
+ error: jest.fn((a1, a2, a3, a4) => {
25
+ console.error(a1, a2, a3, a4);
26
+ }),
27
+ });
28
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/tests/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,iBAAiB,CAAC;AAEpD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,YAAY;AACZ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAgC,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAGvH,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAqB,EAAE,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAClD,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IACF,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IACF,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QACnD,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAE;QACpD,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC;CACH,CAAC,CAAC"}
@@ -1,17 +1,26 @@
1
1
  import { HookSubscriberInfo } from './subscriptions.js';
2
- type AsyncCallbackProperty<IdT, EntityIdT, ReturnT> = (selectedIds: IdT[], entityId: EntityIdT | null, permissions: string[], supports: string[]) => ReturnT | Promise<ReturnT>;
2
+ export interface MenuCallbackProperties<IdT, EntityIdT> {
3
+ selectedIds: IdT[];
4
+ entityId: EntityIdT;
5
+ permissions: string[];
6
+ supports: string[];
7
+ }
8
+ export interface MenuClickHandlerProperties<IdT, EntityIdT, FormValueT extends object = object> extends MenuCallbackProperties<IdT, EntityIdT> {
9
+ formValues: FormValueT;
10
+ }
11
+ type AsyncCallbackProperty<IdT, EntityIdT, ReturnT> = (props: MenuCallbackProperties<IdT, EntityIdT>) => ReturnT | Promise<ReturnT>;
3
12
  export type ContextMenuIcon = {
4
13
  [key in string]: string;
5
14
  };
6
15
  export interface ContextMenu extends HookSubscriberInfo {
7
16
  icon?: ContextMenuIcon;
8
17
  }
9
- export interface ContextMenuItem<IdT, EntityIdT> {
18
+ export interface ContextMenuItem<IdT, EntityIdT, FormValueT extends object = object> {
10
19
  id: string;
11
20
  title: string;
12
21
  icon?: ContextMenuIcon;
13
22
  urls?: string[] | AsyncCallbackProperty<IdT, EntityIdT, string[] | undefined>;
14
- onClick?: (selectedIds: IdT[], entityId: EntityIdT | null, permissions: string[], supports: string[], formValues: object) => void;
23
+ onClick?: (props: MenuClickHandlerProperties<IdT, EntityIdT, FormValueT>) => void;
15
24
  filter?: AsyncCallbackProperty<IdT, EntityIdT, boolean>;
16
25
  access?: string;
17
26
  formDefinitions?: object[] | AsyncCallbackProperty<IdT, EntityIdT, object[]>;
@@ -4,20 +4,20 @@ export interface SelectedMenuItemListenerData<IdT, EntityIdT> {
4
4
  menu_id: string;
5
5
  menuitem_id: string;
6
6
  selected_ids: IdT[];
7
- entity_id: EntityIdT | null;
7
+ entity_id: EntityIdT;
8
8
  permissions: string[];
9
9
  supports: string[];
10
10
  form_values: object;
11
11
  }
12
12
  export interface MenuItemListHookData<IdT, EntityIdT> {
13
13
  selected_ids: IdT[];
14
- entity_id: EntityIdT | null;
14
+ entity_id: EntityIdT;
15
15
  permissions: string[];
16
16
  supports: string[];
17
17
  }
18
18
  export interface ResponseMenuItemCallbackFields {
19
- urls?: string[] | undefined;
20
- form_definitions?: object[] | undefined;
19
+ urls?: string[];
20
+ form_definitions?: object[];
21
21
  }
22
22
  export type ResponseMenuItem<IdT, EntityIdT> = Omit<ContextMenuItem<IdT, EntityIdT>, 'onClick' | 'filter' | 'urls' | 'form_definitions'> & ResponseMenuItemCallbackFields;
23
23
  export interface MenuItemListHookAcceptData<IdT, EntityIdT> {
@@ -20,4 +20,5 @@ export interface APISocket extends SocketRequestMethods, SocketSubscriptions {
20
20
  onSessionReset: SessionResetCallback | null;
21
21
  onDisconnected: DisconnectedCallback | null;
22
22
  readonly nativeSocket: WebSocket | null;
23
+ readonly url: string;
23
24
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "airdcpp-apisocket",
3
- "version": "3.0.0-beta.1",
3
+ "version": "3.0.0-beta.10",
4
4
  "description": "Javascript connector for AirDC++ Web API",
5
5
  "license": "MIT",
6
6
  "authors": [
@@ -41,14 +41,14 @@
41
41
  "devDependencies": {
42
42
  "@babel/preset-env": "^7.20.2",
43
43
  "@types/invariant": "^2.2.35",
44
- "@types/jest": "^29.5.12",
45
- "@types/node": "^20.14.9",
46
- "jest": "^29.7.0",
47
- "jest-cli": "^29.7.0",
44
+ "@types/jest": "^30.0.0",
45
+ "@types/node": "^24.1.0",
46
+ "jest": "^30.0.5",
47
+ "jest-cli": "^30.0.5",
48
48
  "jest-environment-node-debug": "^2.0.0",
49
49
  "mock-socket": "^9.1.5",
50
50
  "pre-commit": "^1.2.2",
51
- "rimraf": "^4.1.2",
51
+ "rimraf": "^6.0.1",
52
52
  "ts-jest": "^29.1.5",
53
53
  "ts-node": "^10.9.1",
54
54
  "tslint": "^6.1.3",
@@ -57,6 +57,9 @@
57
57
  "websocket": "^1.0.34"
58
58
  },
59
59
  "main": "./dist/NodeSocket.js",
60
- "exports": "./dist-es/NodeSocket.js",
60
+ "exports": {
61
+ ".": "./dist-es/NodeSocket.js",
62
+ "./tests": "./dist-es/tests/mocks/index.js"
63
+ },
61
64
  "type": "module"
62
65
  }
@@ -30,7 +30,12 @@ const validateItem = async <IdT, EntityIdT>(
30
30
  return false;
31
31
  }
32
32
 
33
- if (!!menuItem.filter && !(await menuItem.filter(selected_ids, entity_id, permissions, supports))) {
33
+ if (!!menuItem.filter && !(await menuItem.filter({
34
+ selectedIds: selected_ids,
35
+ entityId: entity_id,
36
+ permissions,
37
+ supports
38
+ }))) {
34
39
  return false;
35
40
  }
36
41
 
@@ -42,10 +47,17 @@ const parseCallbackData = async <IdT, EntityIdT extends EntityId | undefined = u
42
47
  data: MenuItemListHookData<IdT, EntityIdT>
43
48
  ): Promise<ResponseMenuItemCallbackFields> => {
44
49
  const { selected_ids, entity_id, permissions, supports } = data;
50
+ const callbackProps = {
51
+ selectedIds: selected_ids,
52
+ entityId: entity_id,
53
+ permissions,
54
+ supports
55
+ }
56
+
45
57
  if (!!item.urls && !!item.urls.length) {
46
58
  let urls: string[] | undefined;
47
59
  if (typeof item.urls === 'function') {
48
- urls = await item.urls(selected_ids, entity_id, permissions, supports);
60
+ urls = await item.urls(callbackProps);
49
61
  } else {
50
62
  urls = item.urls;
51
63
  }
@@ -56,7 +68,7 @@ const parseCallbackData = async <IdT, EntityIdT extends EntityId | undefined = u
56
68
  } else if (!!item.formDefinitions && hasSupport(FORM_SUPPORT, supports)) {
57
69
  let formDefinitions: object[] | undefined;
58
70
  if (typeof item.formDefinitions === 'function') {
59
- formDefinitions = await item.formDefinitions(selected_ids, entity_id, permissions, supports);
71
+ formDefinitions = await item.formDefinitions(callbackProps);
60
72
  } else {
61
73
  formDefinitions = item.formDefinitions;
62
74
  }
@@ -85,7 +97,13 @@ export const addContextMenuItems = async <IdT, EntityIdT extends EntityId | unde
85
97
  const isValid = await validateItem(menuItem, data);
86
98
  if (isValid && !!menuItem.onClick) {
87
99
  const { selected_ids, entity_id, permissions, supports, form_values } = data;
88
- menuItem.onClick(selected_ids, entity_id, permissions, supports, form_values);
100
+ menuItem.onClick({
101
+ selectedIds: selected_ids,
102
+ entityId: entity_id,
103
+ permissions,
104
+ supports,
105
+ formValues: form_values
106
+ });
89
107
  }
90
108
  }
91
109
  }
package/src/SocketBase.ts CHANGED
@@ -125,11 +125,11 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
125
125
  // Connect handler for creation of new session
126
126
  const handlePasswordLogin = (username = options.username, password = options.password) => {
127
127
  if (!username) {
128
- throw '"username" option was not supplied for authentication';
128
+ throw new Error('"username" option was not supplied for authentication');
129
129
  }
130
130
 
131
131
  if (!password) {
132
- throw '"password" option was not supplied for authentication';
132
+ throw new Error('"password" option was not supplied for authentication');
133
133
  }
134
134
 
135
135
  const data: API.CredentialsAuthenticationData = {
@@ -146,7 +146,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
146
146
 
147
147
  const handleRefreshTokenLogin = (refreshToken: string) => {
148
148
  if (!refreshToken) {
149
- throw '"refreshToken" option was not supplied for authentication';
149
+ throw new Error('"refreshToken" option was not supplied for authentication');
150
150
  }
151
151
 
152
152
  const data: API.RefreshTokenAuthenticationData = {
@@ -268,7 +268,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
268
268
  };
269
269
 
270
270
  ws!.onerror = (event) => {
271
- logger.error('Connecting socket failed');
271
+ logger.error('Connecting socket failed (network/system error, most likely the server is unreachable)');
272
272
  scheduleReconnect();
273
273
  };
274
274
  };
@@ -281,7 +281,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
281
281
  forceNoAutoConnect = false;
282
282
  return new Promise(
283
283
  (resolve, reject) => {
284
- logger.info('Starting socket connect');
284
+ logger.info(`Starting socket connect to ${userOptions.url}`);
285
285
  connectInternal(resolve, reject, authenticationHandler, reconnectOnFailure);
286
286
  }
287
287
  );
@@ -317,7 +317,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
317
317
  if (isActive()) {
318
318
  if (attempts >= maxAttempts) {
319
319
  logger.error(`Socket disconnect timed out after ${timeoutMs} ms`);
320
- reject('Socket disconnect timed out');
320
+ reject(new Error('Socket disconnect timed out'));
321
321
  } else {
322
322
  setTimeout(wait, checkInterval);
323
323
  attempts++;
@@ -343,7 +343,6 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
343
343
  }
344
344
  } else {
345
345
  logger.warn('Attempting to disconnect a closed socket (ignore)');
346
- //throw 'Attempting to disconnect a closed socket';
347
346
  }
348
347
 
349
348
  return;
@@ -363,7 +362,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
363
362
  // Username and password are not required if those are available in socket options
364
363
  connect: (username?: string, password?: string, reconnectOnFailure = true) => {
365
364
  if (isActive()) {
366
- throw 'Connect may only be used for a closed socket';
365
+ throw new Error('Connect may only be used for a closed socket');
367
366
  }
368
367
 
369
368
  resetSession();
@@ -373,7 +372,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
373
372
 
374
373
  connectRefreshToken: (refreshToken: string, reconnectOnFailure = true) => {
375
374
  if (isActive()) {
376
- throw 'Connect may only be used for a closed socket';
375
+ throw new Error('Connect may only be used for a closed socket');
377
376
  }
378
377
 
379
378
  resetSession();
@@ -384,7 +383,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
384
383
  // Connect and attempt to associate the socket with an existing session
385
384
  reconnect: (token: API.AuthTokenType | undefined = undefined, reconnectOnFailure = true) => {
386
385
  if (isActive()) {
387
- throw 'Reconnect may only be used for a closed socket';
386
+ throw new Error('Reconnect may only be used for a closed socket');
388
387
  }
389
388
 
390
389
  if (token) {
@@ -392,7 +391,7 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
392
391
  }
393
392
 
394
393
  if (!authToken) {
395
- throw 'No session token available for reconnecting';
394
+ throw new Error('No session token available for reconnecting');
396
395
  }
397
396
 
398
397
  logger.info('Reconnecting socket');
@@ -459,11 +458,15 @@ const ApiSocket = (userOptions: Options.APISocketOptions, WebSocketImpl: WebSock
459
458
  return ws;
460
459
  },
461
460
 
461
+ get url() {
462
+ return userOptions.url;
463
+ },
464
+
462
465
  ...subscriptions.socket,
463
466
  ...requests.socket,
464
467
  };
465
468
 
466
- return socket!;
469
+ return socket;
467
470
  };
468
471
 
469
472
  export default ApiSocket;
@@ -59,12 +59,12 @@ const SocketRequestHandler = (
59
59
  // Pre-checks
60
60
  if (!authenticating && !socket().isConnected()) {
61
61
  logger.warn(`Attempting to send request on a non-authenticated socket: ${path}`);
62
- return Promise.reject('Not authorized');
62
+ return Promise.reject(new Error('Not authorized'));
63
63
  }
64
64
 
65
65
  if (!socket().nativeSocket) {
66
66
  logger.warn(`Attempting to send request without a socket: ${path}`);
67
- return Promise.reject('No socket');
67
+ return Promise.reject(new Error('No socket'));
68
68
  }
69
69
 
70
70
  const callbackId = getCallbackId();
@@ -143,12 +143,10 @@ const SocketRequestHandler = (
143
143
  },
144
144
 
145
145
  delete: (path) => {
146
- //invariant(!data, 'No data is allowed for delete command');
147
146
  return sendRequest('DELETE', path);
148
147
  },
149
148
 
150
149
  get: (path) => {
151
- //invariant(!data, 'No data is allowed for get command');
152
150
  return sendRequest('GET', path);
153
151
  },
154
152
 
@@ -188,7 +186,7 @@ const SocketRequestHandler = (
188
186
  if (messageObj.code >= 200 && messageObj.code <= 204) {
189
187
  const { data } = messageObj as APIInternal.RequestSuccessResponse;
190
188
  if (!callbacks[id].ignored) {
191
- logger.verbose(chalk.green(id.toString()), 'SUCCEEDED', data ? data : '(no data)');
189
+ logger.verbose(chalk.green(id.toString()), 'SUCCEEDED', data ?? '(no data)');
192
190
  }
193
191
 
194
192
  callbacks[id].resolver.resolve(data);