secs4js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +442 -0
  3. package/lib/core/AbstractSecsCommunicator.d.ts +76 -0
  4. package/lib/core/AbstractSecsCommunicator.d.ts.map +1 -0
  5. package/lib/core/AbstractSecsCommunicator.js +85 -0
  6. package/lib/core/AbstractSecsCommunicator.js.map +1 -0
  7. package/lib/core/AbstractSecsMessage.d.ts +36 -0
  8. package/lib/core/AbstractSecsMessage.d.ts.map +1 -0
  9. package/lib/core/AbstractSecsMessage.js +66 -0
  10. package/lib/core/AbstractSecsMessage.js.map +1 -0
  11. package/lib/core/enums/HsmsSsControlType.d.ts +59 -0
  12. package/lib/core/enums/HsmsSsControlType.d.ts.map +1 -0
  13. package/lib/core/enums/HsmsSsControlType.js +105 -0
  14. package/lib/core/enums/HsmsSsControlType.js.map +1 -0
  15. package/lib/core/enums/RejectReason.d.ts +11 -0
  16. package/lib/core/enums/RejectReason.d.ts.map +1 -0
  17. package/lib/core/enums/RejectReason.js +13 -0
  18. package/lib/core/enums/RejectReason.js.map +1 -0
  19. package/lib/core/enums/SecsItemType.d.ts +33 -0
  20. package/lib/core/enums/SecsItemType.d.ts.map +1 -0
  21. package/lib/core/enums/SecsItemType.js +22 -0
  22. package/lib/core/enums/SecsItemType.js.map +1 -0
  23. package/lib/core/enums/SelectStatus.d.ts +11 -0
  24. package/lib/core/enums/SelectStatus.d.ts.map +1 -0
  25. package/lib/core/enums/SelectStatus.js +13 -0
  26. package/lib/core/enums/SelectStatus.js.map +1 -0
  27. package/lib/core/secs2item/AbstractSecs2Item.d.ts +34 -0
  28. package/lib/core/secs2item/AbstractSecs2Item.d.ts.map +1 -0
  29. package/lib/core/secs2item/AbstractSecs2Item.js +59 -0
  30. package/lib/core/secs2item/AbstractSecs2Item.js.map +1 -0
  31. package/lib/core/secs2item/Secs2ItemAscii.d.ts +18 -0
  32. package/lib/core/secs2item/Secs2ItemAscii.d.ts.map +1 -0
  33. package/lib/core/secs2item/Secs2ItemAscii.js +27 -0
  34. package/lib/core/secs2item/Secs2ItemAscii.js.map +1 -0
  35. package/lib/core/secs2item/Secs2ItemBinary.d.ts +11 -0
  36. package/lib/core/secs2item/Secs2ItemBinary.d.ts.map +1 -0
  37. package/lib/core/secs2item/Secs2ItemBinary.js +22 -0
  38. package/lib/core/secs2item/Secs2ItemBinary.js.map +1 -0
  39. package/lib/core/secs2item/Secs2ItemBoolean.d.ts +12 -0
  40. package/lib/core/secs2item/Secs2ItemBoolean.d.ts.map +1 -0
  41. package/lib/core/secs2item/Secs2ItemBoolean.js +27 -0
  42. package/lib/core/secs2item/Secs2ItemBoolean.js.map +1 -0
  43. package/lib/core/secs2item/Secs2ItemFactory.d.ts +27 -0
  44. package/lib/core/secs2item/Secs2ItemFactory.d.ts.map +1 -0
  45. package/lib/core/secs2item/Secs2ItemFactory.js +56 -0
  46. package/lib/core/secs2item/Secs2ItemFactory.js.map +1 -0
  47. package/lib/core/secs2item/Secs2ItemList.d.ts +11 -0
  48. package/lib/core/secs2item/Secs2ItemList.d.ts.map +1 -0
  49. package/lib/core/secs2item/Secs2ItemList.js +26 -0
  50. package/lib/core/secs2item/Secs2ItemList.js.map +1 -0
  51. package/lib/core/secs2item/Secs2ItemNumeric.d.ts +14 -0
  52. package/lib/core/secs2item/Secs2ItemNumeric.d.ts.map +1 -0
  53. package/lib/core/secs2item/Secs2ItemNumeric.js +128 -0
  54. package/lib/core/secs2item/Secs2ItemNumeric.js.map +1 -0
  55. package/lib/core/secs2item/Secs2ItemParser.d.ts +12 -0
  56. package/lib/core/secs2item/Secs2ItemParser.d.ts.map +1 -0
  57. package/lib/core/secs2item/Secs2ItemParser.js +74 -0
  58. package/lib/core/secs2item/Secs2ItemParser.js.map +1 -0
  59. package/lib/gem/Clock.d.ts +21 -0
  60. package/lib/gem/Clock.d.ts.map +1 -0
  61. package/lib/gem/Clock.js +65 -0
  62. package/lib/gem/Clock.js.map +1 -0
  63. package/lib/gem/Gem.d.ts +55 -0
  64. package/lib/gem/Gem.d.ts.map +1 -0
  65. package/lib/gem/Gem.js +137 -0
  66. package/lib/gem/Gem.js.map +1 -0
  67. package/lib/helper/Secs2ItemHelper.d.ts +96 -0
  68. package/lib/helper/Secs2ItemHelper.d.ts.map +1 -0
  69. package/lib/helper/Secs2ItemHelper.js +135 -0
  70. package/lib/helper/Secs2ItemHelper.js.map +1 -0
  71. package/lib/hsms/HsmsActiveCommunicator.d.ts +29 -0
  72. package/lib/hsms/HsmsActiveCommunicator.d.ts.map +1 -0
  73. package/lib/hsms/HsmsActiveCommunicator.js +123 -0
  74. package/lib/hsms/HsmsActiveCommunicator.js.map +1 -0
  75. package/lib/hsms/HsmsCommunicator.d.ts +70 -0
  76. package/lib/hsms/HsmsCommunicator.d.ts.map +1 -0
  77. package/lib/hsms/HsmsCommunicator.js +322 -0
  78. package/lib/hsms/HsmsCommunicator.js.map +1 -0
  79. package/lib/hsms/HsmsMessage.d.ts +92 -0
  80. package/lib/hsms/HsmsMessage.d.ts.map +1 -0
  81. package/lib/hsms/HsmsMessage.js +163 -0
  82. package/lib/hsms/HsmsMessage.js.map +1 -0
  83. package/lib/hsms/HsmsPassiveCommunicator.d.ts +48 -0
  84. package/lib/hsms/HsmsPassiveCommunicator.d.ts.map +1 -0
  85. package/lib/hsms/HsmsPassiveCommunicator.js +304 -0
  86. package/lib/hsms/HsmsPassiveCommunicator.js.map +1 -0
  87. package/lib/hsms/enums/HsmsControlType.d.ts +15 -0
  88. package/lib/hsms/enums/HsmsControlType.d.ts.map +1 -0
  89. package/lib/hsms/enums/HsmsControlType.js +17 -0
  90. package/lib/hsms/enums/HsmsControlType.js.map +1 -0
  91. package/lib/hsms/enums/RejectReason.d.ts +11 -0
  92. package/lib/hsms/enums/RejectReason.d.ts.map +1 -0
  93. package/lib/hsms/enums/RejectReason.js +13 -0
  94. package/lib/hsms/enums/RejectReason.js.map +1 -0
  95. package/lib/hsms/enums/SelectStatus.d.ts +11 -0
  96. package/lib/hsms/enums/SelectStatus.d.ts.map +1 -0
  97. package/lib/hsms/enums/SelectStatus.js +13 -0
  98. package/lib/hsms/enums/SelectStatus.js.map +1 -0
  99. package/lib/index.d.ts +28 -0
  100. package/lib/index.js +29 -0
  101. package/lib/secs1/Secs1Communicator.d.ts +51 -0
  102. package/lib/secs1/Secs1Communicator.d.ts.map +1 -0
  103. package/lib/secs1/Secs1Communicator.js +342 -0
  104. package/lib/secs1/Secs1Communicator.js.map +1 -0
  105. package/lib/secs1/Secs1Message.d.ts +21 -0
  106. package/lib/secs1/Secs1Message.d.ts.map +1 -0
  107. package/lib/secs1/Secs1Message.js +77 -0
  108. package/lib/secs1/Secs1Message.js.map +1 -0
  109. package/lib/secs1/Secs1MessageBlock.d.ts +23 -0
  110. package/lib/secs1/Secs1MessageBlock.d.ts.map +1 -0
  111. package/lib/secs1/Secs1MessageBlock.js +86 -0
  112. package/lib/secs1/Secs1MessageBlock.js.map +1 -0
  113. package/lib/secs1/Secs1OnTcpIpActiveCommunicator.d.ts +23 -0
  114. package/lib/secs1/Secs1OnTcpIpActiveCommunicator.d.ts.map +1 -0
  115. package/lib/secs1/Secs1OnTcpIpActiveCommunicator.js +82 -0
  116. package/lib/secs1/Secs1OnTcpIpActiveCommunicator.js.map +1 -0
  117. package/lib/secs1/Secs1OnTcpIpPassiveCommunicator.d.ts +19 -0
  118. package/lib/secs1/Secs1OnTcpIpPassiveCommunicator.d.ts.map +1 -0
  119. package/lib/secs1/Secs1OnTcpIpPassiveCommunicator.js +49 -0
  120. package/lib/secs1/Secs1OnTcpIpPassiveCommunicator.js.map +1 -0
  121. package/lib/secs1/Secs1SerialCommunicator.d.ts +18 -0
  122. package/lib/secs1/Secs1SerialCommunicator.d.ts.map +1 -0
  123. package/lib/secs1/Secs1SerialCommunicator.js +59 -0
  124. package/lib/secs1/Secs1SerialCommunicator.js.map +1 -0
  125. package/lib/sml/SmlParser.d.ts +27 -0
  126. package/lib/sml/SmlParser.d.ts.map +1 -0
  127. package/lib/sml/SmlParser.js +184 -0
  128. package/lib/sml/SmlParser.js.map +1 -0
  129. package/package.json +53 -0
