@bitpoolos/edge-bacnet 1.0.6 → 1.1.0

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 (181) hide show
  1. package/bacnet_client.js +650 -233
  2. package/bacnet_device.js +65 -16
  3. package/bacnet_gateway.html +242 -99
  4. package/bacnet_gateway.js +211 -27
  5. package/bacnet_object.js +1 -1
  6. package/bacnet_read.html +211 -133
  7. package/bacnet_read.js +24 -24
  8. package/bacnet_server.js +321 -0
  9. package/bacnet_write.html +24 -15
  10. package/bacnet_write.js +0 -2
  11. package/common.js +95 -9
  12. package/edge-bacnet-datastore.cfg +0 -0
  13. package/package.json +6 -4
  14. package/resources/confirmationservice.min.js +1 -0
  15. package/resources/confirmdialog.min.js +1 -0
  16. package/resources/fonts/primeicons.woff2 +0 -0
  17. package/resources/node-bacnet/CHANGELOG.md +481 -0
  18. package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
  19. package/resources/node-bacnet/README.md +91 -0
  20. package/resources/node-bacnet/docs/Client.html +4422 -0
  21. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  22. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  23. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  24. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  25. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  26. package/resources/node-bacnet/docs/bacnet.html +7032 -0
  27. package/resources/node-bacnet/docs/client.js.html +1759 -0
  28. package/resources/node-bacnet/docs/enum.js.html +2530 -0
  29. package/resources/node-bacnet/docs/global.html +2068 -0
  30. package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
  31. package/resources/node-bacnet/docs/index.html +283 -0
  32. package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
  33. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
  34. package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
  35. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  36. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
  37. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
  38. package/resources/node-bacnet/docs/scripts/search.js +47 -0
  39. package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
  40. package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
  41. package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
  42. package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
  43. package/resources/node-bacnet/docs/styles/prettify.css +82 -0
  44. package/resources/node-bacnet/examples/discover-devices.js +66 -0
  45. package/resources/node-bacnet/examples/read-device.js +510 -0
  46. package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
  47. package/resources/{bacstack → node-bacnet}/index.js +3 -0
  48. package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
  49. package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
  50. package/resources/node-bacnet/lib/bvlc.js +90 -0
  51. package/resources/node-bacnet/lib/client.js +1695 -0
  52. package/resources/node-bacnet/lib/enum.js +2463 -0
  53. package/resources/node-bacnet/lib/npdu.js +123 -0
  54. package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
  55. package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
  56. package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
  57. package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
  58. package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
  59. package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
  60. package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
  61. package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
  62. package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
  63. package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
  64. package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
  65. package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
  66. package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
  67. package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
  68. package/resources/node-bacnet/lib/services/i-am.js +90 -0
  69. package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
  70. package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
  71. package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
  72. package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
  73. package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
  74. package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
  75. package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
  76. package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
  77. package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
  78. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
  79. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
  80. package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
  81. package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
  82. package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
  83. package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
  84. package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
  85. package/resources/node-bacnet/lib/transport.js +82 -0
  86. package/resources/node-bacnet/package.json +92 -0
  87. package/resources/primeicons.css +90 -2
  88. package/resources/bacstack/.codeclimate.yml +0 -15
  89. package/resources/bacstack/.dockerignore +0 -5
  90. package/resources/bacstack/.editorconfig +0 -13
  91. package/resources/bacstack/.eslintrc.yml +0 -13
  92. package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
  93. package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  94. package/resources/bacstack/.github/workflows/ci.yml +0 -39
  95. package/resources/bacstack/.jscsrc +0 -8
  96. package/resources/bacstack/.jshintrc +0 -50
  97. package/resources/bacstack/.travis.yml +0 -27
  98. package/resources/bacstack/CHANGELOG.md +0 -232
  99. package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
  100. package/resources/bacstack/CONTRIBUTING.md +0 -77
  101. package/resources/bacstack/Dockerfile +0 -15
  102. package/resources/bacstack/FAQ.md +0 -64
  103. package/resources/bacstack/README.md +0 -157
  104. package/resources/bacstack/docker-compose.yml +0 -9
  105. package/resources/bacstack/lib/adpu.js +0 -190
  106. package/resources/bacstack/lib/bvlc.js +0 -43
  107. package/resources/bacstack/lib/client.js +0 -1028
  108. package/resources/bacstack/lib/enum.js +0 -1314
  109. package/resources/bacstack/lib/npdu.js +0 -119
  110. package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
  111. package/resources/bacstack/lib/services.js +0 -1963
  112. package/resources/bacstack/lib/transport.js +0 -52
  113. package/resources/bacstack/package-lock.json +0 -7974
  114. package/resources/bacstack/package.json +0 -84
  115. package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
  116. package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
  117. package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
  118. package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
  119. package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
  120. package/resources/bacstack/test/integration/create-object.spec.js +0 -16
  121. package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
  122. package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
  123. package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
  124. package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
  125. package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
  126. package/resources/bacstack/test/integration/read-file.spec.js +0 -14
  127. package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
  128. package/resources/bacstack/test/integration/read-property.spec.js +0 -14
  129. package/resources/bacstack/test/integration/read-range.spec.js +0 -14
  130. package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
  131. package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
  132. package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
  133. package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
  134. package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
  135. package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
  136. package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
  137. package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
  138. package/resources/bacstack/test/integration/utils.js +0 -30
  139. package/resources/bacstack/test/integration/who-is.spec.js +0 -17
  140. package/resources/bacstack/test/integration/write-file.spec.js +0 -14
  141. package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
  142. package/resources/bacstack/test/integration/write-property.spec.js +0 -14
  143. package/resources/bacstack/test/unit/apdu.spec.js +0 -162
  144. package/resources/bacstack/test/unit/asn1.spec.js +0 -39
  145. package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
  146. package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
  147. package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
  148. package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
  149. package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
  150. package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
  151. package/resources/bacstack/test/unit/npdu.spec.js +0 -119
  152. package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
  153. package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
  154. package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
  155. package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
  156. package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
  157. package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
  158. package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
  159. package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
  160. package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
  161. package/resources/bacstack/test/unit/service-error.spec.js +0 -17
  162. package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
  163. package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
  164. package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
  165. package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
  166. package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
  167. package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
  168. package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
  169. package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
  170. package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
  171. package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
  172. package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
  173. package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
  174. package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
  175. package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
  176. package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
  177. package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
  178. package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
  179. package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
  180. package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
  181. package/resources/bacstack/test/unit/utils.js +0 -6
