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.
- package/dist-es/PublicHelpers.js +21 -4
- package/dist-es/PublicHelpers.js.map +1 -1
- package/dist-es/SocketBase.js +13 -11
- package/dist-es/SocketBase.js.map +1 -1
- package/dist-es/SocketRequestHandler.js +3 -5
- package/dist-es/SocketRequestHandler.js.map +1 -1
- package/dist-es/tests/mocks/index.d.ts +3 -0
- package/dist-es/tests/mocks/index.js +4 -0
- package/dist-es/tests/mocks/index.js.map +1 -0
- package/dist-es/tests/mocks/mock-data.d.ts +54 -0
- package/dist-es/tests/mocks/mock-data.js +34 -0
- package/dist-es/tests/mocks/mock-data.js.map +1 -0
- package/dist-es/tests/mocks/mock-server.d.ts +43 -0
- package/dist-es/tests/mocks/mock-server.js +154 -0
- package/dist-es/tests/mocks/mock-server.js.map +1 -0
- package/dist-es/tests/mocks/mock-socket.d.ts +23 -0
- package/dist-es/tests/mocks/mock-socket.js +31 -0
- package/dist-es/tests/mocks/mock-socket.js.map +1 -0
- package/dist-es/tests/test-utils.d.ts +8 -0
- package/dist-es/tests/test-utils.js +28 -0
- package/dist-es/tests/test-utils.js.map +1 -0
- package/dist-es/types/public_helpers.d.ts +12 -3
- package/dist-es/types/public_helpers_internal.d.ts +4 -4
- package/dist-es/types/socket.d.ts +1 -0
- package/package.json +10 -7
- package/src/PublicHelpers.ts +22 -4
- package/src/SocketBase.ts +15 -12
- package/src/SocketRequestHandler.ts +3 -5
- package/src/tests/Socket.test.ts +107 -109
- package/src/tests/mocks/index.ts +3 -0
- package/src/tests/mocks/mock-data.ts +36 -0
- package/src/tests/mocks/mock-server.ts +269 -0
- package/src/tests/mocks/mock-socket.ts +68 -0
- package/src/tests/public_helpers.test.ts +63 -62
- package/src/tests/test-utils.ts +31 -0
- package/src/types/api_internal.ts +0 -1
- package/src/types/public_helpers.ts +11 -11
- package/src/types/public_helpers_internal.ts +4 -4
- package/src/types/socket.ts +1 -0
- package/tsconfig.json +1 -1
- 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
|
-
|
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?: (
|
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
|
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
|
14
|
+
entity_id: EntityIdT;
|
15
15
|
permissions: string[];
|
16
16
|
supports: string[];
|
17
17
|
}
|
18
18
|
export interface ResponseMenuItemCallbackFields {
|
19
|
-
urls?: string[]
|
20
|
-
form_definitions?: object[]
|
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> {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "airdcpp-apisocket",
|
3
|
-
"version": "3.0.0-beta.
|
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": "^
|
45
|
-
"@types/node": "^
|
46
|
-
"jest": "^
|
47
|
-
"jest-cli": "^
|
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": "^
|
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":
|
60
|
+
"exports": {
|
61
|
+
".": "./dist-es/NodeSocket.js",
|
62
|
+
"./tests": "./dist-es/tests/mocks/index.js"
|
63
|
+
},
|
61
64
|
"type": "module"
|
62
65
|
}
|
package/src/PublicHelpers.ts
CHANGED
@@ -30,7 +30,12 @@ const validateItem = async <IdT, EntityIdT>(
|
|
30
30
|
return false;
|
31
31
|
}
|
32
32
|
|
33
|
-
if (!!menuItem.filter && !(await menuItem.filter(
|
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(
|
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(
|
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(
|
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(
|
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
|
189
|
+
logger.verbose(chalk.green(id.toString()), 'SUCCEEDED', data ?? '(no data)');
|
192
190
|
}
|
193
191
|
|
194
192
|
callbacks[id].resolver.resolve(data);
|