zklib-ts 1.0.0-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]),
@@ -273,7 +279,7 @@ class Attendance {
273
279
  record_time;
274
280
  type;
275
281
  state;
276
- _ip;
282
+ ip;
277
283
  constructor(sn, user_id, record_time, type, state) {
278
284
  this.sn = sn;
279
285
  this.user_id = user_id;
@@ -281,9 +287,6 @@ class Attendance {
281
287
  this.type = type;
282
288
  this.state = state;
283
289
  }
284
- set ip(value) {
285
- this._ip = value;
286
- }
287
290
  }
288
291
 
289
292
  const parseHexToTime = (hex) => {
@@ -306,9 +309,9 @@ const createChkSum = (buf) => {
306
309
  else {
307
310
  chksum += buf.readUInt16LE(i);
308
311
  }
309
- chksum %= USHRT_MAX;
312
+ chksum %= Constants.USHRT_MAX;
310
313
  }
311
- chksum = USHRT_MAX - chksum - 1;
314
+ chksum = Constants.USHRT_MAX - chksum - 1;
312
315
  return chksum;
313
316
  };
314
317
  const createUDPHeader = (command, sessionId, replyId, data) => {
@@ -321,7 +324,7 @@ const createUDPHeader = (command, sessionId, replyId, data) => {
321
324
  dataBuffer.copy(buf, 8);
322
325
  const chksum2 = createChkSum(buf);
323
326
  buf.writeUInt16LE(chksum2, 2);
324
- replyId = (replyId + 1) % USHRT_MAX;
327
+ replyId = (replyId + 1) % Constants.USHRT_MAX;
325
328
  buf.writeUInt16LE(replyId, 6);
326
329
  return buf;
327
330
  };
@@ -335,7 +338,7 @@ const createTCPHeader = (command, sessionId, replyId, data) => {
335
338
  dataBuffer.copy(buf, 8);
336
339
  const chksum2 = createChkSum(buf);
337
340
  buf.writeUInt16LE(chksum2, 2);
338
- replyId = (replyId + 1) % USHRT_MAX;
341
+ replyId = (replyId + 1) % Constants.USHRT_MAX;
339
342
  buf.writeUInt16LE(replyId, 6);
340
343
  const prefixBuf = Buffer.from([0x50, 0x50, 0x82, 0x7d, 0x13, 0x00, 0x00, 0x00]);
341
344
  prefixBuf.writeUInt16LE(buf.length, 4);
@@ -536,8 +539,8 @@ class Finger {
536
539
  this.template = template;
537
540
  this.size = template.length;
538
541
  // Create mark showing first and last 8 bytes as hex
539
- const start = template.slice(0, 8).toString('hex');
540
- 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');
541
544
  this.mark = `${start}...${end}`;
542
545
  }
543
546
  /**
@@ -668,10 +671,12 @@ class ZTCP {
668
671
  face_cap = 0;
669
672
  userPacketSize = 72;
670
673
  verbose = false;
674
+ packetNumber = 0;
675
+ replyData = Buffer.from([]);
671
676
  constructor(ip, port, timeout, comm_key, verbose) {
672
677
  this.ip = ip;
673
678
  this.port = port;
674
- this.timeout = timeout;
679
+ this.timeout = timeout ? timeout : 10000;
675
680
  this.replyId = 0;
676
681
  this.comm_key = comm_key;
677
682
  this.verbose = verbose;
@@ -892,9 +897,6 @@ class ZTCP {
892
897
  else {
893
898
  this.replyId++;
894
899
  }
895
- if (this.verbose) {
896
- console.log("linea 305: replyId: ", this.replyId, " command: ", command, Object.keys(COMMANDS).find(u => COMMANDS[u] == command));
897
- }
898
900
  const buf = createTCPHeader(command, this.sessionId, this.replyId, data);
899
901
  try {
900
902
  // Write the message to the socket and wait for a response
@@ -940,8 +942,8 @@ class ZTCP {
940
942
  }
941
943
  /**
942
944
  *
943
- * @param {*} reqData - indicate the type of data that need to receive ( user or attLog)
944
- * @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
945
947
  *
946
948
  * readWithBuffer will reject error if it'wrong when starting request data
947
949
  * readWithBuffer will return { data: replyData , err: Error } when receiving requested data
@@ -956,7 +958,6 @@ class ZTCP {
956
958
  }
957
959
  catch (err) {
958
960
  reject(err);
959
- console.log(reply);
960
961
  }
961
962
  const header = decodeTCPHeader(reply.subarray(0, 16));
962
963
  switch (header.commandId) {
@@ -972,56 +973,73 @@ class ZTCP {
972
973
  const size = recvData.readUIntLE(1, 4);
973
974
  // We need to split the data to many chunks to receive , because it's to large
974
975
  // After receiving all chunk data , we concat it to TotalBuffer variable , that 's the data we want
975
- let remain = size % MAX_CHUNK;
976
- let numberChunks = Math.round(size - remain) / MAX_CHUNK;
977
- let totalPackets = numberChunks + (remain > 0 ? 1 : 0);
978
- 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([])
979
980
  let totalBuffer = Buffer.from([]);
980
981
  let realTotalBuffer = Buffer.from([]);
981
- const timeout = 10000;
982
982
  let timer = setTimeout(() => {
983
- internalCallback(replyData, new Error('TIMEOUT WHEN RECEIVING PACKET'));
984
- }, timeout);
983
+ internalCallback(this.replyData, new Error('TIMEOUT WHEN RECEIVING PACKET'));
984
+ }, this.timeout);
985
985
  const internalCallback = (replyData, err = null) => {
986
- // this.socket && this.socket.removeListener('data', handleOnData)
986
+ this.socket && this.socket.removeAllListeners('data');
987
987
  timer && clearTimeout(timer);
988
988
  resolve({ data: replyData, err });
989
989
  };
990
- const handleOnData = (reply) => {
991
- if (checkNotEventTCP(reply))
992
- return;
993
- clearTimeout(timer);
994
- timer = setTimeout(() => {
995
- internalCallback(replyData, new Error(`TIME OUT !! ${totalPackets} PACKETS REMAIN !`));
996
- }, timeout);
997
- totalBuffer = Buffer.concat([totalBuffer, reply]);
998
- const packetLength = totalBuffer.readUIntLE(4, 2);
999
- if (totalBuffer.length >= 8 + packetLength) {
1000
- realTotalBuffer = Buffer.concat([realTotalBuffer, totalBuffer.subarray(16, 8 + packetLength)]);
1001
- totalBuffer = totalBuffer.subarray(8 + packetLength);
1002
- if ((totalPackets > 1 && realTotalBuffer.length === MAX_CHUNK + 8)
1003
- || (totalPackets === 1 && realTotalBuffer.length === remain + 8)) {
1004
- replyData = Buffer.concat([replyData, realTotalBuffer.subarray(8)]);
1005
- totalBuffer = Buffer.from([]);
1006
- realTotalBuffer = Buffer.from([]);
1007
- totalPackets -= 1;
1008
- cb && cb(replyData.length, size);
1009
- if (totalPackets <= 0) {
1010
- internalCallback(replyData);
1011
- }
1012
- }
1013
- }
1014
- };
1015
990
  this.socket.once('close', () => {
1016
- internalCallback(replyData, new Error('Socket is disconnected unexpectedly'));
991
+ internalCallback(this.replyData, new Error('Socket is disconnected unexpectedly'));
1017
992
  });
1018
- this.socket.on('data', handleOnData);
1019
993
  for (let i = 0; i <= numberChunks; i++) {
1020
- if (i === numberChunks) {
1021
- await this.sendChunkRequest(numberChunks * MAX_CHUNK, remain);
1022
- }
1023
- else {
1024
- 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 });
1025
1043
  }
1026
1044
  }
1027
1045
  break;
@@ -1653,32 +1671,58 @@ class ZTCP {
1653
1671
  throw err;
1654
1672
  }
1655
1673
  }
1656
- async getTemplates() {
1674
+ /**
1675
+ * Get all Finger objects
1676
+ * @returns {Record<string, Finger[]>}
1677
+ */
1678
+ async getTemplates(callbackInProcess = () => { }) {
1679
+ let templates = [];
1657
1680
  try {
1681
+ await this.getSizes();
1682
+ if (this.fp_count == 0)
1683
+ return { data: [] };
1658
1684
  await this.freeData();
1659
1685
  await this.disableDevice();
1660
1686
  const Buffer = await this.readWithBuffer(REQUEST_DATA.GET_TEMPLATES);
1661
- let templateData = Buffer.data.slice(4);
1687
+ let templateData = Buffer.data.subarray(4);
1662
1688
  let totalSize = Buffer.data.readUIntLE(0, 4);
1663
- let templates = [];
1664
1689
  while (totalSize) {
1665
- const buf = templateData.slice(0, 6);
1690
+ const buf = templateData.subarray(0, 6);
1666
1691
  const size = buf.readUIntLE(0, 2);
1667
- templates.push(new Finger(buf.readUIntLE(2, 2), buf.readUIntLE(4, 1), buf.readUIntLE(5, 1), templateData.slice(6, size)));
1668
- 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);
1669
1694
  totalSize -= size;
1670
1695
  }
1671
- return templates;
1696
+ return { data: templates };
1672
1697
  }
1673
1698
  catch (err) {
1674
- console.error('Error getting user templates: ', err);
1675
- throw err;
1699
+ this.verbose && console.log("Error getting templates", err);
1700
+ return { data: templates };
1676
1701
  }
1677
1702
  finally {
1678
1703
  await this.enableDevice();
1679
1704
  await this.freeData();
1680
1705
  }
1681
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
+ }
1682
1726
  async refreshData() {
1683
1727
  try {
1684
1728
  const reply = await this.executeCmd(COMMANDS.CMD_REFRESHDATA, '');
@@ -1976,7 +2020,7 @@ class ZTCP {
1976
2020
  }
1977
2021
  async ackOk() {
1978
2022
  try {
1979
- 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([]));
1980
2024
  this.socket.write(buf);
1981
2025
  }
1982
2026
  catch (e) {
@@ -2287,10 +2331,10 @@ class ZUDP {
2287
2331
  }
2288
2332
  };
2289
2333
  this.socket.on('message', handleOnData);
2290
- const chunkCount = Math.ceil(size / MAX_CHUNK);
2334
+ const chunkCount = Math.ceil(size / Constants.MAX_CHUNK);
2291
2335
  for (let i = 0; i < chunkCount; i++) {
2292
- const start = i * MAX_CHUNK;
2293
- 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;
2294
2338
  this.sendChunkRequest(start, chunkSize).catch(err => {
2295
2339
  internalCallback(Buffer.from([]), err);
2296
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>;
@@ -70,3 +70,4 @@ export default class Zklib {
70
70
  clearData(): Promise<any>;
71
71
  executeCmd(command: number, data?: string | Buffer): Promise<Buffer>;
72
72
  }
73
+ export type { Attendance, User, Finger, DeviceInfo, Zklib };