@@ -0,0 +1,123 @@
1
+ 'use strict';
2
+
3
+ const baEnum = require('./enum');
4
+ const debug = require('debug')('bacnet:npdu:debug');
5
+ const trace = require('debug')('bacnet:npdu:trace');
6
+
7
+ const DEFAULT_HOP_COUNT = 0xFF;
8
+ const BACNET_PROTOCOL_VERSION = 1;
9
+ const BACNET_ADDRESS_TYPES = {
10
+ NONE: 0,
11
+ IP: 1
12
+ };
13
+
14
+ const decodeTarget = (buffer, offset) => {
15
+ let len = 0;
16
+ const target = {type: BACNET_ADDRESS_TYPES.NONE, net: (buffer[offset + len++] << 8) | (buffer[offset + len++] << 0)};
17
+ const adrLen = buffer[offset + len++];
18
+ if (adrLen > 0) {
19
+ target.adr = [];
20
+ for (let i = 0; i < adrLen; i++) {
21
+ target.adr.push(buffer[offset + len++]);
22
+ }
23
+ }
24
+ return {
25
+ target,
26
+ len
27
+ };
28
+ };
29
+
30
+ const encodeTarget = (buffer, target) => {
31
+ buffer.buffer[buffer.offset++] = (target.net & 0xFF00) >> 8;
32
+ buffer.buffer[buffer.offset++] = (target.net & 0x00FF) >> 0;
33
+ if (target.net === 0xFFFF || !target.adr) {
34
+ buffer.buffer[buffer.offset++] = 0;
35
+ } else {
36
+ buffer.buffer[buffer.offset++] = target.adr.length;
37
+ if (target.adr.length > 0) {
38
+ for (let i = 0; i < target.adr.length; i++) {
39
+ buffer.buffer[buffer.offset++] = target.adr[i];
40
+ }
41
+ }
42
+ }
43
+ };
44
+
45
+ module.exports.decodeFunction = (buffer, offset) => {
46
+ if (buffer[offset + 0] !== BACNET_PROTOCOL_VERSION) {
47
+ return undefined;
48
+ }
49
+ return buffer[offset + 1];
50
+ };
51
+
52
+ module.exports.decode = (buffer, offset) => {
53
+ let adrLen;
54
+ const orgOffset = offset;
55
+ offset++;
56
+ const funct = buffer[offset++];
57
+ let destination;
58
+ if (funct & baEnum.NpduControlBit.DESTINATION_SPECIFIED) {
59
+ const tmpDestination = decodeTarget(buffer, offset);
60
+ offset += tmpDestination.len;
61
+ destination = tmpDestination.target;
62
+ }
63
+ let source;
64
+ if (funct & baEnum.NpduControlBit.SOURCE_SPECIFIED) {
65
+ const tmpSource = decodeTarget(buffer, offset);
66
+ offset += tmpSource.len;
67
+ source = tmpSource.target;
68
+ }
69
+ let hopCount = 0;
70
+ if (funct & baEnum.NpduControlBit.DESTINATION_SPECIFIED) {
71
+ hopCount = buffer[offset++];
72
+ }
73
+ let networkMsgType = baEnum.NetworkLayerMessageType.WHO_IS_ROUTER_TO_NETWORK;
74
+ let vendorId = 0;
75
+ if (funct & baEnum.NpduControlBit.NETWORK_LAYER_MESSAGE) {
76
+ networkMsgType = buffer[offset++];
77
+ if (networkMsgType >= 0x80) {
78
+ vendorId = (buffer[offset++] << 8) | (buffer[offset++] << 0);
79
+ } else if (networkMsgType === baEnum.NetworkLayerMessageType.WHO_IS_ROUTER_TO_NETWORK) {
80
+ offset += 2;
81
+ }
82
+ }
83
+ if (buffer[orgOffset + 0] !== BACNET_PROTOCOL_VERSION) {
84
+ return undefined;
85
+ }
86
+ return {
87
+ len: offset - orgOffset,
88
+ funct,
89
+ destination,
90
+ source,
91
+ hopCount,
92
+ networkMsgType,
93
+ vendorId
94
+ };
95
+ };
96
+
97
+ module.exports.encode = (buffer, funct, destination, source, hopCount, networkMsgType, vendorId) => {
98
+ const hasDestination = destination && destination.net > 0;
99
+ const hasSource = source && source.net > 0 && source.net !== 0xFFFF;
100
+
101
+ buffer.buffer[buffer.offset++] = BACNET_PROTOCOL_VERSION;
102
+ buffer.buffer[buffer.offset++] = funct | (hasDestination ? baEnum.NpduControlBit.DESTINATION_SPECIFIED : 0) | (hasSource ? baEnum.NpduControlBit.SOURCE_SPECIFIED : 0);
103
+
104
+ if (hasDestination) {
105
+ encodeTarget(buffer, destination);
106
+ }
107
+
108
+ if (hasSource) {
109
+ encodeTarget(buffer, source);
110
+ }
111
+
112
+ if (hasDestination) {
113
+ buffer.buffer[buffer.offset++] = hopCount || DEFAULT_HOP_COUNT;
114
+ }
115
+
116
+ if ((funct & baEnum.NpduControlBit.NETWORK_LAYER_MESSAGE) > 0) {
117
+ buffer.buffer[buffer.offset++] = networkMsgType;
118
+ if (networkMsgType >= 0x80) {
119
+ buffer.buffer[buffer.offset++] = (vendorId & 0xFF00) >> 8;
120
+ buffer.buffer[buffer.offset++] = (vendorId & 0x00FF) >> 0;
121
+ }
122
+ }
123
+ };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, objectId, propertyId, arrayIndex, values) => {
7
7
  baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
@@ -20,7 +20,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
20
20
  let len = 0;
21
21
  let result;
22
22
  let decodedValue;
23
- const value = {};
23
+ let value = {};
24
24
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
25
25
  len += result.len;
26
26
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
@@ -41,17 +41,23 @@ module.exports.decode = (buffer, offset, apduLen) => {
41
41
  value.property.index = baEnum.ASN1_ARRAY_ALL;
42
42
  }
43
43
  const values = [];
44
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) return;
44
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) {
45
+ return undefined;
46
+ }
45
47
  len++;
