airdcpp-apisocket 3.0.0-beta.1 → 3.0.0-beta.3
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/types/public_helpers.d.ts +12 -3
- package/dist-es/types/public_helpers_internal.d.ts +2 -2
- package/package.json +1 -1
- package/src/PublicHelpers.ts +22 -4
- package/src/tests/Socket.test.ts +4 -10
- package/src/tests/public_helpers.test.ts +38 -21
- package/src/types/public_helpers.ts +11 -11
- package/src/types/public_helpers_internal.ts +2 -2
package/dist-es/PublicHelpers.js
CHANGED
@@ -15,17 +15,28 @@ const validateItem = async (menuItem, data) => {
|
|
15
15
|
if (!!menuItem.urls && !hasSupport(URLS_SUPPORT, supports)) {
|
16
16
|
return false;
|
17
17
|
}
|
18
|
-
if (!!menuItem.filter && !(await menuItem.filter(
|
18
|
+
if (!!menuItem.filter && !(await menuItem.filter({
|
19
|
+
selectedIds: selected_ids,
|
20
|
+
entityId: entity_id,
|
21
|
+
permissions,
|
22
|
+
supports
|
23
|
+
}))) {
|
19
24
|
return false;
|
20
25
|
}
|
21
26
|
return checkAccess(menuItem, data.permissions);
|
22
27
|
};
|
23
28
|
const parseCallbackData = async (item, data) => {
|
24
29
|
const { selected_ids, entity_id, permissions, supports } = data;
|
30
|
+
const callbackProps = {
|
31
|
+
selectedIds: selected_ids,
|
32
|
+
entityId: entity_id,
|
33
|
+
permissions,
|
34
|
+
supports
|
35
|
+
};
|
25
36
|
if (!!item.urls && !!item.urls.length) {
|
26
37
|
let urls;
|
27
38
|
if (typeof item.urls === 'function') {
|
28
|
-
urls = await item.urls(
|
39
|
+
urls = await item.urls(callbackProps);
|
29
40
|
}
|
30
41
|
else {
|
31
42
|
urls = item.urls;
|
@@ -37,7 +48,7 @@ const parseCallbackData = async (item, data) => {
|
|
37
48
|
else if (!!item.formDefinitions && hasSupport(FORM_SUPPORT, supports)) {
|
38
49
|
let formDefinitions;
|
39
50
|
if (typeof item.formDefinitions === 'function') {
|
40
|
-
formDefinitions = await item.formDefinitions(
|
51
|
+
formDefinitions = await item.formDefinitions(callbackProps);
|
41
52
|
}
|
42
53
|
else {
|
43
54
|
formDefinitions = item.formDefinitions;
|
@@ -56,7 +67,13 @@ export const addContextMenuItems = async (socket, menuItems, menuTypeId, menu) =
|
|
56
67
|
const isValid = await validateItem(menuItem, data);
|
57
68
|
if (isValid && !!menuItem.onClick) {
|
58
69
|
const { selected_ids, entity_id, permissions, supports, form_values } = data;
|
59
|
-
menuItem.onClick(
|
70
|
+
menuItem.onClick({
|
71
|
+
selectedIds: selected_ids,
|
72
|
+
entityId: entity_id,
|
73
|
+
permissions,
|
74
|
+
supports,
|
75
|
+
formValues: form_values
|
76
|
+
});
|
60
77
|
}
|
61
78
|
}
|
62
79
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"PublicHelpers.js","sourceRoot":"","sources":["../src/PublicHelpers.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,GAAG,CAAiB,QAAyC,EAAE,WAAqB,EAAW,EAAE;IAChH,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5F,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,QAAkB,EAAE,EAAE;IACzD,OAAO,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,YAAY,GAAG,KAAK,EACxB,QAAyC,EACzC,IAA0C,EACxB,EAAE;IACpB,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,
|
1
|
+
{"version":3,"file":"PublicHelpers.js","sourceRoot":"","sources":["../src/PublicHelpers.ts"],"names":[],"mappings":"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"}
|
@@ -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,14 +4,14 @@ 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
|
}
|
package/package.json
CHANGED
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/tests/Socket.test.ts
CHANGED
@@ -16,12 +16,6 @@ const dummyfn = () => {
|
|
16
16
|
// ..
|
17
17
|
};
|
18
18
|
|
19
|
-
const useFakeTimers = () => {
|
20
|
-
// Mocking performance would cause an error with Node 19, can be removed when using
|
21
|
-
// the latest version of Jest
|
22
|
-
jest.useFakeTimers({doNotFake: ['performance']});
|
23
|
-
};
|
24
|
-
|
25
19
|
// tslint:disable:no-empty
|
26
20
|
describe('socket', () => {
|
27
21
|
beforeEach(() => {
|
@@ -193,7 +187,7 @@ describe('socket', () => {
|
|
193
187
|
test('should handle auto reconnect', async () => {
|
194
188
|
const { socket, mockConsole } = await getConnectedSocket(server);
|
195
189
|
|
196
|
-
useFakeTimers();
|
190
|
+
jest.useFakeTimers();
|
197
191
|
|
198
192
|
socket.disconnect(true);
|
199
193
|
jest.runOnlyPendingTimers();
|
@@ -234,7 +228,7 @@ describe('socket', () => {
|
|
234
228
|
test('should cancel auto reconnect', async () => {
|
235
229
|
const { socket, mockConsole } = await getConnectedSocket(server);
|
236
230
|
|
237
|
-
useFakeTimers();
|
231
|
+
jest.useFakeTimers();
|
238
232
|
|
239
233
|
// Disconnect with auto reconnect
|
240
234
|
socket.disconnect(true);
|
@@ -281,7 +275,7 @@ describe('socket', () => {
|
|
281
275
|
// Connect and disconnect
|
282
276
|
const { socket, mockConsole } = await getConnectedSocket(server);
|
283
277
|
|
284
|
-
useFakeTimers();
|
278
|
+
jest.useFakeTimers();
|
285
279
|
socket.disconnect();
|
286
280
|
jest.runOnlyPendingTimers();
|
287
281
|
expect(socket.isActive()).toEqual(false);
|
@@ -334,7 +328,7 @@ describe('socket', () => {
|
|
334
328
|
test('should report request timeouts', async () => {
|
335
329
|
const { socket, mockConsole } = await getConnectedSocket(server);
|
336
330
|
|
337
|
-
useFakeTimers();
|
331
|
+
jest.useFakeTimers();
|
338
332
|
socket.addListener('hubs', 'hub_updated', dummyfn)
|
339
333
|
.catch(() => {});
|
340
334
|
socket.addListener('hubs', 'hub_added', dummyfn)
|
@@ -8,7 +8,7 @@ import { jest } from '@jest/globals';
|
|
8
8
|
|
9
9
|
import { addContextMenuItems } from '../PublicHelpers.js';
|
10
10
|
import { SelectedMenuItemListenerData, MenuItemListHookData, MenuItemListHookAcceptData } from '../types/public_helpers_internal.js';
|
11
|
-
import { HookSubscriberInfo } from '../types/index.js';
|
11
|
+
import { HookSubscriberInfo, MenuCallbackProperties, MenuClickHandlerProperties } from '../types/index.js';
|
12
12
|
import { IncomingSubscriptionEvent } from '../types/api_internal.js';
|
13
13
|
|
14
14
|
|
@@ -123,42 +123,42 @@ describe('public helpers', () => {
|
|
123
123
|
[
|
124
124
|
{
|
125
125
|
...MENU_ITEM1,
|
126
|
-
filter: async (
|
126
|
+
filter: async () => {
|
127
127
|
return true;
|
128
128
|
},
|
129
129
|
access: VALID_ACCESS,
|
130
|
-
onClick: (
|
131
|
-
onClickItem1Mock(
|
130
|
+
onClick: (props) => {
|
131
|
+
onClickItem1Mock(props);
|
132
132
|
},
|
133
|
-
formDefinitions: (
|
133
|
+
formDefinitions: () => {
|
134
134
|
return FORM_DEFINITIONS;
|
135
135
|
},
|
136
136
|
}, {
|
137
137
|
...MENU_ITEM2,
|
138
|
-
onClick: (
|
139
|
-
onClickItem2Mock(
|
138
|
+
onClick: (props) => {
|
139
|
+
onClickItem2Mock(props);
|
140
140
|
}
|
141
141
|
}, {
|
142
142
|
...MENU_ITEM3,
|
143
|
-
urls: (
|
144
|
-
onGetUrlsItem3Mock(
|
143
|
+
urls: (props) => {
|
144
|
+
onGetUrlsItem3Mock(props);
|
145
145
|
return URLS;
|
146
146
|
}
|
147
147
|
}, {
|
148
148
|
id: 'ignored_filter_id',
|
149
149
|
title: 'Mock item ignored by filter',
|
150
|
-
filter: (
|
150
|
+
filter: () => {
|
151
151
|
return false;
|
152
152
|
},
|
153
|
-
onClick: (
|
154
|
-
onClickItemIgnoredMock(
|
153
|
+
onClick: (props) => {
|
154
|
+
onClickItemIgnoredMock(props);
|
155
155
|
}
|
156
156
|
}, {
|
157
157
|
id: 'ignored_access_id',
|
158
158
|
title: 'Mock item ignored by access',
|
159
159
|
access: 'invalid_access',
|
160
|
-
onClick: (
|
161
|
-
onClickItemIgnoredMock(
|
160
|
+
onClick: (props) => {
|
161
|
+
onClickItemIgnoredMock(props);
|
162
162
|
}
|
163
163
|
}
|
164
164
|
],
|
@@ -166,8 +166,8 @@ describe('public helpers', () => {
|
|
166
166
|
SUBSCRIBER_INFO,
|
167
167
|
);
|
168
168
|
|
169
|
-
expect(listenerAddCallback).
|
170
|
-
expect(hookAddCallback).
|
169
|
+
expect(listenerAddCallback).toHaveBeenCalledTimes(1);
|
170
|
+
expect(hookAddCallback).toHaveBeenCalledTimes(1);
|
171
171
|
|
172
172
|
|
173
173
|
// List items hook
|
@@ -192,7 +192,7 @@ describe('public helpers', () => {
|
|
192
192
|
expect(hookResolveCallback).toHaveBeenCalledTimes(1);
|
193
193
|
});
|
194
194
|
|
195
|
-
expect(hookResolveCallback).
|
195
|
+
expect(hookResolveCallback).toHaveBeenCalledWith(
|
196
196
|
expect.objectContaining({
|
197
197
|
data: menuItemListData
|
198
198
|
}),
|
@@ -201,7 +201,15 @@ describe('public helpers', () => {
|
|
201
201
|
await waitForExpect(() => {
|
202
202
|
expect(onGetUrlsItem3Mock).toHaveBeenCalledTimes(1);
|
203
203
|
});
|
204
|
-
|
204
|
+
|
205
|
+
const urlCallbackProps: MenuCallbackProperties<string, null> = {
|
206
|
+
selectedIds: selectedMenuIds,
|
207
|
+
entityId: null,
|
208
|
+
permissions: PERMISSIONS,
|
209
|
+
supports: SUPPORTS
|
210
|
+
}
|
211
|
+
|
212
|
+
expect(onGetUrlsItem3Mock).toHaveBeenCalledWith(urlCallbackProps);
|
205
213
|
}
|
206
214
|
|
207
215
|
// Select event listener
|
@@ -229,9 +237,18 @@ describe('public helpers', () => {
|
|
229
237
|
await waitForExpect(() => {
|
230
238
|
expect(onClickItem1Mock).toHaveBeenCalledTimes(1);
|
231
239
|
});
|
232
|
-
|
233
|
-
|
234
|
-
|
240
|
+
|
241
|
+
const clickHandlerProps: MenuClickHandlerProperties<string, null> = {
|
242
|
+
selectedIds: selectedMenuIds,
|
243
|
+
entityId: null,
|
244
|
+
permissions: PERMISSIONS,
|
245
|
+
supports: SUPPORTS,
|
246
|
+
formValues: FORM_VALUES
|
247
|
+
}
|
248
|
+
|
249
|
+
expect(onClickItem1Mock).toHaveBeenCalledWith(clickHandlerProps);
|
250
|
+
expect(onClickItem2Mock).not.toHaveBeenCalled();
|
251
|
+
expect(onClickItemIgnoredMock).not.toHaveBeenCalled();
|
235
252
|
}
|
236
253
|
|
237
254
|
// Remove items
|
@@ -1,29 +1,29 @@
|
|
1
1
|
import { HookSubscriberInfo } from './subscriptions.js';
|
2
2
|
|
3
|
-
|
3
|
+
export interface MenuCallbackProperties<IdT, EntityIdT> {
|
4
4
|
selectedIds: IdT[],
|
5
|
-
entityId: EntityIdT
|
5
|
+
entityId: EntityIdT,
|
6
6
|
permissions: string[],
|
7
7
|
supports: string[]
|
8
|
-
|
8
|
+
}
|
9
|
+
|
10
|
+
export interface MenuClickHandlerProperties<IdT, EntityIdT, FormValueT extends object = object> extends MenuCallbackProperties<IdT, EntityIdT> {
|
11
|
+
formValues: FormValueT
|
12
|
+
}
|
13
|
+
|
14
|
+
type AsyncCallbackProperty<IdT, EntityIdT, ReturnT> = (props: MenuCallbackProperties<IdT, EntityIdT>) => ReturnT | Promise<ReturnT>;
|
9
15
|
|
10
16
|
export type ContextMenuIcon = { [key in string]: string };
|
11
17
|
|
12
18
|
export interface ContextMenu extends HookSubscriberInfo {
|
13
19
|
icon?: ContextMenuIcon;
|
14
20
|
}
|
15
|
-
export interface ContextMenuItem<IdT, EntityIdT> {
|
21
|
+
export interface ContextMenuItem<IdT, EntityIdT, FormValueT extends object = object> {
|
16
22
|
id: string;
|
17
23
|
title: string;
|
18
24
|
icon?: ContextMenuIcon;
|
19
25
|
urls?: string[] | AsyncCallbackProperty<IdT, EntityIdT, string[] | undefined>;
|
20
|
-
onClick?: (
|
21
|
-
selectedIds: IdT[],
|
22
|
-
entityId: EntityIdT | null,
|
23
|
-
permissions: string[],
|
24
|
-
supports: string[],
|
25
|
-
formValues: object
|
26
|
-
) => void;
|
26
|
+
onClick?: (props: MenuClickHandlerProperties<IdT, EntityIdT, FormValueT>) => void;
|
27
27
|
filter?: AsyncCallbackProperty<IdT, EntityIdT, boolean>;
|
28
28
|
access?: string;
|
29
29
|
formDefinitions?: object[] | AsyncCallbackProperty<IdT, EntityIdT, object[]>;
|
@@ -6,7 +6,7 @@ export interface SelectedMenuItemListenerData<IdT, EntityIdT> {
|
|
6
6
|
menu_id: string;
|
7
7
|
menuitem_id: string;
|
8
8
|
selected_ids: IdT[];
|
9
|
-
entity_id: EntityIdT
|
9
|
+
entity_id: EntityIdT;
|
10
10
|
permissions: string[];
|
11
11
|
supports: string[];
|
12
12
|
form_values: object;
|
@@ -14,7 +14,7 @@ export interface SelectedMenuItemListenerData<IdT, EntityIdT> {
|
|
14
14
|
|
15
15
|
export interface MenuItemListHookData<IdT, EntityIdT> {
|
16
16
|
selected_ids: IdT[];
|
17
|
-
entity_id: EntityIdT
|
17
|
+
entity_id: EntityIdT;
|
18
18
|
permissions: string[];
|
19
19
|
supports: string[];
|
20
20
|
}
|