zklib-ts 1.0.1-development → 1.0.2-development

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/dist/index.cjs.js CHANGED
@@ -23,103 +23,109 @@ function _interopNamespaceDefault(e) {
23
23
 
24
24
  var dgram__namespace = /*#__PURE__*/_interopNamespaceDefault(dgram);
25
25
 
26
- const COMMANDS = {
27
- CMD_CONNECT: 1000,
28
- CMD_EXIT: 1001,
29
- CMD_ENABLEDEVICE: 1002,
30
- CMD_DISABLEDEVICE: 1003,
31
- CMD_RESTART: 1004,
32
- CMD_POWEROFF: 1005,
33
- CMD_SLEEP: 1006,
34
- CMD_RESUME: 1007,
35
- CMD_CAPTUREFINGER: 1009,
36
- CMD_TEST_TEMP: 1011,
37
- CMD_CAPTUREIMAGE: 1012,
38
- CMD_REFRESHDATA: 1013,
39
- CMD_REFRESHOPTION: 1014,
40
- CMD_TESTVOICE: 1017,
41
- CMD_GET_VERSION: 1100,
42
- CMD_CHANGE_SPEED: 1101,
43
- CMD_AUTH: 1102,
44
- CMD_PREPARE_DATA: 1500,
45
- CMD_DATA: 1501,
46
- CMD_FREE_DATA: 1502,
47
- CMD_DATA_WRRQ: 1503,
48
- CMD_DATA_RDY: 1504,
49
- CMD_DB_RRQ: 7,
50
- CMD_USER_WRQ: 8,
51
- CMD_USERTEMP_RRQ: 9,
52
- CMD_USERTEMP_WRQ: 10,
53
- CMD_OPTIONS_RRQ: 11,
54
- CMD_OPTIONS_WRQ: 12,
55
- CMD_ATTLOG_RRQ: 13,
56
- CMD_CLEAR_DATA: 14,
57
- CMD_CLEAR_ATTLOG: 15,
58
- CMD_DELETE_USER: 18,
59
- CMD_DELETE_USERTEMP: 19,
60
- CMD_CLEAR_ADMIN: 20,
61
- CMD_USERGRP_RRQ: 21,
62
- CMD_USERGRP_WRQ: 22,
63
- CMD_USERTZ_RRQ: 23,
64
- CMD_USERTZ_WRQ: 24,
65
- CMD_GRPTZ_RRQ: 25,
66
- CMD_GRPTZ_WRQ: 26,
67
- CMD_TZ_RRQ: 27,
68
- CMD_TZ_WRQ: 28,
69
- CMD_ULG_RRQ: 29,
70
- CMD_ULG_WRQ: 30,
71
- CMD_UNLOCK: 31,
72
- CMD_CLEAR_ACC: 32,
73
- CMD_CLEAR_OPLOG: 33,
74
- CMD_OPLOG_RRQ: 34,
75
- CMD_GET_FREE_SIZES: 50,
76
- CMD_ENABLE_CLOCK: 57,
77
- CMD_STARTVERIFY: 60,
78
- CMD_STARTENROLL: 61,
79
- CMD_CANCELCAPTURE: 62,
80
- CMD_STATE_RRQ: 64,
81
- CMD_WRITE_LCD: 66,
82
- CMD_CLEAR_LCD: 67,
83
- CMD_GET_PINWIDTH: 69,
84
- CMD_SMS_WRQ: 70,
85
- CMD_SMS_RRQ: 71,
86
- CMD_DELETE_SMS: 72,
87
- CMD_UDATA_WRQ: 73,
88
- CMD_DELETE_UDATA: 74,
89
- CMD_DOORSTATE_RRQ: 75,
90
- CMD_WRITE_MIFARE: 76,
91
- CMD_EMPTY_MIFARE: 78,
92
- CMD_VERIFY_WRQ: 79,
93
- CMD_VERIFY_RRQ: 80,
94
- CMD_TMP_WRITE: 87,
95
- CMD_GET_USERTEMP: 88,
96
- CMD_CHECKSUM_BUFFER: 119,
97
- CMD_DEL_FPTMP: 134,
98
- CMD_GET_TIME: 201,
99
- CMD_SET_TIME: 202,
100
- CMD_REG_EVENT: 500,
101
- CMD_ACK_OK: 2000,
102
- CMD_ACK_ERROR: 2001,
103
- CMD_ACK_DATA: 2002,
104
- CMD_ACK_RETRY: 2003,
105
- CMD_ACK_REPEAT: 2004,
106
- CMD_ACK_UNAUTH: 2005,
107
- CMD_ACK_UNKNOWN: 65535,
108
- CMD_ACK_ERROR_CMD: 65533,
109
- CMD_ACK_ERROR_INIT: 65532,
110
- CMD_ACK_ERROR_DATA: 65531,
111
- EF_ATTLOG: 1,
112
- EF_FINGER: 2,
113
- EF_ENROLLUSER: 4,
114
- EF_ENROLLFINGER: 8,
115
- EF_BUTTON: 16,
116
- EF_UNLOCK: 32,
117
- EF_VERIFY: 128,
118
- EF_FPFTR: 256,
119
- EF_ALARM: 512
120
- };
121
- const USHRT_MAX = 65535;
122
- const MAX_CHUNK = 65472;
26
+ var COMMANDS;
27
+ (function (COMMANDS) {
28
+ COMMANDS[COMMANDS["CMD_ACK_DATA"] = 2002] = "CMD_ACK_DATA";
29
+ COMMANDS[COMMANDS["CMD_ACK_ERROR"] = 2001] = "CMD_ACK_ERROR";
30
+ COMMANDS[COMMANDS["CMD_ACK_ERROR_CMD"] = 65533] = "CMD_ACK_ERROR_CMD";
31
+ COMMANDS[COMMANDS["CMD_ACK_ERROR_DATA"] = 65531] = "CMD_ACK_ERROR_DATA";
32
+ COMMANDS[COMMANDS["CMD_ACK_ERROR_INIT"] = 65532] = "CMD_ACK_ERROR_INIT";
33
+ COMMANDS[COMMANDS["CMD_ACK_OK"] = 2000] = "CMD_ACK_OK";
34
+ COMMANDS[COMMANDS["CMD_ACK_REPEAT"] = 2004] = "CMD_ACK_REPEAT";
35
+ COMMANDS[COMMANDS["CMD_ACK_RETRY"] = 2003] = "CMD_ACK_RETRY";
36
+ COMMANDS[COMMANDS["CMD_ACK_UNAUTH"] = 2005] = "CMD_ACK_UNAUTH";
37
+ COMMANDS[COMMANDS["CMD_ACK_UNKNOWN"] = 65535] = "CMD_ACK_UNKNOWN";
38
+ COMMANDS[COMMANDS["CMD_ATTLOG_RRQ"] = 13] = "CMD_ATTLOG_RRQ";
39
+ COMMANDS[COMMANDS["CMD_AUTH"] = 1102] = "CMD_AUTH";
40
+ COMMANDS[COMMANDS["CMD_CANCELCAPTURE"] = 62] = "CMD_CANCELCAPTURE";
41
+ COMMANDS[COMMANDS["CMD_CAPTUREFINGER"] = 1009] = "CMD_CAPTUREFINGER";
42
+ COMMANDS[COMMANDS["CMD_CAPTUREIMAGE"] = 1012] = "CMD_CAPTUREIMAGE";
43
+ COMMANDS[COMMANDS["CMD_CHANGE_SPEED"] = 1101] = "CMD_CHANGE_SPEED";
44
+ COMMANDS[COMMANDS["CMD_CHECKSUM_BUFFER"] = 119] = "CMD_CHECKSUM_BUFFER";
45
+ COMMANDS[COMMANDS["CMD_CLEAR_ACC"] = 32] = "CMD_CLEAR_ACC";
46
+ COMMANDS[COMMANDS["CMD_CLEAR_ADMIN"] = 20] = "CMD_CLEAR_ADMIN";
47
+ COMMANDS[COMMANDS["CMD_CLEAR_ATTLOG"] = 15] = "CMD_CLEAR_ATTLOG";
48
+ COMMANDS[COMMANDS["CMD_CLEAR_DATA"] = 14] = "CMD_CLEAR_DATA";
49
+ COMMANDS[COMMANDS["CMD_CLEAR_LCD"] = 67] = "CMD_CLEAR_LCD";
50
+ COMMANDS[COMMANDS["CMD_CLEAR_OPLOG"] = 33] = "CMD_CLEAR_OPLOG";
51
+ COMMANDS[COMMANDS["CMD_CONNECT"] = 1000] = "CMD_CONNECT";
52
+ COMMANDS[COMMANDS["CMD_DATA"] = 1501] = "CMD_DATA";
53
+ COMMANDS[COMMANDS["CMD_DATA_RDY"] = 1504] = "CMD_DATA_RDY";
54
+ COMMANDS[COMMANDS["CMD_DATA_WRRQ"] = 1503] = "CMD_DATA_WRRQ";
55
+ COMMANDS[COMMANDS["CMD_DB_RRQ"] = 7] = "CMD_DB_RRQ";
56
+ COMMANDS[COMMANDS["CMD_DEL_FPTMP"] = 134] = "CMD_DEL_FPTMP";
57
+ COMMANDS[COMMANDS["CMD_DELETE_SMS"] = 72] = "CMD_DELETE_SMS";
58
+ COMMANDS[COMMANDS["CMD_DELETE_UDATA"] = 74] = "CMD_DELETE_UDATA";
59
+ COMMANDS[COMMANDS["CMD_DELETE_USER"] = 18] = "CMD_DELETE_USER";
60
+ COMMANDS[COMMANDS["CMD_DELETE_USERTEMP"] = 19] = "CMD_DELETE_USERTEMP";
61
+ COMMANDS[COMMANDS["CMD_DISABLEDEVICE"] = 1003] = "CMD_DISABLEDEVICE";
62
+ COMMANDS[COMMANDS["CMD_DOORSTATE_RRQ"] = 75] = "CMD_DOORSTATE_RRQ";
63
+ COMMANDS[COMMANDS["CMD_EMPTY_MIFARE"] = 78] = "CMD_EMPTY_MIFARE";
64
+ COMMANDS[COMMANDS["CMD_ENABLE_CLOCK"] = 57] = "CMD_ENABLE_CLOCK";
65
+ COMMANDS[COMMANDS["CMD_ENABLEDEVICE"] = 1002] = "CMD_ENABLEDEVICE";
66
+ COMMANDS[COMMANDS["CMD_EXIT"] = 1001] = "CMD_EXIT";
67
+ COMMANDS[COMMANDS["CMD_FREE_DATA"] = 1502] = "CMD_FREE_DATA";
68
+ COMMANDS[COMMANDS["CMD_GET_FREE_SIZES"] = 50] = "CMD_GET_FREE_SIZES";
69
+ COMMANDS[COMMANDS["CMD_GET_PINWIDTH"] = 69] = "CMD_GET_PINWIDTH";
70
+ COMMANDS[COMMANDS["CMD_GET_TIME"] = 201] = "CMD_GET_TIME";
71
+ COMMANDS[COMMANDS["CMD_GET_USERTEMP"] = 88] = "CMD_GET_USERTEMP";
72
+ COMMANDS[COMMANDS["CMD_GET_VERSION"] = 1100] = "CMD_GET_VERSION";
73
+ COMMANDS[COMMANDS["CMD_GRPTZ_RRQ"] = 25] = "CMD_GRPTZ_RRQ";
74
+ COMMANDS[COMMANDS["CMD_GRPTZ_WRQ"] = 26] = "CMD_GRPTZ_WRQ";
75
+ COMMANDS[COMMANDS["CMD_OPLOG_RRQ"] = 34] = "CMD_OPLOG_RRQ";
76
+ COMMANDS[COMMANDS["CMD_OPTIONS_RRQ"] = 11] = "CMD_OPTIONS_RRQ";
77
+ COMMANDS[COMMANDS["CMD_OPTIONS_WRQ"] = 12] = "CMD_OPTIONS_WRQ";
78
+ COMMANDS[COMMANDS["CMD_POWEROFF"] = 1005] = "CMD_POWEROFF";
79
+ COMMANDS[COMMANDS["CMD_PREPARE_DATA"] = 1500] = "CMD_PREPARE_DATA";
80
+ COMMANDS[COMMANDS["CMD_REFRESHDATA"] = 1013] = "CMD_REFRESHDATA";
81
+ COMMANDS[COMMANDS["CMD_REFRESHOPTION"] = 1014] = "CMD_REFRESHOPTION";
82
+ COMMANDS[COMMANDS["CMD_REG_EVENT"] = 500] = "CMD_REG_EVENT";
83
+ COMMANDS[COMMANDS["CMD_RESTART"] = 1004] = "CMD_RESTART";
84
+ COMMANDS[COMMANDS["CMD_RESUME"] = 1007] = "CMD_RESUME";
85
+ COMMANDS[COMMANDS["CMD_SET_TIME"] = 202] = "CMD_SET_TIME";
86
+ COMMANDS[COMMANDS["CMD_SLEEP"] = 1006] = "CMD_SLEEP";
87
+ COMMANDS[COMMANDS["CMD_SMS_RRQ"] = 71] = "CMD_SMS_RRQ";
88
+ COMMANDS[COMMANDS["CMD_SMS_WRQ"] = 70] = "CMD_SMS_WRQ";
89
+ COMMANDS[COMMANDS["CMD_STARTENROLL"] = 61] = "CMD_STARTENROLL";
90
+ COMMANDS[COMMANDS["CMD_STARTVERIFY"] = 60] = "CMD_STARTVERIFY";
91
+ COMMANDS[COMMANDS["CMD_STATE_RRQ"] = 64] = "CMD_STATE_RRQ";
92
+ COMMANDS[COMMANDS["CMD_TEST_TEMP"] = 1011] = "CMD_TEST_TEMP";
93
+ COMMANDS[COMMANDS["CMD_TESTVOICE"] = 1017] = "CMD_TESTVOICE";
94
+ COMMANDS[COMMANDS["CMD_TMP_WRITE"] = 87] = "CMD_TMP_WRITE";
95
+ COMMANDS[COMMANDS["CMD_TZ_RRQ"] = 27] = "CMD_TZ_RRQ";
96
+ COMMANDS[COMMANDS["CMD_TZ_WRQ"] = 28] = "CMD_TZ_WRQ";
97
+ COMMANDS[COMMANDS["CMD_UDATA_WRQ"] = 73] = "CMD_UDATA_WRQ";
98
+ COMMANDS[COMMANDS["CMD_ULG_RRQ"] = 29] = "CMD_ULG_RRQ";
99
+ COMMANDS[COMMANDS["CMD_ULG_WRQ"] = 30] = "CMD_ULG_WRQ";
100
+ COMMANDS[COMMANDS["CMD_UNLOCK"] = 31] = "CMD_UNLOCK";
101
+ COMMANDS[COMMANDS["CMD_USER_WRQ"] = 8] = "CMD_USER_WRQ";
102
+ COMMANDS[COMMANDS["CMD_USERGRP_RRQ"] = 21] = "CMD_USERGRP_RRQ";
103
+ COMMANDS[COMMANDS["CMD_USERGRP_WRQ"] = 22] = "CMD_USERGRP_WRQ";
104
+ COMMANDS[COMMANDS["CMD_USERTEMP_RRQ"] = 9] = "CMD_USERTEMP_RRQ";
105
+ COMMANDS[COMMANDS["CMD_USERTEMP_WRQ"] = 10] = "CMD_USERTEMP_WRQ";
106
+ COMMANDS[COMMANDS["CMD_USERTZ_RRQ"] = 23] = "CMD_USERTZ_RRQ";
107
+ COMMANDS[COMMANDS["CMD_USERTZ_WRQ"] = 24] = "CMD_USERTZ_WRQ";
108
+ COMMANDS[COMMANDS["CMD_VERIFY_RRQ"] = 80] = "CMD_VERIFY_RRQ";
109
+ COMMANDS[COMMANDS["CMD_VERIFY_WRQ"] = 79] = "CMD_VERIFY_WRQ";
110
+ COMMANDS[COMMANDS["CMD_WRITE_LCD"] = 66] = "CMD_WRITE_LCD";
111
+ COMMANDS[COMMANDS["CMD_WRITE_MIFARE"] = 76] = "CMD_WRITE_MIFARE";
112
+ COMMANDS[COMMANDS["EF_ALARM"] = 512] = "EF_ALARM";
113
+ COMMANDS[COMMANDS["EF_ATTLOG"] = 1] = "EF_ATTLOG";
114
+ COMMANDS[COMMANDS["EF_BUTTON"] = 16] = "EF_BUTTON";
115
+ COMMANDS[COMMANDS["EF_ENROLLFINGER"] = 8] = "EF_ENROLLFINGER";
116
+ COMMANDS[COMMANDS["EF_ENROLLUSER"] = 4] = "EF_ENROLLUSER";
117
+ COMMANDS[COMMANDS["EF_FINGER"] = 2] = "EF_FINGER";
118
+ COMMANDS[COMMANDS["EF_FPFTR"] = 256] = "EF_FPFTR";
119
+ COMMANDS[COMMANDS["EF_UNLOCK"] = 32] = "EF_UNLOCK";
120
+ COMMANDS[COMMANDS["EF_VERIFY"] = 128] = "EF_VERIFY";
121
+ })(COMMANDS || (COMMANDS = {}));
122
+ var Constants;
123
+ (function (Constants) {
124
+ Constants[Constants["USHRT_MAX"] = 65535] = "USHRT_MAX";
125
+ Constants[Constants["MAX_CHUNK"] = 65472] = "MAX_CHUNK";
126
+ Constants[Constants["MACHINE_PREPARE_DATA_1"] = 20560] = "MACHINE_PREPARE_DATA_1";
127
+ Constants[Constants["MACHINE_PREPARE_DATA_2"] = 32130] = "MACHINE_PREPARE_DATA_2";
128
+ })(Constants || (Constants = {}));
123
129
  const REQUEST_DATA = {
124
130
  DISABLE_DEVICE: Buffer.from([0, 0, 0, 0]),
125
131
  GET_REAL_TIME_EVENT: Buffer.from([0x01, 0x00, 0x00, 0x00]),
@@ -303,9 +309,9 @@ const createChkSum = (buf) => {
303
309
  else {
304
310
  chksum += buf.readUInt16LE(i);
305
311
  }
306
- chksum %= USHRT_MAX;
312
+ chksum %= Constants.USHRT_MAX;
307
313
  }
308
- chksum = USHRT_MAX - chksum - 1;
314
+ chksum = Constants.USHRT_MAX - chksum - 1;
309
315
  return chksum;
310
316
  };
311
317
  const createUDPHeader = (command, sessionId, replyId, data) => {
@@ -318,7 +324,7 @@ const createUDPHeader = (command, sessionId, replyId, data) => {
318
324
  dataBuffer.copy(buf, 8);
319
325
  const chksum2 = createChkSum(buf);
320
326
  buf.writeUInt16LE(chksum2, 2);
321
- replyId = (replyId + 1) % USHRT_MAX;
327
+ replyId = (replyId + 1) % Constants.USHRT_MAX;
322
328
  buf.writeUInt16LE(replyId, 6);
323
329
  return buf;
324
330
  };
@@ -332,7 +338,7 @@ const createTCPHeader = (command, sessionId, replyId, data) => {
332
338
  dataBuffer.copy(buf, 8);
333
339
  const chksum2 = createChkSum(buf);
334
340
  buf.writeUInt16LE(chksum2, 2);
335
- replyId = (replyId + 1) % USHRT_MAX;
341
+ replyId = (replyId + 1) % Constants.USHRT_MAX;
336
342
  buf.writeUInt16LE(replyId, 6);
337
343
  const prefixBuf = Buffer.from([0x50, 0x50, 0x82, 0x7d, 0x13, 0x00, 0x00, 0x00]);
338
344
  prefixBuf.writeUInt16LE(buf.length, 4);
@@ -533,8 +539,8 @@ class Finger {
533
539
  this.template = template;
534
540
  this.size = template.length;
535
541
  // Create mark showing first and last 8 bytes as hex
536
- const start = template.slice(0, 8).toString('hex');
537
- const end = template.slice(-8).toString('hex');
542
+ const start = Uint8Array.prototype.slice.call(template, 0, 8).toString('hex');
543
+ const end = Uint8Array.prototype.slice.call(template, -8).toString('hex');
538
544
  this.mark = `${start}...${end}`;
539
545
  }
540
546
  /**
@@ -665,10 +671,12 @@ class ZTCP {
665
671
  face_cap = 0;
666
672
  userPacketSize = 72;
667
673
  verbose = false;
674
+ packetNumber = 0;
675
+ replyData = Buffer.from([]);
668
676
  constructor(ip, port, timeout, comm_key, verbose) {
669
677
  this.ip = ip;
670
678
  this.port = port;
671
- this.timeout = timeout;
679
+ this.timeout = timeout ? timeout : 10000;
672
680
  this.replyId = 0;
673
681
  this.comm_key = comm_key;
674
682
  this.verbose = verbose;
@@ -889,9 +897,6 @@ class ZTCP {
889
897
  else {
890
898
  this.replyId++;
891
899
  }
892
- if (this.verbose) {
893
- console.log("linea 305: replyId: ", this.replyId, " command: ", command, Object.keys(COMMANDS).find(u => COMMANDS[u] == command));
894
- }
895
900
  const buf = createTCPHeader(command, this.sessionId, this.replyId, data);
896
901
  try {
897
902
  // Write the message to the socket and wait for a response
@@ -937,8 +942,8 @@ class ZTCP {
937
942
  }
938
943
  /**
939
944
  *
940
- * @param {*} reqData - indicate the type of data that need to receive ( user or attLog)
941
- * @param {*} cb - callback is triggered when receiving packets
945
+ * @param {Buffer} reqData - indicate the type of data that need to receive ( user or attLog)
946
+ * @param {Function} cb - callback is triggered when receiving packets
942
947
  *
943
948
  * readWithBuffer will reject error if it'wrong when starting request data
944
949
  * readWithBuffer will return { data: replyData , err: Error } when receiving requested data
@@ -953,7 +958,6 @@ class ZTCP {
953
958
  }
954
959
  catch (err) {
955
960
  reject(err);
956
- console.log(reply);
957
961
  }
958
962
  const header = decodeTCPHeader(reply.subarray(0, 16));
959
963
  switch (header.commandId) {
@@ -969,56 +973,73 @@ class ZTCP {
969
973
  const size = recvData.readUIntLE(1, 4);
970
974
  // We need to split the data to many chunks to receive , because it's to large
971
975
  // After receiving all chunk data , we concat it to TotalBuffer variable , that 's the data we want
972
- let remain = size % MAX_CHUNK;
973
- let numberChunks = Math.round(size - remain) / MAX_CHUNK;
974
- let totalPackets = numberChunks + (remain > 0 ? 1 : 0);
975
- let replyData = Buffer.from([]);
976
+ let remain = size % Constants.MAX_CHUNK;
977
+ let numberChunks = Math.round(size - remain) / Constants.MAX_CHUNK;
978
+ this.packetNumber = numberChunks + (remain > 0 ? 1 : 0);
979
+ //let replyData = Buffer.from([])
976
980
  let totalBuffer = Buffer.from([]);
977
981
  let realTotalBuffer = Buffer.from([]);
978
- const timeout = 10000;
979
982
  let timer = setTimeout(() => {
980
- internalCallback(replyData, new Error('TIMEOUT WHEN RECEIVING PACKET'));
981
- }, timeout);
983
+ internalCallback(this.replyData, new Error('TIMEOUT WHEN RECEIVING PACKET'));
984
+ }, this.timeout);
982
985
  const internalCallback = (replyData, err = null) => {
983
- // this.socket && this.socket.removeListener('data', handleOnData)
986
+ this.socket && this.socket.removeAllListeners('data');
984
987
  timer && clearTimeout(timer);
985
988
  resolve({ data: replyData, err });
986
989
  };
987
- const handleOnData = (reply) => {
988
- if (checkNotEventTCP(reply))
989
- return;
990
- clearTimeout(timer);
991
- timer = setTimeout(() => {
992
- internalCallback(replyData, new Error(`TIME OUT !! ${totalPackets} PACKETS REMAIN !`));
993
- }, timeout);
994
- totalBuffer = Buffer.concat([totalBuffer, reply]);
995
- const packetLength = totalBuffer.readUIntLE(4, 2);
996
- if (totalBuffer.length >= 8 + packetLength) {
997
- realTotalBuffer = Buffer.concat([realTotalBuffer, totalBuffer.subarray(16, 8 + packetLength)]);
998
- totalBuffer = totalBuffer.subarray(8 + packetLength);
999
- if ((totalPackets > 1 && realTotalBuffer.length === MAX_CHUNK + 8)
1000
- || (totalPackets === 1 && realTotalBuffer.length === remain + 8)) {
1001
- replyData = Buffer.concat([replyData, realTotalBuffer.subarray(8)]);
1002
- totalBuffer = Buffer.from([]);
1003
- realTotalBuffer = Buffer.from([]);
1004
- totalPackets -= 1;
1005
- cb && cb(replyData.length, size);
1006
- if (totalPackets <= 0) {
1007
- internalCallback(replyData);
1008
- }
1009
- }
1010
- }
1011
- };
1012
990
  this.socket.once('close', () => {
1013
- internalCallback(replyData, new Error('Socket is disconnected unexpectedly'));
991
+ internalCallback(this.replyData, new Error('Socket is disconnected unexpectedly'));
1014
992
  });
1015
- this.socket.on('data', handleOnData);
1016
993
  for (let i = 0; i <= numberChunks; i++) {
1017
- if (i === numberChunks) {
1018
- await this.sendChunkRequest(numberChunks * MAX_CHUNK, remain);
1019
- }
1020
- else {
1021
- await this.sendChunkRequest(i * MAX_CHUNK, MAX_CHUNK);
994
+ const data = await new Promise((resolve2, reject2) => {
995
+ try {
996
+ this.sendChunkRequest(i * Constants.MAX_CHUNK, (i === numberChunks)
997
+ ? remain
998
+ : Constants.MAX_CHUNK);
999
+ this.socket.on('data', (reply) => {
1000
+ clearTimeout(timer);
1001
+ timer = setTimeout(() => {
1002
+ internalCallback(this.replyData, new Error(`TIME OUT !! ${this.packetNumber} PACKETS REMAIN !`));
1003
+ }, this.timeout);
1004
+ const headers = decodeTCPHeader(reply);
1005
+ if (COMMANDS[headers.commandId]) {
1006
+ switch (headers.commandId) {
1007
+ case COMMANDS.CMD_ACK_OK:
1008
+ case COMMANDS.CMD_DATA:
1009
+ this.verbose && console.log("CMD received: ", COMMANDS[headers.commandId]);
1010
+ break;
1011
+ case COMMANDS.CMD_PREPARE_DATA:
1012
+ this.verbose && console.log("CMD received: ", COMMANDS[headers.commandId]);
1013
+ this.verbose && console.log(`recieve chunk: prepare data size is ${headers.payloadSize}`);
1014
+ break;
1015
+ default:
1016
+ break;
1017
+ }
1018
+ }
1019
+ totalBuffer = Buffer.concat([totalBuffer, reply]);
1020
+ const packetLength = totalBuffer.readUIntLE(4, 2);
1021
+ if (totalBuffer.length >= 8 + packetLength) {
1022
+ realTotalBuffer = Buffer.concat([realTotalBuffer, totalBuffer.subarray(16, 8 + packetLength)]);
1023
+ totalBuffer = totalBuffer.subarray(8 + packetLength);
1024
+ if ((this.packetNumber > 1 && realTotalBuffer.length === (Constants.MAX_CHUNK + 8))
1025
+ || (this.packetNumber === 1 && realTotalBuffer.length === remain + 8)) {
1026
+ this.packetNumber--;
1027
+ cb && cb(realTotalBuffer.length, size);
1028
+ resolve2(realTotalBuffer.subarray(8));
1029
+ totalBuffer = Buffer.from([]);
1030
+ realTotalBuffer = Buffer.from([]);
1031
+ }
1032
+ }
1033
+ });
1034
+ }
1035
+ catch (e) {
1036
+ reject2(e);
1037
+ }
1038
+ });
1039
+ this.replyData = Buffer.concat([this.replyData, data]);
1040
+ this.socket.removeAllListeners('data');
1041
+ if (this.packetNumber <= 0) {
1042
+ resolve({ data: this.replyData });
1022
1043
  }
1023
1044
  }
1024
1045
  break;
@@ -1650,32 +1671,58 @@ class ZTCP {
1650
1671
  throw err;
1651
1672
  }
1652
1673
  }
1653
- async getTemplates() {
1674
+ /**
1675
+ * Get all Finger objects
1676
+ * @returns {Record<string, Finger[]>}
1677
+ */
1678
+ async getTemplates(callbackInProcess = () => { }) {
1679
+ let templates = [];
1654
1680
  try {
1681
+ await this.getSizes();
1682
+ if (this.fp_count == 0)
1683
+ return { data: [] };
1655
1684
  await this.freeData();
1656
1685
  await this.disableDevice();
1657
1686
  const Buffer = await this.readWithBuffer(REQUEST_DATA.GET_TEMPLATES);
1658
- let templateData = Buffer.data.slice(4);
1687
+ let templateData = Buffer.data.subarray(4);
1659
1688
  let totalSize = Buffer.data.readUIntLE(0, 4);
1660
- let templates = [];
1661
1689
  while (totalSize) {
1662
- const buf = templateData.slice(0, 6);
1690
+ const buf = templateData.subarray(0, 6);
1663
1691
  const size = buf.readUIntLE(0, 2);
1664
- templates.push(new Finger(buf.readUIntLE(2, 2), buf.readUIntLE(4, 1), buf.readUIntLE(5, 1), templateData.slice(6, size)));
1665
- templateData = templateData.slice(size);
1692
+ templates.push(new Finger(buf.readUIntLE(2, 2), buf.readUIntLE(4, 1), buf.readUIntLE(5, 1), templateData.subarray(6, size)));
1693
+ templateData = templateData.subarray(size);
1666
1694
  totalSize -= size;
1667
1695
  }
1668
- return templates;
1696
+ return { data: templates };
1669
1697
  }
1670
1698
  catch (err) {
1671
- console.error('Error getting user templates: ', err);
1672
- throw err;
1699
+ this.verbose && console.log("Error getting templates", err);
1700
+ return { data: templates };
1673
1701
  }
1674
1702
  finally {
1675
1703
  await this.enableDevice();
1676
1704
  await this.freeData();
1677
1705
  }
1678
1706
  }
1707
+ /**
1708
+ * Return size
1709
+ * @param packet
1710
+ */
1711
+ testTcpTop(packet) {
1712
+ // Check if packet is too small
1713
+ if (packet.length <= 8)
1714
+ return 0;
1715
+ // Extract header values using little-endian format
1716
+ const headerValue1 = packet.readUInt16LE(0);
1717
+ const headerValue2 = packet.readUInt16LE(2);
1718
+ const size = packet.readUInt32LE(4);
1719
+ // Check if magic numbers match
1720
+ if (headerValue1 === Constants.MACHINE_PREPARE_DATA_1 &&
1721
+ headerValue2 === Constants.MACHINE_PREPARE_DATA_2) {
1722
+ return size;
1723
+ }
1724
+ return 0;
1725
+ }
1679
1726
  async refreshData() {
1680
1727
  try {
1681
1728
  const reply = await this.executeCmd(COMMANDS.CMD_REFRESHDATA, '');
@@ -1973,7 +2020,7 @@ class ZTCP {
1973
2020
  }
1974
2021
  async ackOk() {
1975
2022
  try {
1976
- const buf = createTCPHeader(COMMANDS.CMD_ACK_OK, this.sessionId, USHRT_MAX - 1, Buffer.from([]));
2023
+ const buf = createTCPHeader(COMMANDS.CMD_ACK_OK, this.sessionId, Constants.USHRT_MAX - 1, Buffer.from([]));
1977
2024
  this.socket.write(buf);
1978
2025
  }
1979
2026
  catch (e) {
@@ -2284,10 +2331,10 @@ class ZUDP {
2284
2331
  }
2285
2332
  };
2286
2333
  this.socket.on('message', handleOnData);
2287
- const chunkCount = Math.ceil(size / MAX_CHUNK);
2334
+ const chunkCount = Math.ceil(size / Constants.MAX_CHUNK);
2288
2335
  for (let i = 0; i < chunkCount; i++) {
2289
- const start = i * MAX_CHUNK;
2290
- const chunkSize = (i === chunkCount - 1) ? size % MAX_CHUNK : MAX_CHUNK;
2336
+ const start = i * Constants.MAX_CHUNK;
2337
+ const chunkSize = (i === chunkCount - 1) ? size % Constants.MAX_CHUNK : Constants.MAX_CHUNK;
2291
2338
  this.sendChunkRequest(start, chunkSize).catch(err => {
2292
2339
  internalCallback(Buffer.from([]), err);
2293
2340
  });
package/dist/index.d.ts CHANGED
@@ -54,7 +54,7 @@ export default class Zklib {
54
54
  err?: Error | null;
55
55
  }>;
56
56
  getRealTimeLogs(cb: (log: any) => void): Promise<void>;
57
- getTemplates(): Promise<Finger[]>;
57
+ getTemplates(): Promise<Record<string, Finger[]>>;
58
58
  saveUserTemplate(user: User, fingers?: Finger[]): Promise<void>;
59
59
  deleteFinger(uid: number, fid: number): Promise<boolean>;
60
60
  enrollUser(uid: number, temp_id: number, user_id: string): Promise<boolean>;