46
48
  while ((apduLen - len) > 1) {
47
49
  result = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, value.objectId.type, value.property.id);
48
- if (!result) return;
50
+ if (!result) {
51
+ return undefined;
52
+ }
49
53
  len += result.len;
50
54
  delete result.len;
51
55
  values.push(result);
52
56
  }
53
57
  value.values = values;
54
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) return;
58
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) {
59
+ return undefined;
60
+ }
55
61
  len++;
56
62
  value.len = len;
57
63
  return value;
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, ackProcessId, eventObjectId, eventStateAcknowledged, ackSource, eventTimeStamp, ackTimeStamp) => {
7
7
  baAsn1.encodeContextUnsigned(buffer, 0, ackProcessId);
@@ -14,7 +14,7 @@ module.exports.encode = (buffer, ackProcessId, eventObjectId, eventStateAcknowle
14
14
 
15
15
  module.exports.decode = (buffer, offset, apduLen) => {
16
16
  let len = 0;
17
- const value = {};
17
+ let value = {};
18
18
  let result;
19
19
  let decodedValue;
20
20
  let date;
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.encode = (buffer, alarms) => {
6
7
  alarms.forEach((alarm) => {
@@ -16,7 +17,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
16
17
  let decodedValue;
17
18
  const alarms = [];
18
19
  while ((apduLen - 3 - len) > 0) {
19
- const value = {};
20
+ let value = {};
20
21
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
21
22
  len += result.len;
22
23
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
@@ -35,7 +36,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
35
36
  alarms.push(value);
36
37
  }
37
38
  return {
38
- len: len,
39
- alarms: alarms
39
+ len,
40
+ alarms
40
41
  };
41
42
  };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, isStream, objectId, position, count) => {
7
7
  baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance);
@@ -28,7 +28,9 @@ module.exports.decode = (buffer, offset) => {
28
28
  let count = 0;
29
29
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
30
30
  len += result.len;
31
- if (result.tagNumber !== baEnum.ApplicationTags.OBJECTIDENTIFIER) return;
31
+ if (result.tagNumber !== baEnum.ApplicationTag.OBJECTIDENTIFIER) {
32
+ return undefined;
33
+ }
32
34
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
33
35
  len += decodedValue.len;
34
36
  objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
@@ -37,44 +39,56 @@ module.exports.decode = (buffer, offset) => {
37
39
  len++;
38
40
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
39
41
  len += result.len;
40
- if (result.tagNumber !== baEnum.ApplicationTags.SIGNED_INTEGER) return;
42
+ if (result.tagNumber !== baEnum.ApplicationTag.SIGNED_INTEGER) {
43
+ return undefined;
44
+ }
41
45
  decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
42
46
  len += decodedValue.len;
43
47
  position = decodedValue.value;
44
48
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
45
49
  len += result.len;
46
- if (result.tagNumber !== baEnum.ApplicationTags.UNSIGNED_INTEGER) return;
50
+ if (result.tagNumber !== baEnum.ApplicationTag.UNSIGNED_INTEGER) {
51
+ return undefined;
52
+ }
47
53
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
48
54
  len += decodedValue.len;
49
55
  count = decodedValue.value;
50
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) return;
56
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) {
57
+ return undefined;
58
+ }
51
59
  len++;
52
60
  } else if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
53
61
  isStream = false;
54
62
  len++;
55
63
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
56
64
  len += result.len;
57
- if (result.tagNumber !== baEnum.ApplicationTags.SIGNED_INTEGER) return;
65
+ if (result.tagNumber !== baEnum.ApplicationTag.SIGNED_INTEGER) {
66
+ return undefined;
67
+ }
58
68
  decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
59
69
  len += decodedValue.len;
60
70
  position = decodedValue.value;
61
71
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
62
72
  len += result.len;
63
- if (result.tagNumber !== baEnum.ApplicationTags.UNSIGNED_INTEGER) return;
73
+ if (result.tagNumber !== baEnum.ApplicationTag.UNSIGNED_INTEGER) {
74
+ return undefined;
75
+ }
64
76
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
65
77
  len += decodedValue.len;
66
78
  count = decodedValue.value;
67
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
79
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) {
80
+ return undefined;
81
+ }
68
82
  len++;
69
83
  } else {
70
- return;
84
+ return undefined;
71
85
  }
72
86
  return {
73
- len: len,
74
- isStream: isStream,
75
- objectId: objectId,
76
- position: position,
77
- count: count
87
+ len,
88
+ isStream,
89
+ objectId,
90
+ position,
91
+ count
78
92
  };
79
93
  };
