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.
@@ -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(selected_ids, entity_id, permissions, supports))) {
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(selected_ids, entity_id, permissions, supports);
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(selected_ids, entity_id, permissions, supports);
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(selected_ids, entity_id, permissions, supports, form_values);
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":"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"}
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
- 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,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 | 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
  }
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.3",
4
4
  "description": "Javascript connector for AirDC++ Web API",
5
5
  "license": "MIT",
6
6
  "authors": [
@@ -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
  }
@@ -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 (ids, entityId) => {
126
+ filter: async () => {
127
127
  return true;
128
128
  },
129
129
  access: VALID_ACCESS,
130
- onClick: (ids, entityId, permissions, supports, formValues) => {
131
- onClickItem1Mock(ids, entityId, permissions, supports, formValues);
130
+ onClick: (props) => {
131
+ onClickItem1Mock(props);
132
132
  },
133
- formDefinitions: (ids, entityId, permissions, supports) => {
133
+ formDefinitions: () => {
134
134
  return FORM_DEFINITIONS;
135
135
  },
136
136
  }, {
137
137
  ...MENU_ITEM2,
138
- onClick: (ids, entityId) => {
139
- onClickItem2Mock(ids, entityId);
138
+ onClick: (props) => {
139
+ onClickItem2Mock(props);
140
140
  }
141
141
  }, {
142
142
  ...MENU_ITEM3,
143
- urls: (ids, entityId, permissions, supports) => {
144
- onGetUrlsItem3Mock(ids, entityId, permissions, supports);
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: (ids, entityId, permissions, supports) => {
150
+ filter: () => {
151
151
  return false;
152
152
  },
153
- onClick: (ids, entityId, permissions, supports, formValues) => {
154
- onClickItemIgnoredMock(ids, entityId, permissions, supports, formValues);
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: (ids, entityId, permissions, supports, formValues) => {
161
- onClickItemIgnoredMock(ids, entityId, permissions, supports, formValues);
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).toBeCalledTimes(1);
170
- expect(hookAddCallback).toBeCalledTimes(1);
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).toBeCalledWith(
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
- expect(onGetUrlsItem3Mock).toHaveBeenCalledWith(selectedMenuIds, null, PERMISSIONS, SUPPORTS);
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
- expect(onClickItem1Mock).toHaveBeenCalledWith(selectedMenuIds, null, PERMISSIONS, SUPPORTS, FORM_VALUES);
233
- expect(onClickItem2Mock).not.toBeCalled();
234
- expect(onClickItemIgnoredMock).not.toBeCalled();
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
- type AsyncCallbackProperty<IdT, EntityIdT, ReturnT> = (
3
+ export interface MenuCallbackProperties<IdT, EntityIdT> {
4
4
  selectedIds: IdT[],
5
- entityId: EntityIdT | null,
5
+ entityId: EntityIdT,
6
6
  permissions: string[],
7
7
  supports: string[]
8
- ) => ReturnT | Promise<ReturnT>;
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 | null;
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 | null;
17
+ entity_id: EntityIdT;
18
18
  permissions: string[];
19
19
  supports: string[];
20
20
  }