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/README.md +16 -8
- package/dist/helper/command.d.ts +101 -99
- package/dist/index.cjs.js +211 -167
- package/dist/index.d.ts +2 -1
- package/dist/index.es.js +211 -167
- package/dist/models/Attendance.d.ts +1 -2
- package/dist/ztcp.d.ts +17 -6
- package/package.json +1 -1
- package/dist/helper/models/Attendance.d.ts +0 -12
- package/dist/helper/models/Finger.d.ts +0 -35
- package/dist/helper/models/User.d.ts +0 -26
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
CMD_TMP_WRITE
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
EF_FPFTR
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
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 =
|
|
540
|
-
const end =
|
|
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 {
|
|
944
|
-
* @param {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
1668
|
-
templateData = templateData.
|
|
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.
|
|
1675
|
-
|
|
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 };
|