80
94
 
@@ -100,40 +114,49 @@ module.exports.decodeAcknowledge = (buffer, offset) => {
100
114
  let len = 0;
101
115
  let result;
102
116
  let decodedValue;
117
+ let endOfFile;
103
118
  let isStream;
104
119
  let position;
105
120
  let targetBuffer;
106
121
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
107
122
  len += result.len;
108
- if (result.tagNumber !== baEnum.ApplicationTags.BOOLEAN) return;
109
- const endOfFile = result.value > 0;
123
+ if (result.tagNumber !== baEnum.ApplicationTag.BOOLEAN) {
124
+ return undefined;
125
+ }
126
+ endOfFile = result.value > 0;
110
127
  if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) {
111
128
  isStream = true;
112
129
  len++;
113
130
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
114
131
  len += result.len;
115
- if (result.tagNumber !== baEnum.ApplicationTags.SIGNED_INTEGER) return;
132
+ if (result.tagNumber !== baEnum.ApplicationTag.SIGNED_INTEGER) {
133
+ return undefined;
134
+ }
116
135
  decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
117
136
  len += decodedValue.len;
118
137
  position = decodedValue.value;
119
138
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
120
139
  len += result.len;
121
- if (result.tagNumber !== baEnum.ApplicationTags.OCTET_STRING) return;
140
+ if (result.tagNumber !== baEnum.ApplicationTag.OCTET_STRING) {
141
+ return undefined;
142
+ }
122
143
  targetBuffer = buffer.slice(offset + len, offset + len + result.value);
123
144
  len += result.value;
124
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) return;
145
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) {
146
+ return undefined;
147
+ }
125
148
  len++;
