secs4js 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +20 -20
- package/README.md +84 -0
- package/lib/core/AbstractSecsCommunicator.d.ts +4 -0
- package/lib/core/AbstractSecsCommunicator.d.ts.map +1 -1
- package/lib/core/AbstractSecsCommunicator.js +70 -5
- package/lib/core/AbstractSecsCommunicator.js.map +1 -1
- package/lib/core/AbstractSecsMessage.js.map +1 -1
- package/lib/core/enums/HsmsSsControlType.js.map +1 -1
- package/lib/core/enums/RejectReason.js.map +1 -1
- package/lib/core/enums/SecsItemType.js.map +1 -1
- package/lib/core/enums/SelectStatus.js.map +1 -1
- package/lib/core/secs2item/AbstractSecs2Item.js.map +1 -1
- package/lib/core/secs2item/Secs2ItemAscii.js.map +1 -1
- package/lib/core/secs2item/Secs2ItemBinary.js.map +1 -1
- package/lib/core/secs2item/Secs2ItemBoolean.js.map +1 -1
- package/lib/core/secs2item/Secs2ItemFactory.js.map +1 -1
- package/lib/core/secs2item/Secs2ItemList.js.map +1 -1
- package/lib/core/secs2item/Secs2ItemNumeric.js.map +1 -1
- package/lib/core/secs2item/Secs2ItemParser.js.map +1 -1
- package/lib/gem/Clock.js.map +1 -1
- package/lib/gem/Gem.js.map +1 -1
- package/lib/helper/Secs2ItemHelper.js.map +1 -1
- package/lib/hsms/HsmsActiveCommunicator.d.ts.map +1 -1
- package/lib/hsms/HsmsActiveCommunicator.js +21 -5
- package/lib/hsms/HsmsActiveCommunicator.js.map +1 -1
- package/lib/hsms/HsmsCommunicator.d.ts +1 -0
- package/lib/hsms/HsmsCommunicator.d.ts.map +1 -1
- package/lib/hsms/HsmsCommunicator.js +72 -7
- package/lib/hsms/HsmsCommunicator.js.map +1 -1
- package/lib/hsms/HsmsMessage.js.map +1 -1
- package/lib/hsms/HsmsPassiveCommunicator.js.map +1 -1
- package/lib/hsms/enums/HsmsControlType.js.map +1 -1
- package/lib/hsms/enums/RejectReason.js.map +1 -1
- package/lib/hsms/enums/SelectStatus.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -1
- package/lib/logging/SecsLogger.d.ts +36 -0
- package/lib/logging/SecsLogger.d.ts.map +1 -0
- package/lib/logging/SecsLogger.js +415 -0
- package/lib/logging/SecsLogger.js.map +1 -0
- package/lib/secs1/Secs1Communicator.d.ts +1 -0
- package/lib/secs1/Secs1Communicator.d.ts.map +1 -1
- package/lib/secs1/Secs1Communicator.js +45 -8
- package/lib/secs1/Secs1Communicator.js.map +1 -1
- package/lib/secs1/Secs1Message.js.map +1 -1
- package/lib/secs1/Secs1MessageBlock.js.map +1 -1
- package/lib/secs1/Secs1OnTcpIpActiveCommunicator.d.ts.map +1 -1
- package/lib/secs1/Secs1OnTcpIpActiveCommunicator.js +13 -2
- package/lib/secs1/Secs1OnTcpIpActiveCommunicator.js.map +1 -1
- package/lib/secs1/Secs1OnTcpIpPassiveCommunicator.d.ts.map +1 -1
- package/lib/secs1/Secs1OnTcpIpPassiveCommunicator.js +10 -2
- package/lib/secs1/Secs1OnTcpIpPassiveCommunicator.js.map +1 -1
- package/lib/secs1/Secs1SerialCommunicator.js.map +1 -1
- package/lib/sml/SmlParser.js.map +1 -1
- package/package.json +15 -1
package/lib/gem/Clock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Clock.js","names":["datetime: Date"],"sources":["../../src/gem/Clock.ts"],"sourcesContent":["import { AbstractSecs2Item } from \"../core/secs2item/AbstractSecs2Item.js\";\nimport { Secs2ItemAscii } from \"../core/secs2item/Secs2ItemAscii.js\";\n\nexport enum ClockType {\n\tA12 = \"A12\",\n\tA16 = \"A16\",\n}\n\nexport class Clock {\n\tconstructor(private datetime: Date) {}\n\n\ttoA16(): Secs2ItemAscii {\n\t\tconst year = this.datetime.getFullYear();\n\t\tconst month = (this.datetime.getMonth() + 1).toString().padStart(2, \"0\");\n\t\tconst day = this.datetime.getDate().toString().padStart(2, \"0\");\n\t\tconst hour = this.datetime.getHours().toString().padStart(2, \"0\");\n\t\tconst minute = this.datetime.getMinutes().toString().padStart(2, \"0\");\n\t\tconst second = this.datetime.getSeconds().toString().padStart(2, \"0\");\n\t\tconst cc = Math.floor(this.datetime.getMilliseconds() / 10)\n\t\t\t.toString()\n\t\t\t.padStart(2, \"0\");\n\n\t\treturn new Secs2ItemAscii(\n\t\t\t`${year}${month}${day}${hour}${minute}${second}${cc}`,\n\t\t);\n\t}\n\n\ttoA12(): Secs2ItemAscii {\n\t\tconst year = this.datetime.getFullYear().toString().slice(-2);\n\t\tconst month = (this.datetime.getMonth() + 1).toString().padStart(2, \"0\");\n\t\tconst day = this.datetime.getDate().toString().padStart(2, \"0\");\n\t\tconst hour = this.datetime.getHours().toString().padStart(2, \"0\");\n\t\tconst minute = this.datetime.getMinutes().toString().padStart(2, \"0\");\n\t\tconst second = this.datetime.getSeconds().toString().padStart(2, \"0\");\n\n\t\treturn new Secs2ItemAscii(`${year}${month}${day}${hour}${minute}${second}`);\n\t}\n\n\ttoDatetime(): Date {\n\t\treturn this.datetime;\n\t}\n\n\tstatic now(): Clock {\n\t\treturn new Clock(new Date());\n\t}\n\n\tstatic fromAscii(item: AbstractSecs2Item): Clock {\n\t\tif (!(item instanceof Secs2ItemAscii)) {\n\t\t\tthrow new Error(\"Clock can only be parsed from ASCII item\");\n\t\t}\n\t\tconst val = item.value;\n\t\tconst len = val.length;\n\n\t\tif (len === 12) {\n\t\t\t// YYMMDDHHMMSS\n\t\t\tconst yy = parseInt(val.substring(0, 2), 10);\n\t\t\tconst mm = parseInt(val.substring(2, 4), 10);\n\t\t\tconst dd = parseInt(val.substring(4, 6), 10);\n\t\t\tconst hh = parseInt(val.substring(6, 8), 10);\n\t\t\tconst min = parseInt(val.substring(8, 10), 10);\n\t\t\tconst ss = parseInt(val.substring(10, 12), 10);\n\n\t\t\tconst year = Clock.getYear(yy);\n\t\t\treturn new Clock(new Date(year, mm - 1, dd, hh, min, ss));\n\t\t} else if (len === 16) {\n\t\t\t// YYYYMMDDHHMMSSCC\n\t\t\tconst year = parseInt(val.substring(0, 4), 10);\n\t\t\tconst mm = parseInt(val.substring(4, 6), 10);\n\t\t\tconst dd = parseInt(val.substring(6, 8), 10);\n\t\t\tconst hh = parseInt(val.substring(8, 10), 10);\n\t\t\tconst min = parseInt(val.substring(10, 12), 10);\n\t\t\tconst ss = parseInt(val.substring(12, 14), 10);\n\t\t\tconst cc = parseInt(val.substring(14, 16), 10);\n\n\t\t\treturn new Clock(new Date(year, mm - 1, dd, hh, min, ss, cc * 10));\n\t\t}\n\n\t\tthrow new Error(\"Unknown ClockType format\");\n\t}\n\n\tprivate static getYear(yy: number): number {\n\t\tconst nowYear = new Date().getFullYear();\n\t\tconst century = Math.floor(nowYear / 100) * 100;\n\t\tconst flacYear = nowYear % 100;\n\n\t\tif (flacYear < 25) {\n\t\t\tif (yy >= 75) return century - 100 + yy;\n\t\t} else if (flacYear >= 75) {\n\t\t\tif (yy < 25) return century + 100 + yy;\n\t\t}\n\t\treturn century + yy;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Clock.js","names":["datetime: Date"],"sources":["../../src/gem/Clock.ts"],"sourcesContent":["import { AbstractSecs2Item } from \"../core/secs2item/AbstractSecs2Item.js\";\r\nimport { Secs2ItemAscii } from \"../core/secs2item/Secs2ItemAscii.js\";\r\n\r\nexport enum ClockType {\r\n\tA12 = \"A12\",\r\n\tA16 = \"A16\",\r\n}\r\n\r\nexport class Clock {\r\n\tconstructor(private datetime: Date) {}\r\n\r\n\ttoA16(): Secs2ItemAscii {\r\n\t\tconst year = this.datetime.getFullYear();\r\n\t\tconst month = (this.datetime.getMonth() + 1).toString().padStart(2, \"0\");\r\n\t\tconst day = this.datetime.getDate().toString().padStart(2, \"0\");\r\n\t\tconst hour = this.datetime.getHours().toString().padStart(2, \"0\");\r\n\t\tconst minute = this.datetime.getMinutes().toString().padStart(2, \"0\");\r\n\t\tconst second = this.datetime.getSeconds().toString().padStart(2, \"0\");\r\n\t\tconst cc = Math.floor(this.datetime.getMilliseconds() / 10)\r\n\t\t\t.toString()\r\n\t\t\t.padStart(2, \"0\");\r\n\r\n\t\treturn new Secs2ItemAscii(\r\n\t\t\t`${year}${month}${day}${hour}${minute}${second}${cc}`,\r\n\t\t);\r\n\t}\r\n\r\n\ttoA12(): Secs2ItemAscii {\r\n\t\tconst year = this.datetime.getFullYear().toString().slice(-2);\r\n\t\tconst month = (this.datetime.getMonth() + 1).toString().padStart(2, \"0\");\r\n\t\tconst day = this.datetime.getDate().toString().padStart(2, \"0\");\r\n\t\tconst hour = this.datetime.getHours().toString().padStart(2, \"0\");\r\n\t\tconst minute = this.datetime.getMinutes().toString().padStart(2, \"0\");\r\n\t\tconst second = this.datetime.getSeconds().toString().padStart(2, \"0\");\r\n\r\n\t\treturn new Secs2ItemAscii(`${year}${month}${day}${hour}${minute}${second}`);\r\n\t}\r\n\r\n\ttoDatetime(): Date {\r\n\t\treturn this.datetime;\r\n\t}\r\n\r\n\tstatic now(): Clock {\r\n\t\treturn new Clock(new Date());\r\n\t}\r\n\r\n\tstatic fromAscii(item: AbstractSecs2Item): Clock {\r\n\t\tif (!(item instanceof Secs2ItemAscii)) {\r\n\t\t\tthrow new Error(\"Clock can only be parsed from ASCII item\");\r\n\t\t}\r\n\t\tconst val = item.value;\r\n\t\tconst len = val.length;\r\n\r\n\t\tif (len === 12) {\r\n\t\t\t// YYMMDDHHMMSS\r\n\t\t\tconst yy = parseInt(val.substring(0, 2), 10);\r\n\t\t\tconst mm = parseInt(val.substring(2, 4), 10);\r\n\t\t\tconst dd = parseInt(val.substring(4, 6), 10);\r\n\t\t\tconst hh = parseInt(val.substring(6, 8), 10);\r\n\t\t\tconst min = parseInt(val.substring(8, 10), 10);\r\n\t\t\tconst ss = parseInt(val.substring(10, 12), 10);\r\n\r\n\t\t\tconst year = Clock.getYear(yy);\r\n\t\t\treturn new Clock(new Date(year, mm - 1, dd, hh, min, ss));\r\n\t\t} else if (len === 16) {\r\n\t\t\t// YYYYMMDDHHMMSSCC\r\n\t\t\tconst year = parseInt(val.substring(0, 4), 10);\r\n\t\t\tconst mm = parseInt(val.substring(4, 6), 10);\r\n\t\t\tconst dd = parseInt(val.substring(6, 8), 10);\r\n\t\t\tconst hh = parseInt(val.substring(8, 10), 10);\r\n\t\t\tconst min = parseInt(val.substring(10, 12), 10);\r\n\t\t\tconst ss = parseInt(val.substring(12, 14), 10);\r\n\t\t\tconst cc = parseInt(val.substring(14, 16), 10);\r\n\r\n\t\t\treturn new Clock(new Date(year, mm - 1, dd, hh, min, ss, cc * 10));\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"Unknown ClockType format\");\r\n\t}\r\n\r\n\tprivate static getYear(yy: number): number {\r\n\t\tconst nowYear = new Date().getFullYear();\r\n\t\tconst century = Math.floor(nowYear / 100) * 100;\r\n\t\tconst flacYear = nowYear % 100;\r\n\r\n\t\tif (flacYear < 25) {\r\n\t\t\tif (yy >= 75) return century - 100 + yy;\r\n\t\t} else if (flacYear >= 75) {\r\n\t\t\tif (yy < 25) return century + 100 + yy;\r\n\t\t}\r\n\t\treturn century + yy;\r\n\t}\r\n}\r\n"],"mappings":"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"}
|
package/lib/gem/Gem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gem.js","names":["comm: AbstractSecsCommunicator","body: Secs2ItemList"],"sources":["../../src/gem/Gem.ts"],"sourcesContent":["import { AbstractSecsCommunicator } from \"../core/AbstractSecsCommunicator.js\";\nimport { SecsMessage } from \"../core/AbstractSecsMessage.js\";\nimport { Secs2ItemAscii } from \"../core/secs2item/Secs2ItemAscii.js\";\nimport { Secs2ItemBinary } from \"../core/secs2item/Secs2ItemBinary.js\";\nimport { Secs2ItemList } from \"../core/secs2item/Secs2ItemList.js\";\nimport { A, B, L } from \"../helper/Secs2ItemHelper.js\";\nimport { Clock, ClockType } from \"./Clock.js\";\n\nexport enum CommAck {\n\tOK = 0x0,\n\tDENIED = 0x1,\n}\n\nexport enum OflAck {\n\tOK = 0x0,\n}\n\nexport enum OnlAck {\n\tOK = 0x0,\n\tREFUSE = 0x1,\n\tALREADY_ONLINE = 0x2,\n}\n\nexport enum TiAck {\n\tOK = 0x0,\n\tNOT_DONE = 0x1,\n}\n\nexport class Gem {\n\tprivate static readonly DEFAULT_MDLN = \" \";\n\tprivate static readonly DEFAULT_SOFTREV = \" \";\n\tprivate static readonly DEFAULT_CLOCK_TYPE = ClockType.A16;\n\n\tpublic mdln: string = Gem.DEFAULT_MDLN;\n\tpublic softrev: string = Gem.DEFAULT_SOFTREV;\n\tpublic clockType: ClockType = Gem.DEFAULT_CLOCK_TYPE;\n\n\tconstructor(public comm: AbstractSecsCommunicator) {}\n\n\t// S1F2 - Are You There?\n\tasync s1f2(primaryMsg: SecsMessage): Promise<void> {\n\t\tawait this.comm.reply(primaryMsg, 1, 2, L());\n\t}\n\n\t// S1F13 - Establish Communications Request\n\tasync s1f13(): Promise<number> {\n\t\tlet body: Secs2ItemList;\n\t\tif (this.comm.isEquip) {\n\t\t\tbody = L(A(this.mdln), A(this.softrev));\n\t\t} else {\n\t\t\tbody = L();\n\t\t}\n\n\t\tconst reply = await this.comm.send(1, 13, true, body);\n\t\tif (reply && reply.body instanceof Secs2ItemList) {\n\t\t\tconst list = reply.body;\n\t\t\tif (list.value.length > 0 && list.value[0] instanceof Secs2ItemBinary) {\n\t\t\t\tconst bin = list.value[0];\n\t\t\t\treturn bin.value[0];\n\t\t\t}\n\t\t}\n\t\tthrow new Error(\"S1F14 invalid response or not COMMACK\");\n\t}\n\n\t// S1F14 - Establish Communications Acknowledge\n\tasync s1f14(primaryMsg: SecsMessage, commAck: CommAck): Promise<void> {\n\t\tlet body: Secs2ItemList;\n\t\tif (this.comm.isEquip) {\n\t\t\tbody = L(B(Buffer.from([commAck])), L(A(this.mdln), A(this.softrev)));\n\t\t} else {\n\t\t\tbody = L(B(Buffer.from([commAck])), L());\n\t\t}\n\t\tawait this.comm.reply(primaryMsg, 1, 14, body);\n\t}\n\n\t// S1F15 - Request OFF-LINE\n\tasync s1f15(): Promise<number> {\n\t\tconst reply = await this.comm.send(1, 15, true);\n\t\tif (reply && reply.body instanceof Secs2ItemBinary) {\n\t\t\treturn reply.body.value[0];\n\t\t}\n\t\tthrow new Error(\"S1F16 invalid response or not OFLACK\");\n\t}\n\n\t// S1F16 - OFF-LINE Acknowledge\n\tasync s1f16(primaryMsg: SecsMessage): Promise<void> {\n\t\tawait this.comm.reply(primaryMsg, 1, 16, B(Buffer.from([OflAck.OK])));\n\t}\n\n\t// S1F17 - Request ON-LINE\n\tasync s1f17(): Promise<number> {\n\t\tconst reply = await this.comm.send(1, 17, true);\n\t\tif (reply && reply.body instanceof Secs2ItemBinary) {\n\t\t\treturn reply.body.value[0];\n\t\t}\n\t\tthrow new Error(\"S1F18 invalid response or not ONLACK\");\n\t}\n\n\t// S1F18 - ON-LINE Acknowledge\n\tasync s1f18(primaryMsg: SecsMessage, onlAck: OnlAck): Promise<void> {\n\t\tawait this.comm.reply(primaryMsg, 1, 18, B(Buffer.from([onlAck])));\n\t}\n\n\t// S2F17 - Date and Time Request\n\tasync s2f17(): Promise<Clock> {\n\t\tconst reply = await this.comm.send(2, 17, true);\n\t\tif (reply?.body instanceof Secs2ItemAscii) {\n\t\t\treturn Clock.fromAscii(reply.body);\n\t\t}\n\t\tthrow new Error(\"S2F18 invalid response or not time\");\n\t}\n\n\t// S2F18 - Date and Time Data\n\tasync s2f18(\n\t\tprimaryMsg: SecsMessage,\n\t\tclock: Clock = Clock.now(),\n\t): Promise<void> {\n\t\tconst body =\n\t\t\tthis.clockType === ClockType.A12 ? clock.toA12() : clock.toA16();\n\t\tawait this.comm.reply(primaryMsg, 2, 18, body);\n\t}\n\n\tasync s2f18Now(primaryMsg: SecsMessage): Promise<void> {\n\t\treturn this.s2f18(primaryMsg, Clock.now());\n\t}\n\n\t// S2F31 - Date and Time Set Request\n\tasync s2f31(clock: Clock): Promise<number> {\n\t\tconst body =\n\t\t\tthis.clockType === ClockType.A12 ? clock.toA12() : clock.toA16();\n\t\tconst reply = await this.comm.send(2, 31, true, body);\n\t\tif (reply && reply.body instanceof Secs2ItemBinary) {\n\t\t\treturn reply.body.value[0];\n\t\t}\n\t\tthrow new Error(\"S2F32 invalid response or not TIACK\");\n\t}\n\n\tasync s2f31Now(): Promise<number> {\n\t\treturn this.s2f31(Clock.now());\n\t}\n\n\t// S2F32 - Date and Time Set Acknowledge\n\tasync s2f32(primaryMsg: SecsMessage, tiAck: TiAck): Promise<void> {\n\t\tawait this.comm.reply(primaryMsg, 2, 32, B(Buffer.from([tiAck])));\n\t}\n\n\t// S9Fx Helpers\n\tasync s9f1(refMsg: SecsMessage): Promise<void> {\n\t\tawait this.s9fy(refMsg, 1);\n\t}\n\tasync s9f3(refMsg: SecsMessage): Promise<void> {\n\t\tawait this.s9fy(refMsg, 3);\n\t}\n\tasync s9f5(refMsg: SecsMessage): Promise<void> {\n\t\tawait this.s9fy(refMsg, 5);\n\t}\n\tasync s9f7(refMsg: SecsMessage): Promise<void> {\n\t\tawait this.s9fy(refMsg, 7);\n\t}\n\tasync s9f9(refMsg: SecsMessage): Promise<void> {\n\t\tawait this.s9fy(refMsg, 9);\n\t}\n\tasync s9f11(refMsg: SecsMessage): Promise<void> {\n\t\tawait this.s9fy(refMsg, 11);\n\t}\n\n\tprivate async s9fy(refMsg: SecsMessage, func: number): Promise<void> {\n\t\tconst header = this.getHeader10Bytes(refMsg);\n\t\tawait this.comm.send(9, func, false, B(header));\n\t}\n\n\tprivate getHeader10Bytes(msg: SecsMessage): Buffer {\n\t\tconst buffer = Buffer.alloc(10);\n\t\t// Session ID (Device ID)\n\t\tbuffer.writeUInt16BE(msg.deviceId & 0x7fff, 0);\n\n\t\t// Stream + W-bit\n\t\tlet streamByte = msg.stream & 0x7f;\n\t\tif (msg.wBit) {\n\t\t\tstreamByte |= 0x80;\n\t\t}\n\t\tbuffer.writeUInt8(streamByte, 2);\n\n\t\t// Function\n\t\tbuffer.writeUInt8(msg.func, 3);\n\n\t\t// P-Type, S-Type (Assuming 0 for now)\n\t\tbuffer.writeUInt8(0, 4);\n\t\tbuffer.writeUInt8(0, 5);\n\n\t\t// System Bytes\n\t\tif (typeof msg.systemBytes === \"number\") {\n\t\t\tbuffer.writeUInt32BE(msg.systemBytes, 6);\n\t\t} else {\n\t\t\t// Assuming Buffer\n\t\t\tconst sysBuf = msg.systemBytes as Buffer;\n\t\t\tsysBuf.copy(buffer, 6, 0, 4);\n\t\t}\n\n\t\treturn buffer;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Gem.js","names":["comm: AbstractSecsCommunicator","body: Secs2ItemList"],"sources":["../../src/gem/Gem.ts"],"sourcesContent":["import { AbstractSecsCommunicator } from \"../core/AbstractSecsCommunicator.js\";\r\nimport { SecsMessage } from \"../core/AbstractSecsMessage.js\";\r\nimport { Secs2ItemAscii } from \"../core/secs2item/Secs2ItemAscii.js\";\r\nimport { Secs2ItemBinary } from \"../core/secs2item/Secs2ItemBinary.js\";\r\nimport { Secs2ItemList } from \"../core/secs2item/Secs2ItemList.js\";\r\nimport { A, B, L } from \"../helper/Secs2ItemHelper.js\";\r\nimport { Clock, ClockType } from \"./Clock.js\";\r\n\r\nexport enum CommAck {\r\n\tOK = 0x0,\r\n\tDENIED = 0x1,\r\n}\r\n\r\nexport enum OflAck {\r\n\tOK = 0x0,\r\n}\r\n\r\nexport enum OnlAck {\r\n\tOK = 0x0,\r\n\tREFUSE = 0x1,\r\n\tALREADY_ONLINE = 0x2,\r\n}\r\n\r\nexport enum TiAck {\r\n\tOK = 0x0,\r\n\tNOT_DONE = 0x1,\r\n}\r\n\r\nexport class Gem {\r\n\tprivate static readonly DEFAULT_MDLN = \" \";\r\n\tprivate static readonly DEFAULT_SOFTREV = \" \";\r\n\tprivate static readonly DEFAULT_CLOCK_TYPE = ClockType.A16;\r\n\r\n\tpublic mdln: string = Gem.DEFAULT_MDLN;\r\n\tpublic softrev: string = Gem.DEFAULT_SOFTREV;\r\n\tpublic clockType: ClockType = Gem.DEFAULT_CLOCK_TYPE;\r\n\r\n\tconstructor(public comm: AbstractSecsCommunicator) {}\r\n\r\n\t// S1F2 - Are You There?\r\n\tasync s1f2(primaryMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.comm.reply(primaryMsg, 1, 2, L());\r\n\t}\r\n\r\n\t// S1F13 - Establish Communications Request\r\n\tasync s1f13(): Promise<number> {\r\n\t\tlet body: Secs2ItemList;\r\n\t\tif (this.comm.isEquip) {\r\n\t\t\tbody = L(A(this.mdln), A(this.softrev));\r\n\t\t} else {\r\n\t\t\tbody = L();\r\n\t\t}\r\n\r\n\t\tconst reply = await this.comm.send(1, 13, true, body);\r\n\t\tif (reply && reply.body instanceof Secs2ItemList) {\r\n\t\t\tconst list = reply.body;\r\n\t\t\tif (list.value.length > 0 && list.value[0] instanceof Secs2ItemBinary) {\r\n\t\t\t\tconst bin = list.value[0];\r\n\t\t\t\treturn bin.value[0];\r\n\t\t\t}\r\n\t\t}\r\n\t\tthrow new Error(\"S1F14 invalid response or not COMMACK\");\r\n\t}\r\n\r\n\t// S1F14 - Establish Communications Acknowledge\r\n\tasync s1f14(primaryMsg: SecsMessage, commAck: CommAck): Promise<void> {\r\n\t\tlet body: Secs2ItemList;\r\n\t\tif (this.comm.isEquip) {\r\n\t\t\tbody = L(B(Buffer.from([commAck])), L(A(this.mdln), A(this.softrev)));\r\n\t\t} else {\r\n\t\t\tbody = L(B(Buffer.from([commAck])), L());\r\n\t\t}\r\n\t\tawait this.comm.reply(primaryMsg, 1, 14, body);\r\n\t}\r\n\r\n\t// S1F15 - Request OFF-LINE\r\n\tasync s1f15(): Promise<number> {\r\n\t\tconst reply = await this.comm.send(1, 15, true);\r\n\t\tif (reply && reply.body instanceof Secs2ItemBinary) {\r\n\t\t\treturn reply.body.value[0];\r\n\t\t}\r\n\t\tthrow new Error(\"S1F16 invalid response or not OFLACK\");\r\n\t}\r\n\r\n\t// S1F16 - OFF-LINE Acknowledge\r\n\tasync s1f16(primaryMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.comm.reply(primaryMsg, 1, 16, B(Buffer.from([OflAck.OK])));\r\n\t}\r\n\r\n\t// S1F17 - Request ON-LINE\r\n\tasync s1f17(): Promise<number> {\r\n\t\tconst reply = await this.comm.send(1, 17, true);\r\n\t\tif (reply && reply.body instanceof Secs2ItemBinary) {\r\n\t\t\treturn reply.body.value[0];\r\n\t\t}\r\n\t\tthrow new Error(\"S1F18 invalid response or not ONLACK\");\r\n\t}\r\n\r\n\t// S1F18 - ON-LINE Acknowledge\r\n\tasync s1f18(primaryMsg: SecsMessage, onlAck: OnlAck): Promise<void> {\r\n\t\tawait this.comm.reply(primaryMsg, 1, 18, B(Buffer.from([onlAck])));\r\n\t}\r\n\r\n\t// S2F17 - Date and Time Request\r\n\tasync s2f17(): Promise<Clock> {\r\n\t\tconst reply = await this.comm.send(2, 17, true);\r\n\t\tif (reply?.body instanceof Secs2ItemAscii) {\r\n\t\t\treturn Clock.fromAscii(reply.body);\r\n\t\t}\r\n\t\tthrow new Error(\"S2F18 invalid response or not time\");\r\n\t}\r\n\r\n\t// S2F18 - Date and Time Data\r\n\tasync s2f18(\r\n\t\tprimaryMsg: SecsMessage,\r\n\t\tclock: Clock = Clock.now(),\r\n\t): Promise<void> {\r\n\t\tconst body =\r\n\t\t\tthis.clockType === ClockType.A12 ? clock.toA12() : clock.toA16();\r\n\t\tawait this.comm.reply(primaryMsg, 2, 18, body);\r\n\t}\r\n\r\n\tasync s2f18Now(primaryMsg: SecsMessage): Promise<void> {\r\n\t\treturn this.s2f18(primaryMsg, Clock.now());\r\n\t}\r\n\r\n\t// S2F31 - Date and Time Set Request\r\n\tasync s2f31(clock: Clock): Promise<number> {\r\n\t\tconst body =\r\n\t\t\tthis.clockType === ClockType.A12 ? clock.toA12() : clock.toA16();\r\n\t\tconst reply = await this.comm.send(2, 31, true, body);\r\n\t\tif (reply && reply.body instanceof Secs2ItemBinary) {\r\n\t\t\treturn reply.body.value[0];\r\n\t\t}\r\n\t\tthrow new Error(\"S2F32 invalid response or not TIACK\");\r\n\t}\r\n\r\n\tasync s2f31Now(): Promise<number> {\r\n\t\treturn this.s2f31(Clock.now());\r\n\t}\r\n\r\n\t// S2F32 - Date and Time Set Acknowledge\r\n\tasync s2f32(primaryMsg: SecsMessage, tiAck: TiAck): Promise<void> {\r\n\t\tawait this.comm.reply(primaryMsg, 2, 32, B(Buffer.from([tiAck])));\r\n\t}\r\n\r\n\t// S9Fx Helpers\r\n\tasync s9f1(refMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.s9fy(refMsg, 1);\r\n\t}\r\n\tasync s9f3(refMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.s9fy(refMsg, 3);\r\n\t}\r\n\tasync s9f5(refMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.s9fy(refMsg, 5);\r\n\t}\r\n\tasync s9f7(refMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.s9fy(refMsg, 7);\r\n\t}\r\n\tasync s9f9(refMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.s9fy(refMsg, 9);\r\n\t}\r\n\tasync s9f11(refMsg: SecsMessage): Promise<void> {\r\n\t\tawait this.s9fy(refMsg, 11);\r\n\t}\r\n\r\n\tprivate async s9fy(refMsg: SecsMessage, func: number): Promise<void> {\r\n\t\tconst header = this.getHeader10Bytes(refMsg);\r\n\t\tawait this.comm.send(9, func, false, B(header));\r\n\t}\r\n\r\n\tprivate getHeader10Bytes(msg: SecsMessage): Buffer {\r\n\t\tconst buffer = Buffer.alloc(10);\r\n\t\t// Session ID (Device ID)\r\n\t\tbuffer.writeUInt16BE(msg.deviceId & 0x7fff, 0);\r\n\r\n\t\t// Stream + W-bit\r\n\t\tlet streamByte = msg.stream & 0x7f;\r\n\t\tif (msg.wBit) {\r\n\t\t\tstreamByte |= 0x80;\r\n\t\t}\r\n\t\tbuffer.writeUInt8(streamByte, 2);\r\n\r\n\t\t// Function\r\n\t\tbuffer.writeUInt8(msg.func, 3);\r\n\r\n\t\t// P-Type, S-Type (Assuming 0 for now)\r\n\t\tbuffer.writeUInt8(0, 4);\r\n\t\tbuffer.writeUInt8(0, 5);\r\n\r\n\t\t// System Bytes\r\n\t\tif (typeof msg.systemBytes === \"number\") {\r\n\t\t\tbuffer.writeUInt32BE(msg.systemBytes, 6);\r\n\t\t} else {\r\n\t\t\t// Assuming Buffer\r\n\t\t\tconst sysBuf = msg.systemBytes as Buffer;\r\n\t\t\tsysBuf.copy(buffer, 6, 0, 4);\r\n\t\t}\r\n\r\n\t\treturn buffer;\r\n\t}\r\n}\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Secs2ItemHelper.js","names":["booleanValues: boolean[]","binaryValues: number[]"],"sources":["../../src/helper/Secs2ItemHelper.ts"],"sourcesContent":["import { AbstractSecs2Item } from \"../core/secs2item/AbstractSecs2Item.js\";\nimport { Secs2ItemAscii } from \"../core/secs2item/Secs2ItemAscii.js\";\nimport { Secs2ItemBinary } from \"../core/secs2item/Secs2ItemBinary.js\";\nimport { Secs2ItemBoolean } from \"../core/secs2item/Secs2ItemBoolean.js\";\nimport { Secs2ItemFactory } from \"../core/secs2item/Secs2ItemFactory.js\";\nimport { Secs2ItemList } from \"../core/secs2item/Secs2ItemList.js\";\nimport { Secs2ItemNumeric } from \"../core/secs2item/Secs2ItemNumeric.js\";\n\n/**\n * @description Creates a SECS-II list item.\n * @param items The items in the list.\n * @returns The SECS-II list item.\n */\nexport function L(...items: AbstractSecs2Item[]): Secs2ItemList {\n\treturn Secs2ItemFactory.createListItem(...items);\n}\n\n/**\n * @description Creates a SECS-II ASCII item.\n * @param value The value of the item.\n * @returns The SECS-II ASCII item.\n */\nexport function A(value: string): Secs2ItemAscii {\n\treturn Secs2ItemFactory.createAsciiItem(value);\n}\n\n/**\n * @description Creates a SECS-II boolean item.\n * @param value The value of the item.\n * @returns The SECS-II boolean item.\n */\nexport function BOOLEAN(value: string): Secs2ItemBoolean {\n\tconst booleanValues: boolean[] = [];\n\tconst values = value.split(\"\");\n\tvalues.map((v) => {\n\t\tif (v !== \"TRUE\" && v !== \"FALSE\") {\n\t\t\tthrow new Error(\"BOOLEAN value must be TRUE or FALSE\");\n\t\t}\n\t\tif (v === \"TRUE\") {\n\t\t\tbooleanValues.push(true);\n\t\t} else {\n\t\t\tbooleanValues.push(false);\n\t\t}\n\t});\n\treturn Secs2ItemFactory.createBooleanItem(...booleanValues);\n}\n\n/**\n * @description Creates a SECS-II binary item.\n * @param value The value of the item.\n * @returns The SECS-II binary item.\n */\nexport function B(value: string | Buffer): Secs2ItemBinary {\n\tconst valueType = typeof value;\n\tif (valueType === \"string\") {\n\t\tconst stringToBytes = (s: string) =>\n\t\t\ts\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.map((v) =>\n\t\t\t\t\tv.trim().startsWith(\"0x\") ? parseInt(v, 16) : parseInt(v, 10),\n\t\t\t\t);\n\n\t\tconst binaryValues: number[] = stringToBytes(value as string);\n\t\treturn Secs2ItemFactory.createBinaryItem(Buffer.from(binaryValues));\n\t}\n\n\treturn Secs2ItemFactory.createBinaryItem(value as Buffer);\n}\n\n/**\n * @description Creates a SECS-II unsigned 8-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II unsigned 8-bit integer item.\n */\nexport function U1(...value: number[]): Secs2ItemNumeric {\n\tif (value.some((v) => v < 0)) {\n\t\tthrow new Error(\"U1 value must be unsigned 8-bit integer\");\n\t}\n\treturn Secs2ItemFactory.createU1Item(...value);\n}\n\n/**\n * @description Creates a SECS-II unsigned 16-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II unsigned 16-bit integer item.\n */\nexport function U2(...value: number[]): Secs2ItemNumeric {\n\tif (value.some((v) => v < 0)) {\n\t\tthrow new Error(\"U2 value must be unsigned 16-bit integer\");\n\t}\n\treturn Secs2ItemFactory.createU2Item(...value);\n}\n\n/**\n * @description Creates a SECS-II unsigned 32-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II unsigned 32-bit integer item.\n */\nexport function U4(...value: number[]): Secs2ItemNumeric {\n\tif (value.some((v) => v < 0)) {\n\t\tthrow new Error(\"U4 value must be unsigned 32-bit integer\");\n\t}\n\treturn Secs2ItemFactory.createU4Item(...value);\n}\n\n/**\n * @description Creates a SECS-II unsigned 64-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II unsigned 64-bit integer item.\n */\nexport function U8(...value: number[] | bigint[]): Secs2ItemNumeric {\n\tif (value.some((v) => v < 0)) {\n\t\tthrow new Error(\"U8 value must be unsigned 64-bit integer\");\n\t}\n\treturn Secs2ItemFactory.createU8Item(...value);\n}\n\n/**\n * @description Creates a SECS-II signed 8-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II signed 8-bit integer item.\n */\nexport function I1(...value: number[]): Secs2ItemNumeric {\n\treturn Secs2ItemFactory.createI1Item(...value);\n}\n\n/**\n * @description Creates a SECS-II signed 16-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II signed 16-bit integer item.\n */\nexport function I2(...value: number[]): Secs2ItemNumeric {\n\treturn Secs2ItemFactory.createI2Item(...value);\n}\n\n/**\n * @description Creates a SECS-II signed 32-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II signed 32-bit integer item.\n */\nexport function I4(...value: number[]): Secs2ItemNumeric {\n\treturn Secs2ItemFactory.createI4Item(...value);\n}\n\n/**\n * @description Creates a SECS-II signed 64-bit integer item.\n * @param value The value of the item.\n * @returns The SECS-II signed 64-bit integer item.\n */\nexport function I8(...value: number[] | bigint[]): Secs2ItemNumeric {\n\treturn Secs2ItemFactory.createI8Item(...value);\n}\n\n/**\n * @description Creates a SECS-II float 32-bit number item.\n * @param value The value of the item.\n * @returns The SECS-II float 32-bit number item.\n */\nexport function F4(...value: number[]): Secs2ItemNumeric {\n\tif (value.some((v) => v % 1 !== 0)) {\n\t\tthrow new Error(\"F4 value must be float 32-bit number\");\n\t}\n\treturn Secs2ItemFactory.createF4Item(...value);\n}\n\n/**\n * @description Creates a SECS-II float 64-bit number item.\n * @param value The value of the item.\n * @returns The SECS-II float 64-bit number item.\n */\nexport function F8(...value: number[]): Secs2ItemNumeric {\n\treturn Secs2ItemFactory.createF8Item(...value);\n}\n"],"mappings":";;;;;;;;AAaA,SAAgB,EAAE,GAAG,OAA2C;AAC/D,QAAO,iBAAiB,eAAe,GAAG,MAAM;;;;;;;AAQjD,SAAgB,EAAE,OAA+B;AAChD,QAAO,iBAAiB,gBAAgB,MAAM;;;;;;;AAQ/C,SAAgB,QAAQ,OAAiC;CACxD,MAAMA,gBAA2B,EAAE;AAEnC,CADe,MAAM,MAAM,GAAG,CACvB,KAAK,MAAM;AACjB,MAAI,MAAM,UAAU,MAAM,QACzB,OAAM,IAAI,MAAM,sCAAsC;AAEvD,MAAI,MAAM,OACT,eAAc,KAAK,KAAK;MAExB,eAAc,KAAK,MAAM;GAEzB;AACF,QAAO,iBAAiB,kBAAkB,GAAG,cAAc;;;;;;;AAQ5D,SAAgB,EAAE,OAAyC;AAE1D,KADkB,OAAO,UACP,UAAU;EAC3B,MAAM,iBAAiB,MACtB,EACE,MAAM,MAAM,CACZ,KAAK,MACL,EAAE,MAAM,CAAC,WAAW,KAAK,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,GAAG,CAC7D;EAEH,MAAMC,eAAyB,cAAc,MAAgB;AAC7D,SAAO,iBAAiB,iBAAiB,OAAO,KAAK,aAAa,CAAC;;AAGpE,QAAO,iBAAiB,iBAAiB,MAAgB;;;;;;;AAQ1D,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,0CAA0C;AAE3D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,2CAA2C;AAE5D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,2CAA2C;AAE5D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAA8C;AACnE,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,2CAA2C;AAE5D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAA8C;AACnE,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,MAAM,EAAE,CACjC,OAAM,IAAI,MAAM,uCAAuC;AAExD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM"}
|
|
1
|
+
{"version":3,"file":"Secs2ItemHelper.js","names":["booleanValues: boolean[]","binaryValues: number[]"],"sources":["../../src/helper/Secs2ItemHelper.ts"],"sourcesContent":["import { AbstractSecs2Item } from \"../core/secs2item/AbstractSecs2Item.js\";\r\nimport { Secs2ItemAscii } from \"../core/secs2item/Secs2ItemAscii.js\";\r\nimport { Secs2ItemBinary } from \"../core/secs2item/Secs2ItemBinary.js\";\r\nimport { Secs2ItemBoolean } from \"../core/secs2item/Secs2ItemBoolean.js\";\r\nimport { Secs2ItemFactory } from \"../core/secs2item/Secs2ItemFactory.js\";\r\nimport { Secs2ItemList } from \"../core/secs2item/Secs2ItemList.js\";\r\nimport { Secs2ItemNumeric } from \"../core/secs2item/Secs2ItemNumeric.js\";\r\n\r\n/**\r\n * @description Creates a SECS-II list item.\r\n * @param items The items in the list.\r\n * @returns The SECS-II list item.\r\n */\r\nexport function L(...items: AbstractSecs2Item[]): Secs2ItemList {\r\n\treturn Secs2ItemFactory.createListItem(...items);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II ASCII item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II ASCII item.\r\n */\r\nexport function A(value: string): Secs2ItemAscii {\r\n\treturn Secs2ItemFactory.createAsciiItem(value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II boolean item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II boolean item.\r\n */\r\nexport function BOOLEAN(value: string): Secs2ItemBoolean {\r\n\tconst booleanValues: boolean[] = [];\r\n\tconst values = value.split(\"\");\r\n\tvalues.map((v) => {\r\n\t\tif (v !== \"TRUE\" && v !== \"FALSE\") {\r\n\t\t\tthrow new Error(\"BOOLEAN value must be TRUE or FALSE\");\r\n\t\t}\r\n\t\tif (v === \"TRUE\") {\r\n\t\t\tbooleanValues.push(true);\r\n\t\t} else {\r\n\t\t\tbooleanValues.push(false);\r\n\t\t}\r\n\t});\r\n\treturn Secs2ItemFactory.createBooleanItem(...booleanValues);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II binary item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II binary item.\r\n */\r\nexport function B(value: string | Buffer): Secs2ItemBinary {\r\n\tconst valueType = typeof value;\r\n\tif (valueType === \"string\") {\r\n\t\tconst stringToBytes = (s: string) =>\r\n\t\t\ts\r\n\t\t\t\t.split(/\\s+/)\r\n\t\t\t\t.map((v) =>\r\n\t\t\t\t\tv.trim().startsWith(\"0x\") ? parseInt(v, 16) : parseInt(v, 10),\r\n\t\t\t\t);\r\n\r\n\t\tconst binaryValues: number[] = stringToBytes(value as string);\r\n\t\treturn Secs2ItemFactory.createBinaryItem(Buffer.from(binaryValues));\r\n\t}\r\n\r\n\treturn Secs2ItemFactory.createBinaryItem(value as Buffer);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II unsigned 8-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II unsigned 8-bit integer item.\r\n */\r\nexport function U1(...value: number[]): Secs2ItemNumeric {\r\n\tif (value.some((v) => v < 0)) {\r\n\t\tthrow new Error(\"U1 value must be unsigned 8-bit integer\");\r\n\t}\r\n\treturn Secs2ItemFactory.createU1Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II unsigned 16-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II unsigned 16-bit integer item.\r\n */\r\nexport function U2(...value: number[]): Secs2ItemNumeric {\r\n\tif (value.some((v) => v < 0)) {\r\n\t\tthrow new Error(\"U2 value must be unsigned 16-bit integer\");\r\n\t}\r\n\treturn Secs2ItemFactory.createU2Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II unsigned 32-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II unsigned 32-bit integer item.\r\n */\r\nexport function U4(...value: number[]): Secs2ItemNumeric {\r\n\tif (value.some((v) => v < 0)) {\r\n\t\tthrow new Error(\"U4 value must be unsigned 32-bit integer\");\r\n\t}\r\n\treturn Secs2ItemFactory.createU4Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II unsigned 64-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II unsigned 64-bit integer item.\r\n */\r\nexport function U8(...value: number[] | bigint[]): Secs2ItemNumeric {\r\n\tif (value.some((v) => v < 0)) {\r\n\t\tthrow new Error(\"U8 value must be unsigned 64-bit integer\");\r\n\t}\r\n\treturn Secs2ItemFactory.createU8Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II signed 8-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II signed 8-bit integer item.\r\n */\r\nexport function I1(...value: number[]): Secs2ItemNumeric {\r\n\treturn Secs2ItemFactory.createI1Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II signed 16-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II signed 16-bit integer item.\r\n */\r\nexport function I2(...value: number[]): Secs2ItemNumeric {\r\n\treturn Secs2ItemFactory.createI2Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II signed 32-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II signed 32-bit integer item.\r\n */\r\nexport function I4(...value: number[]): Secs2ItemNumeric {\r\n\treturn Secs2ItemFactory.createI4Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II signed 64-bit integer item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II signed 64-bit integer item.\r\n */\r\nexport function I8(...value: number[] | bigint[]): Secs2ItemNumeric {\r\n\treturn Secs2ItemFactory.createI8Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II float 32-bit number item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II float 32-bit number item.\r\n */\r\nexport function F4(...value: number[]): Secs2ItemNumeric {\r\n\tif (value.some((v) => v % 1 !== 0)) {\r\n\t\tthrow new Error(\"F4 value must be float 32-bit number\");\r\n\t}\r\n\treturn Secs2ItemFactory.createF4Item(...value);\r\n}\r\n\r\n/**\r\n * @description Creates a SECS-II float 64-bit number item.\r\n * @param value The value of the item.\r\n * @returns The SECS-II float 64-bit number item.\r\n */\r\nexport function F8(...value: number[]): Secs2ItemNumeric {\r\n\treturn Secs2ItemFactory.createF8Item(...value);\r\n}\r\n"],"mappings":";;;;;;;;AAaA,SAAgB,EAAE,GAAG,OAA2C;AAC/D,QAAO,iBAAiB,eAAe,GAAG,MAAM;;;;;;;AAQjD,SAAgB,EAAE,OAA+B;AAChD,QAAO,iBAAiB,gBAAgB,MAAM;;;;;;;AAQ/C,SAAgB,QAAQ,OAAiC;CACxD,MAAMA,gBAA2B,EAAE;AAEnC,CADe,MAAM,MAAM,GAAG,CACvB,KAAK,MAAM;AACjB,MAAI,MAAM,UAAU,MAAM,QACzB,OAAM,IAAI,MAAM,sCAAsC;AAEvD,MAAI,MAAM,OACT,eAAc,KAAK,KAAK;MAExB,eAAc,KAAK,MAAM;GAEzB;AACF,QAAO,iBAAiB,kBAAkB,GAAG,cAAc;;;;;;;AAQ5D,SAAgB,EAAE,OAAyC;AAE1D,KADkB,OAAO,UACP,UAAU;EAC3B,MAAM,iBAAiB,MACtB,EACE,MAAM,MAAM,CACZ,KAAK,MACL,EAAE,MAAM,CAAC,WAAW,KAAK,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,GAAG,CAC7D;EAEH,MAAMC,eAAyB,cAAc,MAAgB;AAC7D,SAAO,iBAAiB,iBAAiB,OAAO,KAAK,aAAa,CAAC;;AAGpE,QAAO,iBAAiB,iBAAiB,MAAgB;;;;;;;AAQ1D,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,0CAA0C;AAE3D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,2CAA2C;AAE5D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,2CAA2C;AAE5D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAA8C;AACnE,KAAI,MAAM,MAAM,MAAM,IAAI,EAAE,CAC3B,OAAM,IAAI,MAAM,2CAA2C;AAE5D,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAA8C;AACnE,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,KAAI,MAAM,MAAM,MAAM,IAAI,MAAM,EAAE,CACjC,OAAM,IAAI,MAAM,uCAAuC;AAExD,QAAO,iBAAiB,aAAa,GAAG,MAAM;;;;;;;AAQ/C,SAAgB,GAAG,GAAG,OAAmC;AACxD,QAAO,iBAAiB,aAAa,GAAG,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HsmsActiveCommunicator.d.ts","names":[],"sources":["../../src/hsms/HsmsActiveCommunicator.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAaA;AAOqB,cAPR,sBAAA,SAA+B,gBAAA,CAOvB;
|
|
1
|
+
{"version":3,"file":"HsmsActiveCommunicator.d.ts","names":[],"sources":["../../src/hsms/HsmsActiveCommunicator.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAaA;AAOqB,cAPR,sBAAA,SAA+B,gBAAA,CAOvB;EA0BN,QAAA,UAAA;EAuH0B,QAAA,cAAA;EAIR,QAAA,yBAAA;EAAR,QAAA,cAAA;EAYT,mBAAA,EAAA,MAAA;EAxK4B,WAAA,CAAA,MAAA,EAOvB,sBAPuB;EAAgB,IAAA,CAAA,CAAA,EAiC7C,OAjC6C,CAAA,IAAA,CAAA;;;;;;iCAwJnB;oBAIhB,QAAQ;WAYjB"}
|
|
@@ -19,7 +19,12 @@ var HsmsActiveCommunicator = class extends HsmsCommunicator {
|
|
|
19
19
|
this.on("disconnected", () => {
|
|
20
20
|
this.stopHeartbeat();
|
|
21
21
|
if (!this.shouldStop) {
|
|
22
|
-
|
|
22
|
+
this.logger.detail.warn({
|
|
23
|
+
protocol: "HSMS",
|
|
24
|
+
ip: this.ip,
|
|
25
|
+
port: this.port,
|
|
26
|
+
timeoutT5: this.timeoutT5
|
|
27
|
+
}, "connection lost; scheduling reconnect");
|
|
23
28
|
this.scheduleReconnect();
|
|
24
29
|
}
|
|
25
30
|
});
|
|
@@ -40,7 +45,13 @@ var HsmsActiveCommunicator = class extends HsmsCommunicator {
|
|
|
40
45
|
const socket = new Socket();
|
|
41
46
|
const onError = (err) => {
|
|
42
47
|
socket.destroy();
|
|
43
|
-
|
|
48
|
+
this.logger.detail.warn({
|
|
49
|
+
protocol: "HSMS",
|
|
50
|
+
ip: this.ip,
|
|
51
|
+
port: this.port,
|
|
52
|
+
timeoutT5: this.timeoutT5,
|
|
53
|
+
err
|
|
54
|
+
}, "connection failed; scheduling reconnect");
|
|
44
55
|
if (!this.shouldStop) this.scheduleReconnect();
|
|
45
56
|
};
|
|
46
57
|
socket.once("error", onError);
|
|
@@ -48,8 +59,10 @@ var HsmsActiveCommunicator = class extends HsmsCommunicator {
|
|
|
48
59
|
socket.removeListener("error", onError);
|
|
49
60
|
this.handleSocketEvents(socket);
|
|
50
61
|
this.sendSelectReq().then(() => {}).catch((err) => {
|
|
51
|
-
|
|
52
|
-
|
|
62
|
+
this.logger.detail.error({
|
|
63
|
+
protocol: "HSMS",
|
|
64
|
+
err: err instanceof Error ? err : new Error(String(err))
|
|
65
|
+
}, "select request failed");
|
|
53
66
|
if (!socket.destroyed) socket.destroy();
|
|
54
67
|
});
|
|
55
68
|
if (this.connectionPromiseResolver) {
|
|
@@ -70,7 +83,10 @@ var HsmsActiveCommunicator = class extends HsmsCommunicator {
|
|
|
70
83
|
try {
|
|
71
84
|
await this.sendLinkTestReq();
|
|
72
85
|
} catch (err) {
|
|
73
|
-
|
|
86
|
+
this.logger.detail.error({
|
|
87
|
+
protocol: "HSMS",
|
|
88
|
+
err: err instanceof Error ? err : new Error(String(err))
|
|
89
|
+
}, "heartbeat failed; closing connection");
|
|
74
90
|
if (this.socket) this.socket.destroy();
|
|
75
91
|
return;
|
|
76
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HsmsActiveCommunicator.js","names":[],"sources":["../../src/hsms/HsmsActiveCommunicator.ts"],"sourcesContent":["import { Socket } from \"net\";\nimport {\n\tHsmsCommunicator,\n\tHsmsCommunicatorConfig,\n\tHsmsState,\n} from \"./HsmsCommunicator.js\";\nimport { HsmsMessage } from \"./HsmsMessage.js\";\nimport { RejectReason } from \"./enums/RejectReason.js\";\nimport { SelectStatus } from \"./enums/SelectStatus.js\";\n\n/**\n * @description HsmsActiveCommunicator is a class that extends HsmsCommunicator and implements the active communicator logic.\n */\nexport class HsmsActiveCommunicator extends HsmsCommunicator {\n\tprivate shouldStop = false;\n\tprivate reconnectTimer: NodeJS.Timeout | null = null;\n\tprivate connectionPromiseResolver: (() => void) | null = null;\n\tprivate heartbeatTimer: NodeJS.Timeout | null = null;\n\tpublic heartbeatIntervalMs = 5000;\n\n\tconstructor(config: HsmsCommunicatorConfig) {\n\t\tsuper(config);\n\t\tif (config.linkTestInterval !== undefined) {\n\t\t\tthis.heartbeatIntervalMs = config.linkTestInterval;\n\t\t}\n\t\tthis.on(\"disconnected\", () => {\n\t\t\tthis.stopHeartbeat();\n\t\t\tif (!this.shouldStop) {\n\t\t\t\
|
|
1
|
+
{"version":3,"file":"HsmsActiveCommunicator.js","names":[],"sources":["../../src/hsms/HsmsActiveCommunicator.ts"],"sourcesContent":["import { Socket } from \"net\";\nimport {\n\tHsmsCommunicator,\n\tHsmsCommunicatorConfig,\n\tHsmsState,\n} from \"./HsmsCommunicator.js\";\nimport { HsmsMessage } from \"./HsmsMessage.js\";\nimport { RejectReason } from \"./enums/RejectReason.js\";\nimport { SelectStatus } from \"./enums/SelectStatus.js\";\n\n/**\n * @description HsmsActiveCommunicator is a class that extends HsmsCommunicator and implements the active communicator logic.\n */\nexport class HsmsActiveCommunicator extends HsmsCommunicator {\n\tprivate shouldStop = false;\n\tprivate reconnectTimer: NodeJS.Timeout | null = null;\n\tprivate connectionPromiseResolver: (() => void) | null = null;\n\tprivate heartbeatTimer: NodeJS.Timeout | null = null;\n\tpublic heartbeatIntervalMs = 5000;\n\n\tconstructor(config: HsmsCommunicatorConfig) {\n\t\tsuper(config);\n\t\tif (config.linkTestInterval !== undefined) {\n\t\t\tthis.heartbeatIntervalMs = config.linkTestInterval;\n\t\t}\n\t\tthis.on(\"disconnected\", () => {\n\t\t\tthis.stopHeartbeat();\n\t\t\tif (!this.shouldStop) {\n\t\t\t\tthis.logger.detail.warn(\n\t\t\t\t\t{\n\t\t\t\t\t\tprotocol: \"HSMS\",\n\t\t\t\t\t\tip: this.ip,\n\t\t\t\t\t\tport: this.port,\n\t\t\t\t\t\ttimeoutT5: this.timeoutT5,\n\t\t\t\t\t},\n\t\t\t\t\t\"connection lost; scheduling reconnect\",\n\t\t\t\t);\n\t\t\t\tthis.scheduleReconnect();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"selected\", () => {\n\t\t\tthis.startHeartbeat();\n\t\t});\n\t}\n\n\tasync open(): Promise<void> {\n\t\tif (this.socket && !this.socket.destroyed) {\n\t\t\treturn; // Already open\n\t\t}\n\n\t\tthis.shouldStop = false;\n\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.connectionPromiseResolver = resolve;\n\t\t\tthis.connect();\n\t\t});\n\t}\n\n\tprivate connect() {\n\t\tif (this.shouldStop) return;\n\n\t\tconst socket = new Socket();\n\n\t\tconst onError = (err: Error) => {\n\t\t\tsocket.destroy();\n\t\t\tthis.logger.detail.warn(\n\t\t\t\t{\n\t\t\t\t\tprotocol: \"HSMS\",\n\t\t\t\t\tip: this.ip,\n\t\t\t\t\tport: this.port,\n\t\t\t\t\ttimeoutT5: this.timeoutT5,\n\t\t\t\t\terr,\n\t\t\t\t},\n\t\t\t\t\"connection failed; scheduling reconnect\",\n\t\t\t);\n\t\t\tif (!this.shouldStop) {\n\t\t\t\tthis.scheduleReconnect();\n\t\t\t}\n\t\t};\n\n\t\tsocket.once(\"error\", onError);\n\n\t\tsocket.connect(this.port, this.ip, () => {\n\t\t\tsocket.removeListener(\"error\", onError);\n\t\t\tthis.handleSocketEvents(socket);\n\n\t\t\t// Automatically send SelectReq upon connection\n\t\t\tvoid this.sendSelectReq()\n\t\t\t\t.then(() => {\n\t\t\t\t\t// Select success, state updated in handleSelectRsp\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tthis.logger.detail.error(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprotocol: \"HSMS\",\n\t\t\t\t\t\t\terr: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"select request failed\",\n\t\t\t\t\t);\n\t\t\t\t\t// If Select fails, close connection to trigger reconnect logic\n\t\t\t\t\tif (!socket.destroyed) {\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tif (this.connectionPromiseResolver) {\n\t\t\t\tthis.connectionPromiseResolver();\n\t\t\t\tthis.connectionPromiseResolver = null;\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate scheduleReconnect() {\n\t\tif (this.reconnectTimer) {\n\t\t\tclearTimeout(this.reconnectTimer);\n\t\t}\n\t\tthis.reconnectTimer = setTimeout(() => {\n\t\t\tthis.reconnectTimer = null;\n\t\t\tthis.connect();\n\t\t}, this.timeoutT5 * 1000);\n\t}\n\n\tprivate async runHeartbeatLoop() {\n\t\tif (this.state !== HsmsState.Selected || this.shouldStop) return;\n\n\t\ttry {\n\t\t\tawait this.sendLinkTestReq();\n\t\t} catch (err) {\n\t\t\tthis.logger.detail.error(\n\t\t\t\t{\n\t\t\t\t\tprotocol: \"HSMS\",\n\t\t\t\t\terr: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t},\n\t\t\t\t\"heartbeat failed; closing connection\",\n\t\t\t);\n\t\t\t// Force close to trigger reconnect\n\t\t\tif (this.socket) {\n\t\t\t\tthis.socket.destroy();\n\t\t\t}\n\t\t\treturn; // Stop loop\n\t\t}\n\n\t\tif (this.state === HsmsState.Selected && !this.shouldStop) {\n\t\t\tthis.heartbeatTimer = setTimeout(() => {\n\t\t\t\tvoid this.runHeartbeatLoop();\n\t\t\t}, this.heartbeatIntervalMs);\n\t\t}\n\t}\n\n\tprivate startHeartbeat() {\n\t\tthis.stopHeartbeat();\n\t\t// Start first heartbeat after interval\n\t\tthis.heartbeatTimer = setTimeout(() => {\n\t\t\tvoid this.runHeartbeatLoop();\n\t\t}, this.heartbeatIntervalMs);\n\t}\n\n\tprivate stopHeartbeat() {\n\t\tif (this.heartbeatTimer) {\n\t\t\tclearTimeout(this.heartbeatTimer);\n\t\t\tthis.heartbeatTimer = null;\n\t\t}\n\t}\n\n\tprotected override handleSelectReq(msg: HsmsMessage) {\n\t\tvoid this.sendReject(msg, RejectReason.NotSupportTypeS);\n\t}\n\n\tasync untilConnected(): Promise<SelectStatus> {\n\t\tif (this.state === HsmsState.Selected) {\n\t\t\treturn SelectStatus.Success;\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\tconst onSelected = () => {\n\t\t\t\tresolve(SelectStatus.Success);\n\t\t\t};\n\t\t\tthis.once(\"selected\", onSelected);\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.shouldStop = true;\n\t\tthis.stopHeartbeat();\n\t\tif (this.reconnectTimer) {\n\t\t\tclearTimeout(this.reconnectTimer);\n\t\t\tthis.reconnectTimer = null;\n\t\t}\n\t\tif (this.socket) {\n\t\t\tthis.socket.end();\n\t\t\tthis.socket.destroy();\n\t\t\tthis.socket = null;\n\t\t}\n\t\tawait Promise.resolve();\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -38,6 +38,7 @@ declare abstract class HsmsCommunicator extends AbstractSecsCommunicator<HsmsCom
|
|
|
38
38
|
private t8Timer;
|
|
39
39
|
get connectionState(): HsmsState;
|
|
40
40
|
constructor(config: HsmsCommunicatorConfig);
|
|
41
|
+
protected sendBufferWithLogs(direction: "Sent" | "Received", protocol: string, buffer: Buffer, meta?: Record<string, unknown>): Promise<void>;
|
|
41
42
|
protected sendBuffer(buffer: Buffer): Promise<void>;
|
|
42
43
|
protected createMessage(stream: number, func: number, wBit: boolean, body: AbstractSecs2Item | null, systemBytes: number): SecsMessage;
|
|
43
44
|
protected handleSocketEvents(socket: Socket): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HsmsCommunicator.d.ts","names":[],"sources":["../../src/hsms/HsmsCommunicator.ts"],"sourcesContent":[],"mappings":";;;;;;;;;aAaY,SAAA;;EAAA,SAAA,GAAS,WAAA;EAAA;EAYJ,QAAA,GAAA,UAAA;AAMjB;AAKA;;;;;;
|
|
1
|
+
{"version":3,"file":"HsmsCommunicator.d.ts","names":[],"sources":["../../src/hsms/HsmsCommunicator.ts"],"sourcesContent":[],"mappings":";;;;;;;;;aAaY,SAAA;;EAAA,SAAA,GAAS,WAAA;EAAA;EAYJ,QAAA,GAAA,UAAA;AAMjB;AAKA;;;;;;AA0BU,UArCO,sBAAA,SAA+B,sBAqCtC,CAAA;EACD,EAAA,EAAA,MAAA;EACL,IAAA,EAAA,MAAA;EAYgC,gBAAA,CAAA,EAAA,MAAA;;AAiB5B,UA9DS,sBAAA,SAA+B,sBA8DxC,CAAA;EAEJ,QAAA,EAAA,EAAA;EAckC,UAAA,EAAA,EAAA;;AA0NN,uBAnSV,gBAAA,SAAyB,wBAmSf,CAnSwC,sBAmSxC,CAAA,CAAA;EA0BE,EAAA,EAAA,MAAA;EAIA,IAAA,EAAA,MAAA;EAWA,UAAA,MAAA,EAxUf,MAwUe,GAAA,IAAA;EAcA,UAAA,KAAA,EArVhB,SAqVgB;EAoBC,QAAA,MAAA;EAYC,QAAA,OAAA;EAA2B,QAAA,OAAA;EASzB,IAAA,eAAA,CAAA,CAAA,EAtXP,SAsXO;EAA2B,WAAA,CAAA,MAAA,EAlX5C,sBAkX4C;EAS3B,UAAA,kBAAA,CAAA,SAAA,EAAA,MAAA,GAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAlX5B,MAkX4B,EAAA,IAAA,CAAA,EAjX7B,MAiX6B,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAhXlC,OAgXkC,CAAA,IAAA,CAAA;EAAW,UAAA,UAAA,CAAA,MAAA,EApWb,MAoWa,CAAA,EApWJ,OAoWI,CAAA,IAAA,CAAA;EAQhB,UAAA,aAAA,CAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EA3VzB,iBA2VyB,GAAA,IAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAzV7B,WAyV6B;EAAqB,UAAA,kBAAA,CAAA,MAAA,EA3UhB,MA2UgB,CAAA,EAAA,IAAA;EAAY,QAAA,YAAA;EAa1D,QAAA,YAAA;EACI,QAAA,YAAA;EAAR,QAAA,YAAA;EAQmC,QAAA,aAAA;EAAR,QAAA,kBAAA;EA+BE,QAAA,oBAAA;EA+BA,UAAA,eAAA,CAAA,GAAA,EAxND,WAwNC,CAAA,EAAA,IAAA;EAxec,UAAA,eAAA,CAAA,GAAA,EAmSf,WAnSe,CAAA,EAAA,IAAA;EAAwB,UAAA,iBAAA,CAAA,GAAA,EA6TrC,WA7TqC,CAAA,EAAA,IAAA;mCAiUrC;mCAWA;mCAcA;oCAoBC;+BAYC,8BAA2B;iCASzB,8BAA2B;iCAS3B,cAAW;4BAQhB,qBAAqB,eAAY;2DAa1D,2BACJ,QAAQ;mBAQmB,QAAQ;qBA+BN;qBA+BA"}
|
|
@@ -27,6 +27,12 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
27
27
|
this.ip = config.ip;
|
|
28
28
|
this.port = config.port;
|
|
29
29
|
}
|
|
30
|
+
async sendBufferWithLogs(direction, protocol, buffer, meta) {
|
|
31
|
+
await super.sendBufferWithLogs(direction, protocol === "SECS" ? "HSMS" : protocol, buffer, {
|
|
32
|
+
hsmsState: this.state,
|
|
33
|
+
...meta
|
|
34
|
+
});
|
|
35
|
+
}
|
|
30
36
|
async sendBuffer(buffer) {
|
|
31
37
|
const socket = this.socket;
|
|
32
38
|
if (!socket || socket.destroyed) throw new Error("Socket not connected");
|
|
@@ -42,10 +48,20 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
42
48
|
}
|
|
43
49
|
handleSocketEvents(socket) {
|
|
44
50
|
this.socket = socket;
|
|
51
|
+
const prev = this.state;
|
|
45
52
|
this.state = HsmsState.Connected;
|
|
53
|
+
this.logger.logState("HSMS", prev, this.state, {
|
|
54
|
+
remoteAddress: socket.remoteAddress,
|
|
55
|
+
remotePort: socket.remotePort
|
|
56
|
+
});
|
|
46
57
|
this.resetT7Timer();
|
|
47
58
|
this.emit("connected");
|
|
48
59
|
socket.on("data", (data) => {
|
|
60
|
+
this.logger.logBytes("Received", "HSMS", data, {
|
|
61
|
+
remoteAddress: socket.remoteAddress,
|
|
62
|
+
remotePort: socket.remotePort,
|
|
63
|
+
chunkLength: data.length
|
|
64
|
+
});
|
|
49
65
|
this.buffer = Buffer.concat([this.buffer, data]);
|
|
50
66
|
this.resetT8Timer();
|
|
51
67
|
this.processBuffer();
|
|
@@ -56,7 +72,12 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
56
72
|
this.clearT7Timer();
|
|
57
73
|
this.clearT8Timer();
|
|
58
74
|
this.buffer = Buffer.alloc(0);
|
|
75
|
+
const prevState = this.state;
|
|
59
76
|
this.state = HsmsState.NotConnected;
|
|
77
|
+
this.logger.logState("HSMS", prevState, this.state, {
|
|
78
|
+
remoteAddress: socket.remoteAddress,
|
|
79
|
+
remotePort: socket.remotePort
|
|
80
|
+
});
|
|
60
81
|
this.socket = null;
|
|
61
82
|
this.emit("disconnected");
|
|
62
83
|
});
|
|
@@ -120,6 +141,7 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
120
141
|
const msgBuffer = this.buffer.subarray(0, 4 + length);
|
|
121
142
|
this.buffer = this.buffer.subarray(4 + length);
|
|
122
143
|
try {
|
|
144
|
+
this.logger.logBytes("Received", "HSMS", msgBuffer, { frameLength: length });
|
|
123
145
|
const msg = HsmsMessage.fromBuffer(msgBuffer);
|
|
124
146
|
this.processHsmsMessage(msg);
|
|
125
147
|
} catch (err) {
|
|
@@ -130,10 +152,18 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
130
152
|
}
|
|
131
153
|
processHsmsMessage(msg) {
|
|
132
154
|
if (msg.sType !== HsmsControlType.Data) {
|
|
155
|
+
this.logger.detail.debug({
|
|
156
|
+
protocol: "HSMS",
|
|
157
|
+
controlType: msg.sType,
|
|
158
|
+
pType: msg.pType,
|
|
159
|
+
systemBytes: msg.systemBytes,
|
|
160
|
+
deviceId: msg.deviceId
|
|
161
|
+
}, "control");
|
|
133
162
|
this.handleControlMessage(msg);
|
|
134
163
|
return;
|
|
135
164
|
}
|
|
136
165
|
if (this.state !== HsmsState.Selected) {
|
|
166
|
+
this.logger.logSecs2("Received", msg.toSml());
|
|
137
167
|
this.sendReject(msg, RejectReason.NotSelected);
|
|
138
168
|
return;
|
|
139
169
|
}
|
|
@@ -171,6 +201,7 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
171
201
|
handleSelectReq(msg) {
|
|
172
202
|
if (this.state === HsmsState.Selected) this.sendSelectRsp(msg, SelectStatus.Actived);
|
|
173
203
|
else {
|
|
204
|
+
this.logger.logState("HSMS", this.state, HsmsState.Selected, { systemBytes: msg.systemBytes });
|
|
174
205
|
this.state = HsmsState.Selected;
|
|
175
206
|
this.clearT7Timer();
|
|
176
207
|
this.sendSelectRsp(msg, SelectStatus.Success);
|
|
@@ -182,6 +213,10 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
182
213
|
if (tx) {
|
|
183
214
|
const status = msg.func;
|
|
184
215
|
if (status === SelectStatus.Success || status === SelectStatus.Actived) {
|
|
216
|
+
this.logger.logState("HSMS", this.state, HsmsState.Selected, {
|
|
217
|
+
selectStatus: status,
|
|
218
|
+
systemBytes: msg.systemBytes
|
|
219
|
+
});
|
|
185
220
|
this.state = HsmsState.Selected;
|
|
186
221
|
this.clearT7Timer();
|
|
187
222
|
this.emit("selected");
|
|
@@ -204,6 +239,7 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
204
239
|
}
|
|
205
240
|
handleDeselectReq(msg) {
|
|
206
241
|
if (this.state === HsmsState.Selected) {
|
|
242
|
+
this.logger.logState("HSMS", this.state, HsmsState.Connected, { systemBytes: msg.systemBytes });
|
|
207
243
|
this.state = HsmsState.Connected;
|
|
208
244
|
this.resetT7Timer();
|
|
209
245
|
this.sendDeselectRsp(msg, SelectStatus.Success);
|
|
@@ -216,6 +252,7 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
216
252
|
const tx = this._transactions.get(msg.systemBytes);
|
|
217
253
|
if (tx) {
|
|
218
254
|
if (msg.func === SelectStatus.Success) {
|
|
255
|
+
this.logger.logState("HSMS", this.state, HsmsState.Connected, { systemBytes: msg.systemBytes });
|
|
219
256
|
this.state = HsmsState.Connected;
|
|
220
257
|
this.resetT7Timer();
|
|
221
258
|
this.emit("deselected");
|
|
@@ -227,25 +264,42 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
227
264
|
}
|
|
228
265
|
handleSeparateReq(_msg) {
|
|
229
266
|
const socket = this.socket;
|
|
267
|
+
const prev = this.state;
|
|
230
268
|
this.state = HsmsState.Connected;
|
|
269
|
+
this.logger.logState("HSMS", prev, this.state);
|
|
231
270
|
this.clearT7Timer();
|
|
232
271
|
if (socket && !socket.destroyed) socket.destroy();
|
|
233
272
|
}
|
|
234
273
|
async sendSelectRsp(req, status) {
|
|
235
274
|
const rsp = HsmsMessage.selectRsp(req, status);
|
|
236
|
-
await this.
|
|
275
|
+
await this.sendBufferWithLogs("Sent", "HSMS", rsp.toBuffer(), {
|
|
276
|
+
controlType: HsmsControlType.SelectRsp,
|
|
277
|
+
status,
|
|
278
|
+
systemBytes: rsp.systemBytes
|
|
279
|
+
});
|
|
237
280
|
}
|
|
238
281
|
async sendDeselectRsp(req, status) {
|
|
239
282
|
const rsp = HsmsMessage.deselectRsp(req, status);
|
|
240
|
-
await this.
|
|
283
|
+
await this.sendBufferWithLogs("Sent", "HSMS", rsp.toBuffer(), {
|
|
284
|
+
controlType: HsmsControlType.DeselectRsp,
|
|
285
|
+
status,
|
|
286
|
+
systemBytes: rsp.systemBytes
|
|
287
|
+
});
|
|
241
288
|
}
|
|
242
289
|
async sendLinkTestRsp(req) {
|
|
243
290
|
const rsp = HsmsMessage.linkTestRsp(req);
|
|
244
|
-
await this.
|
|
291
|
+
await this.sendBufferWithLogs("Sent", "HSMS", rsp.toBuffer(), {
|
|
292
|
+
controlType: HsmsControlType.LinkTestRsp,
|
|
293
|
+
systemBytes: rsp.systemBytes
|
|
294
|
+
});
|
|
245
295
|
}
|
|
246
296
|
async sendReject(req, reason) {
|
|
247
297
|
const rsp = HsmsMessage.rejectReq(req, reason);
|
|
248
|
-
await this.
|
|
298
|
+
await this.sendBufferWithLogs("Sent", "HSMS", rsp.toBuffer(), {
|
|
299
|
+
controlType: HsmsControlType.RejectReq,
|
|
300
|
+
reason,
|
|
301
|
+
systemBytes: rsp.systemBytes
|
|
302
|
+
});
|
|
249
303
|
}
|
|
250
304
|
async send(stream, func, wBit, body = null) {
|
|
251
305
|
if (this.state !== HsmsState.Selected) throw new Error("HSMS not selected");
|
|
@@ -268,7 +322,10 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
268
322
|
reject,
|
|
269
323
|
timer
|
|
270
324
|
});
|
|
271
|
-
this.
|
|
325
|
+
this.sendBufferWithLogs("Sent", "HSMS", msg.toBuffer(), {
|
|
326
|
+
controlType: HsmsControlType.SelectReq,
|
|
327
|
+
systemBytes
|
|
328
|
+
}).catch((err) => {
|
|
272
329
|
clearTimeout(timer);
|
|
273
330
|
this._transactions.delete(systemBytes);
|
|
274
331
|
reject(err instanceof Error ? err : new Error(String(err)));
|
|
@@ -292,7 +349,10 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
292
349
|
reject,
|
|
293
350
|
timer
|
|
294
351
|
});
|
|
295
|
-
this.
|
|
352
|
+
this.sendBufferWithLogs("Sent", "HSMS", msg.toBuffer(), {
|
|
353
|
+
controlType: HsmsControlType.LinkTestReq,
|
|
354
|
+
systemBytes
|
|
355
|
+
}).catch((err) => {
|
|
296
356
|
clearTimeout(timer);
|
|
297
357
|
this._transactions.delete(systemBytes);
|
|
298
358
|
reject(err instanceof Error ? err : new Error(String(err)));
|
|
@@ -302,9 +362,14 @@ var HsmsCommunicator = class extends AbstractSecsCommunicator {
|
|
|
302
362
|
async sendSeparateReq() {
|
|
303
363
|
const systemBytes = this.getNextSystemBytes();
|
|
304
364
|
const msg = HsmsMessage.separateReq(systemBytes);
|
|
305
|
-
await this.
|
|
365
|
+
await this.sendBufferWithLogs("Sent", "HSMS", msg.toBuffer(), {
|
|
366
|
+
controlType: HsmsControlType.SeparateReq,
|
|
367
|
+
systemBytes
|
|
368
|
+
});
|
|
306
369
|
const socket = this.socket;
|
|
370
|
+
const prev = this.state;
|
|
307
371
|
this.state = HsmsState.Connected;
|
|
372
|
+
this.logger.logState("HSMS", prev, this.state, { systemBytes });
|
|
308
373
|
this.clearT7Timer();
|
|
309
374
|
if (socket && !socket.destroyed) socket.destroy();
|
|
310
375
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HsmsCommunicator.js","names":[],"sources":["../../src/hsms/HsmsCommunicator.ts"],"sourcesContent":["import { Socket } from \"net\";\nimport {\n\tAbstractSecsCommunicator,\n\tSecsCommunicatorConfig,\n\tSecsCommunicatorEvents,\n} from \"../core/AbstractSecsCommunicator.js\";\nimport { SecsMessage } from \"../core/AbstractSecsMessage.js\";\nimport { AbstractSecs2Item } from \"../core/secs2item/AbstractSecs2Item.js\";\nimport { HsmsMessage } from \"./HsmsMessage.js\";\nimport { HsmsControlType } from \"./enums/HsmsControlType.js\";\nimport { SelectStatus } from \"./enums/SelectStatus.js\";\nimport { RejectReason } from \"./enums/RejectReason.js\";\n\nexport enum HsmsState {\n\tNotConnected = \"NotConnected\",\n\tConnected = \"Connected\", // TCP Connected\n\tSelected = \"Selected\", // HSMS Selected\n}\n\n/**\n * @description HsmsCommunicatorConfig is the configuration interface for HsmsCommunicator.\n * @param ip The IP address of the remote device.\n * @param port The port number of the remote device.\n * @param linkTestInterval The interval in milliseconds to send link test messages.\n */\nexport interface HsmsCommunicatorConfig extends SecsCommunicatorConfig {\n\tip: string;\n\tport: number;\n\tlinkTestInterval?: number;\n}\n\nexport interface HsmsCommunicatorEvents extends SecsCommunicatorEvents {\n\tselected: [];\n\tdeselected: [];\n}\n\nexport abstract class HsmsCommunicator extends AbstractSecsCommunicator<HsmsCommunicatorEvents> {\n\tpublic ip: string;\n\tpublic port: number;\n\n\tprotected socket: Socket | null = null;\n\tprotected state: HsmsState = HsmsState.NotConnected;\n\tprivate buffer: Buffer = Buffer.alloc(0);\n\tprivate t7Timer: NodeJS.Timeout | null = null;\n\tprivate t8Timer: NodeJS.Timeout | null = null;\n\n\t// T6 Timer (Control Transaction)\n\t// We use the same _transactions map for Control messages if they expect reply\n\n\tpublic get connectionState(): HsmsState {\n\t\treturn this.state;\n\t}\n\n\tconstructor(config: HsmsCommunicatorConfig) {\n\t\tsuper(config);\n\t\tthis.ip = config.ip;\n\t\tthis.port = config.port;\n\t}\n\n\tprotected async sendBuffer(buffer: Buffer): Promise<void> {\n\t\tconst socket = this.socket;\n\t\tif (!socket || socket.destroyed) {\n\t\t\tthrow new Error(\"Socket not connected\");\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsocket.write(buffer, (err) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected createMessage(\n\t\tstream: number,\n\t\tfunc: number,\n\t\twBit: boolean,\n\t\tbody: AbstractSecs2Item | null,\n\t\tsystemBytes: number,\n\t): SecsMessage {\n\t\t// For Data messages, pType=0, sType=0 (Data)\n\t\treturn new HsmsMessage(\n\t\t\tstream,\n\t\t\tfunc,\n\t\t\twBit,\n\t\t\tbody,\n\t\t\tsystemBytes,\n\t\t\tthis.deviceId,\n\t\t\t0,\n\t\t\tHsmsControlType.Data,\n\t\t);\n\t}\n\n\tprotected handleSocketEvents(socket: Socket) {\n\t\tthis.socket = socket;\n\t\tthis.state = HsmsState.Connected;\n\t\tthis.resetT7Timer();\n\t\tthis.emit(\"connected\");\n\n\t\tsocket.on(\"data\", (data) => {\n\t\t\tthis.buffer = Buffer.concat([this.buffer, data]);\n\t\t\tthis.resetT8Timer();\n\t\t\tthis.processBuffer();\n\t\t\tif (this.buffer.length === 0) {\n\t\t\t\tthis.clearT8Timer();\n\t\t\t}\n\t\t});\n\n\t\tsocket.on(\"close\", () => {\n\t\t\tthis.rejectAllTransactions(new Error(\"Socket closed\"));\n\t\t\tthis.clearT7Timer();\n\t\t\tthis.clearT8Timer();\n\t\t\tthis.buffer = Buffer.alloc(0);\n\t\t\tthis.state = HsmsState.NotConnected;\n\t\t\tthis.socket = null;\n\t\t\tthis.emit(\"disconnected\");\n\t\t});\n\n\t\tsocket.on(\"end\", () => {\n\t\t\tif (this.socket && !this.socket.destroyed) {\n\t\t\t\tthis.socket.destroy();\n\t\t\t}\n\t\t});\n\n\t\tsocket.on(\"error\", (err) => {\n\t\t\tthis.emit(\"error\", err);\n\t\t\tif (!socket.destroyed) {\n\t\t\t\tsocket.destroy();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate resetT7Timer() {\n\t\tthis.clearT7Timer();\n\t\tif (this.timeoutT7 <= 0) return;\n\t\tthis.t7Timer = setTimeout(() => {\n\t\t\tthis.t7Timer = null;\n\t\t\tif (this.state === HsmsState.Selected) return;\n\t\t\tconst socket = this.socket;\n\t\t\tif (socket && !socket.destroyed) {\n\t\t\t\tthis.emit(\"error\", new Error(\"T7 Timeout\"));\n\t\t\t\tsocket.destroy();\n\t\t\t}\n\t\t}, this.timeoutT7 * 1000);\n\t}\n\n\tprivate clearT7Timer() {\n\t\tif (this.t7Timer) {\n\t\t\tclearTimeout(this.t7Timer);\n\t\t\tthis.t7Timer = null;\n\t\t}\n\t}\n\n\tprivate resetT8Timer() {\n\t\tthis.clearT8Timer();\n\t\tif (this.timeoutT8 <= 0) return;\n\t\tthis.t8Timer = setTimeout(() => {\n\t\t\tthis.t8Timer = null;\n\t\t\tconst socket = this.socket;\n\t\t\tif (socket && !socket.destroyed && this.buffer.length > 0) {\n\t\t\t\tthis.emit(\"error\", new Error(\"T8 Timeout\"));\n\t\t\t\tsocket.destroy();\n\t\t\t}\n\t\t}, this.timeoutT8 * 1000);\n\t}\n\n\tprivate clearT8Timer() {\n\t\tif (this.t8Timer) {\n\t\t\tclearTimeout(this.t8Timer);\n\t\t\tthis.t8Timer = null;\n\t\t}\n\t}\n\n\tprivate processBuffer() {\n\t\twhile (true) {\n\t\t\tif (this.buffer.length < 4) return;\n\n\t\t\tconst length = this.buffer.readUInt32BE(0);\n\t\t\tif (length < 10) {\n\t\t\t\tconst socket = this.socket;\n\t\t\t\tthis.emit(\"error\", new Error(\"Receive message size < 10\"));\n\t\t\t\tthis.buffer = Buffer.alloc(0);\n\t\t\t\tif (socket && !socket.destroyed) {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.buffer.length < 4 + length) return;\n\n\t\t\tconst msgBuffer = this.buffer.subarray(0, 4 + length);\n\t\t\tthis.buffer = this.buffer.subarray(4 + length);\n\n\t\t\ttry {\n\t\t\t\tconst msg = HsmsMessage.fromBuffer(msgBuffer);\n\t\t\t\tthis.processHsmsMessage(msg);\n\t\t\t} catch (err) {\n\t\t\t\tif (err instanceof Error) {\n\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\tnew Error(`Failed to parse HSMS message: ${err.message}`),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\tnew Error(`Failed to parse HSMS message: ${String(err)}`),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate processHsmsMessage(msg: HsmsMessage) {\n\t\t// Handle Control Messages\n\t\tif (msg.sType !== HsmsControlType.Data) {\n\t\t\tthis.handleControlMessage(msg);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle Data Messages\n\t\tif (this.state !== HsmsState.Selected) {\n\t\t\tvoid this.sendReject(msg, RejectReason.NotSelected);\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.handleMessage(msg);\n\t}\n\n\tprivate handleControlMessage(msg: HsmsMessage) {\n\t\tswitch (msg.sType as HsmsControlType) {\n\t\t\tcase HsmsControlType.SelectReq:\n\t\t\t\tthis.handleSelectReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.SelectRsp:\n\t\t\t\tthis.handleSelectRsp(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.DeselectReq:\n\t\t\t\tthis.handleDeselectReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.DeselectRsp:\n\t\t\t\tthis.handleDeselectRsp(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.LinkTestReq:\n\t\t\t\tthis.handleLinkTestReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.LinkTestRsp:\n\t\t\t\tthis.handleLinkTestRsp(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.SeparateReq:\n\t\t\t\tthis.handleSeparateReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.RejectReq:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvoid this.sendReject(\n\t\t\t\t\tmsg,\n\t\t\t\t\tmsg.pType !== 0\n\t\t\t\t\t\t? RejectReason.NotSupportTypeP\n\t\t\t\t\t\t: RejectReason.NotSupportTypeS,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprotected handleSelectReq(msg: HsmsMessage) {\n\t\t// Subclasses might override, but default behavior:\n\t\t// If already selected, return Actived/AlreadyUsed?\n\t\t// If not, accept.\n\n\t\t// Note: HSMS-SS says only one host.\n\t\tif (this.state === HsmsState.Selected) {\n\t\t\tvoid this.sendSelectRsp(msg, SelectStatus.Actived); // Or AlreadyUsed?\n\t\t} else {\n\t\t\tthis.state = HsmsState.Selected;\n\t\t\tthis.clearT7Timer();\n\t\t\tvoid this.sendSelectRsp(msg, SelectStatus.Success);\n\t\t\tthis.emit(\"selected\");\n\t\t}\n\t}\n\n\tprotected handleSelectRsp(msg: HsmsMessage) {\n\t\t// Check if we are waiting for this.\n\t\t// Usually managed by sendSelectReq promise.\n\t\tconst tx = this._transactions.get(msg.systemBytes);\n\t\tif (tx) {\n\t\t\t// If status is Success, set state to Selected\n\t\t\t// msg.func holds the status (byte 3) if we mapped it correctly in HsmsMessage.fromBuffer\n\t\t\t// In HsmsMessage.fromBuffer, for Control msg, func = byte 3.\n\t\t\tconst status = msg.func as SelectStatus;\n\t\t\tif (status === SelectStatus.Success || status === SelectStatus.Actived) {\n\t\t\t\tthis.state = HsmsState.Selected;\n\t\t\t\tthis.clearT7Timer();\n\t\t\t\tthis.emit(\"selected\");\n\t\t\t}\n\t\t\tclearTimeout(tx.timer);\n\t\t\tthis._transactions.delete(msg.systemBytes);\n\t\t\ttx.resolve(msg);\n\t\t} else {\n\t\t\tvoid this.sendReject(msg, RejectReason.TransactionNotOpen);\n\t\t}\n\t}\n\n\tprotected handleLinkTestReq(msg: HsmsMessage) {\n\t\tvoid this.sendLinkTestRsp(msg);\n\t}\n\n\tprotected handleLinkTestRsp(msg: HsmsMessage) {\n\t\tconst tx = this._transactions.get(msg.systemBytes);\n\t\tif (tx) {\n\t\t\tclearTimeout(tx.timer);\n\t\t\tthis._transactions.delete(msg.systemBytes);\n\t\t\ttx.resolve(msg);\n\t\t} else {\n\t\t\tvoid this.sendReject(msg, RejectReason.TransactionNotOpen);\n\t\t}\n\t}\n\n\tprotected handleDeselectReq(msg: HsmsMessage) {\n\t\tif (this.state === HsmsState.Selected) {\n\t\t\tthis.state = HsmsState.Connected;\n\t\t\tthis.resetT7Timer();\n\t\t\tvoid this.sendDeselectRsp(msg, SelectStatus.Success);\n\t\t\tthis.emit(\"deselected\");\n\t\t\treturn;\n\t\t}\n\t\tvoid this.sendDeselectRsp(msg, SelectStatus.NotReady);\n\t}\n\n\tprotected handleDeselectRsp(msg: HsmsMessage) {\n\t\tconst tx = this._transactions.get(msg.systemBytes);\n\t\tif (tx) {\n\t\t\tconst status = msg.func as SelectStatus;\n\t\t\tif (status === SelectStatus.Success) {\n\t\t\t\tthis.state = HsmsState.Connected;\n\t\t\t\tthis.resetT7Timer();\n\t\t\t\tthis.emit(\"deselected\");\n\t\t\t}\n\t\t\tclearTimeout(tx.timer);\n\t\t\tthis._transactions.delete(msg.systemBytes);\n\t\t\ttx.resolve(msg);\n\t\t} else {\n\t\t\tvoid this.sendReject(msg, RejectReason.TransactionNotOpen);\n\t\t}\n\t}\n\n\tprotected handleSeparateReq(_msg: HsmsMessage) {\n\t\tconst socket = this.socket;\n\t\tthis.state = HsmsState.Connected;\n\t\tthis.clearT7Timer();\n\t\tif (socket && !socket.destroyed) {\n\t\t\tsocket.destroy();\n\t\t}\n\t}\n\n\t// Helper senders\n\tprotected async sendSelectRsp(req: HsmsMessage, status: number) {\n\t\tconst rsp = HsmsMessage.selectRsp(req, status);\n\t\tawait this.sendBuffer(rsp.toBuffer());\n\t}\n\n\tprotected async sendDeselectRsp(req: HsmsMessage, status: number) {\n\t\tconst rsp = HsmsMessage.deselectRsp(req, status);\n\t\tawait this.sendBuffer(rsp.toBuffer());\n\t}\n\n\tprotected async sendLinkTestRsp(req: HsmsMessage) {\n\t\tconst rsp = HsmsMessage.linkTestRsp(req);\n\t\tawait this.sendBuffer(rsp.toBuffer());\n\t}\n\n\tprotected async sendReject(req: HsmsMessage, reason: RejectReason) {\n\t\tconst rsp = HsmsMessage.rejectReq(req, reason);\n\t\tawait this.sendBuffer(rsp.toBuffer());\n\t}\n\n\toverride async send(\n\t\tstream: number,\n\t\tfunc: number,\n\t\twBit: boolean,\n\t\tbody: AbstractSecs2Item | null = null,\n\t): Promise<SecsMessage | null> {\n\t\tif (this.state !== HsmsState.Selected) {\n\t\t\tthrow new Error(\"HSMS not selected\");\n\t\t}\n\t\treturn super.send(stream, func, wBit, body);\n\t}\n\n\t// Public control methods\n\tpublic async sendSelectReq(): Promise<SelectStatus> {\n\t\tconst systemBytes = this.getNextSystemBytes();\n\t\tconst msg = HsmsMessage.selectReq(systemBytes);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\tconst socket = this.socket;\n\t\t\t\tif (socket && !socket.destroyed) socket.destroy();\n\t\t\t\treject(new Error(\"T6 Timeout waiting for Select Rsp\"));\n\t\t\t}, this.timeoutT6 * 1000);\n\n\t\t\tthis._transactions.set(systemBytes, {\n\t\t\t\tresolve: (rsp) => {\n\t\t\t\t\tresolve(rsp.func as SelectStatus);\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t\ttimer,\n\t\t\t});\n\n\t\t\tthis.sendBuffer(msg.toBuffer()).catch((err: unknown) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic async sendLinkTestReq(): Promise<void> {\n\t\tconst systemBytes = this.getNextSystemBytes();\n\t\tconst msg = HsmsMessage.linkTestReq(systemBytes);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\tconst socket = this.socket;\n\t\t\t\tif (socket && !socket.destroyed) socket.destroy();\n\t\t\t\treject(new Error(\"T6 Timeout waiting for LinkTest Rsp\"));\n\t\t\t}, this.timeoutT6 * 1000);\n\n\t\t\tthis._transactions.set(systemBytes, {\n\t\t\t\tresolve: () => {\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t\ttimer,\n\t\t\t});\n\n\t\t\tthis.sendBuffer(msg.toBuffer()).catch((err: unknown) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic async sendSeparateReq(): Promise<void> {\n\t\tconst systemBytes = this.getNextSystemBytes();\n\t\tconst msg = HsmsMessage.separateReq(systemBytes);\n\t\tawait this.sendBuffer(msg.toBuffer());\n\t\tconst socket = this.socket;\n\t\tthis.state = HsmsState.Connected;\n\t\tthis.clearT7Timer();\n\t\tif (socket && !socket.destroyed) {\n\t\t\tsocket.destroy();\n\t\t}\n\t}\n\n\tprivate rejectAllTransactions(err: Error) {\n\t\tfor (const [systemBytes, tx] of this._transactions) {\n\t\t\tclearTimeout(tx.timer);\n\t\t\ttx.reject(err);\n\t\t\tthis._transactions.delete(systemBytes);\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HsmsCommunicator.js","names":[],"sources":["../../src/hsms/HsmsCommunicator.ts"],"sourcesContent":["import { Socket } from \"net\";\nimport {\n\tAbstractSecsCommunicator,\n\tSecsCommunicatorConfig,\n\tSecsCommunicatorEvents,\n} from \"../core/AbstractSecsCommunicator.js\";\nimport { SecsMessage } from \"../core/AbstractSecsMessage.js\";\nimport { AbstractSecs2Item } from \"../core/secs2item/AbstractSecs2Item.js\";\nimport { HsmsMessage } from \"./HsmsMessage.js\";\nimport { HsmsControlType } from \"./enums/HsmsControlType.js\";\nimport { SelectStatus } from \"./enums/SelectStatus.js\";\nimport { RejectReason } from \"./enums/RejectReason.js\";\n\nexport enum HsmsState {\n\tNotConnected = \"NotConnected\",\n\tConnected = \"Connected\", // TCP Connected\n\tSelected = \"Selected\", // HSMS Selected\n}\n\n/**\n * @description HsmsCommunicatorConfig is the configuration interface for HsmsCommunicator.\n * @param ip The IP address of the remote device.\n * @param port The port number of the remote device.\n * @param linkTestInterval The interval in milliseconds to send link test messages.\n */\nexport interface HsmsCommunicatorConfig extends SecsCommunicatorConfig {\n\tip: string;\n\tport: number;\n\tlinkTestInterval?: number;\n}\n\nexport interface HsmsCommunicatorEvents extends SecsCommunicatorEvents {\n\tselected: [];\n\tdeselected: [];\n}\n\nexport abstract class HsmsCommunicator extends AbstractSecsCommunicator<HsmsCommunicatorEvents> {\n\tpublic ip: string;\n\tpublic port: number;\n\n\tprotected socket: Socket | null = null;\n\tprotected state: HsmsState = HsmsState.NotConnected;\n\tprivate buffer: Buffer = Buffer.alloc(0);\n\tprivate t7Timer: NodeJS.Timeout | null = null;\n\tprivate t8Timer: NodeJS.Timeout | null = null;\n\n\t// T6 Timer (Control Transaction)\n\t// We use the same _transactions map for Control messages if they expect reply\n\n\tpublic get connectionState(): HsmsState {\n\t\treturn this.state;\n\t}\n\n\tconstructor(config: HsmsCommunicatorConfig) {\n\t\tsuper(config);\n\t\tthis.ip = config.ip;\n\t\tthis.port = config.port;\n\t}\n\n\tprotected override async sendBufferWithLogs(\n\t\tdirection: \"Sent\" | \"Received\",\n\t\tprotocol: string,\n\t\tbuffer: Buffer,\n\t\tmeta?: Record<string, unknown>,\n\t): Promise<void> {\n\t\tawait super.sendBufferWithLogs(\n\t\t\tdirection,\n\t\t\tprotocol === \"SECS\" ? \"HSMS\" : protocol,\n\t\t\tbuffer,\n\t\t\t{\n\t\t\t\thsmsState: this.state,\n\t\t\t\t...meta,\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected async sendBuffer(buffer: Buffer): Promise<void> {\n\t\tconst socket = this.socket;\n\t\tif (!socket || socket.destroyed) {\n\t\t\tthrow new Error(\"Socket not connected\");\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsocket.write(buffer, (err) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected createMessage(\n\t\tstream: number,\n\t\tfunc: number,\n\t\twBit: boolean,\n\t\tbody: AbstractSecs2Item | null,\n\t\tsystemBytes: number,\n\t): SecsMessage {\n\t\t// For Data messages, pType=0, sType=0 (Data)\n\t\treturn new HsmsMessage(\n\t\t\tstream,\n\t\t\tfunc,\n\t\t\twBit,\n\t\t\tbody,\n\t\t\tsystemBytes,\n\t\t\tthis.deviceId,\n\t\t\t0,\n\t\t\tHsmsControlType.Data,\n\t\t);\n\t}\n\n\tprotected handleSocketEvents(socket: Socket) {\n\t\tthis.socket = socket;\n\t\tconst prev = this.state;\n\t\tthis.state = HsmsState.Connected;\n\t\tthis.logger.logState(\"HSMS\", prev, this.state, {\n\t\t\tremoteAddress: socket.remoteAddress,\n\t\t\tremotePort: socket.remotePort,\n\t\t});\n\t\tthis.resetT7Timer();\n\t\tthis.emit(\"connected\");\n\n\t\tsocket.on(\"data\", (data) => {\n\t\t\tthis.logger.logBytes(\"Received\", \"HSMS\", data, {\n\t\t\t\tremoteAddress: socket.remoteAddress,\n\t\t\t\tremotePort: socket.remotePort,\n\t\t\t\tchunkLength: data.length,\n\t\t\t});\n\t\t\tthis.buffer = Buffer.concat([this.buffer, data]);\n\t\t\tthis.resetT8Timer();\n\t\t\tthis.processBuffer();\n\t\t\tif (this.buffer.length === 0) {\n\t\t\t\tthis.clearT8Timer();\n\t\t\t}\n\t\t});\n\n\t\tsocket.on(\"close\", () => {\n\t\t\tthis.rejectAllTransactions(new Error(\"Socket closed\"));\n\t\t\tthis.clearT7Timer();\n\t\t\tthis.clearT8Timer();\n\t\t\tthis.buffer = Buffer.alloc(0);\n\t\t\tconst prevState = this.state;\n\t\t\tthis.state = HsmsState.NotConnected;\n\t\t\tthis.logger.logState(\"HSMS\", prevState, this.state, {\n\t\t\t\tremoteAddress: socket.remoteAddress,\n\t\t\t\tremotePort: socket.remotePort,\n\t\t\t});\n\t\t\tthis.socket = null;\n\t\t\tthis.emit(\"disconnected\");\n\t\t});\n\n\t\tsocket.on(\"end\", () => {\n\t\t\tif (this.socket && !this.socket.destroyed) {\n\t\t\t\tthis.socket.destroy();\n\t\t\t}\n\t\t});\n\n\t\tsocket.on(\"error\", (err) => {\n\t\t\tthis.emit(\"error\", err);\n\t\t\tif (!socket.destroyed) {\n\t\t\t\tsocket.destroy();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate resetT7Timer() {\n\t\tthis.clearT7Timer();\n\t\tif (this.timeoutT7 <= 0) return;\n\t\tthis.t7Timer = setTimeout(() => {\n\t\t\tthis.t7Timer = null;\n\t\t\tif (this.state === HsmsState.Selected) return;\n\t\t\tconst socket = this.socket;\n\t\t\tif (socket && !socket.destroyed) {\n\t\t\t\tthis.emit(\"error\", new Error(\"T7 Timeout\"));\n\t\t\t\tsocket.destroy();\n\t\t\t}\n\t\t}, this.timeoutT7 * 1000);\n\t}\n\n\tprivate clearT7Timer() {\n\t\tif (this.t7Timer) {\n\t\t\tclearTimeout(this.t7Timer);\n\t\t\tthis.t7Timer = null;\n\t\t}\n\t}\n\n\tprivate resetT8Timer() {\n\t\tthis.clearT8Timer();\n\t\tif (this.timeoutT8 <= 0) return;\n\t\tthis.t8Timer = setTimeout(() => {\n\t\t\tthis.t8Timer = null;\n\t\t\tconst socket = this.socket;\n\t\t\tif (socket && !socket.destroyed && this.buffer.length > 0) {\n\t\t\t\tthis.emit(\"error\", new Error(\"T8 Timeout\"));\n\t\t\t\tsocket.destroy();\n\t\t\t}\n\t\t}, this.timeoutT8 * 1000);\n\t}\n\n\tprivate clearT8Timer() {\n\t\tif (this.t8Timer) {\n\t\t\tclearTimeout(this.t8Timer);\n\t\t\tthis.t8Timer = null;\n\t\t}\n\t}\n\n\tprivate processBuffer() {\n\t\twhile (true) {\n\t\t\tif (this.buffer.length < 4) return;\n\n\t\t\tconst length = this.buffer.readUInt32BE(0);\n\t\t\tif (length < 10) {\n\t\t\t\tconst socket = this.socket;\n\t\t\t\tthis.emit(\"error\", new Error(\"Receive message size < 10\"));\n\t\t\t\tthis.buffer = Buffer.alloc(0);\n\t\t\t\tif (socket && !socket.destroyed) {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.buffer.length < 4 + length) return;\n\n\t\t\tconst msgBuffer = this.buffer.subarray(0, 4 + length);\n\t\t\tthis.buffer = this.buffer.subarray(4 + length);\n\n\t\t\ttry {\n\t\t\t\tthis.logger.logBytes(\"Received\", \"HSMS\", msgBuffer, {\n\t\t\t\t\tframeLength: length,\n\t\t\t\t});\n\t\t\t\tconst msg = HsmsMessage.fromBuffer(msgBuffer);\n\t\t\t\tthis.processHsmsMessage(msg);\n\t\t\t} catch (err) {\n\t\t\t\tif (err instanceof Error) {\n\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\tnew Error(`Failed to parse HSMS message: ${err.message}`),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\tnew Error(`Failed to parse HSMS message: ${String(err)}`),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate processHsmsMessage(msg: HsmsMessage) {\n\t\t// Handle Control Messages\n\t\tif (msg.sType !== HsmsControlType.Data) {\n\t\t\tthis.logger.detail.debug(\n\t\t\t\t{\n\t\t\t\t\tprotocol: \"HSMS\",\n\t\t\t\t\tcontrolType: msg.sType,\n\t\t\t\t\tpType: msg.pType,\n\t\t\t\t\tsystemBytes: msg.systemBytes,\n\t\t\t\t\tdeviceId: msg.deviceId,\n\t\t\t\t},\n\t\t\t\t\"control\",\n\t\t\t);\n\t\t\tthis.handleControlMessage(msg);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle Data Messages\n\t\tif (this.state !== HsmsState.Selected) {\n\t\t\tthis.logger.logSecs2(\"Received\", msg.toSml());\n\t\t\tvoid this.sendReject(msg, RejectReason.NotSelected);\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.handleMessage(msg);\n\t}\n\n\tprivate handleControlMessage(msg: HsmsMessage) {\n\t\tswitch (msg.sType as HsmsControlType) {\n\t\t\tcase HsmsControlType.SelectReq:\n\t\t\t\tthis.handleSelectReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.SelectRsp:\n\t\t\t\tthis.handleSelectRsp(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.DeselectReq:\n\t\t\t\tthis.handleDeselectReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.DeselectRsp:\n\t\t\t\tthis.handleDeselectRsp(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.LinkTestReq:\n\t\t\t\tthis.handleLinkTestReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.LinkTestRsp:\n\t\t\t\tthis.handleLinkTestRsp(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.SeparateReq:\n\t\t\t\tthis.handleSeparateReq(msg);\n\t\t\t\tbreak;\n\t\t\tcase HsmsControlType.RejectReq:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvoid this.sendReject(\n\t\t\t\t\tmsg,\n\t\t\t\t\tmsg.pType !== 0\n\t\t\t\t\t\t? RejectReason.NotSupportTypeP\n\t\t\t\t\t\t: RejectReason.NotSupportTypeS,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprotected handleSelectReq(msg: HsmsMessage) {\n\t\t// Subclasses might override, but default behavior:\n\t\t// If already selected, return Actived/AlreadyUsed?\n\t\t// If not, accept.\n\n\t\t// Note: HSMS-SS says only one host.\n\t\tif (this.state === HsmsState.Selected) {\n\t\t\tvoid this.sendSelectRsp(msg, SelectStatus.Actived); // Or AlreadyUsed?\n\t\t} else {\n\t\t\tthis.logger.logState(\"HSMS\", this.state, HsmsState.Selected, {\n\t\t\t\tsystemBytes: msg.systemBytes,\n\t\t\t});\n\t\t\tthis.state = HsmsState.Selected;\n\t\t\tthis.clearT7Timer();\n\t\t\tvoid this.sendSelectRsp(msg, SelectStatus.Success);\n\t\t\tthis.emit(\"selected\");\n\t\t}\n\t}\n\n\tprotected handleSelectRsp(msg: HsmsMessage) {\n\t\t// Check if we are waiting for this.\n\t\t// Usually managed by sendSelectReq promise.\n\t\tconst tx = this._transactions.get(msg.systemBytes);\n\t\tif (tx) {\n\t\t\t// If status is Success, set state to Selected\n\t\t\t// msg.func holds the status (byte 3) if we mapped it correctly in HsmsMessage.fromBuffer\n\t\t\t// In HsmsMessage.fromBuffer, for Control msg, func = byte 3.\n\t\t\tconst status = msg.func as SelectStatus;\n\t\t\tif (status === SelectStatus.Success || status === SelectStatus.Actived) {\n\t\t\t\tthis.logger.logState(\"HSMS\", this.state, HsmsState.Selected, {\n\t\t\t\t\tselectStatus: status,\n\t\t\t\t\tsystemBytes: msg.systemBytes,\n\t\t\t\t});\n\t\t\t\tthis.state = HsmsState.Selected;\n\t\t\t\tthis.clearT7Timer();\n\t\t\t\tthis.emit(\"selected\");\n\t\t\t}\n\t\t\tclearTimeout(tx.timer);\n\t\t\tthis._transactions.delete(msg.systemBytes);\n\t\t\ttx.resolve(msg);\n\t\t} else {\n\t\t\tvoid this.sendReject(msg, RejectReason.TransactionNotOpen);\n\t\t}\n\t}\n\n\tprotected handleLinkTestReq(msg: HsmsMessage) {\n\t\tvoid this.sendLinkTestRsp(msg);\n\t}\n\n\tprotected handleLinkTestRsp(msg: HsmsMessage) {\n\t\tconst tx = this._transactions.get(msg.systemBytes);\n\t\tif (tx) {\n\t\t\tclearTimeout(tx.timer);\n\t\t\tthis._transactions.delete(msg.systemBytes);\n\t\t\ttx.resolve(msg);\n\t\t} else {\n\t\t\tvoid this.sendReject(msg, RejectReason.TransactionNotOpen);\n\t\t}\n\t}\n\n\tprotected handleDeselectReq(msg: HsmsMessage) {\n\t\tif (this.state === HsmsState.Selected) {\n\t\t\tthis.logger.logState(\"HSMS\", this.state, HsmsState.Connected, {\n\t\t\t\tsystemBytes: msg.systemBytes,\n\t\t\t});\n\t\t\tthis.state = HsmsState.Connected;\n\t\t\tthis.resetT7Timer();\n\t\t\tvoid this.sendDeselectRsp(msg, SelectStatus.Success);\n\t\t\tthis.emit(\"deselected\");\n\t\t\treturn;\n\t\t}\n\t\tvoid this.sendDeselectRsp(msg, SelectStatus.NotReady);\n\t}\n\n\tprotected handleDeselectRsp(msg: HsmsMessage) {\n\t\tconst tx = this._transactions.get(msg.systemBytes);\n\t\tif (tx) {\n\t\t\tconst status = msg.func as SelectStatus;\n\t\t\tif (status === SelectStatus.Success) {\n\t\t\t\tthis.logger.logState(\"HSMS\", this.state, HsmsState.Connected, {\n\t\t\t\t\tsystemBytes: msg.systemBytes,\n\t\t\t\t});\n\t\t\t\tthis.state = HsmsState.Connected;\n\t\t\t\tthis.resetT7Timer();\n\t\t\t\tthis.emit(\"deselected\");\n\t\t\t}\n\t\t\tclearTimeout(tx.timer);\n\t\t\tthis._transactions.delete(msg.systemBytes);\n\t\t\ttx.resolve(msg);\n\t\t} else {\n\t\t\tvoid this.sendReject(msg, RejectReason.TransactionNotOpen);\n\t\t}\n\t}\n\n\tprotected handleSeparateReq(_msg: HsmsMessage) {\n\t\tconst socket = this.socket;\n\t\tconst prev = this.state;\n\t\tthis.state = HsmsState.Connected;\n\t\tthis.logger.logState(\"HSMS\", prev, this.state);\n\t\tthis.clearT7Timer();\n\t\tif (socket && !socket.destroyed) {\n\t\t\tsocket.destroy();\n\t\t}\n\t}\n\n\t// Helper senders\n\tprotected async sendSelectRsp(req: HsmsMessage, status: number) {\n\t\tconst rsp = HsmsMessage.selectRsp(req, status);\n\t\tawait this.sendBufferWithLogs(\"Sent\", \"HSMS\", rsp.toBuffer(), {\n\t\t\tcontrolType: HsmsControlType.SelectRsp,\n\t\t\tstatus,\n\t\t\tsystemBytes: rsp.systemBytes,\n\t\t});\n\t}\n\n\tprotected async sendDeselectRsp(req: HsmsMessage, status: number) {\n\t\tconst rsp = HsmsMessage.deselectRsp(req, status);\n\t\tawait this.sendBufferWithLogs(\"Sent\", \"HSMS\", rsp.toBuffer(), {\n\t\t\tcontrolType: HsmsControlType.DeselectRsp,\n\t\t\tstatus,\n\t\t\tsystemBytes: rsp.systemBytes,\n\t\t});\n\t}\n\n\tprotected async sendLinkTestRsp(req: HsmsMessage) {\n\t\tconst rsp = HsmsMessage.linkTestRsp(req);\n\t\tawait this.sendBufferWithLogs(\"Sent\", \"HSMS\", rsp.toBuffer(), {\n\t\t\tcontrolType: HsmsControlType.LinkTestRsp,\n\t\t\tsystemBytes: rsp.systemBytes,\n\t\t});\n\t}\n\n\tprotected async sendReject(req: HsmsMessage, reason: RejectReason) {\n\t\tconst rsp = HsmsMessage.rejectReq(req, reason);\n\t\tawait this.sendBufferWithLogs(\"Sent\", \"HSMS\", rsp.toBuffer(), {\n\t\t\tcontrolType: HsmsControlType.RejectReq,\n\t\t\treason,\n\t\t\tsystemBytes: rsp.systemBytes,\n\t\t});\n\t}\n\n\toverride async send(\n\t\tstream: number,\n\t\tfunc: number,\n\t\twBit: boolean,\n\t\tbody: AbstractSecs2Item | null = null,\n\t): Promise<SecsMessage | null> {\n\t\tif (this.state !== HsmsState.Selected) {\n\t\t\tthrow new Error(\"HSMS not selected\");\n\t\t}\n\t\treturn super.send(stream, func, wBit, body);\n\t}\n\n\t// Public control methods\n\tpublic async sendSelectReq(): Promise<SelectStatus> {\n\t\tconst systemBytes = this.getNextSystemBytes();\n\t\tconst msg = HsmsMessage.selectReq(systemBytes);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\tconst socket = this.socket;\n\t\t\t\tif (socket && !socket.destroyed) socket.destroy();\n\t\t\t\treject(new Error(\"T6 Timeout waiting for Select Rsp\"));\n\t\t\t}, this.timeoutT6 * 1000);\n\n\t\t\tthis._transactions.set(systemBytes, {\n\t\t\t\tresolve: (rsp) => {\n\t\t\t\t\tresolve(rsp.func as SelectStatus);\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t\ttimer,\n\t\t\t});\n\n\t\t\tthis.sendBufferWithLogs(\"Sent\", \"HSMS\", msg.toBuffer(), {\n\t\t\t\tcontrolType: HsmsControlType.SelectReq,\n\t\t\t\tsystemBytes,\n\t\t\t}).catch((err: unknown) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic async sendLinkTestReq(): Promise<void> {\n\t\tconst systemBytes = this.getNextSystemBytes();\n\t\tconst msg = HsmsMessage.linkTestReq(systemBytes);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\tconst socket = this.socket;\n\t\t\t\tif (socket && !socket.destroyed) socket.destroy();\n\t\t\t\treject(new Error(\"T6 Timeout waiting for LinkTest Rsp\"));\n\t\t\t}, this.timeoutT6 * 1000);\n\n\t\t\tthis._transactions.set(systemBytes, {\n\t\t\t\tresolve: () => {\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t\ttimer,\n\t\t\t});\n\n\t\t\tthis.sendBufferWithLogs(\"Sent\", \"HSMS\", msg.toBuffer(), {\n\t\t\t\tcontrolType: HsmsControlType.LinkTestReq,\n\t\t\t\tsystemBytes,\n\t\t\t}).catch((err: unknown) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tthis._transactions.delete(systemBytes);\n\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic async sendSeparateReq(): Promise<void> {\n\t\tconst systemBytes = this.getNextSystemBytes();\n\t\tconst msg = HsmsMessage.separateReq(systemBytes);\n\t\tawait this.sendBufferWithLogs(\"Sent\", \"HSMS\", msg.toBuffer(), {\n\t\t\tcontrolType: HsmsControlType.SeparateReq,\n\t\t\tsystemBytes,\n\t\t});\n\t\tconst socket = this.socket;\n\t\tconst prev = this.state;\n\t\tthis.state = HsmsState.Connected;\n\t\tthis.logger.logState(\"HSMS\", prev, this.state, { systemBytes });\n\t\tthis.clearT7Timer();\n\t\tif (socket && !socket.destroyed) {\n\t\t\tsocket.destroy();\n\t\t}\n\t}\n\n\tprivate rejectAllTransactions(err: Error) {\n\t\tfor (const [systemBytes, tx] of this._transactions) {\n\t\t\tclearTimeout(tx.timer);\n\t\t\ttx.reject(err);\n\t\t\tthis._transactions.delete(systemBytes);\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|