@@ -0,0 +1,48 @@
1
+ import { HsmsCommunicator, HsmsCommunicatorConfig } from "./HsmsCommunicator.js";
2
+
3
+ //#region src/hsms/HsmsPassiveCommunicator.d.ts
4
+ interface HsmsPassiveCommunicatorConfig extends HsmsCommunicatorConfig {
5
+ timeoutRebind?: number;
6
+ }
7
+ /**
8
+ * @description HsmsPassiveCommunicator is the class that represents an HSMS passive communicator.
9
+ */
10
+ declare class HsmsPassiveCommunicator extends HsmsCommunicator {
11
+ private server;
12
+ private shouldStop;
13
+ private serverLoopPromise;
14
+ private timeoutRebind;
15
+ constructor(config: HsmsPassiveCommunicatorConfig);
16
+ /**
17
+ * @description Opens the passive communicator.
18
+ */
19
+ open(): Promise<void>;
20
+ /**
21
+ * @description Runs the server loop.
22
+ * @param onFirstListening The callback function to be called when the first listening is completed.
23
+ * @returns A Promise that resolves when the server loop is stopped.
24
+ */
25
+ private runServerLoop;
26
+ /**
27
+ * @description Listens for a single connection.
28
+ * @param onListening The callback function to be called when the connection is established.
29
+ * @returns A Promise that resolves when the connection is closed.
30
+ */
31
+ private listenOnce;
32
+ /**
33
+ * @description Handles an incoming socket connection.
34
+ * @param socket The socket object representing the incoming connection.
35
+ * @returns A Promise that resolves when the socket connection is handled.
36
+ */
37
+ private handleIncomingSocket;
38
+ /**
39
+ * @description Handles a socket connection until it is selected.
40
+ * @param socket The socket object representing the connection.
41
+ * @returns A Promise that resolves with a boolean indicating whether the socket was promoted to selected.
42
+ */
43
+ private handleSocketUntilSelected;
44
+ close(): Promise<void>;
45
+ }
46
+ //#endregion
47
+ export { HsmsPassiveCommunicator, HsmsPassiveCommunicatorConfig };
48
+ //# sourceMappingURL=HsmsPassiveCommunicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HsmsPassiveCommunicator.d.ts","names":[],"sources":["../../src/hsms/HsmsPassiveCommunicator.ts"],"sourcesContent":[],"mappings":";;;UAWiB,6BAAA,SAAsC;;AAAvD;AAOA;;;AAwWgB,cAxWH,uBAAA,SAAgC,gBAAA,CAwW7B;EAxW6B,QAAA,MAAA;EAAgB,QAAA,UAAA;;;sBAMxC;;;;UAUN;;;;;;;;;;;;;;;;;;;;;;;;;WAwVC"}
@@ -0,0 +1,304 @@
1
+ import { HsmsControlType } from "./enums/HsmsControlType.js";
2
+ import { RejectReason } from "./enums/RejectReason.js";
3
+ import { HsmsMessage } from "./HsmsMessage.js";
4
+ import { SelectStatus } from "./enums/SelectStatus.js";
5
+ import { HsmsCommunicator, HsmsState } from "./HsmsCommunicator.js";
6
+ import { createServer } from "net";
7
+
8
+ //#region src/hsms/HsmsPassiveCommunicator.ts
9
+ /**
10
+ * @description HsmsPassiveCommunicator is the class that represents an HSMS passive communicator.
11
+ */
12
+ var HsmsPassiveCommunicator = class extends HsmsCommunicator {
13
+ server = null;
14
+ shouldStop = false;
15
+ serverLoopPromise = null;
16
+ timeoutRebind = 5;
17
+ constructor(config) {
18
+ super(config);
19
+ if (config.timeoutRebind !== void 0) this.timeoutRebind = config.timeoutRebind;
20
+ }
21
+ /**
22
+ * @description Opens the passive communicator.
23
+ */
24
+ async open() {
25
+ if (this.serverLoopPromise) return;
26
+ this.shouldStop = false;
27
+ let resolveFirstListen = null;
28
+ const firstListen = new Promise((resolve) => {
29
+ resolveFirstListen = resolve;
30
+ });
31
+ this.serverLoopPromise = this.runServerLoop(() => {
32
+ resolveFirstListen?.();
33
+ resolveFirstListen = null;
34
+ }).catch((err) => {
35
+ this.emit("error", err instanceof Error ? err : new Error(String(err)));
36
+ });
37
+ await firstListen;
38
+ }
39
+ /**
40
+ * @description Runs the server loop.
41
+ * @param onFirstListening The callback function to be called when the first listening is completed.
42
+ * @returns A Promise that resolves when the server loop is stopped.
43
+ */
44
+ async runServerLoop(onFirstListening) {
45
+ let first = true;
46
+ while (!this.shouldStop) {
47
+ try {
48
+ await this.listenOnce(first ? onFirstListening : null);
49
+ } catch (err) {
50
+ if (!this.shouldStop) this.emit("error", err instanceof Error ? err : new Error(String(err)));
51
+ if (!this.shouldStop) await new Promise((resolve) => setTimeout(resolve, this.timeoutRebind * 1e3));
52
+ }
53
+ first = false;
54
+ if (this.shouldStop) return;
55
+ }
56
+ }
57
+ /**
58
+ * @description Listens for a single connection.
59
+ * @param onListening The callback function to be called when the connection is established.
60
+ * @returns A Promise that resolves when the connection is closed.
61
+ */
62
+ async listenOnce(onListening) {
63
+ return new Promise((resolve, reject) => {
64
+ const server = createServer((socket) => {
65
+ this.handleIncomingSocket(socket);
66
+ });
67
+ this.server = server;
68
+ let hasConnected = false;
69
+ let settled = false;
70
+ const cleanup = () => {
71
+ server.removeListener("error", onServerError);
72
+ server.removeListener("close", onServerClose);
73
+ this.removeListener("connected", onConnected);
74
+ this.removeListener("disconnected", onDisconnected);
75
+ };
76
+ const finish = (err) => {
77
+ if (settled) return;
78
+ settled = true;
79
+ if (this.server === server) this.server = null;
80
+ cleanup();
81
+ if (err) reject(err);
82
+ else resolve();
83
+ };
84
+ const closeServer = () => {
85
+ if (settled) return;
86
+ if (!server.listening) {
87
+ finish();
88
+ return;
89
+ }
90
+ server.close((err) => {
91
+ if (err) finish(err);
92
+ else finish();
93
+ });
94
+ };
95
+ const onServerError = (err) => {
96
+ finish(err);
97
+ };
98
+ const onServerClose = () => {
99
+ finish();
100
+ };
101
+ const onConnected = () => {
102
+ hasConnected = true;
103
+ };
104
+ const onDisconnected = () => {
105
+ if (!hasConnected) return;
106
+ closeServer();
107
+ };
108
+ server.on("error", onServerError);
109
+ server.on("close", onServerClose);
110
+ this.on("connected", onConnected);
111
+ this.on("disconnected", onDisconnected);
112
+ server.listen(this.port, this.ip, () => {
113
+ onListening?.();
114
+ });
115
+ });
116
+ }
117
+ /**
118
+ * @description Handles an incoming socket connection.
119
+ * @param socket The socket object representing the incoming connection.
120
+ * @returns A Promise that resolves when the socket connection is handled.
121
+ */
122
+ async handleIncomingSocket(socket) {
123
+ socket.setNoDelay(true);
124
+ if (!this.socket || this.socket.destroyed) {
125
+ if (await this.handleSocketUntilSelected(socket)) return;
126
+ return;
127
+ }
128
+ await this.handleSocketUntilSelected(socket);
129
+ }
130
+ /**
131
+ * @description Handles a socket connection until it is selected.
132
+ * @param socket The socket object representing the connection.
133
+ * @returns A Promise that resolves with a boolean indicating whether the socket was promoted to selected.
134
+ */
135
+ async handleSocketUntilSelected(socket) {
136
+ let buffer = Buffer.alloc(0);
137
+ let t8Timer = null;
138
+ let t7Timer = null;
139
+ const clearT8 = () => {
140
+ if (t8Timer) {
141
+ clearTimeout(t8Timer);
142
+ t8Timer = null;
143
+ }
144
+ };
145
+ const resetT8 = () => {
146
+ clearT8();
147
+ if (this.timeoutT8 <= 0) return;
148
+ t8Timer = setTimeout(() => {
149
+ t8Timer = null;
150
+ if (buffer.length > 0 && !socket.destroyed) {
151
+ this.emit("error", /* @__PURE__ */ new Error("T8 Timeout"));
152
+ socket.destroy();
153
+ }
154
+ }, this.timeoutT8 * 1e3);
155
+ };
156
+ const clearT7 = () => {
157
+ if (t7Timer) {
158
+ clearTimeout(t7Timer);
159
+ t7Timer = null;
160
+ }
161
+ };
162
+ const resetT7 = () => {
163
+ clearT7();
164
+ if (this.timeoutT7 <= 0) return;
165
+ t7Timer = setTimeout(() => {
166
+ t7Timer = null;
167
+ if (!socket.destroyed) socket.destroy();
168
+ }, this.timeoutT7 * 1e3);
169
+ };
170
+ const sendSocketBuffer = async (buf) => {
171
+ await new Promise((resolve, reject) => {
172
+ socket.write(buf, (err) => {
173
+ if (err) reject(err);
174
+ else resolve();
175
+ });
176
+ });
177
+ };
178
+ const cleanup = () => {
179
+ clearT8();
180
+ clearT7();
181
+ };
182
+ const promoteToSelected = (selectReq) => {
183
+ socket.removeListener("data", onData);
184
+ socket.removeListener("close", onClose);
185
+ socket.removeListener("end", onEnd);
186
+ socket.removeListener("error", onError);
187
+ cleanup();
188
+ this.handleSocketEvents(socket);
189
+ this.handleSelectReq(selectReq);
190
+ };
191
+ const handlePreSelectedMessage = async (msg) => {
192
+ switch (msg.sType) {
193
+ case HsmsControlType.Data:
194
+ await sendSocketBuffer(HsmsMessage.rejectReq(msg, RejectReason.NotSelected).toBuffer());
195
+ break;
196
+ case HsmsControlType.LinkTestReq:
197
+ await sendSocketBuffer(HsmsMessage.linkTestRsp(msg).toBuffer());
198
+ break;
199
+ case HsmsControlType.SeparateReq:
200
+ socket.destroy();
201
+ break;
202
+ case HsmsControlType.SelectReq:
203
+ if (this.socket && !this.socket.destroyed && this.state === HsmsState.Selected) await sendSocketBuffer(HsmsMessage.selectRsp(msg, SelectStatus.AlreadyUsed).toBuffer());
204
+ else promoteToSelected(msg);
205
+ break;
206
+ case HsmsControlType.SelectRsp:
207
+ case HsmsControlType.LinkTestRsp:
208
+ await sendSocketBuffer(HsmsMessage.rejectReq(msg, RejectReason.TransactionNotOpen).toBuffer());
209
+ break;
210
+ case HsmsControlType.RejectReq: break;
211
+ default: {
212
+ const reason = msg.pType !== 0 ? RejectReason.NotSupportTypeP : RejectReason.NotSupportTypeS;
213
+ await sendSocketBuffer(HsmsMessage.rejectReq(msg, reason).toBuffer());
214
+ break;
215
+ }
216
+ }
217
+ };
218
+ let processing = false;
219
+ const processIncoming = async () => {
220
+ if (processing) return;
221
+ processing = true;
222
+ try {
223
+ while (true) {
224
+ if (buffer.length < 4) return;
225
+ const length = buffer.readUInt32BE(0);
226
+ if (length < 10) {
227
+ this.emit("error", /* @__PURE__ */ new Error("Receive message size < 10"));
228
+ buffer = Buffer.alloc(0);
229
+ socket.destroy();
230
+ return;
231
+ }
232
+ if (buffer.length < 4 + length) return;
233
+ const msgBuffer = buffer.subarray(0, 4 + length);
234
+ buffer = buffer.subarray(4 + length);
235
+ if (buffer.length === 0) clearT8();
236
+ let msg;
237
+ try {
238
+ msg = HsmsMessage.fromBuffer(msgBuffer);
239
+ } catch (err) {
240
+ this.emit("error", err instanceof Error ? err : new Error(String(err)));
241
+ socket.destroy();
242
+ return;
243
+ }
244
+ resetT7();
245
+ await handlePreSelectedMessage(msg);
246
+ if (this.socket === socket && this.state === HsmsState.Selected) return;
247
+ }
248
+ } catch (err) {
249
+ this.emit("error", err instanceof Error ? err : new Error(String(err)));
250
+ socket.destroy();
251
+ } finally {
252
+ processing = false;
253
+ }
254
+ };
255
+ const onData = (data) => {
256
+ buffer = Buffer.concat([buffer, data]);
257
+ resetT8();
258
+ processIncoming();
259
+ };
260
+ const onClose = () => {
261
+ cleanup();
262
+ };
263
+ const onEnd = () => {
264
+ if (!socket.destroyed) socket.destroy();
265
+ };
266
+ const onError = (err) => {
267
+ this.emit("error", err);
268
+ };
269
+ socket.on("data", onData);
270
+ socket.on("close", onClose);
271
+ socket.on("end", onEnd);
272
+ socket.on("error", onError);
273
+ resetT7();
274
+ await new Promise((resolve) => {
275
+ socket.once("close", () => resolve());
276
+ });
277
+ return this.socket === socket && this.state === HsmsState.Selected;
278
+ }
279
+ async close() {
280
+ this.shouldStop = true;
281
+ if (this.socket) {
282
+ this.socket.end();
283
+ this.socket.destroy();
284
+ this.socket = null;
285
+ }
286
+ const server = this.server;
287
+ if (server) await new Promise((resolve, reject) => {
288
+ server.close((err) => {
289
+ this.server = null;
290
+ if (err) reject(err);
291
+ else resolve();
292
+ });
293
+ });
294
+ if (this.serverLoopPromise) {
295
+ const loop = this.serverLoopPromise;
296
+ this.serverLoopPromise = null;
297
+ await loop;
298
+ }
299
+ }
300
+ };
301
+
302
+ //#endregion
303
+ export { HsmsPassiveCommunicator };
304
+ //# sourceMappingURL=HsmsPassiveCommunicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HsmsPassiveCommunicator.js","names":["resolveFirstListen: (() => void) | null","t8Timer: NodeJS.Timeout | null","t7Timer: NodeJS.Timeout | null","msg: HsmsMessage"],"sources":["../../src/hsms/HsmsPassiveCommunicator.ts"],"sourcesContent":["import { Server, Socket, createServer } from \"net\";\nimport {\n\tHsmsCommunicator,\n\tHsmsCommunicatorConfig,\n\tHsmsState,\n} from \"./HsmsCommunicator.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 interface HsmsPassiveCommunicatorConfig extends HsmsCommunicatorConfig {\n\ttimeoutRebind?: number;\n}\n\n/**\n * @description HsmsPassiveCommunicator is the class that represents an HSMS passive communicator.\n */\nexport class HsmsPassiveCommunicator extends HsmsCommunicator {\n\tprivate server: Server | null = null;\n\tprivate shouldStop = false;\n\tprivate serverLoopPromise: Promise<void> | null = null;\n\tprivate timeoutRebind = 5;\n\n\tconstructor(config: HsmsPassiveCommunicatorConfig) {\n\t\tsuper(config);\n\t\tif (config.timeoutRebind !== undefined) {\n\t\t\tthis.timeoutRebind = config.timeoutRebind;\n\t\t}\n\t}\n\n\t/**\n\t * @description Opens the passive communicator.\n\t */\n\tasync open(): Promise<void> {\n\t\tif (this.serverLoopPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.shouldStop = false;\n\n\t\tlet resolveFirstListen: (() => void) | null = null;\n\t\tconst firstListen = new Promise<void>((resolve) => {\n\t\t\tresolveFirstListen = resolve;\n\t\t});\n\n\t\tthis.serverLoopPromise = this.runServerLoop(() => {\n\t\t\tresolveFirstListen?.();\n\t\t\tresolveFirstListen = null;\n\t\t}).catch((err: unknown) => {\n\t\t\tthis.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n\t\t});\n\n\t\tawait firstListen;\n\t}\n\n\t/**\n\t * @description Runs the server loop.\n\t * @param onFirstListening The callback function to be called when the first listening is completed.\n\t * @returns A Promise that resolves when the server loop is stopped.\n\t */\n\tprivate async runServerLoop(onFirstListening: () => void): Promise<void> {\n\t\tlet first = true;\n\t\twhile (!this.shouldStop) {\n\t\t\ttry {\n\t\t\t\tawait this.listenOnce(first ? onFirstListening : null);\n\t\t\t} catch (err) {\n\t\t\t\tif (!this.shouldStop) {\n\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\terr instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!this.shouldStop) {\n\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\tsetTimeout(resolve, this.timeoutRebind * 1000),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfirst = false;\n\t\t\tif (this.shouldStop) return;\n\t\t}\n\t}\n\n\t/**\n\t * @description Listens for a single connection.\n\t * @param onListening The callback function to be called when the connection is established.\n\t * @returns A Promise that resolves when the connection is closed.\n\t */\n\tprivate async listenOnce(onListening: (() => void) | null): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst server = createServer((socket) => {\n\t\t\t\tvoid this.handleIncomingSocket(socket);\n\t\t\t});\n\t\t\tthis.server = server;\n\n\t\t\tlet hasConnected = false;\n\t\t\tlet settled = false;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tserver.removeListener(\"error\", onServerError);\n\t\t\t\tserver.removeListener(\"close\", onServerClose);\n\t\t\t\tthis.removeListener(\"connected\", onConnected);\n\t\t\t\tthis.removeListener(\"disconnected\", onDisconnected);\n\t\t\t};\n\n\t\t\tconst finish = (err?: Error) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (this.server === server) {\n\t\t\t\t\tthis.server = null;\n\t\t\t\t}\n\t\t\t\tcleanup();\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve();\n\t\t\t};\n\n\t\t\tconst closeServer = () => {\n\t\t\t\tif (settled) return;\n\t\t\t\tif (!server.listening) {\n\t\t\t\t\tfinish();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tserver.close((err) => {\n\t\t\t\t\tif (err) finish(err);\n\t\t\t\t\telse finish();\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst onServerError = (err: Error) => {\n\t\t\t\tfinish(err);\n\t\t\t};\n\n\t\t\tconst onServerClose = () => {\n\t\t\t\tfinish();\n\t\t\t};\n\n\t\t\tconst onConnected = () => {\n\t\t\t\thasConnected = true;\n\t\t\t};\n\n\t\t\tconst onDisconnected = () => {\n\t\t\t\tif (!hasConnected) return;\n\t\t\t\tcloseServer();\n\t\t\t};\n\n\t\t\tserver.on(\"error\", onServerError);\n\t\t\tserver.on(\"close\", onServerClose);\n\t\t\tthis.on(\"connected\", onConnected);\n\t\t\tthis.on(\"disconnected\", onDisconnected);\n\n\t\t\tserver.listen(this.port, this.ip, () => {\n\t\t\t\tonListening?.();\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @description Handles an incoming socket connection.\n\t * @param socket The socket object representing the incoming connection.\n\t * @returns A Promise that resolves when the socket connection is handled.\n\t */\n\tprivate async handleIncomingSocket(socket: Socket): Promise<void> {\n\t\tsocket.setNoDelay(true);\n\n\t\tif (!this.socket || this.socket.destroyed) {\n\t\t\tconst promoted = await this.handleSocketUntilSelected(socket);\n\t\t\tif (promoted) return;\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.handleSocketUntilSelected(socket);\n\t}\n\n\t/**\n\t * @description Handles a socket connection until it is selected.\n\t * @param socket The socket object representing the connection.\n\t * @returns A Promise that resolves with a boolean indicating whether the socket was promoted to selected.\n\t */\n\tprivate async handleSocketUntilSelected(socket: Socket): Promise<boolean> {\n\t\tlet buffer = Buffer.alloc(0);\n\t\tlet t8Timer: NodeJS.Timeout | null = null;\n\t\tlet t7Timer: NodeJS.Timeout | null = null;\n\n\t\tconst clearT8 = () => {\n\t\t\tif (t8Timer) {\n\t\t\t\tclearTimeout(t8Timer);\n\t\t\t\tt8Timer = null;\n\t\t\t}\n\t\t};\n\n\t\tconst resetT8 = () => {\n\t\t\tclearT8();\n\t\t\tif (this.timeoutT8 <= 0) return;\n\t\t\tt8Timer = setTimeout(() => {\n\t\t\t\tt8Timer = null;\n\t\t\t\tif (buffer.length > 0 && !socket.destroyed) {\n\t\t\t\t\tthis.emit(\"error\", new Error(\"T8 Timeout\"));\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t}, this.timeoutT8 * 1000);\n\t\t};\n\n\t\tconst clearT7 = () => {\n\t\t\tif (t7Timer) {\n\t\t\t\tclearTimeout(t7Timer);\n\t\t\t\tt7Timer = null;\n\t\t\t}\n\t\t};\n\n\t\tconst resetT7 = () => {\n\t\t\tclearT7();\n\t\t\tif (this.timeoutT7 <= 0) return;\n\t\t\tt7Timer = setTimeout(() => {\n\t\t\t\tt7Timer = null;\n\t\t\t\tif (!socket.destroyed) {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t}, this.timeoutT7 * 1000);\n\t\t};\n\n\t\tconst sendSocketBuffer = async (buf: Buffer): Promise<void> => {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tsocket.write(buf, (err) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve();\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tclearT8();\n\t\t\tclearT7();\n\t\t};\n\n\t\tconst promoteToSelected = (selectReq: HsmsMessage) => {\n\t\t\tsocket.removeListener(\"data\", onData);\n\t\t\tsocket.removeListener(\"close\", onClose);\n\t\t\tsocket.removeListener(\"end\", onEnd);\n\t\t\tsocket.removeListener(\"error\", onError);\n\t\t\tcleanup();\n\t\t\tthis.handleSocketEvents(socket);\n\t\t\tthis.handleSelectReq(selectReq);\n\t\t};\n\n\t\tconst handlePreSelectedMessage = async (msg: HsmsMessage) => {\n\t\t\tswitch (msg.sType as HsmsControlType) {\n\t\t\t\tcase HsmsControlType.Data: {\n\t\t\t\t\tconst rsp = HsmsMessage.rejectReq(msg, RejectReason.NotSelected);\n\t\t\t\t\tawait sendSocketBuffer(rsp.toBuffer());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase HsmsControlType.LinkTestReq: {\n\t\t\t\t\tconst rsp = HsmsMessage.linkTestRsp(msg);\n\t\t\t\t\tawait sendSocketBuffer(rsp.toBuffer());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase HsmsControlType.SeparateReq: {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase HsmsControlType.SelectReq: {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.socket &&\n\t\t\t\t\t\t!this.socket.destroyed &&\n\t\t\t\t\t\tthis.state === HsmsState.Selected\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst rsp = HsmsMessage.selectRsp(msg, SelectStatus.AlreadyUsed);\n\t\t\t\t\t\tawait sendSocketBuffer(rsp.toBuffer());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpromoteToSelected(msg);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase HsmsControlType.SelectRsp:\n\t\t\t\tcase HsmsControlType.LinkTestRsp: {\n\t\t\t\t\tconst rsp = HsmsMessage.rejectReq(\n\t\t\t\t\t\tmsg,\n\t\t\t\t\t\tRejectReason.TransactionNotOpen,\n\t\t\t\t\t);\n\t\t\t\t\tawait sendSocketBuffer(rsp.toBuffer());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase HsmsControlType.RejectReq: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tconst reason =\n\t\t\t\t\t\tmsg.pType !== 0\n\t\t\t\t\t\t\t? RejectReason.NotSupportTypeP\n\t\t\t\t\t\t\t: RejectReason.NotSupportTypeS;\n\t\t\t\t\tconst rsp = HsmsMessage.rejectReq(msg, reason);\n\t\t\t\t\tawait sendSocketBuffer(rsp.toBuffer());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tlet processing = false;\n\t\tconst processIncoming = async () => {\n\t\t\tif (processing) return;\n\t\t\tprocessing = true;\n\t\t\ttry {\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (buffer.length < 4) return;\n\t\t\t\t\tconst length = buffer.readUInt32BE(0);\n\t\t\t\t\tif (length < 10) {\n\t\t\t\t\t\tthis.emit(\"error\", new Error(\"Receive message size < 10\"));\n\t\t\t\t\t\tbuffer = Buffer.alloc(0);\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (buffer.length < 4 + length) return;\n\n\t\t\t\t\tconst msgBuffer = buffer.subarray(0, 4 + length);\n\t\t\t\t\tbuffer = buffer.subarray(4 + length);\n\t\t\t\t\tif (buffer.length === 0) clearT8();\n\n\t\t\t\t\tlet msg: HsmsMessage;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmsg = HsmsMessage.fromBuffer(msgBuffer);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\terr instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tresetT7();\n\t\t\t\t\tawait handlePreSelectedMessage(msg);\n\n\t\t\t\t\tif (this.socket === socket && this.state === HsmsState.Selected) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tthis.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n\t\t\t\tsocket.destroy();\n\t\t\t} finally {\n\t\t\t\tprocessing = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onData = (data: Buffer) => {\n\t\t\tbuffer = Buffer.concat([buffer, data]);\n\t\t\tresetT8();\n\t\t\tvoid processIncoming();\n\t\t};\n\n\t\tconst onClose = () => {\n\t\t\tcleanup();\n\t\t};\n\n\t\tconst onEnd = () => {\n\t\t\tif (!socket.destroyed) {\n\t\t\t\tsocket.destroy();\n\t\t\t}\n\t\t};\n\n\t\tconst onError = (err: Error) => {\n\t\t\tthis.emit(\"error\", err);\n\t\t};\n\n\t\tsocket.on(\"data\", onData);\n\t\tsocket.on(\"close\", onClose);\n\t\tsocket.on(\"end\", onEnd);\n\t\tsocket.on(\"error\", onError);\n\t\tresetT7();\n\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tsocket.once(\"close\", () => resolve());\n\t\t});\n\n\t\treturn this.socket === socket && this.state === HsmsState.Selected;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.shouldStop = true;\n\t\t// Close client connection first\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\n\t\t// Stop listening\n\t\tconst server = this.server;\n\t\tif (server) {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tserver.close((err) => {\n\t\t\t\t\tthis.server = null;\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tif (this.serverLoopPromise) {\n\t\t\tconst loop = this.serverLoopPromise;\n\t\t\tthis.serverLoopPromise = null;\n\t\t\tawait loop;\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ //#region src/hsms/enums/HsmsControlType.d.ts
2
+ declare enum HsmsControlType {
3
+ Data = 0,
4
+ SelectReq = 1,
5
+ SelectRsp = 2,
6
+ DeselectReq = 3,
7
+ DeselectRsp = 4,
8
+ LinkTestReq = 5,
9
+ LinkTestRsp = 6,
10
+ RejectReq = 7,
11
+ SeparateReq = 9,
12
+ }
13
+ //#endregion
14
+ export { HsmsControlType };
15
+ //# sourceMappingURL=HsmsControlType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HsmsControlType.d.ts","names":[],"sources":["../../../src/hsms/enums/HsmsControlType.ts"],"sourcesContent":[],"mappings":";aAAY,eAAA;EAAA,IAAA,GAAA,CAAA"}
@@ -0,0 +1,17 @@
1
+ //#region src/hsms/enums/HsmsControlType.ts
2
+ let HsmsControlType = /* @__PURE__ */ function(HsmsControlType$1) {
3
+ HsmsControlType$1[HsmsControlType$1["Data"] = 0] = "Data";
4
+ HsmsControlType$1[HsmsControlType$1["SelectReq"] = 1] = "SelectReq";
5
+ HsmsControlType$1[HsmsControlType$1["SelectRsp"] = 2] = "SelectRsp";
6
+ HsmsControlType$1[HsmsControlType$1["DeselectReq"] = 3] = "DeselectReq";
7
+ HsmsControlType$1[HsmsControlType$1["DeselectRsp"] = 4] = "DeselectRsp";
8
+ HsmsControlType$1[HsmsControlType$1["LinkTestReq"] = 5] = "LinkTestReq";
9
+ HsmsControlType$1[HsmsControlType$1["LinkTestRsp"] = 6] = "LinkTestRsp";
10
+ HsmsControlType$1[HsmsControlType$1["RejectReq"] = 7] = "RejectReq";
11
+ HsmsControlType$1[HsmsControlType$1["SeparateReq"] = 9] = "SeparateReq";
12
+ return HsmsControlType$1;
13
+ }({});
14
+
15
+ //#endregion
16
+ export { HsmsControlType };
17
+ //# sourceMappingURL=HsmsControlType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HsmsControlType.js","names":[],"sources":["../../../src/hsms/enums/HsmsControlType.ts"],"sourcesContent":["export enum HsmsControlType {\n Data = 0,\n SelectReq = 1,\n SelectRsp = 2,\n DeselectReq = 3,\n DeselectRsp = 4,\n LinkTestReq = 5,\n LinkTestRsp = 6,\n RejectReq = 7,\n SeparateReq = 9,\n}\n"],"mappings":";AAAA,IAAY,8DAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -0,0 +1,11 @@
1
+ //#region src/hsms/enums/RejectReason.d.ts
2
+ declare enum RejectReason {
3
+ NotSupportTypeS = 1,
4
+ NotSupportTypeP = 2,
5
+ TransactionNotOpen = 3,
6
+ NotSelected = 4,
7
+ Unknown = 255,
8
+ }
9
+ //#endregion
10
+ export { RejectReason };
11
+ //# sourceMappingURL=RejectReason.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RejectReason.d.ts","names":[],"sources":["../../../src/hsms/enums/RejectReason.ts"],"sourcesContent":[],"mappings":";aAAY,YAAA;EAAA,eAAY,GAAA,CAAA"}
@@ -0,0 +1,13 @@
1
+ //#region src/hsms/enums/RejectReason.ts
2
+ let RejectReason = /* @__PURE__ */ function(RejectReason$1) {
3
+ RejectReason$1[RejectReason$1["NotSupportTypeS"] = 1] = "NotSupportTypeS";
4
+ RejectReason$1[RejectReason$1["NotSupportTypeP"] = 2] = "NotSupportTypeP";
5
+ RejectReason$1[RejectReason$1["TransactionNotOpen"] = 3] = "TransactionNotOpen";
6
+ RejectReason$1[RejectReason$1["NotSelected"] = 4] = "NotSelected";
7
+ RejectReason$1[RejectReason$1["Unknown"] = 255] = "Unknown";
8
+ return RejectReason$1;
9
+ }({});
10
+
11
+ //#endregion
12
+ export { RejectReason };
13
+ //# sourceMappingURL=RejectReason.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RejectReason.js","names":[],"sources":["../../../src/hsms/enums/RejectReason.ts"],"sourcesContent":["export enum RejectReason {\n NotSupportTypeS = 1,\n NotSupportTypeP = 2,\n TransactionNotOpen = 3,\n NotSelected = 4,\n Unknown = 0xff,\n}\n"],"mappings":";AAAA,IAAY,wDAAL;AACL;AACA;AACA;AACA;AACA"}
@@ -0,0 +1,11 @@
1
+ //#region src/hsms/enums/SelectStatus.d.ts
2
+ declare enum SelectStatus {
3
+ Success = 0,
4
+ Actived = 1,
5
+ NotReady = 2,
6
+ AlreadyUsed = 3,
7
+ Unknown = 255,
8
+ }
9
+ //#endregion
10
+ export { SelectStatus };
11
+ //# sourceMappingURL=SelectStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectStatus.d.ts","names":[],"sources":["../../../src/hsms/enums/SelectStatus.ts"],"sourcesContent":[],"mappings":";aAAY,YAAA;EAAA,OAAA,GAAA,CAAA"}
@@ -0,0 +1,13 @@
1
+ //#region src/hsms/enums/SelectStatus.ts
2
+ let SelectStatus = /* @__PURE__ */ function(SelectStatus$1) {
3
+ SelectStatus$1[SelectStatus$1["Success"] = 0] = "Success";
4
+ SelectStatus$1[SelectStatus$1["Actived"] = 1] = "Actived";
5
+ SelectStatus$1[SelectStatus$1["NotReady"] = 2] = "NotReady";
6
+ SelectStatus$1[SelectStatus$1["AlreadyUsed"] = 3] = "AlreadyUsed";
7
+ SelectStatus$1[SelectStatus$1["Unknown"] = 255] = "Unknown";
8
+ return SelectStatus$1;
9
+ }({});
10
+
11
+ //#endregion
12
+ export { SelectStatus };
13
+ //# sourceMappingURL=SelectStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectStatus.js","names":[],"sources":["../../../src/hsms/enums/SelectStatus.ts"],"sourcesContent":["export enum SelectStatus {\n Success = 0,\n Actived = 1,\n NotReady = 2,\n AlreadyUsed = 3,\n Unknown = 0xff,\n}\n"],"mappings":";AAAA,IAAY,wDAAL;AACL;AACA;AACA;AACA;AACA"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { SecsItemType } from "./core/enums/SecsItemType.js";
2
+ import { AbstractSecs2Item } from "./core/secs2item/AbstractSecs2Item.js";
3
+ import { SecsMessage } from "./core/AbstractSecsMessage.js";
4
+ import { AbstractSecsCommunicator, SecsCommunicatorConfig, SecsCommunicatorEvents } from "./core/AbstractSecsCommunicator.js";
5
+ import { Secs2ItemAscii } from "./core/secs2item/Secs2ItemAscii.js";
6
+ import { Secs2ItemBinary } from "./core/secs2item/Secs2ItemBinary.js";
7
+ import { Secs2ItemBoolean } from "./core/secs2item/Secs2ItemBoolean.js";
8
+ import { Secs2ItemNumeric } from "./core/secs2item/Secs2ItemNumeric.js";
9
+ import { Secs2ItemList } from "./core/secs2item/Secs2ItemList.js";
10
+ import { Secs2ItemFactory } from "./core/secs2item/Secs2ItemFactory.js";
11
+ import { Secs2ItemParser } from "./core/secs2item/Secs2ItemParser.js";
12
+ import { Clock, ClockType } from "./gem/Clock.js";
13
+ import { CommAck, Gem, OflAck, OnlAck, TiAck } from "./gem/Gem.js";
14
+ import { A, B, BOOLEAN, F4, F8, I1, I2, I4, I8, L, U1, U2, U4, U8 } from "./helper/Secs2ItemHelper.js";
15
+ import { RejectReason } from "./hsms/enums/RejectReason.js";
16
+ import { HsmsMessage } from "./hsms/HsmsMessage.js";
17
+ import { SelectStatus } from "./hsms/enums/SelectStatus.js";
18
+ import { HsmsCommunicator, HsmsCommunicatorConfig, HsmsCommunicatorEvents, HsmsState } from "./hsms/HsmsCommunicator.js";
19
+ import { HsmsActiveCommunicator } from "./hsms/HsmsActiveCommunicator.js";
20
+ import { HsmsPassiveCommunicator, HsmsPassiveCommunicatorConfig } from "./hsms/HsmsPassiveCommunicator.js";
21
+ import { HsmsControlType } from "./hsms/enums/HsmsControlType.js";
22
+ import { Secs1MessageBlock } from "./secs1/Secs1MessageBlock.js";
23
+ import { Secs1Message } from "./secs1/Secs1Message.js";
24
+ import { Secs1Communicator, Secs1CommunicatorConfig } from "./secs1/Secs1Communicator.js";
25
+ import { Secs1OnTcpIpActiveCommunicator, Secs1OnTcpIpActiveCommunicatorConfig } from "./secs1/Secs1OnTcpIpActiveCommunicator.js";
26
+ import { Secs1OnTcpIpPassiveCommunicator, Secs1OnTcpIpPassiveCommunicatorConfig } from "./secs1/Secs1OnTcpIpPassiveCommunicator.js";
27
+ import { Secs1SerialCommunicator, Secs1SerialCommunicatorConfig } from "./secs1/Secs1SerialCommunicator.js";
28
+ export { A, AbstractSecs2Item, AbstractSecsCommunicator, B, BOOLEAN, Clock, ClockType, CommAck, F4, F8, Gem, HsmsActiveCommunicator, HsmsCommunicator, HsmsCommunicatorConfig, HsmsCommunicatorEvents, HsmsControlType, HsmsMessage, HsmsPassiveCommunicator, HsmsPassiveCommunicatorConfig, HsmsState, I1, I2, I4, I8, L, OflAck, OnlAck, RejectReason, Secs1Communicator, Secs1CommunicatorConfig, Secs1Message, Secs1MessageBlock, Secs1OnTcpIpActiveCommunicator, Secs1OnTcpIpActiveCommunicatorConfig, Secs1OnTcpIpPassiveCommunicator, Secs1OnTcpIpPassiveCommunicatorConfig, Secs1SerialCommunicator, Secs1SerialCommunicatorConfig, Secs2ItemAscii, Secs2ItemBinary, Secs2ItemBoolean, Secs2ItemFactory, Secs2ItemList, Secs2ItemNumeric, Secs2ItemParser, SecsCommunicatorConfig, SecsCommunicatorEvents, SecsItemType, SecsMessage, SelectStatus, TiAck, U1, U2, U4, U8 };
package/lib/index.js ADDED
@@ -0,0 +1,29 @@
1
+ import { SecsMessage } from "./core/AbstractSecsMessage.js";
2
+ import { AbstractSecsCommunicator } from "./core/AbstractSecsCommunicator.js";
3
+ import { AbstractSecs2Item } from "./core/secs2item/AbstractSecs2Item.js";
4
+ import { SecsItemType } from "./core/enums/SecsItemType.js";
5
+ import { Secs2ItemNumeric } from "./core/secs2item/Secs2ItemNumeric.js";
6
+ import { Secs2ItemAscii } from "./core/secs2item/Secs2ItemAscii.js";
7
+ import { Secs2ItemBinary } from "./core/secs2item/Secs2ItemBinary.js";
8
+ import { Secs2ItemBoolean } from "./core/secs2item/Secs2ItemBoolean.js";
9
+ import { Secs2ItemList } from "./core/secs2item/Secs2ItemList.js";
10
+ import { Secs2ItemFactory } from "./core/secs2item/Secs2ItemFactory.js";
11
+ import { Secs2ItemParser } from "./core/secs2item/Secs2ItemParser.js";
12
+ import { A, B, BOOLEAN, F4, F8, I1, I2, I4, I8, L, U1, U2, U4, U8 } from "./helper/Secs2ItemHelper.js";
13
+ import { HsmsControlType } from "./hsms/enums/HsmsControlType.js";
14
+ import { RejectReason } from "./hsms/enums/RejectReason.js";
15
+ import { HsmsMessage } from "./hsms/HsmsMessage.js";
16
+ import { SelectStatus } from "./hsms/enums/SelectStatus.js";
17
+ import { HsmsCommunicator, HsmsState } from "./hsms/HsmsCommunicator.js";
18
+ import { HsmsActiveCommunicator } from "./hsms/HsmsActiveCommunicator.js";
19
+ import { HsmsPassiveCommunicator } from "./hsms/HsmsPassiveCommunicator.js";
20
+ import { Secs1MessageBlock } from "./secs1/Secs1MessageBlock.js";
21
+ import { Secs1Message } from "./secs1/Secs1Message.js";
22
+ import { Secs1Communicator } from "./secs1/Secs1Communicator.js";
23
+ import { Secs1OnTcpIpActiveCommunicator } from "./secs1/Secs1OnTcpIpActiveCommunicator.js";
24
+ import { Secs1OnTcpIpPassiveCommunicator } from "./secs1/Secs1OnTcpIpPassiveCommunicator.js";
25
+ import { Secs1SerialCommunicator } from "./secs1/Secs1SerialCommunicator.js";
26
+ import { Clock, ClockType } from "./gem/Clock.js";
27
+ import { CommAck, Gem, OflAck, OnlAck, TiAck } from "./gem/Gem.js";
28
+
29
+ export { A, AbstractSecs2Item, AbstractSecsCommunicator, B, BOOLEAN, Clock, ClockType, CommAck, F4, F8, Gem, HsmsActiveCommunicator, HsmsCommunicator, HsmsControlType, HsmsMessage, HsmsPassiveCommunicator, HsmsState, I1, I2, I4, I8, L, OflAck, OnlAck, RejectReason, Secs1Communicator, Secs1Message, Secs1MessageBlock, Secs1OnTcpIpActiveCommunicator, Secs1OnTcpIpPassiveCommunicator, Secs1SerialCommunicator, Secs2ItemAscii, Secs2ItemBinary, Secs2ItemBoolean, Secs2ItemFactory, Secs2ItemList, Secs2ItemNumeric, Secs2ItemParser, SecsItemType, SecsMessage, SelectStatus, TiAck, U1, U2, U4, U8 };
@@ -0,0 +1,51 @@
1
+ import { AbstractSecs2Item } from "../core/secs2item/AbstractSecs2Item.js";
2
+ import { SecsMessage } from "../core/AbstractSecsMessage.js";
3
+ import { AbstractSecsCommunicator, SecsCommunicatorConfig } from "../core/AbstractSecsCommunicator.js";
4
+ import { Duplex } from "stream";
5
+
6
+ //#region src/secs1/Secs1Communicator.d.ts
7
+ interface Secs1CommunicatorConfig extends SecsCommunicatorConfig {
8
+ retry?: number;
9
+ isMaster?: boolean;
10
+ }
11
+ declare abstract class Secs1Communicator extends AbstractSecsCommunicator {
12
+ retry: number;
13
+ isMaster: boolean;
14
+ protected stream: Duplex | null;
15
+ private state;
16
+ private buffer;
17
+ private sendQueue;
18
+ private currentBlocks;
19
+ private currentBlockIndex;
20
+ private retryCount;
21
+ private receivedBlocks;
22
+ private expectedBlockNum;
23
+ private currentBlockLength;
24
+ private t1Timer;
25
+ private t2Timer;
26
+ private t4Timer;
27
+ constructor(config: Secs1CommunicatorConfig);
28
+ protected attachStream(stream: Duplex): void;
29
+ protected stop(): void;
30
+ protected sendBuffer(buffer: Buffer): Promise<void>;
31
+ protected createMessage(stream: number, func: number, wBit: boolean, body: AbstractSecs2Item | null, systemBytes: number): SecsMessage;
32
+ private clearT1;
33
+ private clearT2;
34
+ private clearT4;
35
+ private stopAllTimers;
36
+ private startT1;
37
+ private startT2;
38
+ private startT4;
39
+ private handleT1Timeout;
40
+ private handleT2Timeout;
41
+ private handleT4Timeout;
42
+ private resetState;
43
+ private sendByte;
44
+ private processBuffer;
45
+ private sendCurrentBlock;
46
+ private processSendQueue;
47
+ private rejectAllTransactions;
48
+ }
49
+ //#endregion
50
+ export { Secs1Communicator, Secs1CommunicatorConfig };
51
+ //# sourceMappingURL=Secs1Communicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Secs1Communicator.d.ts","names":[],"sources":["../../src/secs1/Secs1Communicator.ts"],"sourcesContent":[],"mappings":";;;;;;UAUiB,uBAAA,SAAgC;;EAAhC,QAAA,CAAA,EAAA,OAAA;AAkBjB;AAImB,uBAJG,iBAAA,SAA0B,wBAAA,CAI7B;EAkBE,KAAA,EAAA,MAAA;EAMW,QAAA,EAAA,OAAA;EA0CO,UAAA,MAAA,EAlEpB,MAkEoB,GAAA,IAAA;EAAS,QAAA,KAAA;EAUxC,QAAA,MAAA;EAEJ,QAAA,SAAA;EAlF4C,QAAA,aAAA;EAAwB,QAAA,iBAAA;;;;;;;;sBAsBnD;iCAMW;;+BA0CO,SAAS;6EAUxC,gDAEJ"}