126
149
  } else if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
127
150
  isStream = false;
128
- throw new Error('NotImplemented');
151
+ throw new Error('NotImplemented'); //TODO is this catched somewhere or will it kill the process?
129
152
  } else {
130
- return;
153
+ return undefined;
131
154
  }
132
155
  return {
133
- len: len,
134
- endOfFile: endOfFile,
135
- isStream: isStream,
136
- position: position,
156
+ len,
157
+ endOfFile,
158
+ isStream,
159
+ position,
137
160
  buffer: targetBuffer
138
161
  };
139
162
  };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, isStream, objectId, position, blocks) => {
7
7
  baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance);
@@ -27,65 +27,81 @@ module.exports.decode = (buffer, offset, apduLen) => {
27
27
  let decodedValue;
28
28
  let isStream;
29
29
  let position;
30
- const blocks = [];
30
+ let blocks = [];
31
31
  let blockCount;
32
32
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
33
33
  len += result.len;
34
- if (result.tagNumber !== baEnum.ApplicationTags.OBJECTIDENTIFIER) return;
34
+ if (result.tagNumber !== baEnum.ApplicationTag.OBJECTIDENTIFIER) {
35
+ return undefined;
36
+ }
35
37
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
36
38
  len += decodedValue.len;
37
- const objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
39
+ let objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
38
40
  if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) {
39
41
  isStream = true;
40
42
  len++;
41
43
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
42
44
  len += result.len;
43
- if (result.tagNumber !== baEnum.ApplicationTags.SIGNED_INTEGER) return;
45
+ if (result.tagNumber !== baEnum.ApplicationTag.SIGNED_INTEGER) {
46
+ return undefined;
47
+ }
44
48
  decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
45
49
  len += decodedValue.len;
46
50
  position = decodedValue.value;
47
51
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
48
52
  len += result.len;
49
- if (result.tagNumber !== baEnum.ApplicationTags.OCTET_STRING) return;
53
+ if (result.tagNumber !== baEnum.ApplicationTag.OCTET_STRING) {
54
+ return undefined;
55
+ }
50
56
  decodedValue = baAsn1.decodeOctetString(buffer, offset + len, apduLen, 0, result.value);
51
57
  len += decodedValue.len;
52
58
  blocks.push(decodedValue.value);
53
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) return;
59
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) {
60
+ return undefined;
61
+ }
54
62
  len++;
