diff --git a/.eslintrc.yml b/.eslintrc.yml index ac25c77d..567aa4bb 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,13 +1,17 @@ extends: - - eslint:recommended - - google + - 'eslint:recommended' + - 'plugin:@typescript-eslint/recommended' + - 'google' env: node: true jest: true +parser: '@typescript-eslint/parser' parserOptions: ecmaVersion: 2020 rules: - comma-dangle: [error, never] - max-len: [error, 320] - require-jsdoc: 0 - new-cap: 0 + 'comma-dangle': [error, never] + 'max-len': [error, 320] + 'require-jsdoc': 0 + 'new-cap': 0 + '@typescript-eslint/no-explicit-any': 0 + '@typescript-eslint/explicit-function-return-type': 0 diff --git a/index.js b/index.ts similarity index 100% rename from index.js rename to index.ts diff --git a/lib/apdu.js b/lib/apdu.ts similarity index 71% rename from lib/apdu.js rename to lib/apdu.ts index 5b223c38..f7d4739b 100644 --- a/lib/apdu.js +++ b/lib/apdu.ts @@ -1,16 +1,17 @@ 'use strict'; -const baEnum = require('./enum'); +import * as baEnum from './enum'; +import { EncodeBuffer } from './types'; -const getDecodedType = module.exports.getDecodedType = (buffer, offset) => { +export const getDecodedType = (buffer: Buffer, offset: number) => { return buffer[offset]; }; -module.exports.setDecodedType = (buffer, offset, type) => { +export const setDecodedType = (buffer: Buffer, offset: number, type: number) => { buffer[offset] = type; }; -module.exports.getDecodedInvokeId = (buffer, offset) => { +export const getDecodedInvokeId = (buffer: Buffer, offset: number) => { const type = getDecodedType(buffer, offset); switch (type & baEnum.PDU_TYPE_MASK) { case baEnum.PduTypes.SIMPLE_ACK: @@ -26,7 +27,7 @@ module.exports.getDecodedInvokeId = (buffer, offset) => { } }; -module.exports.encodeConfirmedServiceRequest = (buffer, type, service, maxSegments, maxApdu, invokeId, sequencenumber, proposedWindowSize) => { +export const encodeConfirmedServiceRequest = (buffer: EncodeBuffer, type: number, service: number, maxSegments: number, maxApdu: number, invokeId: number, sequencenumber?: number, proposedWindowSize?: number) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = maxSegments | maxApdu; buffer.buffer[buffer.offset++] = invokeId; @@ -37,7 +38,7 @@ module.exports.encodeConfirmedServiceRequest = (buffer, type, service, maxSegmen buffer.buffer[buffer.offset++] = service; }; -module.exports.decodeConfirmedServiceRequest = (buffer, offset) => { +export const decodeConfirmedServiceRequest = (buffer: Buffer, offset: number) => { const orgOffset = offset; const type = buffer[offset++]; const maxSegments = buffer[offset] & 0xF0; @@ -62,12 +63,12 @@ module.exports.decodeConfirmedServiceRequest = (buffer, offset) => { }; }; -module.exports.encodeUnconfirmedServiceRequest = (buffer, type, service) => { +export const encodeUnconfirmedServiceRequest = (buffer: EncodeBuffer, type: number, service: number) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = service; }; -module.exports.decodeUnconfirmedServiceRequest = (buffer, offset) => { +export const decodeUnconfirmedServiceRequest = (buffer: Buffer, offset: number) => { const orgOffset = offset; const type = buffer[offset++]; const service = buffer[offset++]; @@ -78,13 +79,13 @@ module.exports.decodeUnconfirmedServiceRequest = (buffer, offset) => { }; }; -module.exports.encodeSimpleAck = (buffer, type, service, invokeId) => { +export const encodeSimpleAck = (buffer: EncodeBuffer, type: number, service: number, invokeId: number) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = service; }; -module.exports.decodeSimpleAck = (buffer, offset) => { +export const decodeSimpleAck = (buffer: Buffer, offset: number) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; @@ -97,7 +98,7 @@ module.exports.decodeSimpleAck = (buffer, offset) => { }; }; -module.exports.encodeComplexAck = (buffer, type, service, invokeId, sequencenumber, proposedWindowNumber) => { +export const encodeComplexAck = (buffer: EncodeBuffer, type: number, service: number, invokeId: number, sequencenumber?: number, proposedWindowNumber?: number) => { let len = 3; buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; @@ -110,7 +111,7 @@ module.exports.encodeComplexAck = (buffer, type, service, invokeId, sequencenumb return len; }; -module.exports.decodeComplexAck = (buffer, offset) => { +export const decodeComplexAck = (buffer: Buffer, offset: number) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; @@ -131,14 +132,14 @@ module.exports.decodeComplexAck = (buffer, offset) => { }; }; -module.exports.encodeSegmentAck = (buffer, type, originalInvokeId, sequencenumber, actualWindowSize) => { +export const encodeSegmentAck = (buffer: EncodeBuffer, type: number, originalInvokeId: number, sequencenumber: number, actualWindowSize: number) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = originalInvokeId; buffer.buffer[buffer.offset++] = sequencenumber; buffer.buffer[buffer.offset++] = actualWindowSize; }; -module.exports.decodeSegmentAck = (buffer, offset) => { +export const decodeSegmentAck = (buffer: Buffer, offset: number) => { const orgOffset = offset; const type = buffer[offset++]; const originalInvokeId = buffer[offset++]; @@ -153,13 +154,13 @@ module.exports.decodeSegmentAck = (buffer, offset) => { }; }; -module.exports.encodeError = (buffer, type, service, invokeId) => { +export const encodeError = (buffer: EncodeBuffer, type: number, service: number, invokeId: number) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = service; }; -module.exports.decodeError = (buffer, offset) => { +export const decodeError = (buffer: Buffer, offset: number) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; @@ -172,13 +173,13 @@ module.exports.decodeError = (buffer, offset) => { }; }; -module.exports.encodeAbort = (buffer, type, invokeId, reason) => { +export const encodeAbort = (buffer: EncodeBuffer, type: number, invokeId: number, reason: number) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = reason; }; -module.exports.decodeAbort = (buffer, offset) => { +export const decodeAbort = (buffer: Buffer, offset: number) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; diff --git a/lib/asn1.js b/lib/asn1.ts similarity index 75% rename from lib/asn1.js rename to lib/asn1.ts index dc944963..25411abd 100644 --- a/lib/asn1.js +++ b/lib/asn1.ts @@ -1,30 +1,40 @@ 'use strict'; -const iconv = require('iconv-lite'); -const baEnum = require('./enum'); - -const getBuffer = () => { - return { - buffer: Buffer.alloc(1472), - offset: 0 - }; -}; - -const getSignedLength = (value) => { +import * as iconv from 'iconv-lite'; + +import * as baEnum from './enum'; +import { + EncodeBuffer, + BACNetCovSubscription, + BACNetReadAccessSpecification, + BACNetBitString, + BACNetAppData, + BACNetPropertyState, + BACNetDevObjRef, + BACNetObjectID, + BACNetPropertyID +} from './types'; + +const getBuffer = () => ({ + buffer: Buffer.alloc(1472), + offset: 0 +}); + +const getSignedLength = (value: number) => { if ((value >= -128) && (value < 128)) return 1; else if ((value >= -32768) && (value < 32768)) return 2; else if ((value > -8388608) && (value < 8388608)) return 3; else return 4; }; -const getUnsignedLength = (value) => { +const getUnsignedLength = (value: number) => { if (value < 0x100) return 1; else if (value < 0x10000) return 2; else if (value < 0x1000000) return 3; else return 4; }; -const getEncodingType = (encoding, decodingBuffer, decodingOffset) => { +const getEncodingType = (encoding: number, decodingBuffer?: Buffer, decodingOffset?: number) => { switch (encoding) { case baEnum.CharacterStringEncoding.UTF_8: return 'utf8'; @@ -46,51 +56,49 @@ const getEncodingType = (encoding, decodingBuffer, decodingOffset) => { } }; -const encodeUnsigned = (buffer, value, length) => { - buffer.buffer.writeUIntBE(value, buffer.offset, length, true); +const encodeUnsigned = (buffer: EncodeBuffer, value: number, length: number) => { + buffer.buffer.writeUIntBE(value, buffer.offset, length); buffer.offset += length; }; -const encodeBacnetUnsigned = (buffer, value) => { +const encodeBacnetUnsigned = (buffer: EncodeBuffer, value: number) => { encodeUnsigned(buffer, value, getUnsignedLength(value)); }; -const encodeSigned = (buffer, value, length) => { - buffer.buffer.writeIntBE(value, buffer.offset, length, true); +const encodeSigned = (buffer: EncodeBuffer, value: number, length: number) => { + buffer.buffer.writeIntBE(value, buffer.offset, length); buffer.offset += length; }; -const encodeBacnetSigned = (buffer, value) => { +const encodeBacnetSigned = (buffer: EncodeBuffer, value: number) => { encodeSigned(buffer, value, getSignedLength(value)); }; -const encodeBacnetReal = (buffer, value) => { - buffer.buffer.writeFloatBE(value, buffer.offset, true); +const encodeBacnetReal = (buffer: EncodeBuffer, value: number) => { + buffer.buffer.writeFloatBE(value, buffer.offset); buffer.offset += 4; }; -const encodeBacnetDouble = (buffer, value) => { - buffer.buffer.writeDoubleBE(value, buffer.offset, true); +const encodeBacnetDouble = (buffer: EncodeBuffer, value: number) => { + buffer.buffer.writeDoubleBE(value, buffer.offset); buffer.offset += 8; }; -const decodeUnsigned = module.exports.decodeUnsigned = (buffer, offset, length) => { - return { - len: length, - value: buffer.readUIntBE(offset, length, true) - }; -}; +export const decodeUnsigned = (buffer: Buffer, offset: number, length: number) => ({ + len: length, + value: buffer.readUIntBE(offset, length) +}); -const decodeEnumerated = module.exports.decodeEnumerated = (buffer, offset, lenValue) => { +export const decodeEnumerated = (buffer: Buffer, offset: number, lenValue: number) => { return decodeUnsigned(buffer, offset, lenValue); }; -const encodeBacnetObjectId = module.exports.encodeBacnetObjectId = (buffer, objectType, instance) => { +export const encodeBacnetObjectId = (buffer: EncodeBuffer, objectType: number, instance: number) => { const value = (((objectType & baEnum.ASN1_MAX_OBJECT) << baEnum.ASN1_INSTANCE_BITS) | (instance & baEnum.ASN1_MAX_INSTANCE)) >>> 0; encodeUnsigned(buffer, value, 4); }; -const encodeTag = module.exports.encodeTag = (buffer, tagNumber, contextSpecific, lenValueType) => { +export const encodeTag = (buffer: EncodeBuffer, tagNumber: number, contextSpecific: boolean, lenValueType: number) => { let len = 1; const tmp = new Array(3); tmp[0] = 0; @@ -128,45 +136,45 @@ const encodeTag = module.exports.encodeTag = (buffer, tagNumber, contextSpecific } }; -const encodeBacnetEnumerated = (buffer, value) => { +const encodeBacnetEnumerated = (buffer: EncodeBuffer, value: number) => { encodeBacnetUnsigned(buffer, value); }; -const isExtendedTagNumber = (x) => { +const isExtendedTagNumber = (x: number) => { return (x & 0xF0) === 0xF0; }; -const isExtendedValue = (x) => { +const isExtendedValue = (x: number) => { return (x & 0x07) === 5; }; -const isContextSpecific = (x) => { +const isContextSpecific = (x: number) => { return (x & 0x8) === 0x8; }; -const isOpeningTag = (x) => { +const isOpeningTag = (x: number) => { return (x & 0x07) === 6; }; -const isClosingTag = (x) => { +const isClosingTag = (x: number) => { return (x & 0x07) === 7; }; -const encodeContextReal = module.exports.encodeContextReal = (buffer, tagNumber, value) => { +export const encodeContextReal = (buffer: EncodeBuffer, tagNumber: number, value: number) => { encodeTag(buffer, tagNumber, true, 4); encodeBacnetReal(buffer, value); }; -const encodeContextUnsigned = module.exports.encodeContextUnsigned = (buffer, tagNumber, value) => { +export const encodeContextUnsigned = (buffer: EncodeBuffer, tagNumber: number, value: number) => { encodeTag(buffer, tagNumber, true, getUnsignedLength(value)); encodeBacnetUnsigned(buffer, value); }; -const encodeContextEnumerated = module.exports.encodeContextEnumerated = (buffer, tagNumber, value) => { +export const encodeContextEnumerated = (buffer: EncodeBuffer, tagNumber: number, value: number) => { encodeContextUnsigned(buffer, tagNumber, value); }; -const encodeOctetString = (buffer, octetString, octetOffset, octetCount) => { +const encodeOctetString = (buffer: EncodeBuffer, octetString: number[], octetOffset: number, octetCount: number) => { if (octetString) { for (let i = octetOffset; i < (octetOffset + octetCount); i++) { buffer.buffer[buffer.offset++] = octetString[i]; @@ -174,30 +182,30 @@ const encodeOctetString = (buffer, octetString, octetOffset, octetCount) => { } }; -const encodeApplicationOctetString = module.exports.encodeApplicationOctetString = (buffer, octetString, octetOffset, octetCount) => { +export const encodeApplicationOctetString = (buffer: EncodeBuffer, octetString: number[], octetOffset: number, octetCount: number) => { encodeTag(buffer, baEnum.ApplicationTags.OCTET_STRING, false, octetCount); encodeOctetString(buffer, octetString, octetOffset, octetCount); }; -const encodeApplicationNull = (buffer) => { +const encodeApplicationNull = (buffer: EncodeBuffer) => { buffer.buffer[buffer.offset++] = baEnum.ApplicationTags.NULL; }; -const encodeApplicationBoolean = module.exports.encodeApplicationBoolean = (buffer, booleanValue) => { +export const encodeApplicationBoolean = (buffer: EncodeBuffer, booleanValue: boolean) => { encodeTag(buffer, baEnum.ApplicationTags.BOOLEAN, false, booleanValue ? 1 : 0); }; -const encodeApplicationReal = (buffer, value) => { +const encodeApplicationReal = (buffer: EncodeBuffer, value: number) => { encodeTag(buffer, baEnum.ApplicationTags.REAL, false, 4); encodeBacnetReal(buffer, value); }; -const encodeApplicationDouble = (buffer, value) => { +const encodeApplicationDouble = (buffer: EncodeBuffer, value: number) => { encodeTag(buffer, baEnum.ApplicationTags.DOUBLE, false, 8); encodeBacnetDouble(buffer, value); }; -const bitstringBytesUsed = (bitString) => { +const bitstringBytesUsed = (bitString: BACNetBitString) => { let len = 0; if (bitString.bitsUsed > 0) { const lastBit = bitString.bitsUsed - 1; @@ -207,7 +215,7 @@ const bitstringBytesUsed = (bitString) => { return len; }; -const encodeApplicationObjectId = module.exports.encodeApplicationObjectId = (buffer, objectType, instance) => { +export const encodeApplicationObjectId = (buffer: EncodeBuffer, objectType: number, instance: number) => { const tmp = getBuffer(); encodeBacnetObjectId(tmp, objectType, instance); encodeTag(buffer, baEnum.ApplicationTags.OBJECTIDENTIFIER, false, tmp.offset); @@ -215,7 +223,7 @@ const encodeApplicationObjectId = module.exports.encodeApplicationObjectId = (bu buffer.offset += tmp.offset; }; -const encodeApplicationUnsigned = module.exports.encodeApplicationUnsigned = (buffer, value) => { +export const encodeApplicationUnsigned = (buffer: EncodeBuffer, value: number) => { const tmp = getBuffer(); encodeBacnetUnsigned(tmp, value); encodeTag(buffer, baEnum.ApplicationTags.UNSIGNED_INTEGER, false, tmp.offset); @@ -223,7 +231,7 @@ const encodeApplicationUnsigned = module.exports.encodeApplicationUnsigned = (bu buffer.offset += tmp.offset; }; -const encodeApplicationEnumerated = module.exports.encodeApplicationEnumerated = (buffer, value) => { +export const encodeApplicationEnumerated = (buffer: EncodeBuffer, value: number) => { const tmp = getBuffer(); encodeBacnetEnumerated(tmp, value); encodeTag(buffer, baEnum.ApplicationTags.ENUMERATED, false, tmp.offset); @@ -231,7 +239,7 @@ const encodeApplicationEnumerated = module.exports.encodeApplicationEnumerated = buffer.offset += tmp.offset; }; -const encodeApplicationSigned = module.exports.encodeApplicationSigned = (buffer, value) => { +export const encodeApplicationSigned = (buffer: EncodeBuffer, value: number) => { const tmp = getBuffer(); encodeBacnetSigned(tmp, value); encodeTag(buffer, baEnum.ApplicationTags.SIGNED_INTEGER, false, tmp.offset); @@ -239,7 +247,7 @@ const encodeApplicationSigned = module.exports.encodeApplicationSigned = (buffer buffer.offset += tmp.offset; }; -const byteReverseBits = (inByte) => { +const byteReverseBits = (inByte: number) => { let outByte = 0; if ((inByte & 1) > 0) { outByte |= 0x80; @@ -268,7 +276,7 @@ const byteReverseBits = (inByte) => { return outByte; }; -const bitstringOctet = (bitString, octetIndex) => { +const bitstringOctet = (bitString: BACNetBitString, octetIndex: number) => { let octet = 0; if (bitString.value) { if (octetIndex < baEnum.ASN1_MAX_BITSTRING_BYTES) { @@ -278,7 +286,7 @@ const bitstringOctet = (bitString, octetIndex) => { return octet; }; -const encodeBitstring = (buffer, bitString) => { +const encodeBitstring = (buffer: EncodeBuffer, bitString: BACNetBitString) => { if (bitString.bitsUsed === 0) { buffer.buffer[buffer.offset++] = 0; } else { @@ -291,14 +299,14 @@ const encodeBitstring = (buffer, bitString) => { } }; -const encodeApplicationBitstring = module.exports.encodeApplicationBitstring = (buffer, bitString) => { +export const encodeApplicationBitstring = (buffer: EncodeBuffer, bitString: BACNetBitString) => { let bitStringEncodedLength = 1; bitStringEncodedLength += bitstringBytesUsed(bitString); encodeTag(buffer, baEnum.ApplicationTags.BIT_STRING, false, bitStringEncodedLength); encodeBitstring(buffer, bitString); }; -const encodeBacnetDate = (buffer, value) => { +const encodeBacnetDate = (buffer: EncodeBuffer, value: Date) => { if (value === new Date(1, 1, 1)) { buffer.buffer[buffer.offset++] = 0xFF; buffer.buffer[buffer.offset++] = 0xFF; @@ -318,36 +326,36 @@ const encodeBacnetDate = (buffer, value) => { buffer.buffer[buffer.offset++] = (value.getDay() === 0) ? 7 : value.getDay(); }; -const encodeApplicationDate = module.exports.encodeApplicationDate = (buffer, value) => { +export const encodeApplicationDate = (buffer: EncodeBuffer, value: Date) => { encodeTag(buffer, baEnum.ApplicationTags.DATE, false, 4); encodeBacnetDate(buffer, value); }; -const encodeBacnetTime = (buffer, value) => { +const encodeBacnetTime = (buffer: EncodeBuffer, value: Date) => { buffer.buffer[buffer.offset++] = value.getHours(); buffer.buffer[buffer.offset++] = value.getMinutes(); buffer.buffer[buffer.offset++] = value.getSeconds(); buffer.buffer[buffer.offset++] = value.getMilliseconds() / 10; }; -const encodeApplicationTime = module.exports.encodeApplicationTime = (buffer, value) => { +export const encodeApplicationTime = (buffer: EncodeBuffer, value: Date) => { encodeTag(buffer, baEnum.ApplicationTags.TIME, false, 4); encodeBacnetTime(buffer, value); }; -const bacappEncodeDatetime = (buffer, value) => { +const bacappEncodeDatetime = (buffer: EncodeBuffer, value: Date) => { if (value !== new Date(1, 1, 1)) { encodeApplicationDate(buffer, value); encodeApplicationTime(buffer, value); } }; -const encodeContextObjectId = module.exports.encodeContextObjectId = (buffer, tagNumber, objectType, instance) => { +export const encodeContextObjectId = (buffer: EncodeBuffer, tagNumber: number, objectType: number, instance: number) => { encodeTag(buffer, tagNumber, true, 4); encodeBacnetObjectId(buffer, objectType, instance); }; -const encodeOpeningTag = module.exports.encodeOpeningTag = (buffer, tagNumber) => { +export const encodeOpeningTag = (buffer: EncodeBuffer, tagNumber: number) => { let len = 1; const tmp = new Array(2); tmp[0] = 0x8; @@ -363,7 +371,7 @@ const encodeOpeningTag = module.exports.encodeOpeningTag = (buffer, tagNumber) = buffer.offset += len; }; -const encodeClosingTag = module.exports.encodeClosingTag = (buffer, tagNumber) => { +export const encodeClosingTag = (buffer: EncodeBuffer, tagNumber: number) => { let len = 1; const tmp = new Array(2); tmp[0] = 0x8; @@ -379,7 +387,7 @@ const encodeClosingTag = module.exports.encodeClosingTag = (buffer, tagNumber) = buffer.offset += len; }; -const encodeReadAccessSpecification = module.exports.encodeReadAccessSpecification = (buffer, value) => { +export const encodeReadAccessSpecification = (buffer: EncodeBuffer, value: BACNetReadAccessSpecification) => { encodeContextObjectId(buffer, 0, value.objectId.type, value.objectId.instance); encodeOpeningTag(buffer, 1); value.properties.forEach((p) => { @@ -391,19 +399,19 @@ const encodeReadAccessSpecification = module.exports.encodeReadAccessSpecificati encodeClosingTag(buffer, 1); }; -const encodeContextBoolean = module.exports.encodeContextBoolean = (buffer, tagNumber, booleanValue) => { +export const encodeContextBoolean = (buffer: EncodeBuffer, tagNumber: number, booleanValue: boolean) => { encodeTag(buffer, tagNumber, true, 1); - buffer.buffer.writeUInt8(booleanValue ? 1 : 0, buffer.offset, true); + buffer.buffer.writeUInt8(booleanValue ? 1 : 0, buffer.offset); buffer.offset += 1; }; -const encodeCovSubscription = (buffer, value) => { +const encodeCovSubscription = (buffer: EncodeBuffer, value: BACNetCovSubscription) => { encodeOpeningTag(buffer, 0); encodeOpeningTag(buffer, 0); encodeOpeningTag(buffer, 1); encodeApplicationUnsigned(buffer, value.recipient.network); if (value.recipient.network === 0xFFFF) { - encodeApplicationOctetString(buffer, 0, 0, 0); + encodeApplicationOctetString(buffer, [0], 0, 0); } else { encodeApplicationOctetString(buffer, value.recipient.address, 0, value.recipient.address.length); } @@ -425,7 +433,7 @@ const encodeCovSubscription = (buffer, value) => { } }; -const bacappEncodeApplicationData = module.exports.bacappEncodeApplicationData = (buffer, value) => { +export const bacappEncodeApplicationData = (buffer: EncodeBuffer, value: BACNetAppData) => { if (value.value === null) { value.type = baEnum.ApplicationTags.NULL; } @@ -473,7 +481,7 @@ const bacappEncodeApplicationData = module.exports.bacappEncodeApplicationData = bacappEncodeDatetime(buffer, value.value); break; case baEnum.ApplicationTags.OBJECTIDENTIFIER: - encodeApplicationObjectId(buffer, (value.value).type, (value.value).instance); + encodeApplicationObjectId(buffer, value.value.type, value.value.instance); break; case baEnum.ApplicationTags.COV_SUBSCRIPTION: encodeCovSubscription(buffer, value.value); @@ -489,7 +497,7 @@ const bacappEncodeApplicationData = module.exports.bacappEncodeApplicationData = } }; -const bacappEncodeDeviceObjPropertyRef = (buffer, value) => { +const bacappEncodeDeviceObjPropertyRef = (buffer: EncodeBuffer, value: BACNetDevObjRef) => { encodeContextObjectId(buffer, 0, value.objectId.type, value.objectId.instance); encodeContextEnumerated(buffer, 1, value.id); if (value.arrayIndex !== baEnum.ASN1_ARRAY_ALL) { @@ -500,13 +508,13 @@ const bacappEncodeDeviceObjPropertyRef = (buffer, value) => { } }; -module.exports.bacappEncodeContextDeviceObjPropertyRef = (buffer, tagNumber, value) => { +export const bacappEncodeContextDeviceObjPropertyRef = (buffer: EncodeBuffer, tagNumber: number, value: BACNetDevObjRef) => { encodeOpeningTag(buffer, tagNumber); bacappEncodeDeviceObjPropertyRef(buffer, value); encodeClosingTag(buffer, tagNumber); }; -module.exports.bacappEncodePropertyState = (buffer, value) => { +export const bacappEncodePropertyState = (buffer: EncodeBuffer, value: BACNetPropertyState) => { switch (value.type) { case baEnum.PropertyStates.BOOLEAN_VALUE: encodeContextBoolean(buffer, 0, value.state === 1 ? true : false); @@ -555,24 +563,23 @@ module.exports.bacappEncodePropertyState = (buffer, value) => { } }; -module.exports.encodeContextBitstring = (buffer, tagNumber, bitString) => { - let bitStringEncodedLength = 1; - bitStringEncodedLength += bitstringBytesUsed(bitString); +export const encodeContextBitstring = (buffer: EncodeBuffer, tagNumber: number, bitString: BACNetBitString) => { + const bitStringEncodedLength = bitstringBytesUsed(bitString) + 1; encodeTag(buffer, tagNumber, true, bitStringEncodedLength); encodeBitstring(buffer, bitString); }; -module.exports.encodeContextSigned = (buffer, tagNumber, value) => { +export const encodeContextSigned = (buffer: EncodeBuffer, tagNumber: number, value: number) => { encodeTag(buffer, tagNumber, true, getSignedLength(value)); encodeBacnetSigned(buffer, value); }; -const encodeContextTime = (buffer, tagNumber, value) => { +const encodeContextTime = (buffer: EncodeBuffer, tagNumber: number, value: Date) => { encodeTag(buffer, tagNumber, true, 4); encodeBacnetTime(buffer, value); }; -const bacappEncodeContextDatetime = (buffer, tagNumber, value) => { +const bacappEncodeContextDatetime = (buffer: EncodeBuffer, tagNumber: number, value: Date) => { if (value !== new Date(1, 1, 1)) { encodeOpeningTag(buffer, tagNumber); bacappEncodeDatetime(buffer, value); @@ -580,9 +587,9 @@ const bacappEncodeContextDatetime = (buffer, tagNumber, value) => { } }; -const decodeTagNumber = module.exports.decodeTagNumber = (buffer, offset) => { +export const decodeTagNumber = (buffer: Buffer, offset: number) => { let len = 1; - let tagNumber; + let tagNumber: number; if (isExtendedTagNumber(buffer[offset])) { tagNumber = buffer[offset + 1]; len++; @@ -595,30 +602,30 @@ const decodeTagNumber = module.exports.decodeTagNumber = (buffer, offset) => { }; }; -const decodeIsContextTag = module.exports.decodeIsContextTag = (buffer, offset, tagNumber) => { +export const decodeIsContextTag = (buffer: Buffer, offset: number, tagNumber: number) => { const result = decodeTagNumber(buffer, offset); return isContextSpecific(buffer[offset]) && result.tagNumber === tagNumber; }; -const decodeIsOpeningTagNumber = module.exports.decodeIsOpeningTagNumber = (buffer, offset, tagNumber) => { +export const decodeIsOpeningTagNumber = (buffer: Buffer, offset: number, tagNumber: number) => { const result = decodeTagNumber(buffer, offset); return isOpeningTag(buffer[offset]) && result.tagNumber === tagNumber; }; -const decodeIsClosingTagNumber = module.exports.decodeIsClosingTagNumber = (buffer, offset, tagNumber) => { +export const decodeIsClosingTagNumber = (buffer: Buffer, offset: number, tagNumber: number) => { const result = decodeTagNumber(buffer, offset); return isClosingTag(buffer[offset]) && result.tagNumber === tagNumber; }; -module.exports.decodeIsClosingTag = (buffer, offset) => { +export const decodeIsClosingTag = (buffer: Buffer, offset: number) => { return (buffer[offset] & 0x07) === 7; }; -module.exports.decodeIsOpeningTag = (buffer, offset) => { +export const decodeIsOpeningTag = (buffer: Buffer, offset: number) => { return (buffer[offset] & 0x07) === 6; }; -const decodeObjectId = module.exports.decodeObjectId = (buffer, offset) => { +export const decodeObjectId = (buffer: Buffer, offset: number) => { const result = decodeUnsigned(buffer, offset, 4); const objectType = (result.value >> baEnum.ASN1_INSTANCE_BITS) & baEnum.ASN1_MAX_OBJECT; const instance = result.value & baEnum.ASN1_MAX_INSTANCE; @@ -629,7 +636,7 @@ const decodeObjectId = module.exports.decodeObjectId = (buffer, offset) => { }; }; -const decodeObjectIdSafe = (buffer, offset, lenValue) => { +const decodeObjectIdSafe = (buffer: Buffer, offset: number, lenValue: number) => { if (lenValue !== 4) { return { len: 0, @@ -641,19 +648,19 @@ const decodeObjectIdSafe = (buffer, offset, lenValue) => { } }; -const decodeTagNumberAndValue = module.exports.decodeTagNumberAndValue = (buffer, offset) => { - let value; - let result = decodeTagNumber(buffer, offset); - let len = result.len; +export const decodeTagNumberAndValue = (buffer: Buffer, offset: number) => { + let value: number; + let tag = decodeTagNumber(buffer, offset); + let len = tag.len; if (isExtendedValue(buffer[offset])) { if (buffer[offset + len] === 255) { len++; - result = decodeUnsigned(buffer, offset + len, 4); + const result = decodeUnsigned(buffer, offset + len, 4); len += result.len; value = result.value; } else if (buffer[offset + len] === 254) { len++; - result = decodeUnsigned(buffer, offset + len, 2); + const result = decodeUnsigned(buffer, offset + len, 2); len += result.len; value = result.value; } else { @@ -669,19 +676,19 @@ const decodeTagNumberAndValue = module.exports.decodeTagNumberAndValue = (buffer } return { len: len, - tagNumber: result.tagNumber, + tagNumber: tag.tagNumber, value: value }; }; -const bacappDecodeApplicationData = module.exports.bacappDecodeApplicationData = (buffer, offset, maxOffset, objectType, propertyId) => { +export const bacappDecodeApplicationData = (buffer: Buffer, offset: number, maxOffset: number, objectType: number, propertyId: number): any => { if (!isContextSpecific(buffer[offset])) { - let result = decodeTagNumberAndValue(buffer, offset); - if (result) { - const len = result.len; - result = bacappDecodeData(buffer, offset + len, maxOffset, result.tagNumber, result.value); + const tag = decodeTagNumberAndValue(buffer, offset); + if (tag) { + const len = tag.len; + const result = bacappDecodeData(buffer, offset + len, maxOffset, tag.tagNumber, tag.value); if (!result) return; - const resObj = { + const resObj: any = { len: len + result.len, type: result.type, value: result.value @@ -695,7 +702,15 @@ const bacappDecodeApplicationData = module.exports.bacappDecodeApplicationData = } }; -const encodeReadAccessResult = module.exports.encodeReadAccessResult = (buffer, value) => { +interface BACNetReadAccessResult { + objectId: BACNetObjectID; + values: { + property: BACNetPropertyID; + value: any[]; + }[]; +}; + +export const encodeReadAccessResult = (buffer: EncodeBuffer, value: BACNetReadAccessResult) => { encodeContextObjectId(buffer, 0, value.objectId.type, value.objectId.instance); encodeOpeningTag(buffer, 1); value.values.forEach((item) => { @@ -710,32 +725,30 @@ const encodeReadAccessResult = module.exports.encodeReadAccessResult = (buffer, encodeClosingTag(buffer, 5); } else { encodeOpeningTag(buffer, 4); - item.value.forEach((subItem) => { - bacappEncodeApplicationData(buffer, subItem); - }); + item.value.forEach((subItem) => bacappEncodeApplicationData(buffer, subItem)); encodeClosingTag(buffer, 4); } }); encodeClosingTag(buffer, 1); }; -const decodeReadAccessResult = module.exports.decodeReadAccessResult = (buffer, offset, apduLen) => { +export const decodeReadAccessResult = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; + const value: any = {}; if (!decodeIsContextTag(buffer, offset + len, 0)) return; len++; - let result = decodeObjectId(buffer, offset + len); + let result: any = decodeObjectId(buffer, offset + len); value.objectId = { type: result.objectType, instance: result.instance }; len += result.len; - if (!decodeIsOpeningTagNumber(buffer, offset + len, 1)) return -1; + if (!decodeIsOpeningTagNumber(buffer, offset + len, 1)) return; len++; const values = []; while ((apduLen - len) > 0) { - const newEntry = {}; + const newEntry: any = {}; if (decodeIsClosingTagNumber(buffer, offset + len, 1)) { len++; break; @@ -764,7 +777,7 @@ const decodeReadAccessResult = module.exports.decodeReadAccessResult = (buffer, const localResult = bacappDecodeApplicationData(buffer, offset + len, apduLen + offset - 1, value.objectId.type, newEntry.id); if (!localResult) return; len += localResult.len; - const resObj = { + const resObj: {value: any, type: number, encoding?: number} = { value: localResult.value, type: localResult.type }; @@ -773,19 +786,17 @@ const decodeReadAccessResult = module.exports.decodeReadAccessResult = (buffer, localValues.push(resObj); } if (!decodeIsClosingTagNumber(buffer, offset + len, 4)) return; - if ((localValues.count === 2) && (localValues[0].type === baEnum.ApplicationTags.DATE) && (localValues[1].type === baEnum.ApplicationTags.TIME)) { + if ((localValues.length === 2) && (localValues[0].type === baEnum.ApplicationTags.DATE) && (localValues[1].type === baEnum.ApplicationTags.TIME)) { const date = localValues[0].value; const time = localValues[1].value; const bdatetime = new Date(date.year, date.month, date.day, time.hour, time.minute, time.second, time.millisecond); - newEntry.value = [ - {type: baEnum.ApplicationTags.DATETIME, value: bdatetime} - ]; + newEntry.value = [{type: baEnum.ApplicationTags.DATETIME, value: bdatetime}]; } else { newEntry.value = localValues; } len++; } else if (result.tagNumber === 5) { - const err = {}; + const err: any = {}; result = decodeTagNumberAndValue(buffer, offset + len); len += result.len; result = decodeEnumerated(buffer, offset + len, result.value); @@ -812,21 +823,17 @@ const decodeReadAccessResult = module.exports.decodeReadAccessResult = (buffer, }; }; -const decodeSigned = module.exports.decodeSigned = (buffer, offset, length) => { - return { - len: length, - value: buffer.readIntBE(offset, length, true) - }; -}; +export const decodeSigned = (buffer: Buffer, offset: number, length: number) => ({ + len: length, + value: buffer.readIntBE(offset, length) +}); -const decodeReal = module.exports.decodeReal = (buffer, offset) => { - return { - len: 4, - value: buffer.readFloatBE(offset, true) - }; -}; +export const decodeReal = (buffer: Buffer, offset: number) => ({ + len: 4, + value: buffer.readFloatBE(offset) +}); -const decodeRealSafe = (buffer, offset, lenValue) => { +const decodeRealSafe = (buffer: Buffer, offset: number, lenValue: number) => { if (lenValue !== 4) { return { len: lenValue, @@ -837,14 +844,12 @@ const decodeRealSafe = (buffer, offset, lenValue) => { } }; -const decodeDouble = (buffer, offset) => { - return { - len: 8, - value: buffer.readDoubleBE(offset, true) - }; -}; +const decodeDouble = (buffer: Buffer, offset: number) => ({ + len: 8, + value: buffer.readDoubleBE(offset) +}); -const decodeDoubleSafe = (buffer, offset, lenValue) => { +const decodeDoubleSafe = (buffer: Buffer, offset: number, lenValue: number) => { if (lenValue !== 8) { return { len: lenValue, @@ -855,7 +860,7 @@ const decodeDoubleSafe = (buffer, offset, lenValue) => { } }; -const decodeOctetString = module.exports.decodeOctetString = (buffer, offset, maxLength, octetStringOffset, octetStringLength) => { +export const decodeOctetString = (buffer: Buffer, offset: number, maxLength: number, octetStringOffset: number, octetStringLength: number) => { const octetString = []; for (let i = octetStringOffset; i < (octetStringOffset + octetStringLength); i++) { octetString.push(buffer[offset + i]); @@ -866,7 +871,7 @@ const decodeOctetString = module.exports.decodeOctetString = (buffer, offset, ma }; }; -const multiCharsetCharacterstringDecode = (buffer, offset, maxLength, encoding, length) => { +const multiCharsetCharacterstringDecode = (buffer: Buffer, offset: number, maxLength: number, encoding: number, length: number) => { const stringBuf = Buffer.alloc(length); buffer.copy(stringBuf, 0, offset, offset + length); return { @@ -876,19 +881,18 @@ const multiCharsetCharacterstringDecode = (buffer, offset, maxLength, encoding, }; }; -const decodeCharacterString = module.exports.decodeCharacterString = (buffer, offset, maxLength, lenValue) => { +export const decodeCharacterString = (buffer: Buffer, offset: number, maxLength: number, lenValue: number) => { return multiCharsetCharacterstringDecode(buffer, offset + 1, maxLength, buffer[offset], lenValue - 1); }; -const bitstringSetBitsUsed = (bitString, bytesUsed, unusedBits) => { +const bitstringSetBitsUsed = (bitString: BACNetBitString, bytesUsed: number, unusedBits: number) => { bitString.bitsUsed = bytesUsed * 8; bitString.bitsUsed -= unusedBits; }; -const decodeBitstring = module.exports.decodeBitstring = (buffer, offset, lenValue) => { +export const decodeBitstring = (buffer: Buffer, offset: number, lenValue: number) => { let len = 0; - const bitString = {}; - bitString.value = []; + const bitString: {value: number[], bitsUsed: 0} = {value: [], bitsUsed: 0}; if (lenValue > 0) { const bytesUsed = lenValue - 1; if (bytesUsed <= baEnum.ASN1_MAX_BITSTRING_BYTES) { @@ -906,8 +910,8 @@ const decodeBitstring = module.exports.decodeBitstring = (buffer, offset, lenVal }; }; -const decodeDate = module.exports.decodeDate = (buffer, offset) => { - let date; +export const decodeDate = (buffer: Buffer, offset: number) => { + let date: Date; const year = buffer[offset] + 1900; const month = buffer[offset + 1]; const day = buffer[offset + 2]; @@ -923,7 +927,7 @@ const decodeDate = module.exports.decodeDate = (buffer, offset) => { }; }; -const decodeDateSafe = (buffer, offset, lenValue) => { +const decodeDateSafe = (buffer: Buffer, offset: number, lenValue: number) => { if (lenValue !== 4) { return { len: lenValue, @@ -934,21 +938,19 @@ const decodeDateSafe = (buffer, offset, lenValue) => { } }; -const decodeApplicationDate = module.exports.decodeApplicationDate = (buffer, offset) => { +export const decodeApplicationDate = (buffer: Buffer, offset: number) => { const result = decodeTagNumber(buffer, offset); if (result.tagNumber === baEnum.ApplicationTags.DATE) { const value = decodeDate(buffer, offset + 1); return { len: value.len + 1, - value: value + value: value.value }; - } else { - return; } }; -const decodeBacnetTime = module.exports.decodeBacnetTime = (buffer, offset) => { - let value; +export const decodeBacnetTime = (buffer: Buffer, offset: number) => { + let value: Date; const hour = buffer[offset + 0]; const min = buffer[offset + 1]; const sec = buffer[offset + 2]; @@ -965,45 +967,42 @@ const decodeBacnetTime = module.exports.decodeBacnetTime = (buffer, offset) => { }; }; -const decodeBacnetTimeSafe = (buffer, offset, lenValue) => { - if (lenValue !== 4) { - return { - len: lenValue, - value: new Date(1, 1, 1) - }; +const decodeBacnetTimeSafe = (buffer: Buffer, offset: number, len: number) => { + if (len !== 4) { + return { len, value: new Date(1, 1, 1) }; } else { return decodeBacnetTime(buffer, offset); } }; -const decodeApplicationTime = module.exports.decodeApplicationTime = (buffer, offset) => { +export const decodeApplicationTime = (buffer: Buffer, offset: number) => { const result = decodeTagNumber(buffer, offset); if (result.tagNumber === baEnum.ApplicationTags.TIME) { const value = decodeBacnetTime(buffer, offset + 1); return { len: value.len + 1, - value: value + value: value.value }; - } else { - return; } }; -const decodeBacnetDatetime = (buffer, offset) => { +const decodeBacnetDatetime = (buffer: Buffer, offset: number) => { let len = 0; - const date = decodeApplicationDate(buffer, offset + len); - len += date.len; - const time = decodeApplicationTime(buffer, offset + len); - len += time.len; + const rawDate = decodeApplicationDate(buffer, offset + len); + len += rawDate.len; + const date = rawDate.value; + const rawTime = decodeApplicationTime(buffer, offset + len); + len += rawTime.len; + const time = rawTime.value; return { len: len, - value: new Date(date.year, date.month, date.day, time.hour, time.minute, time.second, time.millisecond) + value: new Date(date.getFullYear(), date.getMonth(), date.getDay(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()) }; }; -const bacappDecodeData = (buffer, offset, maxLength, tagDataType, lenValueType) => { - let result; - const value = { +const bacappDecodeData = (buffer: Buffer, offset: number, maxLength: number, tagDataType: number, lenValueType: number) => { + let result: any; + const value: any = { len: 0, type: tagDataType }; @@ -1076,7 +1075,7 @@ const bacappDecodeData = (buffer, offset, maxLength, tagDataType, lenValueType) return value; }; -const bacappContextTagType = (property, tagNumber) => { +const bacappContextTagType = (property: number, tagNumber: number) => { let tag = 0; switch (property) { case baEnum.PropertyIdentifier.ACTUAL_SHED_LEVEL: @@ -1196,9 +1195,9 @@ const bacappContextTagType = (property, tagNumber) => { return tag; }; -const decodeDeviceObjPropertyRef = (buffer, offset) => { +const decodeDeviceObjPropertyRef = (buffer: Buffer, offset: number) => { let len = 0; - let arrayIndex = baEnum.ASN1_ARRAY_ALL; + let arrayIndex: any = baEnum.ASN1_ARRAY_ALL; if (!decodeIsContextTag(buffer, offset + len, 0)) return; len++; let objectId = decodeObjectId(buffer, offset + len); @@ -1211,6 +1210,7 @@ const decodeDeviceObjPropertyRef = (buffer, offset) => { result = decodeTagNumberAndValue(buffer, offset + len); if (result.tagNumber === 2) { len += result.len; + // FIXME: This doesn't seem to be used arrayIndex = decodeUnsigned(buffer, offset + len, result.value); len += arrayIndex.len; } @@ -1230,12 +1230,12 @@ const decodeDeviceObjPropertyRef = (buffer, offset) => { }; }; -const decodeReadAccessSpecification = module.exports.decodeReadAccessSpecification = (buffer, offset, apduLen) => { +export const decodeReadAccessSpecification = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; + const value: any = {}; if (!decodeIsContextTag(buffer, offset + len, 0)) return; len++; - let decodedValue = decodeObjectId(buffer, offset + len); + let decodedValue: any = decodeObjectId(buffer, offset + len); value.objectId = { type: decodedValue.objectType, instance: decodedValue.instance @@ -1245,7 +1245,7 @@ const decodeReadAccessSpecification = module.exports.decodeReadAccessSpecificati len++; const propertyIdAndArrayIndex = []; while ((apduLen - len) > 1 && !decodeIsClosingTagNumber(buffer, offset + len, 1)) { - const propertyRef = {}; + const propertyRef: any = {}; if (!isContextSpecific(buffer[offset + len])) return; const result = decodeTagNumberAndValue(buffer, offset + len); len += result.len; @@ -1276,11 +1276,11 @@ const decodeReadAccessSpecification = module.exports.decodeReadAccessSpecificati }; }; -const decodeCovSubscription = (buffer, offset, apduLen) => { +const decodeCovSubscription = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; - let result; - let decodedValue; + const value: any = {}; + let result: any ; + let decodedValue: any ; value.recipient = {}; if (!decodeIsOpeningTagNumber(buffer, offset + len, 0)) return; len++; @@ -1366,17 +1366,15 @@ const decodeCovSubscription = (buffer, offset, apduLen) => { }; }; -const decodeCalendarDate = (buffer, offset) => { - return { - len: 4, - year: buffer[offset], - month: buffer[offset + 1], - day: buffer[offset + 2], - wday: buffer[offset + 3] - }; -}; +const decodeCalendarDate = (buffer: Buffer, offset: number) => ({ + len: 4, + year: buffer[offset], + month: buffer[offset + 1], + day: buffer[offset + 2], + wday: buffer[offset + 3] +}); -const decodeCalendarDateRange = (buffer, offset) => { +const decodeCalendarDateRange = (buffer: Buffer, offset: number) => { let len = 1; const startDate = decodeDate(buffer, offset + len); len += startDate.len + 1; @@ -1389,39 +1387,36 @@ const decodeCalendarDateRange = (buffer, offset) => { }; }; -const decodeCalendarWeekDay = (buffer, offset) => { - return { - len: 3, - month: buffer[offset], - week: buffer[offset + 1], - wday: buffer[offset + 2] - }; -}; +const decodeCalendarWeekDay = (buffer: Buffer, offset: number) => ({ + len: 3, + month: buffer[offset], + week: buffer[offset + 1], + wday: buffer[offset + 2] +}); -const decodeCalendar = (buffer, offset, apduLen) => { +const decodeCalendar = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; const entries = []; - let decodedValue; while (len < apduLen) { const result = decodeTagNumber(buffer, offset + len); len += result.len; switch (result.tagNumber) { - case 0: - decodedValue = decodeCalendarDate(buffer, offset + len); + case 0: { + const decodedValue = decodeCalendarDate(buffer, offset + len); len += decodedValue.len; entries.push(decodedValue); break; - case 1: - decodedValue = decodeCalendarDateRange(buffer, offset + len); + } case 1: { + const decodedValue = decodeCalendarDateRange(buffer, offset + len); len += decodedValue.len; entries.push(decodedValue); break; - case 2: - decodedValue = decodeCalendarWeekDay(buffer, offset + len); + } case 2: { + const decodedValue = decodeCalendarWeekDay(buffer, offset + len); len += decodedValue.len; entries.push(decodedValue); break; - default: + } default: return { len: len - 1, value: entries @@ -1430,12 +1425,11 @@ const decodeCalendar = (buffer, offset, apduLen) => { } }; -const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectType, propertyId) => { +const bacappDecodeContextApplicationData = (buffer: Buffer, offset: number, maxOffset: number, objectType: number, propertyId: number) => { let len = 0; - let result; if (isContextSpecific(buffer[offset])) { if (propertyId === baEnum.PropertyIdentifier.LIST_OF_GROUP_MEMBERS) { - result = decodeReadAccessSpecification(buffer, offset, maxOffset); + const result = decodeReadAccessSpecification(buffer, offset, maxOffset); if (!result) return; return { type: baEnum.ApplicationTags.READ_ACCESS_SPECIFICATION, @@ -1443,7 +1437,7 @@ const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectTyp len: result.len }; } else if (propertyId === baEnum.PropertyIdentifier.ACTIVE_COV_SUBSCRIPTIONS) { - result = decodeCovSubscription(buffer, offset, maxOffset); + const result = decodeCovSubscription(buffer, offset, maxOffset); if (!result) return; return { type: baEnum.ApplicationTags.COV_SUBSCRIPTION, @@ -1451,7 +1445,7 @@ const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectTyp len: result.len }; } else if (objectType === baEnum.ObjectType.GROUP && propertyId === baEnum.PropertyIdentifier.PRESENT_VALUE) { - result = decodeReadAccessResult(buffer, offset, maxOffset); + const result = decodeReadAccessResult(buffer, offset, maxOffset); if (!result) return; return { type: baEnum.ApplicationTags.READ_ACCESS_RESULT, @@ -1459,7 +1453,7 @@ const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectTyp len: result.len }; } else if (propertyId === baEnum.PropertyIdentifier.LIST_OF_OBJECT_PROPERTY_REFERENCES || propertyId === baEnum.PropertyIdentifier.LOG_DEVICE_OBJECT_PROPERTY || propertyId === baEnum.PropertyIdentifier.OBJECT_PROPERTY_REFERENCE) { - result = decodeDeviceObjPropertyRef(buffer, offset, maxOffset); + const result = decodeDeviceObjPropertyRef(buffer, offset); if (!result) return; return { type: baEnum.ApplicationTags.OBJECT_PROPERTY_REFERENCE, @@ -1467,7 +1461,7 @@ const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectTyp len: result.len }; } else if (propertyId === baEnum.PropertyIdentifier.DATE_LIST) { - result = decodeCalendar(buffer, offset, maxOffset); + const result = decodeCalendar(buffer, offset, maxOffset); if (!result) return; return { type: baEnum.ApplicationTags.CONTEXT_SPECIFIC_DECODED, @@ -1511,7 +1505,7 @@ const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectTyp if (!subResult) return; if (subResult.value === 0) { len += subResult.len; - result = bacappDecodeApplicationData(buffer, offset + len, maxOffset, baEnum.ASN1_MAX_OBJECT_TYPE, baEnum.ASN1_MAX_PROPERTY_ID); + const result = bacappDecodeApplicationData(buffer, offset + len, maxOffset, baEnum.ASN1_MAX_OBJECT_TYPE, baEnum.ASN1_MAX_PROPERTY_ID); if (!result) return; list.push(result); len += result.len; @@ -1523,7 +1517,7 @@ const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectTyp const bacappResult = bacappDecodeData(buffer, offset + len + subResult.len, maxOffset, subResult.tagNumber, subResult.value); if (!bacappResult) return; if (bacappResult.len === subResult.value) { - const resObj = { + const resObj: {value: any, type: number, encoding?: number} = { value: bacappResult.value, type: bacappResult.type }; @@ -1561,7 +1555,7 @@ const bacappDecodeContextApplicationData = (buffer, offset, maxOffset, objectTyp } }; -const bacappEncodeTimestamp = module.exports.bacappEncodeTimestamp = (buffer, value) => { +export const bacappEncodeTimestamp = (buffer: EncodeBuffer, value: {type: number, value: any}) => { switch (value.type) { case baEnum.TimeStamp.TIME: encodeContextTime(buffer, 0, value.value); @@ -1577,13 +1571,13 @@ const bacappEncodeTimestamp = module.exports.bacappEncodeTimestamp = (buffer, va } }; -module.exports.bacappEncodeContextTimestamp = (buffer, tagNumber, value) => { +export const bacappEncodeContextTimestamp = (buffer: EncodeBuffer, tagNumber: number, value: {type: number, value: any}) => { encodeOpeningTag(buffer, tagNumber); bacappEncodeTimestamp(buffer, value); encodeClosingTag(buffer, tagNumber); }; -module.exports.decodeContextCharacterString = (buffer, offset, maxLength, tagNumber) => { +export const decodeContextCharacterString = (buffer: Buffer, offset: number, maxLength: number, tagNumber: number) => { let len = 0; if (!decodeIsContextTag(buffer, offset + len, tagNumber)) return; const result = decodeTagNumberAndValue(buffer, offset + len); @@ -1598,7 +1592,7 @@ module.exports.decodeContextCharacterString = (buffer, offset, maxLength, tagNum }; }; -const decodeIsContextTagWithLength = (buffer, offset, tagNumber) => { +const decodeIsContextTagWithLength = (buffer: Buffer, offset: number, tagNumber: number) => { const result = decodeTagNumber(buffer, offset); return { len: result.len, @@ -1606,7 +1600,7 @@ const decodeIsContextTagWithLength = (buffer, offset, tagNumber) => { }; }; -module.exports.decodeContextObjectId = (buffer, offset, tagNumber) => { +export const decodeContextObjectId = (buffer: Buffer, offset: number, tagNumber: number) => { const result = decodeIsContextTagWithLength(buffer, offset, tagNumber); if (!result.value) return; const decodedValue = decodeObjectId(buffer, offset + result.len); @@ -1614,14 +1608,14 @@ module.exports.decodeContextObjectId = (buffer, offset, tagNumber) => { return decodedValue; }; -const encodeBacnetCharacterString = (buffer, value, encoding) => { +const encodeBacnetCharacterString = (buffer: EncodeBuffer, value: string, encoding?: number) => { encoding = encoding || baEnum.CharacterStringEncoding.UTF_8; buffer.buffer[buffer.offset++] = encoding; const bufEncoded = iconv.encode(value, getEncodingType(encoding)); buffer.offset += bufEncoded.copy(buffer.buffer, buffer.offset); }; -const encodeApplicationCharacterString = module.exports.encodeApplicationCharacterString = (buffer, value, encoding) => { +export const encodeApplicationCharacterString = (buffer: EncodeBuffer, value: string, encoding?: number) => { const tmp = getBuffer(); encodeBacnetCharacterString(tmp, value, encoding); encodeTag(buffer, baEnum.ApplicationTags.CHARACTER_STRING, false, tmp.offset); @@ -1629,7 +1623,7 @@ const encodeApplicationCharacterString = module.exports.encodeApplicationCharact buffer.offset += tmp.offset; }; -module.exports.encodeContextCharacterString = (buffer, tagNumber, value, encoding) => { +export const encodeContextCharacterString = (buffer: EncodeBuffer, tagNumber: number, value: string, encoding?: number) => { const tmp = getBuffer(); encodeBacnetCharacterString(tmp, value, encoding); encodeTag(buffer, tagNumber, true, tmp.offset); diff --git a/lib/bvlc.js b/lib/bvlc.ts similarity index 88% rename from lib/bvlc.js rename to lib/bvlc.ts index d6fabf6a..dc2f5426 100644 --- a/lib/bvlc.js +++ b/lib/bvlc.ts @@ -1,8 +1,8 @@ 'use strict'; -const baEnum = require('./enum'); +import * as baEnum from './enum'; -module.exports.encode = (buffer, func, msgLength) => { +export const encode = (buffer: Buffer, func: number, msgLength: number) => { buffer[0] = baEnum.BVLL_TYPE_BACNET_IP; buffer[1] = func; buffer[2] = (msgLength & 0xFF00) >> 8; @@ -10,7 +10,7 @@ module.exports.encode = (buffer, func, msgLength) => { return baEnum.BVLC_HEADER_LENGTH; }; -module.exports.decode = (buffer, offset) => { +export const decode = (buffer: Buffer, offset: number) => { let len; const func = buffer[1]; const msgLength = (buffer[2] << 8) | (buffer[3] << 0); diff --git a/lib/client.js b/lib/client.ts similarity index 89% rename from lib/client.js rename to lib/client.ts index 58e6607f..8fffe298 100644 --- a/lib/client.js +++ b/lib/client.ts @@ -1,17 +1,18 @@ 'use strict'; // Util Modules -const EventEmitter = require('events').EventEmitter; +import { EventEmitter } from 'events'; const debug = require('debug')('bacstack'); // Local Modules -const baTransport = require('./transport'); -const baServices = require('./services'); -const baAsn1 = require('./asn1'); -const baApdu = require('./apdu'); -const baNpdu = require('./npdu'); -const baBvlc = require('./bvlc'); -const baEnum = require('./enum'); +import { Transport as baTransport } from './transport'; +import * as baServices from './services'; +import * as baAsn1 from './asn1'; +import * as baApdu from './apdu'; +import * as baNpdu from './npdu'; +import * as baBvlc from './bvlc'; +import * as baEnum from './enum'; +import { BACNetObjectID, BACNetPropertyID, BACNetAppData } from './types'; const DEFAULT_HOP_COUNT = 0xFF; const BVLC_HEADER_LENGTH = 4; @@ -34,17 +35,20 @@ const BVLC_HEADER_LENGTH = 4; * apduTimeout: 6000 // Wait twice as long for response * }); */ -class Client extends EventEmitter { - constructor(options) { - super(); +export class Client extends EventEmitter { + private _settings: any; + private _transport: baTransport; - options = options || {}; + private _invokeCounter = 1; + private _invokeStore: any = {}; - this._invokeCounter = 1; - this._invokeStore = {}; + private _lastSequenceNumber = 0; + private _segmentStore: any[] = []; - this._lastSequenceNumber = 0; - this._segmentStore = []; + constructor(options: any) { + super(); + + options = options || {}; this._settings = { port: options.port || 47808, @@ -67,31 +71,31 @@ class Client extends EventEmitter { } // Helper utils - _getInvokeId() { + private _getInvokeId() { const id = this._invokeCounter++; if (id >= 256) this._invokeCounter = 1; return id - 1; } - _invokeCallback(id, err, result) { + private _invokeCallback(id: number, err: Error, result?: any) { const callback = this._invokeStore[id]; if (callback) return callback(err, result); debug('InvokeId ', id, ' not found -> drop package'); } - _addCallback(id, callback) { + private _addCallback(id: number, callback: (err: Error, data?: any) => void) { const timeout = setTimeout(() => { delete this._invokeStore[id]; callback(new Error('ERR_TIMEOUT')); }, this._settings.apduTimeout); - this._invokeStore[id] = (err, data) => { + this._invokeStore[id] = (err: Error, data: any) => { clearTimeout(timeout); delete this._invokeStore[id]; callback(err, data); }; } - _getBuffer() { + private _getBuffer() { return { buffer: Buffer.alloc(this._transport.getMaxPayload()), offset: BVLC_HEADER_LENGTH @@ -99,17 +103,17 @@ class Client extends EventEmitter { } // Service Handlers - _processError(invokeId, buffer, offset, length) { - const result = baServices.error.decode(buffer, offset, length); + private _processError(invokeId: number, buffer: Buffer, offset: number, length: number) { + const result = baServices.error.decode(buffer, offset); if (!result) return debug('Couldn`t decode Error'); this._invokeCallback(invokeId, new Error('BacnetError - Class:' + result.class + ' - Code:' + result.code)); } - _processAbort(invokeId, reason) { + private _processAbort(invokeId: number, reason: number) { this._invokeCallback(invokeId, new Error('BacnetAbort - Reason:' + reason)); } - _segmentAckResponse(receiver, negative, server, originalInvokeId, sequencenumber, actualWindowSize) { + private _segmentAckResponse(receiver: string, negative: boolean, server: boolean, originalInvokeId: number, sequencenumber: number, actualWindowSize: number) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, receiver, null, DEFAULT_HOP_COUNT, baEnum.NetworkLayerMessageType.WHO_IS_ROUTER_TO_NETWORK, 0); baApdu.encodeSegmentAck(buffer, baEnum.PduTypes.SEGMENT_ACK | (negative ? baEnum.PduSegAckBits.NEGATIVE_ACK : 0) | (server ? baEnum.PduSegAckBits.SERVER : 0), originalInvokeId, sequencenumber, actualWindowSize); @@ -117,7 +121,7 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, receiver); } - _performDefaultSegmentHandling(sender, adr, type, service, invokeId, maxSegments, maxApdu, sequencenumber, first, moreFollows, buffer, offset, length) { + private _performDefaultSegmentHandling(sender: any, adr: string, type: number, service: number, invokeId: number, maxSegments: number, maxApdu: number, sequencenumber: number, first: boolean, moreFollows: number, buffer: Buffer, offset: number, length: number) { if (first) { this._segmentStore = []; type &= ~baEnum.PduConReqBits.SEGMENTED_MESSAGE; @@ -145,7 +149,7 @@ class Client extends EventEmitter { } } - _processSegment(receiver, type, service, invokeId, maxSegments, maxApdu, server, sequencenumber, proposedWindowNumber, buffer, offset, length) { + private _processSegment(receiver: string, type: number, service: number, invokeId: number, maxSegments: number, maxApdu: number, server: boolean, sequencenumber: number, proposedWindowNumber: number, buffer: Buffer, offset: number, length: number) { let first = false; if (sequencenumber === 0 && this._lastSequenceNumber === 0) { first = true; @@ -165,97 +169,96 @@ class Client extends EventEmitter { this._performDefaultSegmentHandling(this, receiver, type, service, invokeId, maxSegments, maxApdu, sequencenumber, first, moreFollows, buffer, offset, length); } - _processConfirmedServiceRequest(address, type, service, maxSegments, maxApdu, invokeId, buffer, offset, length) { - let result; + private _processConfirmedServiceRequest(address: string, type: number, service: number, maxSegments: number, maxApdu: number, invokeId: number, buffer: Buffer, offset: number, length: number) { debug('Handle this._processConfirmedServiceRequest'); if (service === baEnum.ConfirmedServiceChoice.READ_PROPERTY) { - result = baServices.readProperty.decode(buffer, offset, length); + const result = baServices.readProperty.decode(buffer, offset, length); if (!result) return debug('Received invalid readProperty message'); this.emit('readProperty', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.WRITE_PROPERTY) { - result = baServices.writeProperty.decode(buffer, offset, length); + const result = baServices.writeProperty.decode(buffer, offset, length); if (!result) return debug('Received invalid writeProperty message'); this.emit('writeProperty', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.READ_PROPERTY_MULTIPLE) { - result = baServices.readPropertyMultiple.decode(buffer, offset, length); + const result = baServices.readPropertyMultiple.decode(buffer, offset, length); if (!result) return debug('Received invalid readPropertyMultiple message'); this.emit('readPropertyMultiple', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.WRITE_PROPERTY_MULTIPLE) { - result = baServices.writePropertyMultiple.decode(buffer, offset, length); + const result = baServices.writePropertyMultiple.decode(buffer, offset, length); if (!result) return debug('Received invalid writePropertyMultiple message'); this.emit('writePropertyMultiple', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.CONFIRMED_COV_NOTIFICATION) { - result = baServices.covNotify.decode(buffer, offset, length); + const result = baServices.covNotify.decode(buffer, offset, length); if (!result) return debug('Received invalid covNotify message'); this.emit('covNotify', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.ATOMIC_WRITE_FILE) { - result = baServices.atomicWriteFile.decode(buffer, offset, length); + const result = baServices.atomicWriteFile.decode(buffer, offset, length); if (!result) return debug('Received invalid atomicWriteFile message'); this.emit('atomicWriteFile', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.ATOMIC_READ_FILE) { - result = baServices.atomicReadFile.decode(buffer, offset, length); + const result = baServices.atomicReadFile.decode(buffer, offset); if (!result) return debug('Received invalid atomicReadFile message'); this.emit('atomicReadFile', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.SUBSCRIBE_COV) { - result = baServices.subscribeCov.decode(buffer, offset, length); + const result = baServices.subscribeCov.decode(buffer, offset, length); if (!result) return debug('Received invalid subscribeCOV message'); this.emit('subscribeCOV', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.SUBSCRIBE_COV_PROPERTY) { - result = baServices.subscribeProperty.decode(buffer, offset, length); + const result = baServices.subscribeProperty.decode(buffer, offset); if (!result) return debug('Received invalid subscribeProperty message'); this.emit('subscribeProperty', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.DEVICE_COMMUNICATION_CONTROL) { - result = baServices.deviceCommunicationControl.decode(buffer, offset, length); + const result = baServices.deviceCommunicationControl.decode(buffer, offset, length); if (!result) return debug('Received invalid deviceCommunicationControl message'); this.emit('deviceCommunicationControl', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.REINITIALIZE_DEVICE) { - result = baServices.reinitializeDevice.decode(buffer, offset, length); + const result = baServices.reinitializeDevice.decode(buffer, offset, length); if (!result) return debug('Received invalid reinitializeDevice message'); this.emit('reinitializeDevice', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.CONFIRMED_EVENT_NOTIFICATION) { - result = baServices.eventNotifyData.decode(buffer, offset, length); + const result = baServices.eventNotifyData.decode(buffer, offset); if (!result) return debug('Received invalid eventNotifyData message'); this.emit('eventNotifyData', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.READ_RANGE) { - result = baServices.readRange.decode(buffer, offset, length); + const result = baServices.readRange.decode(buffer, offset, length); if (!result) return debug('Received invalid readRange message'); this.emit('readRange', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.CREATE_OBJECT) { - result = baServices.createObject.decode(buffer, offset, length); + const result = baServices.createObject.decode(buffer, offset, length); if (!result) return debug('Received invalid createObject message'); this.emit('createObject', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.DELETE_OBJECT) { - result = baServices.deleteObject.decode(buffer, offset, length); + const result = baServices.deleteObject.decode(buffer, offset, length); if (!result) return debug('Received invalid deleteObject message'); this.emit('deleteObject', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.ACKNOWLEDGE_ALARM) { - result = baServices.alarmAcknowledge.decode(buffer, offset, length); + const result = baServices.alarmAcknowledge.decode(buffer, offset, length); if (!result) return debug('Received invalid alarmAcknowledge message'); this.emit('alarmAcknowledge', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.GET_ALARM_SUMMARY) { this.emit('getAlarmSummary', {address: address, invokeId: invokeId}); } else if (service === baEnum.ConfirmedServiceChoice.GET_ENROLLMENT_SUMMARY) { - result = baServices.getEnrollmentSummary.decode(buffer, offset, length); + const result = baServices.getEnrollmentSummary.decode(buffer, offset); if (!result) return debug('Received invalid getEntrollmentSummary message'); this.emit('getEntrollmentSummary', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.GET_EVENT_INFORMATION) { - result = baServices.getEventInformation.decode(buffer, offset, length); + const result = baServices.getEventInformation.decode(buffer, offset); if (!result) return debug('Received invalid getEventInformation message'); this.emit('getEventInformation', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.LIFE_SAFETY_OPERATION) { - result = baServices.lifeSafetyOperation.decode(buffer, offset, length); + const result = baServices.lifeSafetyOperation.decode(buffer, offset, length); if (!result) return debug('Received invalid lifeSafetyOperation message'); this.emit('lifeSafetyOperation', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.ADD_LIST_ELEMENT) { - result = baServices.addListElement.decode(buffer, offset, length); + const result = baServices.addListElement.decode(buffer, offset, length); if (!result) return debug('Received invalid addListElement message'); this.emit('addListElement', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.REMOVE_LIST_ELEMENT) { - result = baServices.addListElement.decode(buffer, offset, length); + const result = baServices.addListElement.decode(buffer, offset, length); if (!result) return debug('Received invalid removeListElement message'); this.emit('removeListElement', {address: address, invokeId: invokeId, request: result}); } else if (service === baEnum.ConfirmedServiceChoice.CONFIRMED_PRIVATE_TRANSFER) { - result = baServices.privateTransfer.decode(buffer, offset, length); + const result = baServices.privateTransfer.decode(buffer, offset, length); if (!result) return debug('Received invalid privateTransfer message'); this.emit('privateTransfer', {address: address, invokeId: invokeId, request: result}); } else { @@ -263,11 +266,10 @@ class Client extends EventEmitter { } } - _processUnconfirmedServiceRequest(address, type, service, buffer, offset, length) { - let result; + private _processUnconfirmedServiceRequest(address: string, type: number, service: number, buffer: Buffer, offset: number, length: number) { debug('Handle this._processUnconfirmedServiceRequest'); if (service === baEnum.UnconfirmedServiceChoice.I_AM) { - result = baServices.iAmBroadcast.decode(buffer, offset); + const result = baServices.iAmBroadcast.decode(buffer, offset); if (!result) return debug('Received invalid iAm message'); /** @@ -289,7 +291,7 @@ class Client extends EventEmitter { */ this.emit('iAm', {address: address, deviceId: result.deviceId, maxApdu: result.maxApdu, segmentation: result.segmentation, vendorId: result.vendorId}); } else if (service === baEnum.UnconfirmedServiceChoice.WHO_IS) { - result = baServices.whoIs.decode(buffer, offset, length); + const result = baServices.whoIs.decode(buffer, offset, length); if (!result) return debug('Received invalid WhoIs message'); /** @@ -309,15 +311,15 @@ class Client extends EventEmitter { */ this.emit('whoIs', {address: address, lowLimit: result.lowLimit, highLimit: result.highLimit}); } else if (service === baEnum.UnconfirmedServiceChoice.WHO_HAS) { - result = baServices.whoHas.decode(buffer, offset, length); + const result = baServices.whoHas.decode(buffer, offset, length); if (!result) return debug('Received invalid WhoHas message'); this.emit('whoHas', {address: address, lowLimit: result.lowLimit, highLimit: result.highLimit, objectId: result.objectId, objectName: result.objectName}); } else if (service === baEnum.UnconfirmedServiceChoice.UNCONFIRMED_COV_NOTIFICATION) { - result = baServices.covNotify.decode(buffer, offset, length); + const result = baServices.covNotify.decode(buffer, offset, length); if (!result) return debug('Received invalid covNotifyUnconfirmed message'); this.emit('covNotifyUnconfirmed', {address: address, request: result}); } else if (service === baEnum.UnconfirmedServiceChoice.TIME_SYNCHRONIZATION) { - result = baServices.timeSync.decode(buffer, offset, length); + const result = baServices.timeSync.decode(buffer, offset); if (!result) return debug('Received invalid TimeSync message'); /** @@ -331,12 +333,12 @@ class Client extends EventEmitter { * const client = new bacnet(); * * client.on('timeSync', (request) => { - * console.log('address: ', device.address, ' - dateTime: ', device.dateTime); + * console.log('address: ', request.address, ' - dateTime: ', request.dateTime); * }); */ - this.emit('timeSync', {address: address, dateTime: result.dateTime}); + this.emit('timeSync', {address: address, dateTime: result.value}); } else if (service === baEnum.UnconfirmedServiceChoice.UTC_TIME_SYNCHRONIZATION) { - result = baServices.timeSync.decode(buffer, offset, length); + const result = baServices.timeSync.decode(buffer, offset); if (!result) return debug('Received invalid TimeSyncUTC message'); /** @@ -350,20 +352,20 @@ class Client extends EventEmitter { * const client = new bacnet(); * * client.on('timeSyncUTC', (request) => { - * console.log('address: ', device.address, ' - dateTime: ', device.dateTime); + * console.log('address: ', request.address, ' - dateTime: ', request.dateTime); * }); */ - this.emit('timeSyncUTC', {address: address, dateTime: result.dateTime}); + this.emit('timeSyncUTC', {address: address, dateTime: result.value}); } else if (service === baEnum.UnconfirmedServiceChoice.UNCONFIRMED_EVENT_NOTIFICATION) { - result = baServices.eventNotifyData.decode(buffer, offset, length); + const result = baServices.eventNotifyData.decode(buffer, offset); if (!result) return debug('Received invalid EventNotify message'); this.emit('eventNotify', {address: address, eventData: result.eventData}); } else if (service === baEnum.UnconfirmedServiceChoice.I_HAVE) { - result = baServices.iHaveBroadcast.decode(buffer, offset, length); + const result = baServices.iHaveBroadcast.decode(buffer, offset, length); if (!result) return debug('Received invalid ihaveBroadcast message'); this.emit('ihaveBroadcast', {address: address, eventData: result.eventData}); } else if (service === baEnum.UnconfirmedServiceChoice.UNCONFIRMED_PRIVATE_TRANSFER) { - result = baServices.privateTransfer.decode(buffer, offset, length); + const result = baServices.privateTransfer.decode(buffer, offset, length); if (!result) return debug('Received invalid privateTransfer message'); this.emit('privateTransfer', {address: address, eventData: result.eventData}); } else { @@ -371,7 +373,7 @@ class Client extends EventEmitter { } } - _handlePdu(address, type, buffer, offset, length) { + private _handlePdu(address: string, type: number, buffer: Buffer, offset: number, length: number) { let result; // Handle different PDU types switch (type & baEnum.PDU_TYPE_MASK) { @@ -421,7 +423,7 @@ class Client extends EventEmitter { } } - _handleNpdu(buffer, offset, msgLength, remoteAddress) { + private _handleNpdu(buffer: Buffer, offset: number, msgLength: number, remoteAddress: string) { // Check data length if (msgLength <= 0) return debug('No NPDU data -> Drop package'); // Parse baNpdu header @@ -437,9 +439,9 @@ class Client extends EventEmitter { this._handlePdu(remoteAddress, apduType, buffer, offset, msgLength); } - _receiveData(buffer, remoteAddress) { + private _receiveData(buffer: Buffer, remoteAddress: string) { // Check data length - if (buffer.length < baBvlc.BVLC_HEADER_LENGTH) return debug('Received invalid data -> Drop package'); + if (buffer.length < baEnum.BVLC_HEADER_LENGTH) return debug('Received invalid data -> Drop package'); // Parse BVLC header const result = baBvlc.decode(buffer, 0); if (!result) return debug('Received invalid BVLC header -> Drop package'); @@ -451,7 +453,7 @@ class Client extends EventEmitter { } } - _receiveError(err) { + private _receiveError(err: Error) { /** * @event bacstack.error * @param {error} err - The error object thrown by the underlying transport layer. @@ -481,7 +483,7 @@ class Client extends EventEmitter { * * client.whoIs(); */ - whoIs(options) { + whoIs(options?: {lowLimit?: number, highLimit?: number, address?: string}) { options = options || {}; const settings = { lowLimit: options.lowLimit, @@ -508,7 +510,7 @@ class Client extends EventEmitter { * * client.timeSync('192.168.1.43', new Date()); */ - timeSync(address, dateTime) { + timeSync(address: string, dateTime: Date) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, address); baApdu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.UNCONFIRMED_REQUEST, baEnum.UnconfirmedServiceChoice.TIME_SYNCHRONIZATION); @@ -529,7 +531,7 @@ class Client extends EventEmitter { * * client.timeSyncUTC('192.168.1.43', new Date()); */ - timeSyncUTC(address, dateTime) { + timeSyncUTC(address: string, dateTime: Date) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, address); baApdu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.UNCONFIRMED_REQUEST, baEnum.UnconfirmedServiceChoice.UTC_TIME_SYNCHRONIZATION); @@ -561,7 +563,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - readProperty(address, objectId, propertyId, options, next) { + readProperty(address: string, objectId: BACNetObjectID, propertyId: number, options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -612,7 +614,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - writeProperty(address, objectId, propertyId, values, options, next) { + writeProperty(address: string, objectId: BACNetObjectID, propertyId: number, values: BACNetAppData[], options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -656,7 +658,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - readPropertyMultiple(address, propertiesArray, options, next) { + readPropertyMultiple(address: string, propertiesArray: any[], options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -712,7 +714,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - writePropertyMultiple(address, values, options, next) { + writePropertyMultiple(address: string, values: any[], options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -748,7 +750,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - deviceCommunicationControl(address, timeDuration, enableDisable, options, next) { + deviceCommunicationControl(address: string, timeDuration: number, enableDisable: number, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -784,7 +786,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - reinitializeDevice(address, state, options, next) { + reinitializeDevice(address: string, state: number, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -823,7 +825,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - writeFile(address, objectId, position, fileBuffer, options, next) { + writeFile(address: string, objectId: BACNetObjectID, position: number, fileBuffer: number[][], options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -838,7 +840,7 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, address); this._addCallback(settings.invokeId, (err, data) => { if (err) return next(err); - const result = baServices.atomicWriteFile.decodeAcknowledge(data.buffer, data.offset, data.length); + const result = baServices.atomicWriteFile.decodeAcknowledge(data.buffer, data.offset); if (!result) return next(new Error('INVALID_DECODING')); next(null, result); }); @@ -866,7 +868,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - readFile(address, objectId, position, count, options, next) { + readFile(address: string, objectId: BACNetObjectID, position: number, count: number, options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -881,7 +883,7 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, address); this._addCallback(settings.invokeId, (err, data) => { if (err) return next(err); - const result = baServices.atomicReadFile.decodeAcknowledge(data.buffer, data.offset, data.length); + const result = baServices.atomicReadFile.decodeAcknowledge(data.buffer, data.offset); if (!result) return next(new Error('INVALID_DECODING')); next(null, result); }); @@ -909,7 +911,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - readRange(address, objectId, idxBegin, quantity, options, next) { + readRange(address: string, objectId: BACNetObjectID, idxBegin: number, quantity: number, options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -954,7 +956,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - subscribeCOV(address, objectId, subscribeId, cancel, issueConfirmedNotifications, lifetime, options, next) { + subscribeCOV(address: string, objectId: BACNetObjectID, subscribeId: number, cancel: boolean, issueConfirmedNotifications: boolean, lifetime: number, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -996,7 +998,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - subscribeProperty(address, objectId, monitoredProperty, subscribeId, cancel, issueConfirmedNotifications, options, next) { + subscribeProperty(address: string, objectId: BACNetObjectID, monitoredProperty: BACNetPropertyID, subscribeId: number, cancel: boolean, issueConfirmedNotifications: boolean, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1012,7 +1014,7 @@ class Client extends EventEmitter { this._addCallback(settings.invokeId, (err) => next(err)); } - createObject(address, objectId, values, options, next) { + createObject(address: string, objectId: BACNetObjectID, values: any, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1048,7 +1050,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - deleteObject(address, objectId, options, next) { + deleteObject(address: string, objectId: BACNetObjectID, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1064,7 +1066,7 @@ class Client extends EventEmitter { this._addCallback(settings.invokeId, (err) => next(err)); } - removeListElement(address, objectId, reference, values, options, next) { + removeListElement(address: string, objectId: BACNetObjectID, reference: BACNetPropertyID, values: any, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1080,7 +1082,7 @@ class Client extends EventEmitter { this._addCallback(settings.invokeId, (err) => next(err)); } - addListElement(address, objectId, reference, values, options, next) { + addListElement(address: string, objectId: BACNetObjectID, reference: BACNetPropertyID, values: any, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1113,7 +1115,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - getAlarmSummary(address, options, next) { + getAlarmSummary(address: string, options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1153,7 +1155,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - getEventInformation(address, objectId, options, next) { + getEventInformation(address: string, objectId: BACNetObjectID, options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1174,7 +1176,7 @@ class Client extends EventEmitter { }); } - acknowledgeAlarm(address, objectId, eventState, ackText, evTimeStamp, ackTimeStamp, options, next) { + acknowledgeAlarm(address: string, objectId: BACNetObjectID, eventState: number, ackText: string, evTimeStamp: any, ackTimeStamp: any, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1210,7 +1212,7 @@ class Client extends EventEmitter { * console.log('error: ', err); * }); */ - confirmedPrivateTransfer(address, vendorId, serviceNumber, data, options, next) { + confirmedPrivateTransfer(address: string, vendorId: number, serviceNumber: number, data: number[], options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1239,7 +1241,7 @@ class Client extends EventEmitter { * * client.unconfirmedPrivateTransfer('192.168.1.43', 0, 7, [0x00, 0xaa, 0xfa, 0xb1, 0x00]); */ - unconfirmedPrivateTransfer(address, vendorId, serviceNumber, data) { + unconfirmedPrivateTransfer(address: string, vendorId: number, serviceNumber: number, data: number[]) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, address); baApdu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.UNCONFIRMED_REQUEST, baEnum.UnconfirmedServiceChoice.UNCONFIRMED_PRIVATE_TRANSFER); @@ -1273,7 +1275,7 @@ class Client extends EventEmitter { * console.log('value: ', value); * }); */ - getEnrollmentSummary(address, acknowledgmentFilter, options, next) { + getEnrollmentSummary(address: string, acknowledgmentFilter: number, options: any, next: (err?: Error, result?: any) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1294,7 +1296,7 @@ class Client extends EventEmitter { }); } - unconfirmedEventNotification(address, eventNotification) { + unconfirmedEventNotification(address: string, eventNotification: any) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, address); baApdu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.UNCONFIRMED_REQUEST, baEnum.UnconfirmedServiceChoice.UNCONFIRMED_EVENT_NOTIFICATION); @@ -1303,7 +1305,7 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, address); } - confirmedEventNotification(address, eventNotification, options, next) { + confirmedEventNotification(address: string, eventNotification: any, options: any, next: (err?: Error) => void) { next = next || options; const settings = { maxSegments: options.maxSegments || baEnum.MaxSegmentsAccepted.SEGMENTS_65, @@ -1320,7 +1322,7 @@ class Client extends EventEmitter { } // Public Device Functions - readPropertyResponse(receiver, invokeId, objectId, property, value) { + readPropertyResponse(receiver: string, invokeId: number, objectId: BACNetObjectID, property: BACNetPropertyID, value: any[]) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, receiver); baApdu.encodeComplexAck(buffer, baEnum.PduTypes.COMPLEX_ACK, baEnum.ConfirmedServiceChoice.READ_PROPERTY, invokeId); @@ -1329,7 +1331,7 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, receiver); } - readPropertyMultipleResponse(receiver, invokeId, values) { + readPropertyMultipleResponse(receiver: string, invokeId: number, values: any[]) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, receiver); baApdu.encodeComplexAck(buffer, baEnum.PduTypes.COMPLEX_ACK, baEnum.ConfirmedServiceChoice.READ_PROPERTY_MULTIPLE, invokeId); @@ -1338,7 +1340,7 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, receiver); } - iAmResponse(deviceId, segmentation, vendorId) { + iAmResponse(deviceId: number, segmentation: number, vendorId: number) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, this._transport.getBroadcastAddress()); baApdu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.UNCONFIRMED_REQUEST, baEnum.UnconfirmedServiceChoice.I_AM); @@ -1347,16 +1349,16 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, this._transport.getBroadcastAddress()); } - iHaveResponse(deviceId, objectId, objectName) { + iHaveResponse(deviceId: BACNetObjectID, objectId: BACNetObjectID, objectName: string) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, this._transport.getBroadcastAddress()); - baApdu.EecodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.UNCONFIRMED_REQUEST, baEnum.UnconfirmedServiceChoice.I_HAVE); - baServices.EncodeIhaveBroadcast(buffer, deviceId, objectId, objectName); + baApdu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.UNCONFIRMED_REQUEST, baEnum.UnconfirmedServiceChoice.I_HAVE); + baServices.iHaveBroadcast.encode(buffer, deviceId, objectId, objectName); baBvlc.encode(buffer.buffer, baEnum.BvlcResultPurpose.ORIGINAL_BROADCAST_NPDU, buffer.offset); this._transport.send(buffer.buffer, buffer.offset, this._transport.getBroadcastAddress()); } - simpleAckResponse(receiver, service, invokeId) { + simpleAckResponse(receiver: string, service: number, invokeId: number) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, receiver); baApdu.encodeSimpleAck(buffer, baEnum.PduTypes.SIMPLE_ACK, service, invokeId); @@ -1364,7 +1366,7 @@ class Client extends EventEmitter { this._transport.send(buffer.buffer, buffer.offset, receiver); } - errorResponse(receiver, service, invokeId, errorClass, errorCode) { + errorResponse(receiver: string, service: number, invokeId: number, errorClass: number, errorCode: number) { const buffer = this._getBuffer(); baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE, receiver); baApdu.encodeError(buffer, baEnum.PduTypes.ERROR, service, invokeId); @@ -1386,4 +1388,3 @@ class Client extends EventEmitter { this._transport.close(); } } -module.exports = Client; diff --git a/lib/enum.js b/lib/enum.ts similarity index 91% rename from lib/enum.js rename to lib/enum.ts index 2a7e019b..d58acbf6 100644 --- a/lib/enum.js +++ b/lib/enum.ts @@ -1,22 +1,22 @@ 'use strict'; -module.exports.PDU_TYPE_MASK = 0xF0; -module.exports.ASN1_MAX_OBJECT = 0x3FF; -module.exports.ASN1_INSTANCE_BITS = 22; -module.exports.ASN1_MAX_INSTANCE = 0x3FFFFF; -module.exports.ASN1_MAX_BITSTRING_BYTES = 15; -module.exports.ASN1_ARRAY_ALL = 0xFFFFFFFF; -module.exports.ASN1_NO_PRIORITY = 0; -module.exports.ASN1_MIN_PRIORITY = 1; -module.exports.ASN1_MAX_PRIORITY = 16; -module.exports.ASN1_MAX_APPLICATION_TAG = 16; -module.exports.ASN1_MAX_OBJECT_TYPE = 1024; -module.exports.ASN1_MAX_PROPERTY_ID = 4194303; -module.exports.BVLL_TYPE_BACNET_IP = 0x81; -module.exports.BVLC_HEADER_LENGTH = 4; +export const PDU_TYPE_MASK = 0xF0; +export const ASN1_MAX_OBJECT = 0x3FF; +export const ASN1_INSTANCE_BITS = 22; +export const ASN1_MAX_INSTANCE = 0x3FFFFF; +export const ASN1_MAX_BITSTRING_BYTES = 15; +export const ASN1_ARRAY_ALL = 0xFFFFFFFF; +export const ASN1_NO_PRIORITY = 0; +export const ASN1_MIN_PRIORITY = 1; +export const ASN1_MAX_PRIORITY = 16; +export const ASN1_MAX_APPLICATION_TAG = 16; +export const ASN1_MAX_OBJECT_TYPE = 1024; +export const ASN1_MAX_PROPERTY_ID = 4194303; +export const BVLL_TYPE_BACNET_IP = 0x81; +export const BVLC_HEADER_LENGTH = 4; // ASHRE 135-2016 - 21 FORMAL DESCRIPTION OF APPLICATION PROTOCOL DATA UNITS - Enumerators -module.exports.ConfirmedServiceChoice = { +export const ConfirmedServiceChoice = { ACKNOWLEDGE_ALARM: 0, CONFIRMED_COV_NOTIFICATION: 1, CONFIRMED_EVENT_NOTIFICATION: 2, @@ -48,7 +48,7 @@ module.exports.ConfirmedServiceChoice = { CONFIRMED_COV_NOTIFICATION_MULTIPLE: 31 }; -module.exports.UnconfirmedServiceChoice = { +export const UnconfirmedServiceChoice = { I_AM: 0, I_HAVE: 1, UNCONFIRMED_COV_NOTIFICATION: 2, @@ -63,7 +63,7 @@ module.exports.UnconfirmedServiceChoice = { UNCONFIRMED_COV_NOTIFICATION_MULTIPLE: 11 }; -module.exports.AbortReason = { +export const AbortReason = { OTHER: 0, BUFFER_OVERFLOW: 1, INVALID_APDU_IN_THIS_STATE: 2, @@ -78,7 +78,7 @@ module.exports.AbortReason = { APDU_TOO_LONG: 11 }; -module.exports.RejectReason = { +export const RejectReason = { OTHER: 0, BUFFER_OVERFLOW: 1, INCONSISTENT_PARAMETERS: 2, @@ -91,7 +91,7 @@ module.exports.RejectReason = { UNRECOGNIZED_SERVICE: 9 }; -module.exports.ErrorClass = { +export const ErrorClass = { DEVICE: 0, OBJECT: 1, PROPERTY: 2, @@ -102,7 +102,7 @@ module.exports.ErrorClass = { COMMUNICATION: 7 }; -module.exports.ErrorCode = { +export const ErrorCode = { ABORT_APDU_TOO_LONG: 123, ABORT_APPLICATION_EXCEEDED_REPLY_TIME: 124, ABORT_BUFFER_OVERFLOW: 51, @@ -238,7 +238,7 @@ module.exports.ErrorCode = { WRITE_BDT_FAILED: 116 }; -module.exports.AccessAuthenticationFactorDisable = { +export const AccessAuthenticationFactorDisable = { NONE: 0, DISABLED: 1, DISABLED_LOST: 2, @@ -247,14 +247,14 @@ module.exports.AccessAuthenticationFactorDisable = { DISABLED_DESTROYED: 5 }; -module.exports.AccessCredentialDisable = { +export const AccessCredentialDisable = { NONE: 0, DISABLE: 1, DISABLE_MANUAL: 2, DISABLE_LOCKOUT: 3 }; -module.exports.AccessCredentialDisableReason = { +export const AccessCredentialDisableReason = { DISABLED: 0, DISABLED_NEEDS_PROVISIONING: 1, DISABLED_UNASSIGNED: 2, @@ -267,7 +267,7 @@ module.exports.AccessCredentialDisableReason = { DISABLED_MANUAL: 9 }; -module.exports.AccessEvent = { +export const AccessEvent = { NONE: 0, GRANTED: 1, MUSTER: 2, @@ -324,19 +324,19 @@ module.exports.AccessEvent = { DENIED_OTHER: 164 }; -module.exports.AccessPassbackMode = { +export const AccessPassbackMode = { PASSBACK_OFF: 0, HARD_PASSBACK: 1, SOFT_PASSBACK: 2 }; -module.exports.AccessUserType = { +export const AccessUserType = { ASSET: 0, GROUP: 1, PERSON: 2 }; -module.exports.AccessZoneOccupancyState = { +export const AccessZoneOccupancyState = { NORMAL: 0, BELOW_LOWER_LIMIT: 1, AT_LOWER_LIMIT: 2, @@ -346,12 +346,12 @@ module.exports.AccessZoneOccupancyState = { NOT_SUPPORTED: 6 }; -module.exports.Action = { +export const Action = { DIRECT: 0, REVERSE: 1 }; -module.exports.AuthenticationFactorType = { +export const AuthenticationFactorType = { UNDEFINED: 0, ERROR: 1, CUSTOM: 2, @@ -379,7 +379,7 @@ module.exports.AuthenticationFactorType = { USER_PASSWORD: 24 }; -module.exports.AuthenticationStatus = { +export const AuthenticationStatus = { NOT_READY: 0, READY: 1, DISABLED: 2, WAITING_FOR_AUTHENTICATION_FACTOR: 3, @@ -388,7 +388,7 @@ module.exports.AuthenticationStatus = { IN_PROGRESS: 6 }; -module.exports.AuthorizationExemption = { +export const AuthorizationExemption = { PASSBACK: 0, OCCUPANCY_CHECK: 1, ACCESS_RIGHTS: 2, @@ -398,7 +398,7 @@ module.exports.AuthorizationExemption = { AUTHORIZATION_DELAY: 6 }; -module.exports.AuthorizationMode = { +export const AuthorizationMode = { AUTHORIZE: 0, GRANT_ACTIVE: 1, DENY_ALL: 2, @@ -407,7 +407,7 @@ module.exports.AuthorizationMode = { NONE: 5 }; -module.exports.BackupState = { +export const BackupState = { IDLE: 0, PREPARING_FOR_BACKUP: 1, PREPARING_FOR_RESTORE: 2, @@ -417,7 +417,7 @@ module.exports.BackupState = { RESTORE_FAILURE: 6 }; -module.exports.BinaryLightingPV = { +export const BinaryLightingPV = { OFF: 0, ON: 1, WARN: 2, @@ -426,12 +426,12 @@ module.exports.BinaryLightingPV = { STOP: 5 }; -module.exports.BinaryPV = { +export const BinaryPV = { INACTIVE: 0, ACTIVE: 1 }; -module.exports.DeviceStatus = { +export const DeviceStatus = { OPERATIONAL: 0, OPERATIONAL_READ_ONLY: 1, DOWNLOAD_REQUIRED: 2, @@ -440,7 +440,7 @@ module.exports.DeviceStatus = { BACKUP_IN_PROGRESS: 5 }; -module.exports.DoorAlarmState = { +export const DoorAlarmState = { NORMAL: 0, ALARM: 1, DOOR_OPEN_TOO_LONG: 2, @@ -452,13 +452,13 @@ module.exports.DoorAlarmState = { EGRESS_OPEN: 8 }; -module.exports.DoorSecuredStatus = { +export const DoorSecuredStatus = { SECURED: 0, UNSECURED: 1, UNKNOWN: 2 }; -module.exports.DoorStatus = { +export const DoorStatus = { CLOSED: 0, OPENED: 1, UNKNOWN: 2, @@ -471,14 +471,14 @@ module.exports.DoorStatus = { LIMITED_OPENED: 9 }; -module.exports.DoorValue = { +export const DoorValue = { LOCK: 0, UNLOCK: 1, PULSE_UNLOCK: 2, EXTENDED_PULSE_UNLOCK: 3 }; -module.exports.EngineeringUnits = { +export const EngineeringUnits = { METERS_PER_SECOND_PER_SECOND: 166, SQUARE_METERS: 0, SQUARE_CENTIMETERS: 116, @@ -743,7 +743,7 @@ module.exports.EngineeringUnits = { MINUTES_PER_DEGREE_KELVIN: 236 }; -module.exports.EscalatorFault = { +export const EscalatorFault = { CONTROLLER_FAULT: 0, DRIVE_AND_MOTOR_FAULT: 1, MECHANICAL_COMPONENT_FAULT: 2, @@ -755,7 +755,7 @@ module.exports.EscalatorFault = { COMB_PLATE_FAULT: 8 }; -module.exports.EscalatorMode = { +export const EscalatorMode = { UNKNOWN: 0, STOP: 1, UP: 2, @@ -764,7 +764,7 @@ module.exports.EscalatorMode = { OUT_OF_SERVICE: 5 }; -module.exports.EscalatorOperationDirection = { +export const EscalatorOperationDirection = { UNKNOWN: 0, STOPPED: 1, UP_RATED_SPEED: 2, @@ -773,7 +773,7 @@ module.exports.EscalatorOperationDirection = { DOWN_REDUCED_SPEED: 5 }; -module.exports.EventState = { +export const EventState = { NORMAL: 0, FAULT: 1, OFFNORMAL: 2, @@ -782,7 +782,7 @@ module.exports.EventState = { LIFE_SAFETY_ALARM: 5 }; -module.exports.EventType = { +export const EventType = { CHANGE_OF_BITSTRING: 0, CHANGE_OF_STATE: 1, CHANGE_OF_VALUE: 2, @@ -806,7 +806,7 @@ module.exports.EventType = { CHANGE_OF_TIMER: 22 }; -module.exports.FaultType = { +export const FaultType = { NONE: 0, FAULT_CHARACTERSTRING: 1, FAULT_EXTENDED: 2, @@ -817,18 +817,18 @@ module.exports.FaultType = { FAULT_LISTED: 7 }; -module.exports.FileAccessMethod = { +export const FileAccessMethod = { RECORD_ACCESS: 0, STREAM_ACCESS: 1 }; -module.exports.IPMode = { +export const IPMode = { NORMAL: 0, FOREIGN: 1, BBMD: 2 }; -module.exports.LifeSafetyMode = { +export const LifeSafetyMode = { OFF: 0, ON: 1, TEST: 2, @@ -846,7 +846,7 @@ module.exports.LifeSafetyMode = { DEFAULT: 14 }; -module.exports.LifeSafetyOperation = { +export const LifeSafetyOperation = { NONE: 0, SILENCE: 1, SILENCE_AUDIBLE: 2, @@ -859,7 +859,7 @@ module.exports.LifeSafetyOperation = { UNSILENCE_VISUAL: 9 }; -module.exports.LifeSafetyState = { +export const LifeSafetyState = { QUIET: 0, PRE_ALARM: 1, ALARM: 2, @@ -886,7 +886,7 @@ module.exports.LifeSafetyState = { TEST_SUPERVISORY: 23 }; -module.exports.LiftCarDirection = { +export const LiftCarDirection = { UNKNOWN: 0, NONE: 1, STOPPED: 2, @@ -895,13 +895,13 @@ module.exports.LiftCarDirection = { UP_AND_DOWN: 5 }; -module.exports.LiftCarDoorCommand = { +export const LiftCarDoorCommand = { NONE: 0, OPEN: 1, CLOSE: 2 }; -module.exports.LiftCarDriveStatus = { +export const LiftCarDriveStatus = { UNKNOWN: 0, STATIONARY: 1, BRAKING: 2, @@ -914,7 +914,7 @@ module.exports.LiftCarDriveStatus = { MULTI_FLOOR_JUMP: 9 }; -module.exports.LiftCarMode = { +export const LiftCarMode = { UNKNOWN: 0, NORMAL: 1, VIP: 2, @@ -931,7 +931,7 @@ module.exports.LiftCarMode = { OCCUPANT_EVACUATION: 13 }; -module.exports.LiftFault = { +export const LiftFault = { CONTROLLER_FAULT: 0, DRIVE_AND_MOTOR_FAULT: 1, GOVERNOR_AND_SAFETY_GEAR_FAULT: 2, @@ -951,7 +951,7 @@ module.exports.LiftFault = { LOAD_MEASUREMENT_FAULT: 16 }; -module.exports.LiftGroupMode = { +export const LiftGroupMode = { UNKNOWN: 0, NORMAL: 1, DOWN_PEAK: 2, @@ -961,7 +961,7 @@ module.exports.LiftGroupMode = { UP_PEAK: 6 }; -module.exports.LightingInProgress = { +export const LightingInProgress = { IDLE: 0, FADE_ACTIVE: 1, RAMP_ACTIVE: 2, @@ -969,7 +969,7 @@ module.exports.LightingInProgress = { OTHER: 4 }; -module.exports.LightingOperation = { +export const LightingOperation = { NONE: 0, FADE_TO: 1, RAMP_TO: 2, @@ -983,13 +983,13 @@ module.exports.LightingOperation = { STOP: 10 }; -module.exports.LightingTransition = { +export const LightingTransition = { NONE: 0, FADE: 1, RAMP: 2 }; -module.exports.LockStatus = { +export const LockStatus = { LOCKED: 0, UNLOCKED: 1, LOCK_FAULT: 2, @@ -997,27 +997,27 @@ module.exports.LockStatus = { UNKNOWN: 4 }; -module.exports.LoggingType = { +export const LoggingType = { POLLED: 0, COV: 1, TRIGGERED: 2 }; -module.exports.Maintenance = { +export const Maintenance = { NONE: 0, PERIODIC_TEST: 1, NEED_SERVICE_OPERATIONAL: 2, NEED_SERVICE_INOPERATIVE: 3 }; -module.exports.NetworkNumberQuality = { +export const NetworkNumberQuality = { UNKNOWN: 0, LEARNED: 1, LEARNED_CONFIGURED: 2, CONFIGURED: 3 }; -module.exports.NetworkPortCommand = { +export const NetworkPortCommand = { IDLE: 0, DISCARD_CHANGES: 1, RENEW_FD_REGISTRATION: 2, @@ -1028,7 +1028,7 @@ module.exports.NetworkPortCommand = { RESTART_PORT: 7 }; -module.exports.NetworkType = { +export const NetworkType = { ETHERNET: 0, ARCNET: 1, MSTP: 2, @@ -1041,7 +1041,7 @@ module.exports.NetworkType = { SERIAL: 10 }; -module.exports.NodeType = { +export const NodeType = { UNKNOWN: 0, SYSTEM: 1, NETWORK: 2, @@ -1066,13 +1066,13 @@ module.exports.NodeType = { ZONE: 21 }; -module.exports.NotifyType = { +export const NotifyType = { ALARM: 0, EVENT: 1, ACK_NOTIFICATION: 2 }; -module.exports.ObjectType = { +export const ObjectType = { ACCESS_CREDENTIAL: 32, ACCESS_DOOR: 30, ACCESS_POINT: 33, @@ -1135,12 +1135,12 @@ module.exports.ObjectType = { TREND_LOG_MULTIPLE: 27 }; -module.exports.Polarity = { +export const Polarity = { NORMAL: 0, REVERSE: 1 }; -module.exports.ProgramError = { +export const ProgramError = { NORMAL: 0, LOAD_FAILED: 1, INTERNAL: 2, @@ -1148,7 +1148,7 @@ module.exports.ProgramError = { OTHER: 4 }; -module.exports.ProgramRequest = { +export const ProgramRequest = { READY: 0, LOAD: 1, RUN: 2, @@ -1157,7 +1157,7 @@ module.exports.ProgramRequest = { UNLOAD: 5 }; -module.exports.ProgramState = { +export const ProgramState = { IDLE: 0, LOADING: 1, RUNNING: 2, @@ -1166,7 +1166,7 @@ module.exports.ProgramState = { UNLOADING: 5 }; -module.exports.PropertyIdentifier = { +export const PropertyIdentifier = { ABSENTEE_LIMIT: 244, ACCEPTED_MODES: 175, ACCESS_ALARM_EVENTS: 245, @@ -1624,14 +1624,14 @@ module.exports.PropertyIdentifier = { ZONE_TO: 321 }; -module.exports.ProtocolLevel = { +export const ProtocolLevel = { PHYSICAL: 0, PROTOCOL: 1, BACNET_APPLICATION: 2, NON_BACNET_APPLICATION: 3 }; -module.exports.Relationship = { +export const Relationship = { UNKNOWN: 0, DEFAULT: 1, CONTAINS: 2, @@ -1664,7 +1664,7 @@ module.exports.Relationship = { RECEIVES_STEAM: 29 }; -module.exports.Reliability = { +export const Reliability = { NO_FAULT_DETECTED: 0, NO_SENSOR: 1, OVER_RANGE: 2, @@ -1691,7 +1691,7 @@ module.exports.Reliability = { REFERENCED_OBJECT_FAULT: 24 }; -module.exports.RestartReason = { +export const RestartReason = { UNKNOWN: 0, COLDSTART: 1, WARMSTART: 2, @@ -1703,7 +1703,7 @@ module.exports.RestartReason = { ACTIVATE_CHANGES: 8 }; -module.exports.SecurityLevel = { +export const SecurityLevel = { INCAPABLE: 0, PLAIN: 1, SIGNED: 2, @@ -1712,41 +1712,41 @@ module.exports.SecurityLevel = { ENCRYPTED_END_TO_END: 5 }; -module.exports.SecurityPolicy = { +export const SecurityPolicy = { PLAIN_NON_TRUSTED: 0, PLAIN_TRUSTED: 1, SIGNED_TRUSTED: 2, ENCRYPTED_TRUSTED: 3 }; -module.exports.Segmentation = { +export const Segmentation = { SEGMENTED_BOTH: 0, SEGMENTED_TRANSMIT: 1, SEGMENTED_RECEIVE: 2, NO_SEGMENTATION: 3 }; -module.exports.ShedState = { +export const ShedState = { SHED_INACTIVE: 0, SHED_REQUEST_PENDING: 1, SHED_COMPLIANT: 2, SHED_NON_COMPLIANT: 3 }; -module.exports.SilencedState = { +export const SilencedState = { UNSILENCED: 0, AUDIBLE_SILENCED: 1, VISIBLE_SILENCED: 2, ALL_SILENCED: 3 }; -module.exports.TimerState = { +export const TimerState = { IDLE: 0, RUNNING: 1, EXPIRED: 2 }; -module.exports.TimerTransition = { +export const TimerTransition = { NONE: 0, IDLE_TO_RUNNING: 1, RUNNING_TO_IDLE: 2, @@ -1757,7 +1757,7 @@ module.exports.TimerTransition = { EXPIRED_TO_RUNNING: 7 }; -module.exports.VTClass = { +export const VTClass = { DEFAULT_TERMINAL: 0, ANSI_X3_64: 1, DEC_VT52: 2, @@ -1767,7 +1767,7 @@ module.exports.VTClass = { IBM_3130: 6 }; -module.exports.WriteStatus = { +export const WriteStatus = { IDLE: 0, IN_PROGRESS: 1, SUCCESSFUL: 2, @@ -1775,7 +1775,7 @@ module.exports.WriteStatus = { }; // ASHRE 135-2016 - 21 FORMAL DESCRIPTION OF APPLICATION PROTOCOL DATA UNITS - Bitstrings -module.exports.DaysOfWeek = { +export const DaysOfWeek = { MONDAY: 0, TUESDAY: 1, WEDNESDAY: 2, @@ -1785,24 +1785,24 @@ module.exports.DaysOfWeek = { SUNDAY: 6 }; -module.exports.EventTransitionBits = { +export const EventTransitionBits = { TO_OFFNORMAL: 0, TO_FAULT: 1, TO_NORMAL: 2 }; -module.exports.LimitEnable = { +export const LimitEnable = { LOW_LIMIT_ENABLE: 0, HIGH_LIMIT_ENABLE: 1 }; -module.exports.LogStatus = { +export const LogStatus = { LOG_DISABLED: 0, BUFFER_PURGED: 1, LOG_INTERRUPTED: 2 }; -module.exports.ObjectTypesSupported = { +export const ObjectTypesSupported = { ANALOG_INPUT: 0, ANALOG_OUTPUT: 1, ANALOG_VALUE: 2, @@ -1865,13 +1865,13 @@ module.exports.ObjectTypesSupported = { LIFT: 59 }; -module.exports.ResultFlags = { +export const ResultFlags = { FIRST_ITEM: 0, LAST_ITEM: 1, MORE_ITEMS: 2 }; -module.exports.ServicesSupported = { +export const ServicesSupported = { ACKNOWLEDGE_ALARM: 0, CONFIRMED_COV_NOTIFICATION: 1, CONFIRMED_EVENT_NOTIFICATION: 2, @@ -1918,7 +1918,7 @@ module.exports.ServicesSupported = { UNCONFIRMED_COV_NOTIFICATION_MULTIPLE: 43 }; -module.exports.StatusFlags = { +export const StatusFlags = { IN_ALARM: 0, FAULT: 1, OVERRIDDEN: 2, @@ -1930,7 +1930,7 @@ module.exports.StatusFlags = { * @readonly * @enum {ApplicationTags} */ -module.exports.ApplicationTags = { +export const ApplicationTags = { NULL: 0, BOOLEAN: 1, UNSIGNED_INTEGER: 2, @@ -1969,7 +1969,7 @@ module.exports.ApplicationTags = { }; // ASHRE 135-2016 - J.2.1.1 BVLC-Result: Format - Enumerators -module.exports.BvlcResultFormat = { +export const BvlcResultFormat = { SUCCESSFUL_COMPLETION: 0x0000, WRITE_BROADCAST_DISTRIBUTION_TABLE_NAK: 0x0010, READ_BROADCAST_DISTRIBUTION_TABLE_NAK: 0x0020, @@ -1980,7 +1980,7 @@ module.exports.BvlcResultFormat = { }; // ASHRE 135-2016 - J.2.1 BVLC-Result: Purpose - Enumerators -module.exports.BvlcResultPurpose = { +export const BvlcResultPurpose = { BVLC_RESULT: 0x00, WRITE_BROADCAST_DISTRIBUTION_TABLE: 0x01, READ_BROADCAST_DISTRIBUTION_TABLE: 0x02, @@ -1997,7 +1997,7 @@ module.exports.BvlcResultPurpose = { }; // ASHRE 135-2016 - 20.2.9 Encoding of a Character String Value - Enumerators -module.exports.CharacterStringEncoding = { +export const CharacterStringEncoding = { UTF_8: 0, MICROSOFT_DBCS: 1, JIS_X_0208: 2, @@ -2007,7 +2007,7 @@ module.exports.CharacterStringEncoding = { }; // ASHRE 135-2016 - 13.3.3 CHANGE_OF_VALUE Event Algorithm - Internal -module.exports.CovTypes = { +export const CovTypes = { REAL: 0, BIT_STRING: 1 }; @@ -2017,7 +2017,7 @@ module.exports.CovTypes = { * @readonly * @enum {EnableDisable} */ -module.exports.EnableDisable = { +export const EnableDisable = { ENABLE: 0, DISABLE: 1, DISABLE_INITIATION: 2 @@ -2028,7 +2028,7 @@ module.exports.EnableDisable = { * @readonly * @enum {MaxApduLengthAccepted} */ -module.exports.MaxApduLengthAccepted = { +export const MaxApduLengthAccepted = { OCTETS_50: 0b0000, OCTETS_128: 0b0001, OCTETS_206: 0b0010, @@ -2042,7 +2042,7 @@ module.exports.MaxApduLengthAccepted = { * @readonly * @enum {MaxSegmentsAccepted} */ -module.exports.MaxSegmentsAccepted = { +export const MaxSegmentsAccepted = { SEGMENTS_0: (0b000 << 4), SEGMENTS_2: (0b001 << 4), SEGMENTS_4: (0b010 << 4), @@ -2054,7 +2054,7 @@ module.exports.MaxSegmentsAccepted = { }; // ASHRE 135-2016 - 6.2.4 Network Layer Message Type - Enumerators -module.exports.NetworkLayerMessageType = { +export const NetworkLayerMessageType = { WHO_IS_ROUTER_TO_NETWORK: 0x00, I_AM_ROUTER_TO_NETWORK: 0x01, I_COULD_BE_ROUTER_TO_NETWORK: 0x02, @@ -2078,7 +2078,7 @@ module.exports.NetworkLayerMessageType = { }; // ASHRE 135-2016 - 6.2.2 Network Layer Protocol Control Information - Enumerators -module.exports.NpduControlBits = { +export const NpduControlBits = { EXPECTING_REPLY: (1 << 2), SOURCE_SPECIFIED: (1 << 3), DESTINATION_SPECIFIED: (1 << 5), @@ -2086,7 +2086,7 @@ module.exports.NpduControlBits = { }; // ASHRE 135-2016 - 6.2.2 Network Layer Protocol Control Information - Enumerators -module.exports.NpduControlPriority = { +export const NpduControlPriority = { NORMAL_MESSAGE: 0b00, URGENT_MESSAGE: 0b01, CRITICAL_EQUIPMENT_MESSAGE: 0b10, @@ -2094,20 +2094,20 @@ module.exports.NpduControlPriority = { }; // ASHRE 135-2016 - 20.1.2.11 Format of the BACnet-Confirmed-Request-PDU - Enumerators -module.exports.PduConReqBits = { +export const PduConReqBits = { SEGMENTED_RESPONSE_ACCEPTED: (1 << 1), MORE_FOLLOWS: (1 << 2), SEGMENTED_MESSAGE: (1 << 3) }; // ASHRE 135-2016 - 20.1.6.6 Format of the BACnet-SegmentACK-PDU - Enumerators -module.exports.PduSegAckBits = { +export const PduSegAckBits = { SERVER: (1 << 0), NEGATIVE_ACK: (1 << 1) }; // ASHRE 135-2016 - 21 FORMAL DESCRIPTION OF APPLICATION PROTOCOL DATA UNITS - Enumerators -module.exports.PduTypes = { +export const PduTypes = { CONFIRMED_REQUEST: (0 << 4), UNCONFIRMED_REQUEST: (1 << 4), SIMPLE_ACK: (2 << 4), @@ -2119,7 +2119,7 @@ module.exports.PduTypes = { }; // ASHRE 135-2016 - 21 FORMAL DESCRIPTION OF APPLICATION PROTOCOL DATA UNITS - Enumerators -module.exports.PropertyStates = { +export const PropertyStates = { BOOLEAN_VALUE: 0, BINARY_VALUE: 1, EVENT_TYPE: 2, @@ -2181,7 +2181,7 @@ module.exports.PropertyStates = { }; // ASHRE 135-2016 - 15.8.1.1.4 Range - Internal -module.exports.ReadRangeType = { +export const ReadRangeType = { BY_POSITION: 0, BY_SEQUENCE_NUMBER: 1, BY_TIME_REFERENCE_TIME_COUNT: 2 @@ -2192,7 +2192,7 @@ module.exports.ReadRangeType = { * @readonly * @enum {ReinitializedState} */ -module.exports.ReinitializedState = { +export const ReinitializedState = { COLDSTART: 0, WARMSTART: 1, STARTBACKUP: 2, @@ -2204,7 +2204,7 @@ module.exports.ReinitializedState = { }; // ASHRE 135-2016 - 21 FORMAL DESCRIPTION OF APPLICATION PROTOCOL DATA UNITS - Internal -module.exports.TimeStamp = { +export const TimeStamp = { TIME: 0, SEQUENCE_NUMBER: 1, DATETIME: 2 diff --git a/lib/npdu.js b/lib/npdu.ts similarity index 80% rename from lib/npdu.js rename to lib/npdu.ts index 369a9e73..30598e85 100644 --- a/lib/npdu.js +++ b/lib/npdu.ts @@ -1,6 +1,7 @@ 'use strict'; -const baEnum = require('./enum'); +import * as baEnum from './enum'; +import { EncodeBuffer, BACNetAddress } from './types'; const BACNET_PROTOCOL_VERSION = 1; const BacnetAddressTypes = { @@ -8,9 +9,9 @@ const BacnetAddressTypes = { IP: 1 }; -const decodeTarget = (buffer, offset) => { +const decodeTarget = (buffer: Buffer, offset: number) => { let len = 0; - const target = {type: BacnetAddressTypes.NONE, net: (buffer[offset + len++] << 8) | (buffer[offset + len++] << 0)}; + const target: BACNetAddress = {type: BacnetAddressTypes.NONE, net: (buffer[offset + len++] << 8) | (buffer[offset + len++] << 0)}; const adrLen = buffer[offset + len++]; if (adrLen > 0) { target.adr = []; @@ -24,7 +25,7 @@ const decodeTarget = (buffer, offset) => { }; }; -const encodeTarget = (buffer, target) => { +const encodeTarget = (buffer: EncodeBuffer, target: BACNetAddress) => { buffer.buffer[buffer.offset++] = (target.net & 0xFF00) >> 8; buffer.buffer[buffer.offset++] = (target.net & 0x00FF) >> 0; if (target.net === 0xFFFF || !target.adr) { @@ -39,22 +40,22 @@ const encodeTarget = (buffer, target) => { } }; -module.exports.decodeFunction = (buffer, offset) => { +export const decodeFunction = (buffer: Buffer, offset: number) => { if (buffer[offset + 0] !== BACNET_PROTOCOL_VERSION) return; return buffer[offset + 1]; }; -module.exports.decode = (buffer, offset) => { +export const decode = (buffer: Buffer, offset: number) => { const orgOffset = offset; offset++; const funct = buffer[offset++]; - let destination; + let destination: BACNetAddress; if (funct & baEnum.NpduControlBits.DESTINATION_SPECIFIED) { const tmpDestination = decodeTarget(buffer, offset); offset += tmpDestination.len; destination = tmpDestination.target; } - let source; + let source: BACNetAddress; if (funct & baEnum.NpduControlBits.SOURCE_SPECIFIED) { const tmpSource = decodeTarget(buffer, offset); offset += tmpSource.len; @@ -86,7 +87,7 @@ module.exports.decode = (buffer, offset) => { }; }; -module.exports.encode = (buffer, funct, destination, source, hopCount, networkMsgType, vendorId) => { +export const encode = (buffer: EncodeBuffer, funct: number, destination?: any, source?: BACNetAddress, hopCount?: number, networkMsgType?: number, vendorId?: number) => { const hasDestination = destination && destination.net > 0; const hasSource = source && source.net > 0 && source.net !== 0xFFFF; diff --git a/lib/services/add-list-element.js b/lib/services/add-list-element.ts similarity index 74% rename from lib/services/add-list-element.js rename to lib/services/add-list-element.ts index 6eaff0b1..8104d443 100644 --- a/lib/services/add-list-element.js +++ b/lib/services/add-list-element.ts @@ -1,26 +1,25 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, objectId, propertyId, arrayIndex, values) => { +export const encode = (buffer: EncodeBuffer, objectId: BACNetObjectID, propertyId: number, arrayIndex: number, values: any) => { baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance); baAsn1.encodeContextEnumerated(buffer, 1, propertyId); if (arrayIndex !== baEnum.ASN1_ARRAY_ALL) { baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex); } baAsn1.encodeOpeningTag(buffer, 3); - values.forEach((value) => { - baAsn1.bacappEncodeApplicationData(buffer, value); - }); + values.forEach((value: any) => baAsn1.bacappEncodeApplicationData(buffer, value)); baAsn1.encodeClosingTag(buffer, 3); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - const value = {}; + let result: any; + let decodedValue: any; + const value: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); @@ -30,15 +29,13 @@ module.exports.decode = (buffer, offset, apduLen) => { len += result.len; decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value); len += decodedValue.len; - value.property = {id: decodedValue.value}; + value.property = {id: decodedValue.value, index: baEnum.ASN1_ARRAY_ALL}; if (len < apduLen && baAsn1.decodeIsContextTag(buffer, offset + len, 2)) { result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value); len += decodedValue.len; value.property.index = decodedValue.value; - } else { - value.property.index = baEnum.ASN1_ARRAY_ALL; } const values = []; if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) return; diff --git a/lib/services/alarm-acknowledge.js b/lib/services/alarm-acknowledge.ts similarity index 73% rename from lib/services/alarm-acknowledge.js rename to lib/services/alarm-acknowledge.ts index 3b9ba219..2b591481 100644 --- a/lib/services/alarm-acknowledge.js +++ b/lib/services/alarm-acknowledge.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, ackProcessId, eventObjectId, eventStateAcknowledged, ackSource, eventTimeStamp, ackTimeStamp) => { +export const encode = (buffer: EncodeBuffer, ackProcessId: number, eventObjectId: BACNetObjectID, eventStateAcknowledged: number, ackSource: string, eventTimeStamp: any, ackTimeStamp: any) => { baAsn1.encodeContextUnsigned(buffer, 0, ackProcessId); baAsn1.encodeContextObjectId(buffer, 1, eventObjectId.type, eventObjectId.instance); baAsn1.encodeContextEnumerated(buffer, 2, eventStateAcknowledged); @@ -12,13 +13,11 @@ module.exports.encode = (buffer, ackProcessId, eventObjectId, eventStateAcknowle baAsn1.bacappEncodeContextTimestamp(buffer, 5, ackTimeStamp); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; - let result; - let decodedValue; - let date; - let time; + const value: any = {}; + let result: any; + let decodedValue: any; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value); @@ -39,7 +38,7 @@ module.exports.decode = (buffer, offset, apduLen) => { result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber === baEnum.TimeStamp.TIME) { - decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len, result.value); + decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len); len += decodedValue.len; value.eventTimeStamp = decodedValue.value; } else if (result.tagNumber === baEnum.TimeStamp.SEQUENCE_NUMBER) { @@ -47,12 +46,12 @@ module.exports.decode = (buffer, offset, apduLen) => { len += decodedValue.len; value.eventTimeStamp = decodedValue.value; } else if (result.tagNumber === baEnum.TimeStamp.DATETIME) { - date = baAsn1.decodeApplicationDate(buffer, offset + len); - len += date.len; - date = date.value.value; - time = baAsn1.decodeApplicationTime(buffer, offset + len); - len += time.len; - time = time.value.value; + const dateRaw = baAsn1.decodeApplicationDate(buffer, offset + len); + len += dateRaw.len; + const date = dateRaw.value; + const timeRaw = baAsn1.decodeApplicationTime(buffer, offset + len); + len += timeRaw.len; + const time = timeRaw.value; value.eventTimeStamp = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()); len++; } @@ -67,7 +66,7 @@ module.exports.decode = (buffer, offset, apduLen) => { result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber === baEnum.TimeStamp.TIME) { - decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len, result.value); + decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len); len += decodedValue.len; value.acknowledgeTimeStamp = decodedValue.value; } else if (result.tagNumber === baEnum.TimeStamp.SEQUENCE_NUMBER) { @@ -75,12 +74,12 @@ module.exports.decode = (buffer, offset, apduLen) => { len += decodedValue.len; value.acknowledgeTimeStamp = decodedValue.value; } else if (result.tagNumber === baEnum.TimeStamp.DATETIME) { - date = baAsn1.decodeApplicationDate(buffer, offset + len); - len += date.len; - date = date.value.value; - time = baAsn1.decodeApplicationTime(buffer, offset + len); - len += time.len; - time = time.value.value; + const dateRaw = baAsn1.decodeApplicationDate(buffer, offset + len); + len += dateRaw.len; + const date = dateRaw.value; + const timeRaw = baAsn1.decodeApplicationTime(buffer, offset + len); + len += timeRaw.len; + const time = timeRaw.value; value.acknowledgeTimeStamp = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()); len++; } diff --git a/lib/services/alarm-summary.js b/lib/services/alarm-summary.ts similarity index 77% rename from lib/services/alarm-summary.js rename to lib/services/alarm-summary.ts index adc6ac97..5c78785d 100644 --- a/lib/services/alarm-summary.js +++ b/lib/services/alarm-summary.ts @@ -1,8 +1,9 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer, BACNetAlarm} from '../types'; -module.exports.encode = (buffer, alarms) => { +export const encode = (buffer: EncodeBuffer, alarms: BACNetAlarm[]) => { alarms.forEach((alarm) => { baAsn1.encodeContextObjectId(buffer, 12, alarm.objectId.type, alarm.objectId.instance); baAsn1.encodeContextEnumerated(buffer, 9, alarm.alarmState); @@ -10,13 +11,13 @@ module.exports.encode = (buffer, alarms) => { }); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - const alarms = []; + let result: any; + let decodedValue: any; + const alarms: BACNetAlarm[] = []; while ((apduLen - 3 - len) > 0) { - const value = {}; + const value: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); diff --git a/lib/services/atomic-read-file.js b/lib/services/atomic-read-file.ts similarity index 87% rename from lib/services/atomic-read-file.js rename to lib/services/atomic-read-file.ts index f9be2246..79d55704 100644 --- a/lib/services/atomic-read-file.js +++ b/lib/services/atomic-read-file.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, isStream, objectId, position, count) => { +export const encode = (buffer: EncodeBuffer, isStream: boolean, objectId: BACNetObjectID, position: number, count: number) => { baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance); if (isStream) { baAsn1.encodeOpeningTag(buffer, 0); @@ -18,7 +19,7 @@ module.exports.encode = (buffer, isStream, objectId, position, count) => { } }; -module.exports.decode = (buffer, offset) => { +export const decode = (buffer: Buffer, offset: number) => { let len = 0; let result; let decodedValue; @@ -78,7 +79,7 @@ module.exports.decode = (buffer, offset) => { }; }; -module.exports.encodeAcknowledge = (buffer, isStream, endOfFile, position, blockCount, blocks, counts) => { +export const encodeAcknowledge = (buffer: EncodeBuffer, isStream: boolean, endOfFile: boolean, position: number, blockCount: number, blocks: number[][], counts: number[]) => { baAsn1.encodeApplicationBoolean(buffer, endOfFile); if (isStream) { baAsn1.encodeOpeningTag(buffer, 0); @@ -96,13 +97,13 @@ module.exports.encodeAcknowledge = (buffer, isStream, endOfFile, position, block } }; -module.exports.decodeAcknowledge = (buffer, offset) => { +export const decodeAcknowledge = (buffer: Buffer, offset: number) => { let len = 0; - let result; - let decodedValue; - let isStream; - let position; - let targetBuffer; + let result: any; + let decodedValue: any; + let isStream: boolean; + let position: number; + let targetBuffer: Buffer; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== baEnum.ApplicationTags.BOOLEAN) return; diff --git a/lib/services/atomic-write-file.js b/lib/services/atomic-write-file.ts similarity index 86% rename from lib/services/atomic-write-file.js rename to lib/services/atomic-write-file.ts index 62adf99d..79fb7cd1 100644 --- a/lib/services/atomic-write-file.js +++ b/lib/services/atomic-write-file.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {BACNetObjectID, EncodeBuffer} from '../types'; -module.exports.encode = (buffer, isStream, objectId, position, blocks) => { +export const encode = (buffer: EncodeBuffer, isStream: boolean, objectId: BACNetObjectID, position: number, blocks: number[][]) => { baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance); if (isStream) { baAsn1.encodeOpeningTag(buffer, 0); @@ -21,14 +22,14 @@ module.exports.encode = (buffer, isStream, objectId, position, blocks) => { } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - let isStream; - let position; + let result: any; + let decodedValue: any; + let isStream: boolean; + let position: number; const blocks = []; - let blockCount; + let blockCount: number; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== baEnum.ApplicationTags.OBJECTIDENTIFIER) return; @@ -89,7 +90,7 @@ module.exports.decode = (buffer, offset, apduLen) => { }; }; -module.exports.encodeAcknowledge = (buffer, isStream, position) => { +export const encodeAcknowledge = (buffer: EncodeBuffer, isStream: boolean, position: number) => { if (isStream) { baAsn1.encodeContextSigned(buffer, 0, position); } else { @@ -97,7 +98,7 @@ module.exports.encodeAcknowledge = (buffer, isStream, position) => { } }; -module.exports.decodeAcknowledge = (buffer, offset) => { +export const decodeAcknowledge = (buffer: Buffer, offset: number) => { let len = 0; let isStream = false; let position = 0; diff --git a/lib/services/cov-notify.js b/lib/services/cov-notify.ts similarity index 88% rename from lib/services/cov-notify.js rename to lib/services/cov-notify.ts index fc243169..a77e512a 100644 --- a/lib/services/cov-notify.js +++ b/lib/services/cov-notify.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, subscriberProcessId, initiatingDeviceId, monitoredObjectId, timeRemaining, values) => { +export const encode = (buffer: EncodeBuffer, subscriberProcessId: number, initiatingDeviceId: number, monitoredObjectId: BACNetObjectID, timeRemaining: number, values: any[]) => { baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId); baAsn1.encodeContextObjectId(buffer, 1, baEnum.ObjectType.DEVICE, initiatingDeviceId); baAsn1.encodeContextObjectId(buffer, 2, monitoredObjectId.type, monitoredObjectId.instance); @@ -15,9 +16,7 @@ module.exports.encode = (buffer, subscriberProcessId, initiatingDeviceId, monito baAsn1.encodeContextUnsigned(buffer, 1, value.property.index); } baAsn1.encodeOpeningTag(buffer, 2); - value.value.forEach((v) => { - baAsn1.bacappEncodeApplicationData(buffer, v); - }); + value.value.forEach((v: any) => baAsn1.bacappEncodeApplicationData(buffer, v)); baAsn1.encodeClosingTag(buffer, 2); if (value.priority === baEnum.ASN1_NO_PRIORITY) { baAsn1.encodeContextUnsigned(buffer, 3, value.priority); @@ -27,10 +26,10 @@ module.exports.encode = (buffer, subscriberProcessId, initiatingDeviceId, monito baAsn1.encodeClosingTag(buffer, 4); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; + let result: any; + let decodedValue: any; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; @@ -59,7 +58,7 @@ module.exports.decode = (buffer, offset, apduLen) => { len++; const values = []; while ((apduLen - len) > 1 && !baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 4)) { - const newEntry = {}; + const newEntry: any = {}; newEntry.property = {}; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); diff --git a/lib/services/create-object.js b/lib/services/create-object.ts similarity index 84% rename from lib/services/create-object.js rename to lib/services/create-object.ts index e5a3d3e5..cafd3d05 100644 --- a/lib/services/create-object.js +++ b/lib/services/create-object.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, objectId, values) => { +export const encode = (buffer: EncodeBuffer, objectId: BACNetObjectID, values: any[]) => { baAsn1.encodeOpeningTag(buffer, 0); baAsn1.encodeContextObjectId(buffer, 1, objectId.type, objectId.instance); baAsn1.encodeClosingTag(buffer, 0); @@ -14,7 +15,7 @@ module.exports.encode = (buffer, objectId, values) => { baAsn1.encodeContextUnsigned(buffer, 1, propertyValue.property.index); } baAsn1.encodeOpeningTag(buffer, 2); - propertyValue.value.forEach((value) => { + propertyValue.value.forEach((value: any) => { baAsn1.bacappEncodeApplicationData(buffer, value); }); baAsn1.encodeClosingTag(buffer, 2); @@ -25,11 +26,11 @@ module.exports.encode = (buffer, objectId, values) => { baAsn1.encodeClosingTag(buffer, 1); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - let objectId; + let result: any; + let decodedValue: any; + let objectId: {type: number; instance: number}; const valueList = []; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; @@ -48,7 +49,7 @@ module.exports.decode = (buffer, offset, apduLen) => { if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) return; len++; while ((apduLen - len) > 1) { - const newEntry = {}; + const newEntry: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== 0) return; @@ -91,6 +92,6 @@ module.exports.decode = (buffer, offset, apduLen) => { }; }; -module.exports.encodeAcknowledge = (buffer, objectId) => { +export const encodeAcknowledge = (buffer: EncodeBuffer, objectId: BACNetObjectID) => { baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance); }; diff --git a/lib/services/delete-object.js b/lib/services/delete-object.ts similarity index 60% rename from lib/services/delete-object.js rename to lib/services/delete-object.ts index 029a1c15..b7d95e7d 100644 --- a/lib/services/delete-object.js +++ b/lib/services/delete-object.ts @@ -1,8 +1,13 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.decode = (buffer, offset, apduLen) => { +export const encode = (buffer: EncodeBuffer, objectId: BACNetObjectID) => { + baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance); +}; + +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { const result = baAsn1.decodeTagNumberAndValue(buffer, offset); if (result.tagNumber !== 12) return; let len = 1; @@ -12,7 +17,3 @@ module.exports.decode = (buffer, offset, apduLen) => { value.len = len; return value; }; - -module.exports.encode = (buffer, objectId) => { - baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance); -}; diff --git a/lib/services/device-communication-control.js b/lib/services/device-communication-control.ts similarity index 79% rename from lib/services/device-communication-control.js rename to lib/services/device-communication-control.ts index f4f0183b..730819df 100644 --- a/lib/services/device-communication-control.js +++ b/lib/services/device-communication-control.ts @@ -1,8 +1,9 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, timeDuration, enableDisable, password) => { +export const encode = (buffer: EncodeBuffer, timeDuration: number, enableDisable: number, password: string) => { if (timeDuration > 0) { baAsn1.encodeContextUnsigned(buffer, 0, timeDuration); } @@ -12,11 +13,11 @@ module.exports.encode = (buffer, timeDuration, enableDisable, password) => { } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; - let decodedValue; - let result; + const value: any = {}; + let decodedValue: any; + let result: any; if (baAsn1.decodeIsContextTag(buffer, offset + len, 0)) { result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; diff --git a/lib/services/error.js b/lib/services/error.ts similarity index 72% rename from lib/services/error.js rename to lib/services/error.ts index 564f6920..ddd903de 100644 --- a/lib/services/error.js +++ b/lib/services/error.ts @@ -1,15 +1,16 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, errorClass, errorCode) => { +export const encode = (buffer: EncodeBuffer, errorClass: number, errorCode: number) => { baAsn1.encodeApplicationEnumerated(buffer, errorClass); baAsn1.encodeApplicationEnumerated(buffer, errorCode); }; -module.exports.decode = (buffer, offset) => { +export const decode = (buffer: Buffer, offset: number) => { const orgOffset = offset; - let result; + let result: any; result = baAsn1.decodeTagNumberAndValue(buffer, offset); offset += result.len; const errorClass = baAsn1.decodeEnumerated(buffer, offset, result.value); diff --git a/lib/services/event-information.js b/lib/services/event-information.ts similarity index 88% rename from lib/services/event-information.js rename to lib/services/event-information.ts index 6d18a49a..eba7efd9 100644 --- a/lib/services/event-information.js +++ b/lib/services/event-information.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetEvent} from '../types'; -module.exports.encode = (buffer, events, moreEvents) => { +export const encode = (buffer: EncodeBuffer, events: BACNetEvent[], moreEvents: boolean) => { baAsn1.encodeOpeningTag(buffer, 0); events.forEach((event) => { baAsn1.encodeContextObjectId(buffer, 0, event.objectId.type, event.objectId.instance); @@ -27,14 +28,14 @@ module.exports.encode = (buffer, events, moreEvents) => { baAsn1.encodeContextBoolean(buffer, 1, moreEvents); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; + let result: any; + let decodedValue: any; len++; const alarms = []; while ((apduLen - 3 - len) > 0) { - const value = {}; + const value: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); @@ -57,10 +58,10 @@ module.exports.decode = (buffer, offset, apduLen) => { if (result.tagNumber !== baEnum.ApplicationTags.NULL) { decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len); len += decodedValue.len; - const date = decodedValue.value.value; + const date = decodedValue.value; decodedValue = baAsn1.decodeApplicationTime(buffer, offset + len); len += decodedValue.len; - const time = decodedValue.value.value; + const time = decodedValue.value; value.eventTimeStamps[i] = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()); } else { len += result.value; diff --git a/lib/services/event-notify-data.js b/lib/services/event-notify-data.ts similarity index 96% rename from lib/services/event-notify-data.js rename to lib/services/event-notify-data.ts index 9807604b..bc601ad1 100644 --- a/lib/services/event-notify-data.js +++ b/lib/services/event-notify-data.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, data) => { +export const encode = (buffer: EncodeBuffer, data: any) => { baAsn1.encodeContextUnsigned(buffer, 0, data.processId); baAsn1.encodeContextObjectId(buffer, 1, data.initiatingObjectId.type, data.initiatingObjectId.instance); baAsn1.encodeContextObjectId(buffer, 2, data.eventObjectId.type, data.eventObjectId.instance); @@ -114,11 +115,11 @@ module.exports.encode = (buffer, data) => { } }; -module.exports.decode = (buffer, offset) => { +export const decode = (buffer: Buffer, offset: number) => { let len = 0; - let result; - let decodedValue; - const eventData = {}; + let result: any; + let decodedValue: any; + const eventData: any = {}; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; @@ -141,10 +142,10 @@ module.exports.decode = (buffer, offset) => { len += 2; decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len); len += decodedValue.len; - const date = decodedValue.value.value; + const date = decodedValue.value; decodedValue = baAsn1.decodeApplicationTime(buffer, offset + len); len += decodedValue.len; - const time = decodedValue.value.value; + const time = decodedValue.value; eventData.timeStamp = {}; eventData.timeStamp = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()); len += 2; diff --git a/lib/services/get-enrollment-summary.js b/lib/services/get-enrollment-summary.ts similarity index 90% rename from lib/services/get-enrollment-summary.js rename to lib/services/get-enrollment-summary.ts index 1d4e3dd4..d79b1154 100644 --- a/lib/services/get-enrollment-summary.js +++ b/lib/services/get-enrollment-summary.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, acknowledgmentFilter, enrollmentFilter, eventStateFilter, eventTypeFilter, priorityFilter, notificationClassFilter) => { +export const encode = (buffer: EncodeBuffer, acknowledgmentFilter: number, enrollmentFilter?: any, eventStateFilter?: number, eventTypeFilter?: number, priorityFilter?: any, notificationClassFilter?: number) => { baAsn1.encodeContextEnumerated(buffer, 0, acknowledgmentFilter); if (enrollmentFilter) { baAsn1.encodeOpeningTag(buffer, 1); @@ -36,11 +37,11 @@ module.exports.encode = (buffer, acknowledgmentFilter, enrollmentFilter, eventSt } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number) => { let len = 0; - let result; - let decodedValue; - const value = {}; + let result: any; + let decodedValue: any; + const value: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value); @@ -110,7 +111,7 @@ module.exports.decode = (buffer, offset, apduLen) => { return value; }; -module.exports.encodeAcknowledge = (buffer, enrollmentSummaries) => { +export const encodeAcknowledge = (buffer: EncodeBuffer, enrollmentSummaries: any[]) => { enrollmentSummaries.forEach((enrollmentSummary) => { baAsn1.encodeApplicationObjectId(buffer, enrollmentSummary.objectId.type, enrollmentSummary.objectId.instance); baAsn1.encodeApplicationEnumerated(buffer, enrollmentSummary.eventType); @@ -120,12 +121,12 @@ module.exports.encodeAcknowledge = (buffer, enrollmentSummaries) => { }); }; -module.exports.decodeAcknowledge = (buffer, offset, apduLen) => { +export const decodeAcknowledge = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; + let result: any; const enrollmentSummaries = []; while ((apduLen - len) > 0) { - const enrollmentSummary = {}; + const enrollmentSummary: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== baEnum.ApplicationTags.OBJECTIDENTIFIER) return; diff --git a/lib/services/get-event-information.js b/lib/services/get-event-information.ts similarity index 82% rename from lib/services/get-event-information.js rename to lib/services/get-event-information.ts index 09afbb4c..ba526038 100644 --- a/lib/services/get-event-information.js +++ b/lib/services/get-event-information.ts @@ -1,25 +1,23 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID, BACNetEventInformation} from '../types'; -module.exports.encode = (buffer, lastReceivedObjectId) => { +export const encode = (buffer: EncodeBuffer, lastReceivedObjectId: BACNetObjectID) => { baAsn1.encodeContextObjectId(buffer, 0, lastReceivedObjectId.type, lastReceivedObjectId.instance); }; -module.exports.decode = (buffer, offset) => { +export const decode = (buffer: Buffer, offset: number) => { let len = 0; - const value = {}; const result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; const decodedValue = baAsn1.decodeObjectId(buffer, offset + len); len += decodedValue.len; - value.lastReceivedObjectId = {type: decodedValue.objectType, instance: decodedValue.instance}; - value.len = len; - return value; + return {len, lastReceivedObjectId: {type: decodedValue.objectType, instance: decodedValue.instance}}; }; -module.exports.encodeAcknowledge = (buffer, events, moreEvents) => { +export const encodeAcknowledge = (buffer: EncodeBuffer, events: BACNetEventInformation[], moreEvents: boolean) => { baAsn1.encodeOpeningTag(buffer, 0); events.forEach((eventData) => { baAsn1.encodeContextObjectId(buffer, 0, eventData.objectId.type, eventData.objectId.instance); @@ -42,16 +40,16 @@ module.exports.encodeAcknowledge = (buffer, events, moreEvents) => { baAsn1.encodeContextBoolean(buffer, 1, moreEvents); }; -module.exports.decodeAcknowledge = (buffer, offset, apduLen) => { +export const decodeAcknowledge = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - const value = {}; + let result: any; + let decodedValue: any; + const value: any = {}; if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) return; len++; value.events = []; while ((apduLen - len) > 3) { - const event = {}; + const event: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); @@ -74,7 +72,7 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => { result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber === baEnum.TimeStamp.TIME) { - decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len, result.value); + decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len); len += decodedValue.len; event.eventTimeStamps[i] = {value: decodedValue.value, type: baEnum.TimeStamp.TIME}; } else if (result.tagNumber === baEnum.TimeStamp.SEQUENCE_NUMBER) { @@ -82,12 +80,12 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => { len += decodedValue.len; event.eventTimeStamps[i] = {value: decodedValue.value, type: baEnum.TimeStamp.SEQUENCE_NUMBER}; } else if (result.tagNumber === baEnum.TimeStamp.DATETIME) { - let date = baAsn1.decodeApplicationDate(buffer, offset + len); - len += date.len; - date = date.value.value; - let time = baAsn1.decodeApplicationTime(buffer, offset + len); - len += time.len; - time = time.value.value; + const dateRaw = baAsn1.decodeApplicationDate(buffer, offset + len); + len += dateRaw.len; + const date = dateRaw.value; + const timeRaw = baAsn1.decodeApplicationTime(buffer, offset + len); + len += timeRaw.len; + const time = timeRaw.value; event.eventTimeStamps[i] = {value: new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()), type: baEnum.TimeStamp.DATETIME}; len++; } diff --git a/lib/services/i-am-broadcast.js b/lib/services/i-am-broadcast.ts similarity index 85% rename from lib/services/i-am-broadcast.js rename to lib/services/i-am-broadcast.ts index 87e8a346..99a08c8c 100644 --- a/lib/services/i-am-broadcast.js +++ b/lib/services/i-am-broadcast.ts @@ -1,17 +1,19 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, deviceId, maxApdu, segmentation, vendorId) => { +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; + +export const encode = (buffer: EncodeBuffer, deviceId: number, maxApdu: number, segmentation: number, vendorId: number) => { baAsn1.encodeApplicationObjectId(buffer, baEnum.ObjectType.DEVICE, deviceId); baAsn1.encodeApplicationUnsigned(buffer, maxApdu); baAsn1.encodeApplicationEnumerated(buffer, segmentation); baAsn1.encodeApplicationUnsigned(buffer, vendorId); }; -module.exports.decode = (buffer, offset) => { - let result; +export const decode = (buffer: Buffer, offset: number) => { + let result: any; let apduLen = 0; const orgOffset = offset; result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen); diff --git a/lib/services/i-have-broadcast.js b/lib/services/i-have-broadcast.ts similarity index 75% rename from lib/services/i-have-broadcast.js rename to lib/services/i-have-broadcast.ts index 1067a7cc..19839430 100644 --- a/lib/services/i-have-broadcast.js +++ b/lib/services/i-have-broadcast.ts @@ -1,18 +1,19 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, deviceId, objectId, objectName) => { +export const encode = (buffer: EncodeBuffer, deviceId: BACNetObjectID, objectId: BACNetObjectID, objectName: string) => { baAsn1.encodeApplicationObjectId(buffer, deviceId.type, deviceId.instance); baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance); baAsn1.encodeApplicationCharacterString(buffer, objectName); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - const value = {}; + let result: any; + let decodedValue: any; + const value: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); diff --git a/lib/services/index.js b/lib/services/index.js deleted file mode 100644 index a8cbb9cf..00000000 --- a/lib/services/index.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -module.exports.addListElement = require('./add-list-element'); -module.exports.alarmAcknowledge = require('./alarm-acknowledge'); -module.exports.alarmSummary = require('./alarm-summary'); -module.exports.atomicReadFile = require('./atomic-read-file'); -module.exports.atomicWriteFile = require('./atomic-write-file'); -module.exports.covNotify = require('./cov-notify'); -module.exports.createObject = require('./create-object'); -module.exports.deleteObject = require('./delete-object'); -module.exports.deviceCommunicationControl = require('./device-communication-control'); -module.exports.error = require('./error'); -module.exports.eventInformation = require('./event-information'); -module.exports.eventNotifyData = require('./event-notify-data'); -module.exports.getEnrollmentSummary = require('./get-enrollment-summary'); -module.exports.getEventInformation = require('./get-event-information'); -module.exports.iAmBroadcast = require('./i-am-broadcast'); -module.exports.iHaveBroadcast = require('./i-have-broadcast'); -module.exports.lifeSafetyOperation = require('./life-safety-operation'); -module.exports.privateTransfer = require('./private-transfer'); -module.exports.readPropertyMultiple = require('./read-property-multiple'); -module.exports.readProperty = require('./read-property'); -module.exports.readRange = require('./read-range'); -module.exports.reinitializeDevice = require('./reinitialize-device'); -module.exports.subscribeCov = require('./subscribe-cov'); -module.exports.subscribeProperty = require('./subscribe-property'); -module.exports.timeSync = require('./time-sync'); -module.exports.whoHas = require('./who-has'); -module.exports.whoIs = require('./who-is'); -module.exports.writePropertyMultiple = require('./write-property-multiple'); -module.exports.writeProperty = require('./write-property'); diff --git a/lib/services/index.ts b/lib/services/index.ts new file mode 100644 index 00000000..b6a83cd3 --- /dev/null +++ b/lib/services/index.ts @@ -0,0 +1,31 @@ +'use strict'; + +export * as addListElement from './add-list-element'; +export * as alarmAcknowledge from './alarm-acknowledge'; +export * as alarmSummary from './alarm-summary'; +export * as atomicReadFile from './atomic-read-file'; +export * as atomicWriteFile from './atomic-write-file'; +export * as covNotify from './cov-notify'; +export * as createObject from './create-object'; +export * as deleteObject from './delete-object'; +export * as deviceCommunicationControl from './device-communication-control'; +export * as error from './error'; +export * as eventInformation from './event-information'; +export * as eventNotifyData from './event-notify-data'; +export * as getEnrollmentSummary from './get-enrollment-summary'; +export * as getEventInformation from './get-event-information'; +export * as iAmBroadcast from './i-am-broadcast'; +export * as iHaveBroadcast from './i-have-broadcast'; +export * as lifeSafetyOperation from './life-safety-operation'; +export * as privateTransfer from './private-transfer'; +export * as readPropertyMultiple from './read-property-multiple'; +export * as readProperty from './read-property'; +export * as readRange from './read-range'; +export * as reinitializeDevice from './reinitialize-device'; +export * as subscribeCov from './subscribe-cov'; +export * as subscribeProperty from './subscribe-property'; +export * as timeSync from './time-sync'; +export * as whoHas from './who-has'; +export * as whoIs from './who-is'; +export * as writePropertyMultiple from './write-property-multiple'; +export * as writeProperty from './write-property'; diff --git a/lib/services/life-safety-operation.js b/lib/services/life-safety-operation.ts similarity index 77% rename from lib/services/life-safety-operation.js rename to lib/services/life-safety-operation.ts index 17104a92..582b9538 100644 --- a/lib/services/life-safety-operation.js +++ b/lib/services/life-safety-operation.ts @@ -1,19 +1,20 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, processId, requestingSource, operation, targetObjectId) => { +export const encode = (buffer: EncodeBuffer, processId: number, requestingSource: string, operation: number, targetObjectId: BACNetObjectID) => { baAsn1.encodeContextUnsigned(buffer, 0, processId); baAsn1.encodeContextCharacterString(buffer, 1, requestingSource); baAsn1.encodeContextEnumerated(buffer, 2, operation); baAsn1.encodeContextObjectId(buffer, 3, targetObjectId.type, targetObjectId.instance); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - const value = {}; + let result: any; + let decodedValue: any; + const value: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value); diff --git a/lib/services/private-transfer.js b/lib/services/private-transfer.ts similarity index 77% rename from lib/services/private-transfer.js rename to lib/services/private-transfer.ts index 636af85b..0fcff622 100644 --- a/lib/services/private-transfer.js +++ b/lib/services/private-transfer.ts @@ -1,8 +1,9 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, vendorId, serviceNumber, data) => { +export const encode = (buffer: EncodeBuffer, vendorId: number, serviceNumber: number, data: number[]) => { baAsn1.encodeContextUnsigned(buffer, 0, vendorId); baAsn1.encodeContextUnsigned(buffer, 1, serviceNumber); baAsn1.encodeOpeningTag(buffer, 2); @@ -12,11 +13,11 @@ module.exports.encode = (buffer, vendorId, serviceNumber, data) => { baAsn1.encodeClosingTag(buffer, 2); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - const value = {}; + let result: any; + let decodedValue: any; + const value: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value); diff --git a/lib/services/read-property-multiple.js b/lib/services/read-property-multiple.ts similarity index 54% rename from lib/services/read-property-multiple.js rename to lib/services/read-property-multiple.ts index 6d45f2e0..25f2a40f 100644 --- a/lib/services/read-property-multiple.js +++ b/lib/services/read-property-multiple.ts @@ -1,14 +1,13 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, properties) => { - properties.forEach((value) => { - baAsn1.encodeReadAccessSpecification(buffer, value); - }); +export const encode = (buffer: EncodeBuffer, properties: any[]) => { + properties.forEach((value) => baAsn1.encodeReadAccessSpecification(buffer, value)); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; const values = []; while ((apduLen - len) > 0) { @@ -23,13 +22,11 @@ module.exports.decode = (buffer, offset, apduLen) => { }; }; -module.exports.encodeAcknowledge = (buffer, values) => { - values.forEach((value) => { - baAsn1.encodeReadAccessResult(buffer, value); - }); +export const encodeAcknowledge = (buffer: EncodeBuffer, values: any[]) => { + values.forEach((value) => baAsn1.encodeReadAccessResult(buffer, value)); }; -module.exports.decodeAcknowledge = (buffer, offset, apduLen) => { +export const decodeAcknowledge = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; const values = []; while ((apduLen - len) > 0) { diff --git a/lib/services/read-property.js b/lib/services/read-property.ts similarity index 79% rename from lib/services/read-property.js rename to lib/services/read-property.ts index c427b7aa..9aca2104 100644 --- a/lib/services/read-property.js +++ b/lib/services/read-property.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, objectType, objectInstance, propertyId, arrayIndex) => { +export const encode = (buffer: EncodeBuffer, objectType: number, objectInstance: number, propertyId: number, arrayIndex: number) => { if (objectType <= baEnum.ASN1_MAX_OBJECT) { baAsn1.encodeContextObjectId(buffer, 0, objectType, objectInstance); } @@ -15,17 +16,17 @@ module.exports.encode = (buffer, objectType, objectInstance, propertyId, arrayIn } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; + let result: any; + let decodedValue: any; if (apduLen < 7) return; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; len++; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); len += decodedValue.len; const objectId = {type: decodedValue.objectType, instance: decodedValue.instance}; - const property = {}; + const property: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== 1) return; @@ -52,24 +53,22 @@ module.exports.decode = (buffer, offset, apduLen) => { }; }; -module.exports.encodeAcknowledge = (buffer, objectId, propertyId, arrayIndex, values) => { +export const encodeAcknowledge = (buffer: EncodeBuffer, objectId: BACNetObjectID, propertyId: number, arrayIndex: number, values: any[]) => { baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance); baAsn1.encodeContextEnumerated(buffer, 1, propertyId); if (arrayIndex !== baEnum.ASN1_ARRAY_ALL) { baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex); } baAsn1.encodeOpeningTag(buffer, 3); - values.forEach((value) => { - baAsn1.bacappEncodeApplicationData(buffer, value); - }); + values.forEach((value) => baAsn1.bacappEncodeApplicationData(buffer, value)); baAsn1.encodeClosingTag(buffer, 3); }; -module.exports.decodeAcknowledge = (buffer, offset, apduLen) => { - let result; - let decodedValue; - const objectId = {}; - const property = {}; +export const decodeAcknowledge = (buffer: Buffer, offset: number, apduLen: number) => { + let result: any; + let decodedValue: any; + const objectId: any = {}; + const property: any = {}; if (!baAsn1.decodeIsContextTag(buffer, offset, 0)) return; let len = 1; result = baAsn1.decodeObjectId(buffer, offset + len); diff --git a/lib/services/read-range.js b/lib/services/read-range.ts similarity index 85% rename from lib/services/read-range.js rename to lib/services/read-range.ts index 3762882f..e5ba6766 100644 --- a/lib/services/read-range.js +++ b/lib/services/read-range.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID, BACNetBitString} from '../types'; -module.exports.encode = (buffer, objectId, propertyId, arrayIndex, requestType, position, time, count) => { +export const encode = (buffer: EncodeBuffer, objectId: BACNetObjectID, propertyId: number, arrayIndex: number, requestType: number, position: number, time: Date, count: number) => { baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance); baAsn1.encodeContextEnumerated(buffer, 1, propertyId); if (arrayIndex !== baEnum.ASN1_ARRAY_ALL) { @@ -34,20 +35,20 @@ module.exports.encode = (buffer, objectId, propertyId, arrayIndex, requestType, } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; - let requestType; - let position; - let time; - let count; + let result: any; + let decodedValue: any; + let requestType: number; + let position: number; + let time: Date; + let count: number; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; len++; - decodedValue = baAsn1.decodeObjectId(buffer, offset + len, 0); + decodedValue = baAsn1.decodeObjectId(buffer, offset + len); len += decodedValue.len; const objectId = {type: decodedValue.objectType, instance: decodedValue.instance}; - const property = {}; + const property: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== 1) return; @@ -97,10 +98,10 @@ module.exports.decode = (buffer, offset, apduLen) => { requestType = baEnum.ReadRangeType.BY_TIME_REFERENCE_TIME_COUNT; decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len); len += decodedValue.len; - const tmpDate = decodedValue.value.value; + const tmpDate = decodedValue.value; decodedValue = baAsn1.decodeApplicationTime(buffer, offset + len); len += decodedValue.len; - const tmpTime = decodedValue.value.value; + const tmpTime = decodedValue.value; time = new Date(tmpDate.getYear(), tmpDate.getMonth(), tmpDate.getDate(), tmpTime.getHours(), tmpTime.getMinutes(), tmpTime.getSeconds(), tmpTime.getMilliseconds()); result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; @@ -125,7 +126,7 @@ module.exports.decode = (buffer, offset, apduLen) => { }; }; -module.exports.encodeAcknowledge = (buffer, objectId, propertyId, arrayIndex, resultFlags, itemCount, applicationData, requestType, firstSequence) => { +export const encodeAcknowledge = (buffer: EncodeBuffer, objectId: BACNetObjectID, propertyId: number, arrayIndex: number, resultFlags: BACNetBitString, itemCount: number, applicationData: Buffer, requestType: number, firstSequence: number) => { baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance); baAsn1.encodeContextEnumerated(buffer, 1, propertyId); if (arrayIndex !== baEnum.ASN1_ARRAY_ALL) { @@ -144,16 +145,16 @@ module.exports.encodeAcknowledge = (buffer, objectId, propertyId, arrayIndex, re } }; -module.exports.decodeAcknowledge = (buffer, offset, apduLen) => { +export const decodeAcknowledge = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; + let result: any; + let decodedValue: any; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; len++; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); len += decodedValue.len; const objectId = {type: decodedValue.objectType, instance: decodedValue.instance}; - const property = {index: baEnum.ASN1_ARRAY_ALL}; + const property: any = {index: baEnum.ASN1_ARRAY_ALL}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== 1) return; diff --git a/lib/services/reinitialize-device.js b/lib/services/reinitialize-device.ts similarity index 68% rename from lib/services/reinitialize-device.js rename to lib/services/reinitialize-device.ts index be41c911..3fb2ddd2 100644 --- a/lib/services/reinitialize-device.js +++ b/lib/services/reinitialize-device.ts @@ -1,22 +1,23 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, state, password) => { +export const encode = (buffer: EncodeBuffer, state: number, password: string) => { baAsn1.encodeContextEnumerated(buffer, 0, state); if (password && password !== '') { baAsn1.encodeContextCharacterString(buffer, 1, password); } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; - let result; + const value: any = {}; + let result: any; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; - let decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value); + let decodedValue: any = baAsn1.decodeEnumerated(buffer, offset + len, result.value); value.state = decodedValue.value; len += decodedValue.len; if (len < apduLen) { diff --git a/lib/services/subscribe-cov.js b/lib/services/subscribe-cov.ts similarity index 80% rename from lib/services/subscribe-cov.js rename to lib/services/subscribe-cov.ts index eb51bb42..175d9426 100644 --- a/lib/services/subscribe-cov.js +++ b/lib/services/subscribe-cov.ts @@ -1,8 +1,9 @@ 'use strict'; -const baAsn1 = require('../asn1'); +import * as baAsn1 from '../asn1'; +import {EncodeBuffer, BACNetObjectID} from '../types'; -module.exports.encode = (buffer, subscriberProcessId, monitoredObjectId, cancellationRequest, issueConfirmedNotifications, lifetime) => { +export const encode = (buffer: EncodeBuffer, subscriberProcessId: number, monitoredObjectId: BACNetObjectID, cancellationRequest: boolean, issueConfirmedNotifications: boolean, lifetime: number) => { baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId); baAsn1.encodeContextObjectId(buffer, 1, monitoredObjectId.type, monitoredObjectId.instance); if (!cancellationRequest) { @@ -11,11 +12,11 @@ module.exports.encode = (buffer, subscriberProcessId, monitoredObjectId, cancell } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; - let result; - let decodedValue; + const value: any = {}; + let result: any; + let decodedValue: any; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; diff --git a/lib/services/subscribe-property.js b/lib/services/subscribe-property.ts similarity index 85% rename from lib/services/subscribe-property.js rename to lib/services/subscribe-property.ts index bd792d34..c00431ee 100644 --- a/lib/services/subscribe-property.js +++ b/lib/services/subscribe-property.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID, BACNetPropertyID} from '../types'; -module.exports.encode = (buffer, subscriberProcessId, monitoredObjectId, cancellationRequest, issueConfirmedNotifications, lifetime, monitoredProperty, covIncrementPresent, covIncrement) => { +export const encode = (buffer: EncodeBuffer, subscriberProcessId: number, monitoredObjectId: BACNetObjectID, cancellationRequest: boolean, issueConfirmedNotifications: boolean, lifetime: number, monitoredProperty: BACNetPropertyID, covIncrementPresent: boolean, covIncrement: number) => { baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId); baAsn1.encodeContextObjectId(buffer, 1, monitoredObjectId.type, monitoredObjectId.instance); if (!cancellationRequest) { @@ -21,11 +22,11 @@ module.exports.encode = (buffer, subscriberProcessId, monitoredObjectId, cancell } }; -module.exports.decode = (buffer, offset) => { +export const decode = (buffer: Buffer, offset: number) => { let len = 0; - const value = {}; - let result; - let decodedValue; + const value: any = {}; + let result: any; + let decodedValue: any; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; diff --git a/lib/services/time-sync.js b/lib/services/time-sync.ts similarity index 76% rename from lib/services/time-sync.js rename to lib/services/time-sync.ts index cf7f27f4..c0db361c 100644 --- a/lib/services/time-sync.js +++ b/lib/services/time-sync.ts @@ -1,16 +1,17 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, time) => { +export const encode = (buffer: EncodeBuffer, time: Date) => { baAsn1.encodeApplicationDate(buffer, time); baAsn1.encodeApplicationTime(buffer, time); }; -module.exports.decode = (buffer, offset, length) => { +export const decode = (buffer: Buffer, offset: number) => { let len = 0; - let result; + let result: any; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== baEnum.ApplicationTags.DATE) return; diff --git a/lib/services/who-has.js b/lib/services/who-has.ts similarity index 81% rename from lib/services/who-has.js rename to lib/services/who-has.ts index fcf58a3e..36cb0e74 100644 --- a/lib/services/who-has.js +++ b/lib/services/who-has.ts @@ -1,9 +1,10 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {BACNetObjectID, EncodeBuffer} from '../types'; -module.exports.encode = (buffer, lowLimit, highLimit, objectId, objectName) => { +export const encode = (buffer: EncodeBuffer, lowLimit: number, highLimit: number, objectId: BACNetObjectID, objectName: string) => { if ((lowLimit >= 0) && (lowLimit <= baEnum.ASN1_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baEnum.ASN1_MAX_INSTANCE)) { baAsn1.encodeContextUnsigned(buffer, 0, lowLimit); baAsn1.encodeContextUnsigned(buffer, 1, highLimit); @@ -15,10 +16,10 @@ module.exports.encode = (buffer, lowLimit, highLimit, objectId, objectName) => { } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; - let decodedValue; + const value: any = {}; + let decodedValue: any; let result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber === 0) { diff --git a/lib/services/who-is.js b/lib/services/who-is.ts similarity index 78% rename from lib/services/who-is.js rename to lib/services/who-is.ts index 88778507..f2a5b2d9 100644 --- a/lib/services/who-is.js +++ b/lib/services/who-is.ts @@ -1,18 +1,19 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer} from '../types'; -module.exports.encode = (buffer, lowLimit, highLimit) => { +export const encode = (buffer: EncodeBuffer, lowLimit: number, highLimit: number) => { if ((lowLimit >= 0) && (lowLimit <= baEnum.ASN1_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baEnum.ASN1_MAX_INSTANCE)) { baAsn1.encodeContextUnsigned(buffer, 0, lowLimit); baAsn1.encodeContextUnsigned(buffer, 1, highLimit); } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = {}; + const value: any = {}; if (apduLen <= 0) return {}; let result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; diff --git a/lib/services/write-property-multiple.js b/lib/services/write-property-multiple.ts similarity index 80% rename from lib/services/write-property-multiple.js rename to lib/services/write-property-multiple.ts index a84d0a4c..8b2ebf66 100644 --- a/lib/services/write-property-multiple.js +++ b/lib/services/write-property-multiple.ts @@ -1,9 +1,16 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetObjectID, BACNetPropertyID, BACNetAppData} from '../types'; -const encode = module.exports.encode = (buffer, objectId, values) => { +interface BACNETWPM { + property: BACNetPropertyID; + value: BACNetAppData[]; + priority: number; +} + +export const encode = (buffer: EncodeBuffer, objectId: BACNetObjectID, values: BACNETWPM[]) => { baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance); baAsn1.encodeOpeningTag(buffer, 1); values.forEach((pValue) => { @@ -12,9 +19,7 @@ const encode = module.exports.encode = (buffer, objectId, values) => { baAsn1.encodeContextUnsigned(buffer, 1, pValue.property.index); } baAsn1.encodeOpeningTag(buffer, 2); - pValue.value.forEach((value) => { - baAsn1.bacappEncodeApplicationData(buffer, value); - }); + pValue.value.forEach((value) => baAsn1.bacappEncodeApplicationData(buffer, value)); baAsn1.encodeClosingTag(buffer, 2); if (pValue.priority !== baEnum.ASN1_NO_PRIORITY) { baAsn1.encodeContextUnsigned(buffer, 3, pValue.priority); @@ -23,10 +28,10 @@ const encode = module.exports.encode = (buffer, objectId, values) => { baAsn1.encodeClosingTag(buffer, 1); }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - let result; - let decodedValue; + let result: any; + let decodedValue: any; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if ((result.tagNumber !== 0) || (apduLen <= len)) return; @@ -42,7 +47,7 @@ module.exports.decode = (buffer, offset, apduLen) => { len++; const _values = []; while ((apduLen - len) > 1) { - const newEntry = {}; + const newEntry: any = {}; result = baAsn1.decodeTagNumberAndValue(buffer, offset + len); len += result.len; if (result.tagNumber !== 0) return; @@ -93,8 +98,6 @@ module.exports.decode = (buffer, offset, apduLen) => { }; }; -module.exports.encodeObject = (buffer, values) => { - values.forEach((object) => { - encode(buffer, object.objectId, object.values); - }); +export const encodeObject = (buffer: EncodeBuffer, values: any[]) => { + values.forEach((object) => encode(buffer, object.objectId, object.values)); }; diff --git a/lib/services/write-property.js b/lib/services/write-property.ts similarity index 82% rename from lib/services/write-property.js rename to lib/services/write-property.ts index 5da9de55..5e448256 100644 --- a/lib/services/write-property.js +++ b/lib/services/write-property.ts @@ -1,31 +1,30 @@ 'use strict'; -const baAsn1 = require('../asn1'); -const baEnum = require('../enum'); +import * as baAsn1 from '../asn1'; +import * as baEnum from '../enum'; +import {EncodeBuffer, BACNetAppData} from '../types'; -module.exports.encode = (buffer, objectType, objectInstance, propertyId, arrayIndex, priority, values) => { +export const encode = (buffer: EncodeBuffer, objectType: number, objectInstance: number, propertyId: number, arrayIndex: number, priority: number, values: BACNetAppData[]) => { baAsn1.encodeContextObjectId(buffer, 0, objectType, objectInstance); baAsn1.encodeContextEnumerated(buffer, 1, propertyId); if (arrayIndex !== baEnum.ASN1_ARRAY_ALL) { baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex); } baAsn1.encodeOpeningTag(buffer, 3); - values.forEach((value) => { - baAsn1.bacappEncodeApplicationData(buffer, value); - }); + values.forEach((value) => baAsn1.bacappEncodeApplicationData(buffer, value)); baAsn1.encodeClosingTag(buffer, 3); if (priority !== baEnum.ASN1_NO_PRIORITY) { baAsn1.encodeContextUnsigned(buffer, 4, priority); } }; -module.exports.decode = (buffer, offset, apduLen) => { +export const decode = (buffer: Buffer, offset: number, apduLen: number) => { let len = 0; - const value = { + const value: any = { property: {} }; - let decodedValue; - let result; + let decodedValue: any; + let result: any; if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return; len++; decodedValue = baAsn1.decodeObjectId(buffer, offset + len); diff --git a/lib/transport.js b/lib/transport.ts similarity index 65% rename from lib/transport.js rename to lib/transport.ts index 88271726..5b84ab50 100644 --- a/lib/transport.js +++ b/lib/transport.ts @@ -1,10 +1,15 @@ 'use strict'; -const createSocket = require('dgram').createSocket; -const EventEmitter = require('events').EventEmitter; +import { createSocket, Socket } from 'dgram'; +import { EventEmitter } from 'events'; -class Transport extends EventEmitter { - constructor(settings) { +import { TransportSettings } from './types'; + +export class Transport extends EventEmitter { + private _settings: TransportSettings; + private _server: Socket; + + constructor(settings: TransportSettings) { super(); this._settings = settings; this._server = createSocket({type: 'udp4', reuseAddr: true}); @@ -20,7 +25,7 @@ class Transport extends EventEmitter { return 1482; } - send(buffer, offset, receiver) { + send(buffer: Buffer, offset: number, receiver: string) { this._server.send(buffer, 0, offset, this._settings.port, receiver); } @@ -34,4 +39,3 @@ class Transport extends EventEmitter { this._server.close(); } } -module.exports = Transport; diff --git a/lib/types.ts b/lib/types.ts new file mode 100644 index 00000000..8c14ca73 --- /dev/null +++ b/lib/types.ts @@ -0,0 +1,93 @@ +export interface EncodeBuffer { + buffer: Buffer; + offset: number; +} + +export interface BACNetAddress { + type?: number; + net?: number; + adr?: number[]; +} + +export interface TransportSettings { + port?: number; + interface?: string; + broadcastAddress?: string; +} + +export interface BACNetObjectID { + type: number; + instance: number; +} + +export interface BACNetPropertyID { + id: number; + index: number; +} + +export interface BACNetReadAccessSpecification { + objectId: BACNetObjectID; + properties: BACNetPropertyID[]; +} + +export interface BACNetBitString { + bitsUsed: number; + value: number[]; +} + +export interface BACNetCovSubscription { + recipient: { + network: number; + address: number[]; + }; + subscriptionProcessId: number; + monitoredObjectId: BACNetObjectID; + monitoredProperty: BACNetPropertyID; + issueConfirmedNotifications: boolean; + timeRemaining: number; + covIncrement: number; +} + +export interface BACNetAlarm { + objectId: BACNetObjectID; + alarmState: number; + acknowledgedTransitions: BACNetBitString; +} + +export interface BACNetEvent { + objectId: BACNetObjectID; + eventState: number; + acknowledgedTransitions: BACNetBitString; + eventTimeStamps: Date[]; + notifyType: number; + eventEnable: BACNetBitString; + eventPriorities: number[]; +} + +export interface BACNetDevObjRef { + id: number; + arrayIndex: number; + objectId: BACNetObjectID; + deviceIndentifier: BACNetObjectID; +} + +export interface BACNetAppData { + type: number; + value: any; + encoding?: number; +} + +export interface BACNetPropertyState { + type: number; + state: number; +} + +export interface BACNetEventInformation { + objectId: BACNetObjectID; + eventState: number; + acknowledgedTransitions: BACNetBitString; + eventTimeStamps: any[]; + notifyType: number; + eventEnable: BACNetBitString; + eventPriorities: number[]; +} diff --git a/package.json b/package.json index ff30104b..9bd742f8 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,12 @@ "main": "index.js", "scripts": { "changelog": "commitlint --from=origin/master", - "lint": "eslint lib/ test/ index.js", - "test": "jest --coverageDirectory reports/coverage-test test/unit/*.spec.js", - "integration": "jest --coverageDirectory reports/coverage-integration test/integration/*.spec.js", - "compliance": "jest --coverageDirectory reports/coverage-compliance test/compliance/*.spec.js", - "docs": "jsdoc -d ./docs -t node_modules/docdash ./lib ./index.js ./README.md" + "build": "tsc", + "lint": "eslint lib/**/*.ts test/**/*.ts index.ts", + "test": "jest --coverageDirectory reports/coverage-test test/unit/*.spec.ts", + "integration": "jest --coverageDirectory reports/coverage-integration test/integration/*.spec.ts", + "compliance": "jest --coverageDirectory reports/coverage-compliance test/compliance/*.spec.ts", + "docs": "typedoc --out docs --entryPoint '\"client\"' --excludeExternals --excludeNotExported --excludePrivate lib/client.ts" }, "repository": { "type": "git", @@ -29,6 +30,7 @@ "node": ">= 12.0.0" }, "jest": { + "preset": "ts-jest", "testEnvironment": "node", "collectCoverage": true, "coverageReporters": [ @@ -37,7 +39,7 @@ "lcov" ], "collectCoverageFrom": [ - "lib/**/*.js" + "lib/**/*.ts" ] }, "commitlint": { @@ -57,10 +59,14 @@ "devDependencies": { "@commitlint/cli": "^12.1.4", "@commitlint/config-conventional": "^12.1.4", - "docdash": "^1.2.0", + "@types/jest": "^26.0.23", + "@types/node": "^15.12.5", + "@typescript-eslint/eslint-plugin": "^4.28.1", + "@typescript-eslint/parser": "^4.28.1", "eslint": "^7.29.0", "eslint-config-google": "^0.14.0", "jest": "^27.0.6", - "jsdoc": "^3.6.7" + "ts-jest": "^27.0.3", + "typescript": "^4.3.4" } } diff --git a/test/compliance/who-is.spec.js b/test/compliance/who-is.spec.ts similarity index 67% rename from test/compliance/who-is.spec.js rename to test/compliance/who-is.spec.ts index 5ca95331..00ac3f97 100644 --- a/test/compliance/who-is.spec.js +++ b/test/compliance/who-is.spec.ts @@ -1,18 +1,19 @@ 'use strict'; -const bacnet = require('../../'); +import {Client} from '../../lib/client'; +import * as baEnum from '../../lib/enum'; describe('bacstack - whoIs compliance', () => { - let client; + let client: Client; - beforeEach(() => client = new bacnet({apduTimeout: 1000})); + beforeEach(() => client = new Client({apduTimeout: 1000})); afterEach(() => client.close()); it('should find the device simulator', (next) => { client.on('iAm', (device) => { expect(device.deviceId).toEqual(1234); expect(device.maxApdu).toEqual(1476); - expect(device.segmentation).toEqual(bacnet.enum.Segmentation.NO_SEGMENTATION); + expect(device.segmentation).toEqual(baEnum.Segmentation.NO_SEGMENTATION); expect(device.vendorId).toEqual(260); next(); }); @@ -24,7 +25,7 @@ describe('bacstack - whoIs compliance', () => { expect(device.deviceId).toEqual(1234); next(); }); - client.whoIs(1233); + client.whoIs({lowLimit: 1233}); }); it('should find the device simulator with provided min/max device ID and IP', (next) => { @@ -32,6 +33,6 @@ describe('bacstack - whoIs compliance', () => { expect(device.deviceId).toEqual(1234); next(); }); - client.whoIs(1233, 1235, 'bacnet-device'); + client.whoIs({lowLimit: 1233, highLimit: 1235, address: 'bacnet-device'}); }); }); diff --git a/test/integration/acknowledge-alarm.spec.js b/test/integration/acknowledge-alarm.spec.ts similarity index 68% rename from test/integration/acknowledge-alarm.spec.js rename to test/integration/acknowledge-alarm.spec.ts index 877318ea..70d4df0f 100644 --- a/test/integration/acknowledge-alarm.spec.js +++ b/test/integration/acknowledge-alarm.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - acknowledgeAlarm integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.acknowledgeAlarm('127.0.0.1', {type: 2, instance: 3}, 2, 'Alarm Acknowledge Test', {value: new Date(), type: 2}, {value: new Date(), type: 2}, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.acknowledgeAlarm('127.0.0.1', {type: 2, instance: 3}, 2, 'Alarm Acknowledge Test', {value: new Date(), type: 2}, {value: new Date(), type: 2}, {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/add-list-element.spec.js b/test/integration/add-list-element.spec.ts similarity index 70% rename from test/integration/add-list-element.spec.js rename to test/integration/add-list-element.spec.ts index cac3764f..f693f23a 100644 --- a/test/integration/add-list-element.spec.js +++ b/test/integration/add-list-element.spec.ts @@ -1,15 +1,14 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - addListElement integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); client.addListElement('127.0.0.1', {type: 19, instance: 101}, {id: 80, index: 0}, [ {type: 1, value: true} - ], (err, value) => { + ], {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/confirmed-event-notification.spec.js b/test/integration/confirmed-event-notification.spec.ts similarity index 82% rename from test/integration/confirmed-event-notification.spec.js rename to test/integration/confirmed-event-notification.spec.ts index ce2eb3e9..859f946a 100644 --- a/test/integration/confirmed-event-notification.spec.js +++ b/test/integration/confirmed-event-notification.spec.ts @@ -1,10 +1,10 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - confirmedEventNotification integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); const date = new Date(); date.setMilliseconds(880); client.confirmedEventNotification('127.0.0.1', { @@ -20,9 +20,8 @@ describe('bacstack - confirmedEventNotification integration', () => { changeOfValueTag: 0, changeOfValueChangeValue: 90, changeOfValueStatusFlags: {bitsUsed: 24, value: [0xaa, 0xaa, 0xaa]} - }, (err, value) => { + }, {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/confirmed-private-transfer.spec.js b/test/integration/confirmed-private-transfer.spec.ts similarity index 65% rename from test/integration/confirmed-private-transfer.spec.js rename to test/integration/confirmed-private-transfer.spec.ts index d3db0174..d4de2775 100644 --- a/test/integration/confirmed-private-transfer.spec.js +++ b/test/integration/confirmed-private-transfer.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - confirmedPrivateTransfer integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.confirmedPrivateTransfer('127.0.0.1', 0, 8, [0x00, 0xaa, 0xfa, 0xb1, 0x00], (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.confirmedPrivateTransfer('127.0.0.1', 0, 8, [0x00, 0xaa, 0xfa, 0xb1, 0x00], {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/create-object.spec.js b/test/integration/create-object.spec.ts similarity index 70% rename from test/integration/create-object.spec.js rename to test/integration/create-object.spec.ts index ba16a5c9..6e764731 100644 --- a/test/integration/create-object.spec.js +++ b/test/integration/create-object.spec.ts @@ -1,15 +1,14 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - createObject integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); client.createObject('127.0.0.1', {type: 2, instance: 300}, [ {property: {id: 85, index: 1}, value: [{type: 1, value: true}]} - ], (err, value) => { + ], {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/delete-object.spec.js b/test/integration/delete-object.spec.ts similarity index 54% rename from test/integration/delete-object.spec.js rename to test/integration/delete-object.spec.ts index 5342b5cb..eafc898a 100644 --- a/test/integration/delete-object.spec.js +++ b/test/integration/delete-object.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - deleteObject integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.deleteObject('127.0.0.1', {type: 2, instance: 15}, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.deleteObject('127.0.0.1', {type: 2, instance: 15}, {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/device-communication-control.spec.js b/test/integration/device-communication-control.spec.ts similarity index 66% rename from test/integration/device-communication-control.spec.js rename to test/integration/device-communication-control.spec.ts index 4a4fb736..00dd3d91 100644 --- a/test/integration/device-communication-control.spec.js +++ b/test/integration/device-communication-control.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - deviceCommunicationControl integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.deviceCommunicationControl('127.0.0.1', 60, 1, {password: 'Test1234'}, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.deviceCommunicationControl('127.0.0.1', 60, 1, {password: 'Test1234'}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/get-alarm-summary.spec.js b/test/integration/get-alarm-summary.spec.ts similarity index 64% rename from test/integration/get-alarm-summary.spec.js rename to test/integration/get-alarm-summary.spec.ts index f5b9990d..d944036e 100644 --- a/test/integration/get-alarm-summary.spec.js +++ b/test/integration/get-alarm-summary.spec.ts @@ -1,11 +1,11 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - getAlarmSummary integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.getAlarmSummary('127.0.0.1', (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.getAlarmSummary('127.0.0.1', {}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); client.close(); diff --git a/test/integration/get-enrollment-summary.spec.js b/test/integration/get-enrollment-summary.spec.ts similarity index 80% rename from test/integration/get-enrollment-summary.spec.js rename to test/integration/get-enrollment-summary.spec.ts index 139baa94..71c31cf7 100644 --- a/test/integration/get-enrollment-summary.spec.js +++ b/test/integration/get-enrollment-summary.spec.ts @@ -1,10 +1,10 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - getEnrollmentSummary integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); client.getEnrollmentSummary('127.0.0.1', 0, {notificationClassFilter: 5}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); diff --git a/test/integration/get-event-information.spec.js b/test/integration/get-event-information.spec.ts similarity index 74% rename from test/integration/get-event-information.spec.js rename to test/integration/get-event-information.spec.ts index d72d77c0..ed405e54 100644 --- a/test/integration/get-event-information.spec.js +++ b/test/integration/get-event-information.spec.ts @@ -1,11 +1,11 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - getEventInformation integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.getEventInformation('127.0.0.1', {type: 5, instance: 33}, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.getEventInformation('127.0.0.1', {type: 5, instance: 33}, {}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); client.close(); diff --git a/test/integration/read-file.spec.js b/test/integration/read-file.spec.ts similarity index 73% rename from test/integration/read-file.spec.js rename to test/integration/read-file.spec.ts index bd9e4bc9..76aafa04 100644 --- a/test/integration/read-file.spec.js +++ b/test/integration/read-file.spec.ts @@ -1,11 +1,11 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - readFile integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.readFile('127.0.0.1', {type: 10, instance: 100}, 0, 100, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.readFile('127.0.0.1', {type: 10, instance: 100}, 0, 100, {}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); client.close(); diff --git a/test/integration/read-property-multiple.spec.js b/test/integration/read-property-multiple.spec.ts similarity index 92% rename from test/integration/read-property-multiple.spec.js rename to test/integration/read-property-multiple.spec.ts index f5294751..bdb6de4f 100644 --- a/test/integration/read-property-multiple.spec.js +++ b/test/integration/read-property-multiple.spec.ts @@ -1,14 +1,14 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - readPropertyMultiple integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); const requestArray = [ {objectId: {type: 8, instance: 4194303}, properties: [{id: 8}]} ]; - client.readPropertyMultiple('127.0.0.1', requestArray, (err, value) => { + client.readPropertyMultiple('127.0.0.1', requestArray, {}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); client.close(); @@ -17,13 +17,13 @@ describe('bacstack - readPropertyMultiple integration', () => { }); it('should successfully decode a structured view', (next) => { - const transport = new utils.transportStub(); - const client = new utils.bacnetClient({transport: transport}); + const transport = new utils.TransportStub(); + const client = new utils.BacnetClient({transport: transport}); const data = Buffer.from('810a0109010030000e0c0740001f1e291c4e752900436f6c6c656374696f6e206f66206c69676874696e672070726573656e6365206465746563746f724f294b4ec40740001f4f294d4e7531005ac3a4686c657277656727466c6f6f72203427525365675456274c6774275073634f70274c6774507363446574436f6c4f294f4e911d4f29a84e751800372d42412d524453312d3034312d5342437631332e32304f29cf4e71004f29d04e91084f29d24e750c004c67745073634465745273750a00507363446574282a294f29d34e1c014000001c00c000004f2a13424e91004f2a134d4e91064f2a13a64e21004f2a13bd4e91004f2a13de4e8207808207004f2a13ee4e91294f1f', 'hex'); // eslint-disable-line max-len const requestArray = [ {objectId: {type: 8, instance: 4194303}, properties: [{id: 8}]} ]; - client.readPropertyMultiple('127.0.0.1', requestArray, (err, response) => { + client.readPropertyMultiple('127.0.0.1', requestArray, {}, (err, response) => { expect(err).toBeNull(); const object = utils.propertyFormater(response.values[0].values); expect(response.values[0].objectId).toEqual({type: 29, instance: 31}); @@ -58,13 +58,13 @@ describe('bacstack - readPropertyMultiple integration', () => { }); it('should successfully decode a value object', (next) => { - const transport = new utils.transportStub(); - const client = new utils.bacnetClient({transport: transport}); + const transport = new utils.TransportStub(); + const client = new utils.BacnetClient({transport: transport}); const data = Buffer.from('810a01eb010030000e0c04c0000a1e291c4e75070053656e736f724f29244e91004f294a4e21084f294b4ec404c0000a4f294d4e7525005ac3a4686c657277656727466c6f6f722034275253656754562753656e4465762753656e4f294f4e91134f29514e104f29554e21014f29674e91004f296e4e750c004f7065726174696f6e616c750f004465766963652073746f70706564751400446576696365206e6f742061737369676e6564750f00446576696365206d697373696e67751300436f6e6669677572696e6720646576696365750700556e75736564751f004d697373696e67206f722077726f6e6720636f6e66696775726174696f6e750a00536561726368696e674f296f4e8204004f29a84e751800372d42412d524453312d3032342d5342437631332e32304f2a13424e91004f2a134d4e91054f2a13884e91004f2a13894e91004f2a13af4e750800302e322e3234394f2a13df4e750e00355747313235382d32444231324f2a13e44e750b00504c2d313a444c3d313b4f2a13e64e21034f2a13ec4e750d003030303130303433656464634f2a13ed4e752d00504c3a4444543d303538362e303030312e30302e30312e30303b46573d302e312e31333b4d4f44453d504c3b4f2a13ee4e91184f2a13ef4e71004f2a13f04e91004f2a13f34e21014f1f', 'hex'); // eslint-disable-line max-len const requestArray = [ {objectId: {type: 8, instance: 4194303}, properties: [{id: 8}]} ]; - client.readPropertyMultiple('127.0.0.1', requestArray, (err, response) => { + client.readPropertyMultiple('127.0.0.1', requestArray, {}, (err, response) => { expect(err).toBeNull(); expect(response.values[0].objectId).toEqual({type: 19, instance: 10}); const object = utils.propertyFormater(response.values[0].values); diff --git a/test/integration/read-property.spec.js b/test/integration/read-property.spec.ts similarity index 74% rename from test/integration/read-property.spec.js rename to test/integration/read-property.spec.ts index 5f8596e6..703e5993 100644 --- a/test/integration/read-property.spec.js +++ b/test/integration/read-property.spec.ts @@ -1,11 +1,11 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - readProperty integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.readProperty('127.0.0.1', {type: 8, instance: 44301}, 28, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.readProperty('127.0.0.1', {type: 8, instance: 44301}, 28, {}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); client.close(); diff --git a/test/integration/read-range.spec.js b/test/integration/read-range.spec.ts similarity index 74% rename from test/integration/read-range.spec.js rename to test/integration/read-range.spec.ts index e9411d26..6f5c800f 100644 --- a/test/integration/read-range.spec.js +++ b/test/integration/read-range.spec.ts @@ -1,11 +1,11 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - readRange integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.readRange('127.0.0.1', {type: 20, instance: 0}, 0, 200, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.readRange('127.0.0.1', {type: 20, instance: 0}, 0, 200, {}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); client.close(); diff --git a/test/integration/reinitialize-sevice.spec.js b/test/integration/reinitialize-sevice.spec.ts similarity index 67% rename from test/integration/reinitialize-sevice.spec.js rename to test/integration/reinitialize-sevice.spec.ts index 5b7c792c..721476dd 100644 --- a/test/integration/reinitialize-sevice.spec.js +++ b/test/integration/reinitialize-sevice.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - reinitializeDevice integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.reinitializeDevice('127.0.0.1', 1, {password: 'Test1234'}, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.reinitializeDevice('127.0.0.1', 1, {password: 'Test1234'}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/remove-list-element.spec.js b/test/integration/remove-list-element.spec.ts similarity index 70% rename from test/integration/remove-list-element.spec.js rename to test/integration/remove-list-element.spec.ts index 9452375a..126892ef 100644 --- a/test/integration/remove-list-element.spec.js +++ b/test/integration/remove-list-element.spec.ts @@ -1,15 +1,14 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - removeListElement integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); client.removeListElement('127.0.0.1', {type: 19, instance: 100}, {id: 80, index: 0}, [ {type: 1, value: true} - ], (err, value) => { + ], {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/subscribe-cov.spec.js b/test/integration/subscribe-cov.spec.ts similarity index 65% rename from test/integration/subscribe-cov.spec.js rename to test/integration/subscribe-cov.spec.ts index f5f31874..81a6157f 100644 --- a/test/integration/subscribe-cov.spec.js +++ b/test/integration/subscribe-cov.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - subscribeCOV integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.subscribeCOV('127.0.0.1', {type: 5, instance: 3}, 7, false, false, 0, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.subscribeCOV('127.0.0.1', {type: 5, instance: 3}, 7, false, false, 0, {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/subscribe-property.spec.js b/test/integration/subscribe-property.spec.ts similarity index 62% rename from test/integration/subscribe-property.spec.js rename to test/integration/subscribe-property.spec.ts index 3edc8d45..217cdb98 100644 --- a/test/integration/subscribe-property.spec.js +++ b/test/integration/subscribe-property.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - subscribeProperty integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.subscribeProperty('127.0.0.1', {type: 5, instance: 33}, {id: 80, index: 0}, 8, false, false, (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.subscribeProperty('127.0.0.1', {type: 5, instance: 33}, {id: 80, index: 0}, 8, false, false, {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/time-sync-utc.spec.js b/test/integration/time-sync-utc.spec.ts similarity index 67% rename from test/integration/time-sync-utc.spec.js rename to test/integration/time-sync-utc.spec.ts index 25d71b7c..b6fa8711 100644 --- a/test/integration/time-sync-utc.spec.js +++ b/test/integration/time-sync-utc.spec.ts @@ -1,10 +1,10 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - timeSyncUTC integration', () => { it('should send a time UTC sync package', () => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); client.timeSyncUTC('127.0.0.1', new Date()); client.close(); }); diff --git a/test/integration/time-sync.spec.js b/test/integration/time-sync.spec.ts similarity index 66% rename from test/integration/time-sync.spec.js rename to test/integration/time-sync.spec.ts index 6001f0a8..434a3140 100644 --- a/test/integration/time-sync.spec.js +++ b/test/integration/time-sync.spec.ts @@ -1,10 +1,10 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - timeSync integration', () => { it('should send a time sync package', () => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); client.timeSync('127.0.0.1', new Date()); client.close(); }); diff --git a/test/integration/unconfirmed-event-notification.spec.js b/test/integration/unconfirmed-event-notification.spec.ts similarity index 89% rename from test/integration/unconfirmed-event-notification.spec.js rename to test/integration/unconfirmed-event-notification.spec.ts index e7cad901..e89d5224 100644 --- a/test/integration/unconfirmed-event-notification.spec.js +++ b/test/integration/unconfirmed-event-notification.spec.ts @@ -1,10 +1,10 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - unconfirmedEventNotification integration', () => { it('should correctly send a telegram', () => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); const date = new Date(); date.setMilliseconds(880); client.unconfirmedEventNotification('127.0.0.1', { diff --git a/test/integration/unconfirmed-private-transfer.spec.js b/test/integration/unconfirmed-private-transfer.spec.ts similarity index 72% rename from test/integration/unconfirmed-private-transfer.spec.js rename to test/integration/unconfirmed-private-transfer.spec.ts index 031d5fae..4f9ab694 100644 --- a/test/integration/unconfirmed-private-transfer.spec.js +++ b/test/integration/unconfirmed-private-transfer.spec.ts @@ -1,10 +1,10 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - unconfirmedPrivateTransfer integration', () => { it('should correctly send a telegram', () => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); client.unconfirmedPrivateTransfer('127.0.0.1', 0, 7, [0x00, 0xaa, 0xfa, 0xb1, 0x00]); client.close(); }); diff --git a/test/integration/utils.js b/test/integration/utils.js deleted file mode 100644 index 92bbd67f..00000000 --- a/test/integration/utils.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -const EventEmitter = require('events').EventEmitter; -const bacnet = require('../../'); - -module.exports.bacnetClient = bacnet; - -class Transport extends EventEmitter { - constructor() { - super(); - } - getBroadcastAddress() { - return '255.255.255.255'; - } - getMaxPayload() { - return 1482; - } - send() { } - open() { } - close() { } -} -module.exports.transportStub = Transport; - -module.exports.propertyFormater = (object) => { - const converted = {}; - object.forEach((property) => converted[property.id] = property.value); - return converted; -}; diff --git a/test/integration/utils.ts b/test/integration/utils.ts new file mode 100644 index 00000000..80788a68 --- /dev/null +++ b/test/integration/utils.ts @@ -0,0 +1,27 @@ +'use strict'; + +import {EventEmitter} from 'events'; +import {Client} from '../../lib/client'; + +export const BacnetClient = Client; + +export class TransportStub extends EventEmitter { + constructor() { + super(); + } + getBroadcastAddress() { + return '255.255.255.255'; + } + getMaxPayload() { + return 1482; + } + send() {} // eslint-disable-line @typescript-eslint/no-empty-function + open() {} // eslint-disable-line @typescript-eslint/no-empty-function + close() {} // eslint-disable-line @typescript-eslint/no-empty-function +} + +export const propertyFormater = (object: {id: number; value: any}[]) => { + const converted: {[name: number]: any} = {}; + object.forEach((property) => converted[property.id] = property.value); + return converted; +}; diff --git a/test/integration/who-is.spec.js b/test/integration/who-is.spec.ts similarity index 64% rename from test/integration/who-is.spec.js rename to test/integration/who-is.spec.ts index 21371857..0d7754ff 100644 --- a/test/integration/who-is.spec.js +++ b/test/integration/who-is.spec.ts @@ -1,11 +1,11 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - whoIs integration', () => { it('should not invoke a event if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.on('iAm', (address, deviceId, maxApdu, segmentation, vendorId) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.on('iAm', () => { client.close(); next(new Error('Unallowed Callback')); }); diff --git a/test/integration/write-file.spec.js b/test/integration/write-file.spec.ts similarity index 70% rename from test/integration/write-file.spec.js rename to test/integration/write-file.spec.ts index c725aef0..181fd73d 100644 --- a/test/integration/write-file.spec.js +++ b/test/integration/write-file.spec.ts @@ -1,11 +1,11 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - writeFile integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.writeFile('127.0.0.1', {type: 10, instance: 2}, 0, [[5, 6, 7, 8], [5, 6, 7, 8]], (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.writeFile('127.0.0.1', {type: 10, instance: 2}, 0, [[5, 6, 7, 8], [5, 6, 7, 8]], {}, (err, value) => { expect(err.message).toEqual('ERR_TIMEOUT'); expect(value).toBeUndefined(); client.close(); diff --git a/test/integration/write-property-multiple.spec.js b/test/integration/write-property-multiple.spec.ts similarity index 68% rename from test/integration/write-property-multiple.spec.js rename to test/integration/write-property-multiple.spec.ts index 2ea3bddd..3d607b09 100644 --- a/test/integration/write-property-multiple.spec.js +++ b/test/integration/write-property-multiple.spec.ts @@ -1,18 +1,17 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - writePropertyMultiple integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); + const client = new utils.BacnetClient({apduTimeout: 200}); const values = [ {objectId: {type: 8, instance: 44301}, values: [ {property: {id: 28, index: 12}, value: [{type: 1, value: true}], priority: 8} ]} ]; - client.writePropertyMultiple('127.0.0.1', values, (err, value) => { + client.writePropertyMultiple('127.0.0.1', values, {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/integration/write-property.spec.js b/test/integration/write-property.spec.ts similarity index 63% rename from test/integration/write-property.spec.js rename to test/integration/write-property.spec.ts index 7513cc4e..ffc68037 100644 --- a/test/integration/write-property.spec.js +++ b/test/integration/write-property.spec.ts @@ -1,13 +1,12 @@ 'use strict'; -const utils = require('./utils'); +import * as utils from './utils'; describe('bacstack - writeProperty integration', () => { it('should return a timeout error if no device is available', (next) => { - const client = new utils.bacnetClient({apduTimeout: 200}); - client.writeProperty('127.0.0.1', {type: 8, instance: 44301}, 28, [{type: 4, value: 100}], (err, value) => { + const client = new utils.BacnetClient({apduTimeout: 200}); + client.writeProperty('127.0.0.1', {type: 8, instance: 44301}, 28, [{type: 4, value: 100}], {}, (err) => { expect(err.message).toEqual('ERR_TIMEOUT'); - expect(value).toBeUndefined(); client.close(); next(); }); diff --git a/test/unit/apdu.spec.js b/test/unit/apdu.spec.ts similarity index 95% rename from test/unit/apdu.spec.js rename to test/unit/apdu.spec.ts index 3bdb1b32..a229781b 100644 --- a/test/unit/apdu.spec.js +++ b/test/unit/apdu.spec.ts @@ -1,26 +1,26 @@ 'use strict'; -const utils = require('./utils'); -const baApdu = require('../../lib/apdu'); +import * as utils from './utils'; +import * as baApdu from '../../lib/apdu'; describe('bacstack - APDU layer', () => { describe('decodedType', () => { it('should correctly encode and decode a package', () => { - const value = [0, 128, 4, 5]; + const value = Buffer.from([0, 128, 4, 5]); baApdu.setDecodedType(value, 1, 48); const result = baApdu.getDecodedInvokeId(value, 1); expect(result).toEqual(4); }); it('should correctly encode and decode a confirmed service package', () => { - const value = [0, 128, 4, 5]; + const value = Buffer.from([0, 128, 4, 5]); baApdu.setDecodedType(value, 1, 0); const result = baApdu.getDecodedInvokeId(value, 1); expect(result).toEqual(5); }); it('should fail if decode an invalid package', () => { - const value = [0, 128, 4, 5]; + const value = Buffer.from([0, 128, 4, 5]); const result = baApdu.getDecodedInvokeId(value, 1); expect(result).toBeUndefined(); }); diff --git a/test/unit/asn1.spec.js b/test/unit/asn1.spec.ts similarity index 97% rename from test/unit/asn1.spec.js rename to test/unit/asn1.spec.ts index 27ede55d..75001a0e 100644 --- a/test/unit/asn1.spec.js +++ b/test/unit/asn1.spec.ts @@ -1,6 +1,6 @@ 'use strict'; -const baAsn1 = require('../../lib/asn1'); +import * as baAsn1 from '../../lib/asn1'; describe('bacstack - ASN1 layer', () => { describe('decodeUnsigned', () => { diff --git a/test/unit/bvlc.spec.js b/test/unit/bvlc.spec.ts similarity index 95% rename from test/unit/bvlc.spec.js rename to test/unit/bvlc.spec.ts index dd757abe..84443ae0 100644 --- a/test/unit/bvlc.spec.js +++ b/test/unit/bvlc.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baBvlc = require('../../lib/bvlc'); +import * as utils from './utils'; +import * as baBvlc from '../../lib/bvlc'; describe('bacstack - BVLC layer', () => { it('should successfuly encode and decode a package', () => { diff --git a/test/unit/npdu.spec.js b/test/unit/npdu.spec.ts similarity index 94% rename from test/unit/npdu.spec.js rename to test/unit/npdu.spec.ts index cd75b924..cc824b03 100644 --- a/test/unit/npdu.spec.js +++ b/test/unit/npdu.spec.ts @@ -1,16 +1,16 @@ 'use strict'; -const utils = require('./utils'); -const baNpdu = require('../../lib/npdu'); +import * as utils from './utils'; +import * as baNpdu from '../../lib/npdu'; describe('bacstack - NPDU layer', () => { it('should successfully decode the NPDU function', () => { - const result = baNpdu.decodeFunction([0, 1, 12], 1); + const result = baNpdu.decodeFunction(Buffer.from([0, 1, 12]), 1); expect(result).toEqual(12); }); it('should fail decoding the NPDU function if invalid version', () => { - const result = baNpdu.decodeFunction([0, 2, 12], 1); + const result = baNpdu.decodeFunction(Buffer.from([0, 2, 12]), 1); expect(result).toBeUndefined(); }); diff --git a/test/unit/service-add-list-element.spec.js b/test/unit/service-add-list-element.spec.ts similarity index 88% rename from test/unit/service-add-list-element.spec.js rename to test/unit/service-add-list-element.spec.ts index 4947af9d..37b145c6 100644 --- a/test/unit/service-add-list-element.spec.js +++ b/test/unit/service-add-list-element.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer AddListElement unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-alarm-acknowledge.spec.js b/test/unit/service-alarm-acknowledge.spec.ts similarity index 95% rename from test/unit/service-alarm-acknowledge.spec.js rename to test/unit/service-alarm-acknowledge.spec.ts index 500cd3d8..ce09d817 100644 --- a/test/unit/service-alarm-acknowledge.spec.js +++ b/test/unit/service-alarm-acknowledge.spec.ts @@ -1,8 +1,8 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); -const baEnum = require('../../lib/enum'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; +import * as baEnum from '../../lib/enum'; describe('bacstack - Services layer AlarmAcknowledge unit', () => { it('should successfully encode and decode with time timestamp', () => { diff --git a/test/unit/service-alarm-summary.spec.js b/test/unit/service-alarm-summary.spec.ts similarity index 91% rename from test/unit/service-alarm-summary.spec.js rename to test/unit/service-alarm-summary.spec.ts index 6a40fbcf..7298d586 100644 --- a/test/unit/service-alarm-summary.spec.js +++ b/test/unit/service-alarm-summary.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer AlarmSummary unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-atomic-read-file.spec.js b/test/unit/service-atomic-read-file.spec.ts similarity index 93% rename from test/unit/service-atomic-read-file.spec.js rename to test/unit/service-atomic-read-file.spec.ts index 72646ac9..568df829 100644 --- a/test/unit/service-atomic-read-file.spec.js +++ b/test/unit/service-atomic-read-file.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer AtomicReadFile unit', () => { it('should successfully encode and decode as stream', () => { @@ -47,7 +47,7 @@ describe('AtomicReadFileAcknowledge', () => { it('should successfully encode and decode as non-stream', () => { const buffer = utils.getBuffer(); - baServices.atomicReadFile.encodeAcknowledge(buffer, false, false, 0, 90, [12, 12, 12], 3); + baServices.atomicReadFile.encodeAcknowledge(buffer, false, false, 0, 90, [[12, 12, 12]], [3]); // TODO: AtomicReadFileAcknowledge as non-stream not yet implemented expect(() => baServices.atomicReadFile.decodeAcknowledge(buffer.buffer, 0)).toThrow('NotImplemented'); }); diff --git a/test/unit/service-atomic-write-file.spec.js b/test/unit/service-atomic-write-file.spec.ts similarity index 95% rename from test/unit/service-atomic-write-file.spec.js rename to test/unit/service-atomic-write-file.spec.ts index 3a9f76e4..1eea3fe9 100644 --- a/test/unit/service-atomic-write-file.spec.js +++ b/test/unit/service-atomic-write-file.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer AtomicWriteFile unit', () => { it('should successfully encode and decode as stream', () => { diff --git a/test/unit/service-cov-notify.spec.js b/test/unit/service-cov-notify.spec.ts similarity index 97% rename from test/unit/service-cov-notify.spec.js rename to test/unit/service-cov-notify.spec.ts index 0e4db678..e4fa3d82 100644 --- a/test/unit/service-cov-notify.spec.js +++ b/test/unit/service-cov-notify.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer COVNotify unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-create-object.spec.js b/test/unit/service-create-object.spec.ts similarity index 97% rename from test/unit/service-create-object.spec.js rename to test/unit/service-create-object.spec.ts index b35f9b22..ae41fc48 100644 --- a/test/unit/service-create-object.spec.js +++ b/test/unit/service-create-object.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer CreateObject unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-delete-object.spec.js b/test/unit/service-delete-object.spec.ts similarity index 83% rename from test/unit/service-delete-object.spec.js rename to test/unit/service-delete-object.spec.ts index a3048f30..572e4c8f 100644 --- a/test/unit/service-delete-object.spec.js +++ b/test/unit/service-delete-object.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer DeleteObject unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-device-communication-control.spec.js b/test/unit/service-device-communication-control.spec.ts similarity index 91% rename from test/unit/service-device-communication-control.spec.js rename to test/unit/service-device-communication-control.spec.ts index 9fdf95ab..bfc57e44 100644 --- a/test/unit/service-device-communication-control.spec.js +++ b/test/unit/service-device-communication-control.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer DeviceCommunicationControl unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-error.spec.js b/test/unit/service-error.spec.ts similarity index 81% rename from test/unit/service-error.spec.js rename to test/unit/service-error.spec.ts index c813d572..be1ab66b 100644 --- a/test/unit/service-error.spec.js +++ b/test/unit/service-error.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer Error unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-event-information.spec.js b/test/unit/service-event-information.spec.ts similarity index 94% rename from test/unit/service-event-information.spec.js rename to test/unit/service-event-information.spec.ts index 3410ea71..dcfa5d59 100644 --- a/test/unit/service-event-information.spec.js +++ b/test/unit/service-event-information.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer EventInformation unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-event-notify-data.spec.js b/test/unit/service-event-notify-data.spec.ts similarity index 98% rename from test/unit/service-event-notify-data.spec.js rename to test/unit/service-event-notify-data.spec.ts index 297cc8ed..b0b22332 100644 --- a/test/unit/service-event-notify-data.spec.js +++ b/test/unit/service-event-notify-data.spec.ts @@ -1,8 +1,8 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); -const baEnum = require('../../lib/enum'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; +import * as baEnum from '../../lib/enum'; describe('bacstack - Services layer EventNotifyData unit', () => { it('should successfully encode and decode a change of bitstring event', () => { diff --git a/test/unit/service-get-enrollment-summary.spec.js b/test/unit/service-get-enrollment-summary.spec.ts similarity index 92% rename from test/unit/service-get-enrollment-summary.spec.js rename to test/unit/service-get-enrollment-summary.spec.ts index 654d8327..658e0ae6 100644 --- a/test/unit/service-get-enrollment-summary.spec.js +++ b/test/unit/service-get-enrollment-summary.spec.ts @@ -1,13 +1,13 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer GetEnrollmentSummary unit', () => { it('should successfully encode and decode', () => { const buffer = utils.getBuffer(); baServices.getEnrollmentSummary.encode(buffer, 2); - const result = baServices.getEnrollmentSummary.decode(buffer.buffer, 0, buffer.offset); + const result = baServices.getEnrollmentSummary.decode(buffer.buffer, 0); delete result.len; expect(result).toEqual({ acknowledgmentFilter: 2 @@ -17,7 +17,7 @@ describe('bacstack - Services layer GetEnrollmentSummary unit', () => { it('should successfully encode and decode full payload', () => { const buffer = utils.getBuffer(); baServices.getEnrollmentSummary.encode(buffer, 2, {objectId: {type: 5, instance: 33}, processId: 7}, 1, 3, {min: 1, max: 65}, 5); - const result = baServices.getEnrollmentSummary.decode(buffer.buffer, 0, buffer.offset); + const result = baServices.getEnrollmentSummary.decode(buffer.buffer, 0); delete result.len; expect(result).toEqual({ acknowledgmentFilter: 2, diff --git a/test/unit/service-get-event-information.spec.js b/test/unit/service-get-event-information.spec.ts similarity index 94% rename from test/unit/service-get-event-information.spec.js rename to test/unit/service-get-event-information.spec.ts index 25db0372..c5e8d79b 100644 --- a/test/unit/service-get-event-information.spec.js +++ b/test/unit/service-get-event-information.spec.ts @@ -1,8 +1,8 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); -const baEnum = require('../../lib/enum'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; +import * as baEnum from '../../lib/enum'; describe('bacstack - Services layer GetEventInformation unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-i-am.spec.js b/test/unit/service-i-am.spec.ts similarity index 83% rename from test/unit/service-i-am.spec.js rename to test/unit/service-i-am.spec.ts index c1f5885e..6c5de165 100644 --- a/test/unit/service-i-am.spec.js +++ b/test/unit/service-i-am.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer Iam unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-i-have-broadcast.spec.js b/test/unit/service-i-have-broadcast.spec.ts similarity index 86% rename from test/unit/service-i-have-broadcast.spec.js rename to test/unit/service-i-have-broadcast.spec.ts index 94f6b790..85bf91f5 100644 --- a/test/unit/service-i-have-broadcast.spec.js +++ b/test/unit/service-i-have-broadcast.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer IhaveBroadcast unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-life-safety-operation.spec.js b/test/unit/service-life-safety-operation.spec.ts similarity index 86% rename from test/unit/service-life-safety-operation.spec.js rename to test/unit/service-life-safety-operation.spec.ts index b1248b7d..cf55f84f 100644 --- a/test/unit/service-life-safety-operation.spec.js +++ b/test/unit/service-life-safety-operation.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer LifeSafetyOperation unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-private-transfer.spec.js b/test/unit/service-private-transfer.spec.ts similarity index 85% rename from test/unit/service-private-transfer.spec.js rename to test/unit/service-private-transfer.spec.ts index 3ecc029d..343fd5fb 100644 --- a/test/unit/service-private-transfer.spec.js +++ b/test/unit/service-private-transfer.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer PrivateTransfer unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-read-property-multiple.spec.js b/test/unit/service-read-property-multiple.spec.ts similarity index 98% rename from test/unit/service-read-property-multiple.spec.js rename to test/unit/service-read-property-multiple.spec.ts index 1e70943f..b4b70a26 100644 --- a/test/unit/service-read-property-multiple.spec.js +++ b/test/unit/service-read-property-multiple.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer ReadPropertyMultiple unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-read-property.spec.js b/test/unit/service-read-property.spec.ts similarity index 99% rename from test/unit/service-read-property.spec.js rename to test/unit/service-read-property.spec.ts index 4878b8bf..1a407413 100644 --- a/test/unit/service-read-property.spec.js +++ b/test/unit/service-read-property.spec.ts @@ -1,8 +1,8 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); -const baEnum = require('../../lib/enum'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; +import * as baEnum from '../../lib/enum'; describe('bacstack - Services layer ReadProperty unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-read-range.spec.js b/test/unit/service-read-range.spec.ts similarity index 96% rename from test/unit/service-read-range.spec.js rename to test/unit/service-read-range.spec.ts index c62f0e0a..b4940db1 100644 --- a/test/unit/service-read-range.spec.js +++ b/test/unit/service-read-range.spec.ts @@ -1,8 +1,8 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); -const baEnum = require('../../lib/enum'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; +import * as baEnum from '../../lib/enum'; describe('bacstack - Services layer ReadRange unit', () => { it('should successfully encode and decode by position', () => { diff --git a/test/unit/service-reinitialize-device.spec.js b/test/unit/service-reinitialize-device.spec.ts similarity index 90% rename from test/unit/service-reinitialize-device.spec.js rename to test/unit/service-reinitialize-device.spec.ts index a67df32c..e4b163d0 100644 --- a/test/unit/service-reinitialize-device.spec.js +++ b/test/unit/service-reinitialize-device.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer ReinitializeDevice unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-subscribe-cov.spec.js b/test/unit/service-subscribe-cov.spec.ts similarity index 92% rename from test/unit/service-subscribe-cov.spec.js rename to test/unit/service-subscribe-cov.spec.ts index 7b53d6be..1ec30c9a 100644 --- a/test/unit/service-subscribe-cov.spec.js +++ b/test/unit/service-subscribe-cov.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer SubscribeCOV unit', () => { it('should successfully encode and decode a cancelation request', () => { diff --git a/test/unit/service-subscribe-property.spec.js b/test/unit/service-subscribe-property.spec.ts similarity index 94% rename from test/unit/service-subscribe-property.spec.js rename to test/unit/service-subscribe-property.spec.ts index 1cd2b82f..bc9e58bb 100644 --- a/test/unit/service-subscribe-property.spec.js +++ b/test/unit/service-subscribe-property.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer SubscribeProperty unit', () => { it('should successfully encode and decode with cancellation request', () => { diff --git a/test/unit/service-time-sync.spec.js b/test/unit/service-time-sync.spec.ts similarity index 68% rename from test/unit/service-time-sync.spec.js rename to test/unit/service-time-sync.spec.ts index 8d2f960c..05a3a149 100644 --- a/test/unit/service-time-sync.spec.js +++ b/test/unit/service-time-sync.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer TimeSync unit', () => { it('should successfully encode and decode', () => { @@ -9,7 +9,7 @@ describe('bacstack - Services layer TimeSync unit', () => { const date = new Date(); date.setMilliseconds(990); baServices.timeSync.encode(buffer, date); - const result = baServices.timeSync.decode(buffer.buffer, 0, buffer.offset); + const result = baServices.timeSync.decode(buffer.buffer, 0); delete result.len; expect(result).toEqual({ value: date diff --git a/test/unit/service-who-has.spec.js b/test/unit/service-who-has.spec.ts similarity index 83% rename from test/unit/service-who-has.spec.js rename to test/unit/service-who-has.spec.ts index 35d208b1..370a0593 100644 --- a/test/unit/service-who-has.spec.js +++ b/test/unit/service-who-has.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer WhoHas unit', () => { it('should successfully encode and decode by id', () => { @@ -21,7 +21,7 @@ describe('bacstack - Services layer WhoHas unit', () => { it('should successfully encode and decode by name', () => { const buffer = utils.getBuffer(); - baServices.whoHas.encode(buffer, 3, 4000, {}, 'analog-output-1'); + baServices.whoHas.encode(buffer, 3, 4000, undefined, 'analog-output-1'); const result = baServices.whoHas.decode(buffer.buffer, 0, buffer.offset); delete result.len; expect(result).toEqual({ diff --git a/test/unit/service-who-is.spec.js b/test/unit/service-who-is.spec.ts similarity index 82% rename from test/unit/service-who-is.spec.js rename to test/unit/service-who-is.spec.ts index 671b0bfc..6f3126e2 100644 --- a/test/unit/service-who-is.spec.js +++ b/test/unit/service-who-is.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer WhoIs unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-write-property-multiple.spec.js b/test/unit/service-write-property-multiple.spec.ts similarity index 98% rename from test/unit/service-write-property-multiple.spec.js rename to test/unit/service-write-property-multiple.spec.ts index 78a5414f..40179040 100644 --- a/test/unit/service-write-property-multiple.spec.js +++ b/test/unit/service-write-property-multiple.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer WritePropertyMultiple unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/service-write-property.spec.js b/test/unit/service-write-property.spec.ts similarity index 98% rename from test/unit/service-write-property.spec.js rename to test/unit/service-write-property.spec.ts index 092e402f..4cb9684c 100644 --- a/test/unit/service-write-property.spec.js +++ b/test/unit/service-write-property.spec.ts @@ -1,7 +1,7 @@ 'use strict'; -const utils = require('./utils'); -const baServices = require('../../lib/services'); +import * as utils from './utils'; +import * as baServices from '../../lib/services'; describe('bacstack - Services layer WriteProperty unit', () => { it('should successfully encode and decode', () => { diff --git a/test/unit/utils.js b/test/unit/utils.js deleted file mode 100644 index 10142825..00000000 --- a/test/unit/utils.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -module.exports.getBuffer = () => { - return { - buffer: Buffer.alloc(1482), - offset: 0 - }; -}; diff --git a/test/unit/utils.ts b/test/unit/utils.ts new file mode 100644 index 00000000..0d3016f8 --- /dev/null +++ b/test/unit/utils.ts @@ -0,0 +1,6 @@ +'use strict'; + +export const getBuffer = () => ({ + buffer: Buffer.alloc(1482), + offset: 0 +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..1716ab4b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "es6", + "outDir": "dist", + "module": "commonjs", + "noImplicitAny": true + } +} diff --git a/yarn.lock b/yarn.lock index 8ec41652..7aa2e699 100644 --- a/yarn.lock +++ b/yarn.lock @@ -176,7 +176,12 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.7.2", "@babel/parser@^7.9.4": +"@babel/parser@^7.1.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + +"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.7.2": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== @@ -635,6 +640,17 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@jest/types@^27.0.6": version "27.0.6" resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.0.6.tgz#9a992bc517e0c49f035938b8549719c2de40706b" @@ -646,6 +662,27 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz#94c23db18ee4653e129abd26fb06f870ac9e1ee2" + integrity sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -724,12 +761,25 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@^26.0.23": + version "26.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" + integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/json-schema@^7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + "@types/minimist@^1.2.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== -"@types/node@*": +"@types/node@*", "@types/node@^15.12.5": version "15.12.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.5.tgz#9a78318a45d75c9523d2396131bd3cca54b2d185" integrity sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg== @@ -759,6 +809,13 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^16.0.0": version "16.0.3" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.3.tgz#4b6d35bb8e680510a7dc2308518a80ee1ef27e01" @@ -766,6 +823,75 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.1.tgz#c045e440196ae45464e08e20c38aff5c3a825947" + integrity sha512-9yfcNpDaNGQ6/LQOX/KhUFTR1sCKH+PBr234k6hI9XJ0VP5UqGxap0AnNwBnWFk1MNyWBylJH9ZkzBXC+5akZQ== + dependencies: + "@typescript-eslint/experimental-utils" "4.28.1" + "@typescript-eslint/scope-manager" "4.28.1" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.1.tgz#3869489dcca3c18523c46018b8996e15948dbadc" + integrity sha512-n8/ggadrZ+uyrfrSEchx3jgODdmcx7MzVM2sI3cTpI/YlfSm0+9HEUaWw3aQn2urL2KYlWYMDgn45iLfjDYB+Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.28.1" + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/typescript-estree" "4.28.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.1.tgz#5181b81658414f47291452c15bf6cd44a32f85bd" + integrity sha512-UjrMsgnhQIIK82hXGaD+MCN8IfORS1CbMdu7VlZbYa8LCZtbZjJA26De4IPQB7XYZbL8gJ99KWNj0l6WD0guJg== + dependencies: + "@typescript-eslint/scope-manager" "4.28.1" + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/typescript-estree" "4.28.1" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.1.tgz#fd3c20627cdc12933f6d98b386940d8d0ce8a991" + integrity sha512-o95bvGKfss6705x7jFGDyS7trAORTy57lwJ+VsYwil/lOUxKQ9tA7Suuq+ciMhJc/1qPwB3XE2DKh9wubW8YYA== + dependencies: + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/visitor-keys" "4.28.1" + +"@typescript-eslint/types@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.1.tgz#d0f2ecbef3684634db357b9bbfc97b94b828f83f" + integrity sha512-4z+knEihcyX7blAGi7O3Fm3O6YRCP+r56NJFMNGsmtdw+NCdpG5SgNz427LS9nQkRVTswZLhz484hakQwB8RRg== + +"@typescript-eslint/typescript-estree@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.1.tgz#af882ae41740d1f268e38b4d0fad21e7e8d86a81" + integrity sha512-GhKxmC4sHXxHGJv8e8egAZeTZ6HI4mLU6S7FUzvFOtsk7ZIDN1ksA9r9DyOgNqowA9yAtZXV0Uiap61bIO81FQ== + dependencies: + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/visitor-keys" "4.28.1" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.1.tgz#162a515ee255f18a6068edc26df793cdc1ec9157" + integrity sha512-K4HMrdFqr9PFquPu178SaSb92CaWe2yErXyPumc8cYWxFmhgJsNY9eSePmO05j0JhBvf2Cdhptd6E6Yv9HVHcg== + dependencies: + "@typescript-eslint/types" "4.28.1" + eslint-visitor-keys "^2.0.0" + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -890,6 +1016,11 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -976,11 +1107,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1012,6 +1138,13 @@ browserslist@^4.16.6: escalade "^3.1.1" node-releases "^1.1.71" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1019,7 +1152,7 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-from@^1.0.0: +buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -1053,13 +1186,6 @@ caniuse-lite@^1.0.30001219: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598" integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ== -catharsis@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" - integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== - dependencies: - lodash "^4.17.15" - chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1298,15 +1424,22 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + diff-sequences@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== -docdash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/docdash/-/docdash-1.2.0.tgz#f99dde5b8a89aa4ed083a3150383e042d06c7f49" - integrity sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" @@ -1351,11 +1484,6 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -entities@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1415,7 +1543,19 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== @@ -1550,7 +1690,18 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-json-stable-stringify@^2.0.0: +fast-glob@^3.1.1: + version "3.2.6" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.6.tgz#434dd9529845176ea049acc9343e8282765c6e1a" + integrity sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -1560,6 +1711,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" + integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -1687,10 +1845,21 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.1.1, glob@^7.1.2, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1707,9 +1876,8 @@ global-dirs@^0.1.1: ini "^1.3.4" globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + version "11.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" globals@^13.6.0, globals@^13.9.0: version "13.9.0" @@ -1718,7 +1886,24 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -1746,9 +1931,8 @@ has@^1.0.3: function-bind "^1.1.1" hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" hosted-git-info@^4.0.1: version "4.0.2" @@ -1810,6 +1994,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -1850,9 +2039,8 @@ inherits@2, inherits@^2.0.3: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" is-arrayish@^0.2.1: version "0.2.1" @@ -2057,6 +2245,16 @@ jest-config@^27.0.6: micromatch "^4.0.4" pretty-format "^27.0.6" +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + jest-diff@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.0.6.tgz#4a7a19ee6f04ad70e0e3388f35829394a44c7b5e" @@ -2110,6 +2308,11 @@ jest-environment-node@^27.0.6: jest-mock "^27.0.6" jest-util "^27.0.6" +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + jest-get-type@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" @@ -2332,7 +2535,7 @@ jest-snapshot@^27.0.6: pretty-format "^27.0.6" semver "^7.3.2" -jest-util@^27.0.6: +jest-util@^27.0.0, jest-util@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.6.tgz#e8e04eec159de2f4d5f57f795df9cdc091e50297" integrity sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ== @@ -2400,33 +2603,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js2xmlparser@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd" - integrity sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw== - dependencies: - xmlcreate "^2.0.3" - -jsdoc@^3.6.7: - version "3.6.7" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.7.tgz#00431e376bed7f9de4716c6f15caa80e64492b89" - integrity sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw== - dependencies: - "@babel/parser" "^7.9.4" - bluebird "^3.7.2" - catharsis "^0.9.0" - escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.1" - klaw "^3.0.0" - markdown-it "^10.0.0" - markdown-it-anchor "^5.2.7" - marked "^2.0.3" - mkdirp "^1.0.4" - requizzle "^0.2.3" - strip-json-comments "^3.1.0" - taffydb "2.6.2" - underscore "~1.13.1" - jsdom@^16.6.0: version "16.6.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" @@ -2485,10 +2661,10 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== +json5@2.x, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: minimist "^1.2.5" @@ -2511,13 +2687,6 @@ kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" - integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== - dependencies: - graceful-fs "^4.1.9" - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -2549,13 +2718,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -linkify-it@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" - integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== - dependencies: - uc.micro "^1.0.1" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -2585,7 +2747,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: +lodash@4.x, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2604,6 +2766,11 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -2621,32 +2788,6 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== -markdown-it-anchor@^5.2.7: - version "5.3.0" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" - integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== - -markdown-it@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" - integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== - dependencies: - argparse "^1.0.7" - entities "~2.0.0" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -marked@^2.0.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" - integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -2669,6 +2810,11 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" @@ -2720,7 +2866,7 @@ minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mkdirp@^1.0.4: +mkdirp@1.x: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -2939,6 +3085,16 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + pretty-format@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.6.tgz#ab770c47b2c6f893a21aefc57b75da63ef49a11f" @@ -2977,6 +3133,11 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -3038,13 +3199,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -requizzle@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" - integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== - dependencies: - lodash "^4.17.14" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -3069,7 +3223,14 @@ resolve-global@1.0.0, resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" -resolve@^1.10.0, resolve@^1.20.0: +resolve@^1.10.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -3077,6 +3238,11 @@ resolve@^1.10.0, resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -3084,6 +3250,13 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -3107,11 +3280,10 @@ saxes@^5.0.1: xmlchars "^2.2.0" "semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" -semver@7.3.5, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@7.3.5, semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -3135,7 +3307,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -3326,11 +3502,6 @@ table@^6.0.9: string-width "^4.2.0" strip-ansi "^6.0.0" -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" - integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg= - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -3418,6 +3589,34 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +ts-jest@^27.0.3: + version "27.0.3" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.3.tgz#808492f022296cde19390bb6ad627c8126bf93f8" + integrity sha512-U5rdMjnYam9Ucw+h0QvtNDbc5+88nxt7tbIvqaZUhFrfG4+SkWhMXjejCLVGcpILTPuV+H3W/GZDZrnZFpPeXw== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash "4.x" + make-error "1.x" + mkdirp "1.x" + semver "7.x" + yargs-parser "20.x" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -3469,15 +3668,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -underscore@~1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" - integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== +typescript@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" + integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== universalify@^0.1.2: version "0.1.2" @@ -3626,11 +3820,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmlcreate@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.3.tgz#df9ecd518fd3890ab3548e1b811d040614993497" - integrity sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -3638,15 +3827,15 @@ y18n@^5.0.5: yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==