aes70 2.0.16 → 2.0.18

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.
@@ -7,19 +7,25 @@ import { UDPConnection } from '../src/controller/udp_connection.js';
7
7
  import { fetchDeviceContent } from '../src/controller/fetch_device_content.js';
8
8
 
9
9
  function badArguments() {
10
- console.log('Usage: node print_tree.js [--json] [--udp] <ip> <port>');
10
+ console.log(
11
+ 'Usage: node print_tree.js [--json] [--udp] [--progress] <ip> <port>'
12
+ );
11
13
  exit(1);
12
14
  }
13
15
 
14
16
  let jsonMode = false;
15
17
  let useUdp = false;
16
18
  const rest = [];
19
+ let progress = false;
17
20
 
18
21
  argv.slice(2).forEach((option) => {
19
22
  switch (option) {
20
23
  case '--json':
21
24
  jsonMode = true;
22
25
  break;
26
+ case '--progress':
27
+ progress = true;
28
+ break;
23
29
  case '-h':
24
30
  case '--help':
25
31
  badArguments();
@@ -76,8 +82,13 @@ function printTreeJson(content) {
76
82
 
77
83
  async function printDevice(device) {
78
84
  try {
79
- const content = await fetchDeviceContent(device);
80
-
85
+ const reportProgress = progress
86
+ ? (finished, total) => {
87
+ process.stderr.write(`\r${finished} of ${total}`);
88
+ }
89
+ : undefined;
90
+ const content = await fetchDeviceContent(device, reportProgress);
91
+ if (progress) process.stderr.write(`\ndone.\n`);
81
92
  if (jsonMode) {
82
93
  printTreeJson(content);
83
94
  } else {
package/dist/AES70.es5.js CHANGED
@@ -1382,6 +1382,8 @@
1382
1382
 
1383
1383
  const t = seconds * 1000;
1384
1384
 
1385
+ if (this.keepalive_interval === t) return;
1386
+
1385
1387
  this.keepalive_interval = t;
1386
1388
 
1387
1389
  // Notify the other side about our new keepalive
@@ -1816,6 +1818,19 @@
1816
1818
  this.name = name;
1817
1819
  this.lastSent = 0;
1818
1820
  this.retries = 0;
1821
+ this.duration = 0;
1822
+ }
1823
+
1824
+ /**
1825
+ * Sets the expected processing time for this command on the device.
1826
+ * This duration is used when scheduling retries.
1827
+ * Only has an effect for UDP connections.
1828
+ *
1829
+ * @param {number} interval
1830
+ * The interval in milliseconds.
1831
+ */
1832
+ set_duration(interval) {
1833
+ this.duration = interval;
1819
1834
  }
1820
1835
 
1821
1836
  get_arguments() {
@@ -1886,7 +1901,7 @@
1886
1901
  this._scheduledPendingCommands = new Set();
1887
1902
  // All pending commands wich have been sent.
1888
1903
  this._sentPendingCommands = new Set();
1889
- this._nextCommandHandle = 0;
1904
+ this._lastCommandHandle = 0;
1890
1905
  this._subscribers = new Map();
1891
1906
  this._sendCommandsTimer = new Timer(
1892
1907
  () => {
@@ -1970,8 +1985,8 @@
1970
1985
  }
1971
1986
 
1972
1987
  do {
1973
- handle = this._nextCommandHandle;
1974
- this._nextCommandHandle = (handle + 1) | 0;
1988
+ handle = this._lastCommandHandle;
1989
+ this._lastCommandHandle = (handle + 1) | 0;
1975
1990
  } while (pendingCommands.has(handle));
1976
1991
 
1977
1992
  return handle;
@@ -1993,6 +2008,10 @@
1993
2008
  }
1994
2009
  }
1995
2010
 
2011
+ get_last_pending_command() {
2012
+ return this._pendingCommands.get(this._lastCommandHandle);
2013
+ }
2014
+
1996
2015
  send_command(command, returnTypes, callback, stack, name) {
1997
2016
  const executor = (resolve, reject) => {
1998
2017
  const handle = this._getNextCommandHandle();
@@ -29173,6 +29192,13 @@
29173
29192
 
29174
29193
  _sentPendingCommands.delete(pendingCommand);
29175
29194
 
29195
+ if (pendingCommand.lastSent + pendingCommand.duration > retryTime) {
29196
+ // This command is expected to take longer. Simply push it back to the queue,
29197
+ // we will pick it up later.
29198
+ _sentPendingCommands.add(pendingCommand);
29199
+ continue;
29200
+ }
29201
+
29176
29202
  if (pendingCommand.retries >= this.retry_count) {
29177
29203
  failed.push(pendingCommand);
29178
29204
  } else {
@@ -29188,7 +29214,8 @@
29188
29214
  if (failed.length) {
29189
29215
  const timeoutError = new Error('Timeout.');
29190
29216
 
29191
- failed.forEach(([handle, pendingCommand]) => {
29217
+ failed.forEach((pendingCommand) => {
29218
+ const handle = pendingCommand.handle;
29192
29219
  pendingCommands.delete(handle);
29193
29220
  pendingCommand.reject(timeoutError);
29194
29221
  });
@@ -29345,9 +29372,9 @@
29345
29372
  if (typeof value === 'object') {
29346
29373
  if (value instanceof Arguments) {
29347
29374
  return {
29348
- [name]: value.item(0),
29349
- ['Min' + name]: value.item(1),
29350
- ['Max' + name]: value.item(2),
29375
+ [name]: formatValue(value.item(0)),
29376
+ ['Min' + name]: formatValue(value.item(1)),
29377
+ ['Max' + name]: formatValue(value.item(2)),
29351
29378
  };
29352
29379
  } else {
29353
29380
  value = formatValue(value);
@@ -29355,7 +29382,7 @@
29355
29382
  }
29356
29383
 
29357
29384
  return {
29358
- [name]: value,
29385
+ [name]: formatValue(value),
29359
29386
  };
29360
29387
  }
29361
29388
 
@@ -29387,7 +29414,11 @@
29387
29414
 
29388
29415
  Object.assign(info, formatReturnValue(name, currentValue));
29389
29416
  } catch (err) {
29390
- if (err.status != 8)
29417
+ // 8 - NotImplemented
29418
+ // 11 - BadMethod
29419
+ // Note: Some implementations respond with BadMethod for methods which have been
29420
+ // defined in more recent vrsions of aes70
29421
+ if (err.status != 8 && err.status != 11)
29391
29422
  console.error(
29392
29423
  'Fetching property',
29393
29424
  o.ClassName,
@@ -29415,10 +29446,13 @@
29415
29446
  }
29416
29447
  }
29417
29448
 
29418
- async function fetchDeviceContentRec(objects) {
29449
+ async function fetchDeviceContentRec(objects, reportProgress) {
29419
29450
  const result = [];
29420
29451
 
29421
29452
  for (let i = 0; i < objects.length; i++) {
29453
+ if (reportProgress) {
29454
+ reportProgress(i, objects.length);
29455
+ }
29422
29456
  const o = objects[i];
29423
29457
  const info = await fetchObjectInfo(o);
29424
29458
 
@@ -29437,7 +29471,7 @@
29437
29471
  return result;
29438
29472
  }
29439
29473
 
29440
- async function fetchDeviceContent(device) {
29474
+ async function fetchDeviceContent(device, reportProgress) {
29441
29475
  const objects = await device.GetDeviceTree();
29442
29476
  const managers = [
29443
29477
  device.DeviceManager,
@@ -29459,7 +29493,7 @@
29459
29493
  if (await managerExists(manager)) objects.push(manager);
29460
29494
  }
29461
29495
 
29462
- return await fetchDeviceContentRec(objects);
29496
+ return await fetchDeviceContentRec(objects, reportProgress);
29463
29497
  }
29464
29498
 
29465
29499
  /*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aes70",
3
- "version": "2.0.16",
3
+ "version": "2.0.18",
4
4
  "description": "A controller library for the AES70 protocol.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/connection.js CHANGED
@@ -219,6 +219,8 @@ export class Connection extends Events {
219
219
 
220
220
  const t = seconds * 1000;
221
221
 
222
+ if (this.keepalive_interval === t) return;
223
+
222
224
  this.keepalive_interval = t;
223
225
 
224
226
  // Notify the other side about our new keepalive
@@ -192,6 +192,13 @@ export class AbstractUDPConnection extends ClientConnection {
192
192
 
193
193
  _sentPendingCommands.delete(pendingCommand);
194
194
 
195
+ if (pendingCommand.lastSent + pendingCommand.duration > retryTime) {
196
+ // This command is expected to take longer. Simply push it back to the queue,
197
+ // we will pick it up later.
198
+ _sentPendingCommands.add(pendingCommand);
199
+ continue;
200
+ }
201
+
195
202
  if (pendingCommand.retries >= this.retry_count) {
196
203
  failed.push(pendingCommand);
197
204
  } else {
@@ -207,7 +214,8 @@ export class AbstractUDPConnection extends ClientConnection {
207
214
  if (failed.length) {
208
215
  const timeoutError = new Error('Timeout.');
209
216
 
210
- failed.forEach(([handle, pendingCommand]) => {
217
+ failed.forEach((pendingCommand) => {
218
+ const handle = pendingCommand.handle;
211
219
  pendingCommands.delete(handle);
212
220
  pendingCommand.reject(timeoutError);
213
221
  });
@@ -25,7 +25,17 @@ export interface PendingCommand {
25
25
  * If available, returns the arguments of this
26
26
  * remote method call.
27
27
  */
28
- get_arguments(): unknwon[] | undefined;
28
+ get_arguments(): unknown[] | undefined;
29
+
30
+ /**
31
+ * Sets the expected processing time for this command on the device.
32
+ * This duration is used when scheduling retries.
33
+ * Only has an effect for UDP connections.
34
+ *
35
+ * @param {number} interval
36
+ * The interval in milliseconds.
37
+ */
38
+ set_duration(interval: number): void;
29
39
  }
30
40
 
31
41
  /**
@@ -42,4 +52,6 @@ export declare class ClientConnection extends Connection {
42
52
  * Keepalive interval in seconds.
43
53
  */
44
54
  wait_for_keepalive(interval: number): Promise<void>;
55
+
56
+ get_last_pending_command(): PendingCommand | undefined;
45
57
  }
@@ -27,6 +27,19 @@ class PendingCommand {
27
27
  this.name = name;
28
28
  this.lastSent = 0;
29
29
  this.retries = 0;
30
+ this.duration = 0;
31
+ }
32
+
33
+ /**
34
+ * Sets the expected processing time for this command on the device.
35
+ * This duration is used when scheduling retries.
36
+ * Only has an effect for UDP connections.
37
+ *
38
+ * @param {number} interval
39
+ * The interval in milliseconds.
40
+ */
41
+ set_duration(interval) {
42
+ this.duration = interval;
30
43
  }
31
44
 
32
45
  get_arguments() {
@@ -97,7 +110,7 @@ export class ClientConnection extends Connection {
97
110
  this._scheduledPendingCommands = new Set();
98
111
  // All pending commands wich have been sent.
99
112
  this._sentPendingCommands = new Set();
100
- this._nextCommandHandle = 0;
113
+ this._lastCommandHandle = 0;
101
114
  this._subscribers = new Map();
102
115
  this._sendCommandsTimer = new Timer(
103
116
  () => {
@@ -181,8 +194,8 @@ export class ClientConnection extends Connection {
181
194
  }
182
195
 
183
196
  do {
184
- handle = this._nextCommandHandle;
185
- this._nextCommandHandle = (handle + 1) | 0;
197
+ handle = this._lastCommandHandle;
198
+ this._lastCommandHandle = (handle + 1) | 0;
186
199
  } while (pendingCommands.has(handle));
187
200
 
188
201
  return handle;
@@ -204,6 +217,10 @@ export class ClientConnection extends Connection {
204
217
  }
205
218
  }
206
219
 
220
+ get_last_pending_command() {
221
+ return this._pendingCommands.get(this._lastCommandHandle);
222
+ }
223
+
207
224
  send_command(command, returnTypes, callback, stack, name) {
208
225
  const executor = (resolve, reject) => {
209
226
  const handle = this._getNextCommandHandle();
@@ -37,9 +37,9 @@ function formatReturnValue(name, value) {
37
37
  if (typeof value === 'object') {
38
38
  if (value instanceof Arguments) {
39
39
  return {
40
- [name]: value.item(0),
41
- ['Min' + name]: value.item(1),
42
- ['Max' + name]: value.item(2),
40
+ [name]: formatValue(value.item(0)),
41
+ ['Min' + name]: formatValue(value.item(1)),
42
+ ['Max' + name]: formatValue(value.item(2)),
43
43
  };
44
44
  } else {
45
45
  value = formatValue(value);
@@ -47,7 +47,7 @@ function formatReturnValue(name, value) {
47
47
  }
48
48
 
49
49
  return {
50
- [name]: value,
50
+ [name]: formatValue(value),
51
51
  };
52
52
  }
53
53
 
@@ -79,7 +79,11 @@ async function fetchObjectInfo(o) {
79
79
 
80
80
  Object.assign(info, formatReturnValue(name, currentValue));
81
81
  } catch (err) {
82
- if (err.status != 8)
82
+ // 8 - NotImplemented
83
+ // 11 - BadMethod
84
+ // Note: Some implementations respond with BadMethod for methods which have been
85
+ // defined in more recent vrsions of aes70
86
+ if (err.status != 8 && err.status != 11)
83
87
  console.error(
84
88
  'Fetching property',
85
89
  o.ClassName,
@@ -107,10 +111,13 @@ async function managerExists(manager) {
107
111
  }
108
112
  }
109
113
 
110
- async function fetchDeviceContentRec(objects) {
114
+ async function fetchDeviceContentRec(objects, reportProgress) {
111
115
  const result = [];
112
116
 
113
117
  for (let i = 0; i < objects.length; i++) {
118
+ if (reportProgress) {
119
+ reportProgress(i, objects.length);
120
+ }
114
121
  const o = objects[i];
115
122
  const info = await fetchObjectInfo(o);
116
123
 
@@ -129,7 +136,7 @@ async function fetchDeviceContentRec(objects) {
129
136
  return result;
130
137
  }
131
138
 
132
- export async function fetchDeviceContent(device) {
139
+ export async function fetchDeviceContent(device, reportProgress) {
133
140
  const objects = await device.GetDeviceTree();
134
141
  const managers = [
135
142
  device.DeviceManager,
@@ -151,5 +158,5 @@ export async function fetchDeviceContent(device) {
151
158
  if (await managerExists(manager)) objects.push(manager);
152
159
  }
153
160
 
154
- return await fetchDeviceContentRec(objects);
161
+ return await fetchDeviceContentRec(objects, reportProgress);
155
162
  }