55
63
  } else if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
56
64
  isStream = false;
57
65
  len++;
58
66
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
59
67
  len += result.len;
60
- if (result.tagNumber !== baEnum.ApplicationTags.SIGNED_INTEGER) return;
68
+ if (result.tagNumber !== baEnum.ApplicationTag.SIGNED_INTEGER) {
69
+ return undefined;
70
+ }
61
71
  decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
62
72
  len += decodedValue.len;
63
73
  position = decodedValue.value;
64
74
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
65
75
  len += result.len;
66
- if (result.tagNumber !== baEnum.ApplicationTags.UNSIGNED_INTEGER) return;
76
+ if (result.tagNumber !== baEnum.ApplicationTag.UNSIGNED_INTEGER) {
77
+ return undefined;
78
+ }
67
79
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
68
80
  len += decodedValue.len;
69
81
  blockCount = decodedValue.value;
70
82
  for (let i = 0; i < blockCount; i++) {
71
83
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
72
84
  len += result.len;
73
- if (result.tagNumber !== baEnum.ApplicationTags.OCTET_STRING) return;
85
+ if (result.tagNumber !== baEnum.ApplicationTag.OCTET_STRING) {
86
+ return undefined;
87
+ }
74
88
  decodedValue = baAsn1.decodeOctetString(buffer, offset + len, apduLen, 0, result.value);
75
89
  len += decodedValue.len;
76
90
  blocks.push(decodedValue.value);
77
91
  }
78
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
92
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) {
93
+ return undefined;
94
+ }
79
95
  len++;
80
96
  } else {
81
- return;
97
+ return undefined;
82
98
  }
83
99
  return {
84
- len: len,
85
- isStream: isStream,
86
- objectId: objectId,
87
- position: position,
88
- blocks: blocks
100
+ len,
101
+ isStream,
102
+ objectId,
103
+ position,
104
+ blocks
89
105
  };
90
106
  };
91
107
 
@@ -101,6 +117,7 @@ module.exports.decodeAcknowledge = (buffer, offset) => {
101
117
  let len = 0;
102
118
  let isStream = false;
103
119
  let position = 0;
120
+ let decodedValue;
104
121
  const result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
105
122
  len += result.len;
106
123
  if (result.tagNumber === 0) {
@@ -108,14 +125,14 @@ module.exports.decodeAcknowledge = (buffer, offset) => {
108
125
  } else if (result.tagNumber === 1) {
109
126
  isStream = false;
110
127
  } else {
111
- return;
128
+ return undefined;
112
129
  }
113
- const decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
130
+ decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
114
131
  len += decodedValue.len;
115
132
  position = decodedValue.value;
116
133
  return {
117
- len: len,
118
- isStream: isStream,
119
- position: position
134
+ len,
135
+ isStream,
136
+ position
120
137
  };
121
138
  };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, subscriberProcessId, initiatingDeviceId, monitoredObjectId, timeRemaining, values) => {
7
7
  baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId);
@@ -31,37 +31,49 @@ module.exports.decode = (buffer, offset, apduLen) => {
31
31
  let len = 0;
32
32
  let result;
33
33
  let decodedValue;
34
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
34
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
35
+ return undefined;
36
+ }
35
37
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
36
38
  len += result.len;
37
39
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
38
40
  len += decodedValue.len;
39
41
  const subscriberProcessId = decodedValue.value;
40
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
42
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
43
+ return undefined;
44
+ }
41
45
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
42
46
  len += result.len;
43
47
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
44
48
  len += decodedValue.len;
45
49
  const initiatingDeviceId = {type: decodedValue.objectType, instance: decodedValue.instance};
46
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) return;
50
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) {
51
+ return undefined;
52
+ }
47
53
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
48
54
  len += result.len;
49
55
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
50
56
  len += decodedValue.len;
51
57
  const monitoredObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
52
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 3)) return;
58
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 3)) {
59
+ return undefined;
60
+ }
53
61
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
54
62
  len += result.len;
55
63
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
56
64
  len += decodedValue.len;
57
65
  const timeRemaining = decodedValue.value;
58
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 4)) return;
66
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 4)) {
67
+ return undefined;
68
+ }
59
69
  len++;
60
70
  const values = [];
61
71
  while ((apduLen - len) > 1 && !baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 4)) {
62
- const newEntry = {};
72
+ let newEntry = {};
63
73
  newEntry.property = {};
64
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
74
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
75
+ return undefined;
76
+ }
65
77
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
66
78
  len += result.len;
67
79
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
@@ -76,12 +88,16 @@ module.exports.decode = (buffer, offset, apduLen) => {
76
88
  } else {
77
89
  newEntry.property.index = baEnum.ASN1_ARRAY_ALL;
78
90
  }
79
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 2)) return;
91
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 2)) {
92
+ return undefined;
93
+ }
80
94
  len++;
81
95
  const properties = [];
82
96
  while ((apduLen - len) > 1 && !baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 2)) {
83
97
  decodedValue = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, monitoredObjectId.type, newEntry.property.id);
84
- if (!decodedValue) return;
98
+ if (!decodedValue) {
99
+ return undefined;
100
+ }
85
101
  len += decodedValue.len;
86
102
  delete decodedValue.len;
87
103
  properties.push(decodedValue);
@@ -100,11 +116,11 @@ module.exports.decode = (buffer, offset, apduLen) => {
100
116
  values.push(newEntry);
101
117
  }
102
118
  return {
103
- len: len,
104
- subscriberProcessId: subscriberProcessId,
105
- initiatingDeviceId: initiatingDeviceId,
106
- monitoredObjectId: monitoredObjectId,
107
- timeRemaining: timeRemaining,
108
- values: values
119
+ len,
120
+ subscriberProcessId,
121
+ initiatingDeviceId,
122
+ monitoredObjectId,
123
+ timeRemaining,
124
+ values
109
125
  };
110
126
  };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, objectId, values) => {
7
7
  baAsn1.encodeOpeningTag(buffer, 0);
@@ -35,26 +35,32 @@ module.exports.decode = (buffer, offset, apduLen) => {
35
35
  len += result.len;
36
36
  if ((result.tagNumber === 0) && (apduLen > len)) {
37
37
  apduLen -= len;
38
- if (apduLen < 4) return;
38
+ if (apduLen < 4) {
39
+ return undefined;
40
+ }
39
41
  decodedValue = baAsn1.decodeContextObjectId(buffer, offset + len, 1);
40
42
  len += decodedValue.len;
41
43
  objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
42
44
  } else {
43
- return;
45
+ return undefined;
44
46
  }
45
47
  if (baAsn1.decodeIsClosingTag(buffer, offset + len)) {
46
48
  len++;
47
49
  }
48
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) return;
50
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
51
+ return undefined;
52
+ }
49
53
  len++;
50
54
  while ((apduLen - len) > 1) {
51
- const newEntry = {};
55
+ let newEntry = {};
52
56
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
53
57
  len += result.len;
54
- if (result.tagNumber !== 0) return;
58
+ if (result.tagNumber !== 0) {
59
+ return undefined;
60
+ }
55
61
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
56
62
  len += decodedValue.len;
57
- const propertyId = decodedValue.value;
63
+ let propertyId = decodedValue.value;
58
64
  let arraIndex = baEnum.ASN1_ARRAY_ALL;
59
65
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
60
66
  len += result.len;
@@ -70,7 +76,9 @@ module.exports.decode = (buffer, offset, apduLen) => {
70
76
  const values = [];
71
77
  while (!baAsn1.decodeIsClosingTag(buffer, offset + len)) {
72
78
  decodedValue = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, propertyId);
73
- if (!decodedValue) return;
79
+ if (!decodedValue) {
80
+ return undefined;
81
+ }
74
82
  len += decodedValue.len;
75
83
  delete decodedValue.len;
76
84
  values.push(decodedValue);
@@ -78,15 +86,17 @@ module.exports.decode = (buffer, offset, apduLen) => {
78
86
  len++;
79
87
  newEntry.value = values;
80
88
  } else {
81
- return;
89
+ return undefined;
82
90
  }
83
91
  valueList.push(newEntry);
84
92
  }
85
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
93
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) {
94
+ return undefined;
95
+ }
86
96
  len++;
87
97
  return {
88
- len: len,
89
- objectId: objectId,
98
+ len,
99
+ objectId,
90
100
  values: valueList
91
101
  };
92
102
  };