@samlab-corp/sfm-node 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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +479 -0
  3. package/dist/commands/data.d.ts +29 -0
  4. package/dist/commands/data.d.ts.map +1 -0
  5. package/dist/commands/data.js +176 -0
  6. package/dist/commands/data.js.map +1 -0
  7. package/dist/commands/fingerprint.d.ts +132 -0
  8. package/dist/commands/fingerprint.d.ts.map +1 -0
  9. package/dist/commands/fingerprint.js +580 -0
  10. package/dist/commands/fingerprint.js.map +1 -0
  11. package/dist/commands/firmware.d.ts +37 -0
  12. package/dist/commands/firmware.d.ts.map +1 -0
  13. package/dist/commands/firmware.js +152 -0
  14. package/dist/commands/firmware.js.map +1 -0
  15. package/dist/commands/freescan.d.ts +68 -0
  16. package/dist/commands/freescan.d.ts.map +1 -0
  17. package/dist/commands/freescan.js +202 -0
  18. package/dist/commands/freescan.js.map +1 -0
  19. package/dist/commands/index.d.ts +88 -0
  20. package/dist/commands/index.d.ts.map +1 -0
  21. package/dist/commands/index.js +104 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/system.d.ts +82 -0
  24. package/dist/commands/system.d.ts.map +1 -0
  25. package/dist/commands/system.js +191 -0
  26. package/dist/commands/system.js.map +1 -0
  27. package/dist/constants/crypto.d.ts +11 -0
  28. package/dist/constants/crypto.d.ts.map +1 -0
  29. package/dist/constants/crypto.js +10 -0
  30. package/dist/constants/crypto.js.map +1 -0
  31. package/dist/constants/index.d.ts +6 -0
  32. package/dist/constants/index.d.ts.map +1 -0
  33. package/dist/constants/index.js +4 -0
  34. package/dist/constants/index.js.map +1 -0
  35. package/dist/constants/packet.d.ts +17 -0
  36. package/dist/constants/packet.d.ts.map +1 -0
  37. package/dist/constants/packet.js +17 -0
  38. package/dist/constants/packet.js.map +1 -0
  39. package/dist/constants/protocol.d.ts +653 -0
  40. package/dist/constants/protocol.d.ts.map +1 -0
  41. package/dist/constants/protocol.js +422 -0
  42. package/dist/constants/protocol.js.map +1 -0
  43. package/dist/core/client.d.ts +118 -0
  44. package/dist/core/client.d.ts.map +1 -0
  45. package/dist/core/client.js +320 -0
  46. package/dist/core/client.js.map +1 -0
  47. package/dist/core/crypto.d.ts +86 -0
  48. package/dist/core/crypto.d.ts.map +1 -0
  49. package/dist/core/crypto.js +248 -0
  50. package/dist/core/crypto.js.map +1 -0
  51. package/dist/core/errors.d.ts +25 -0
  52. package/dist/core/errors.d.ts.map +1 -0
  53. package/dist/core/errors.js +66 -0
  54. package/dist/core/errors.js.map +1 -0
  55. package/dist/core/index.d.ts +15 -0
  56. package/dist/core/index.d.ts.map +1 -0
  57. package/dist/core/index.js +10 -0
  58. package/dist/core/index.js.map +1 -0
  59. package/dist/core/packet.d.ts +126 -0
  60. package/dist/core/packet.d.ts.map +1 -0
  61. package/dist/core/packet.js +267 -0
  62. package/dist/core/packet.js.map +1 -0
  63. package/dist/core/serial.d.ts +123 -0
  64. package/dist/core/serial.d.ts.map +1 -0
  65. package/dist/core/serial.js +421 -0
  66. package/dist/core/serial.js.map +1 -0
  67. package/dist/core/tcp.d.ts +58 -0
  68. package/dist/core/tcp.d.ts.map +1 -0
  69. package/dist/core/tcp.js +219 -0
  70. package/dist/core/tcp.js.map +1 -0
  71. package/dist/index.d.ts +19 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +16 -0
  74. package/dist/index.js.map +1 -0
  75. package/package.json +49 -0
@@ -0,0 +1,219 @@
1
+ /**
2
+ * SFM TCP/IP Communication Module
3
+ *
4
+ * Transmits the same packet protocol as serial port over TCP socket.
5
+ * Provides the same interface as SfmSerial (open, close, read, write)
6
+ * for transparent substitution in SfmClient.
7
+ *
8
+ * Decompilation analysis:
9
+ * - "TCP Port" @ 14004f280: TCP port configuration string
10
+ * - Protocol packet structure is identical to serial (13/15/35 bytes)
11
+ */
12
+ import net from 'node:net';
13
+ const DEFAULT_PORT = 9870;
14
+ const READ_TIMEOUT_MS = 3000;
15
+ const CONNECT_TIMEOUT_MS = 5000;
16
+ export class SfmTcp {
17
+ constructor(options = {}) {
18
+ this.socket = null;
19
+ this.host = options.host || '127.0.0.1';
20
+ this.port = options.port || DEFAULT_PORT;
21
+ this.isOpen = false;
22
+ this._readBuffer = Buffer.alloc(0);
23
+ this._readResolve = null;
24
+ this._readReject = null;
25
+ this._readTimer = null;
26
+ }
27
+ /**
28
+ * Open TCP connection
29
+ */
30
+ async open(hostOrPath) {
31
+ if (this.isOpen) {
32
+ await this.close();
33
+ }
34
+ // Support host:port format
35
+ if (hostOrPath) {
36
+ const parts = hostOrPath.split(':');
37
+ this.host = parts[0];
38
+ if (parts[1]) {
39
+ const parsed = parseInt(parts[1], 10);
40
+ if (isNaN(parsed) || parsed < 1 || parsed > 65535) {
41
+ throw new Error(`Invalid TCP port: "${parts[1]}"`);
42
+ }
43
+ this.port = parsed;
44
+ }
45
+ }
46
+ return new Promise((resolve, reject) => {
47
+ this.socket = new net.Socket();
48
+ const connectTimer = setTimeout(() => {
49
+ this.socket?.destroy();
50
+ reject(new Error(`TCP connection timeout (${CONNECT_TIMEOUT_MS}ms): ${this.host}:${this.port}`));
51
+ }, CONNECT_TIMEOUT_MS);
52
+ this.socket.on('data', (data) => {
53
+ this._readBuffer = Buffer.concat([this._readBuffer, data]);
54
+ if (this._readResolve) {
55
+ this._resolveRead();
56
+ }
57
+ });
58
+ this.socket.on('error', (err) => {
59
+ clearTimeout(connectTimer);
60
+ if (!this.isOpen) {
61
+ reject(new Error(`TCP connection failed: ${err.message}`));
62
+ return;
63
+ }
64
+ if (this._readReject) {
65
+ this._readReject(err);
66
+ this._readResolve = null;
67
+ this._readReject = null;
68
+ }
69
+ });
70
+ this.socket.on('close', () => {
71
+ this.isOpen = false;
72
+ if (this._readReject) {
73
+ this._readReject(new Error('TCP connection closed'));
74
+ this._readResolve = null;
75
+ this._readReject = null;
76
+ }
77
+ if (this._readTimer) {
78
+ clearTimeout(this._readTimer);
79
+ this._readTimer = null;
80
+ }
81
+ this._readBuffer = Buffer.alloc(0);
82
+ });
83
+ this.socket.connect(this.port, this.host, () => {
84
+ clearTimeout(connectTimer);
85
+ this.isOpen = true;
86
+ resolve();
87
+ });
88
+ });
89
+ }
90
+ /**
91
+ * Close TCP connection
92
+ */
93
+ async close() {
94
+ if (!this.isOpen || !this.socket)
95
+ return;
96
+ return new Promise((resolve) => {
97
+ this.socket.end(() => {
98
+ this.isOpen = false;
99
+ this._readBuffer = Buffer.alloc(0);
100
+ resolve();
101
+ });
102
+ });
103
+ }
104
+ /**
105
+ * Write data (TCP doesn't need chunking, but interface-compatible)
106
+ */
107
+ async write(data) {
108
+ if (!this.isOpen)
109
+ throw new Error('TCP connection is not open');
110
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
111
+ return new Promise((resolve, reject) => {
112
+ this.socket.write(buf, (err) => {
113
+ if (err)
114
+ return reject(err);
115
+ resolve();
116
+ });
117
+ });
118
+ }
119
+ /**
120
+ * Read data (same interface as SfmSerial.read)
121
+ */
122
+ async read(expectedLength, timeoutMs = READ_TIMEOUT_MS) {
123
+ if (!this.isOpen)
124
+ throw new Error('TCP connection is not open');
125
+ if (this._readBuffer.length >= expectedLength) {
126
+ const result = this._readBuffer.subarray(0, expectedLength);
127
+ this._readBuffer = this._readBuffer.subarray(expectedLength);
128
+ return Buffer.from(result);
129
+ }
130
+ return new Promise((resolve, reject) => {
131
+ let settled = false;
132
+ const cleanup = () => {
133
+ if (this._readTimer)
134
+ clearTimeout(this._readTimer);
135
+ this._readTimer = null;
136
+ this._readResolve = null;
137
+ this._readReject = null;
138
+ };
139
+ this._readResolve = () => {
140
+ if (settled)
141
+ return;
142
+ if (this._readBuffer.length >= expectedLength) {
143
+ settled = true;
144
+ cleanup();
145
+ const result = this._readBuffer.subarray(0, expectedLength);
146
+ this._readBuffer = this._readBuffer.subarray(expectedLength);
147
+ resolve(Buffer.from(result));
148
+ }
149
+ };
150
+ this._readReject = (err) => {
151
+ if (settled)
152
+ return;
153
+ settled = true;
154
+ cleanup();
155
+ reject(err);
156
+ };
157
+ this._readTimer = setTimeout(() => {
158
+ if (settled)
159
+ return;
160
+ settled = true;
161
+ const available = Buffer.from(this._readBuffer);
162
+ this._readBuffer = Buffer.alloc(0);
163
+ cleanup();
164
+ if (available.length > 0) {
165
+ resolve(available);
166
+ }
167
+ else {
168
+ reject(new Error(`TCP read timeout (${timeoutMs}ms)`));
169
+ }
170
+ }, timeoutMs);
171
+ this._readResolve();
172
+ });
173
+ }
174
+ /**
175
+ * Read single byte
176
+ */
177
+ async readByte(timeoutMs = READ_TIMEOUT_MS) {
178
+ const buf = await this.read(1, timeoutMs);
179
+ return buf[0];
180
+ }
181
+ /**
182
+ * Read until specific string
183
+ */
184
+ async readUntil(marker, timeoutMs = 5000) {
185
+ const startTime = Date.now();
186
+ let accumulated = '';
187
+ while (Date.now() - startTime < timeoutMs) {
188
+ try {
189
+ const byte = await this.readByte(100);
190
+ accumulated += String.fromCharCode(byte);
191
+ if (accumulated.includes(marker)) {
192
+ return accumulated;
193
+ }
194
+ }
195
+ catch {
196
+ // timeout on single byte, continue
197
+ }
198
+ }
199
+ throw new Error(`Marker wait timeout: "${marker}" (${timeoutMs}ms)`);
200
+ }
201
+ /**
202
+ * Clear RX buffer
203
+ */
204
+ async purgeRX() {
205
+ this._readBuffer = Buffer.alloc(0);
206
+ }
207
+ async purgeTX() {
208
+ // TCP doesn't need separate TX purge
209
+ }
210
+ async purgeAll() {
211
+ await this.purgeRX();
212
+ }
213
+ _resolveRead() {
214
+ if (this._readResolve) {
215
+ this._readResolve();
216
+ }
217
+ }
218
+ }
219
+ //# sourceMappingURL=tcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../src/core/tcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * sfm-node - SFM Protocol Manual V3.6.0 기반 지문인식 라이브러리
3
+ *
4
+ * 사용법:
5
+ * import { SfmCommands } from './sfm-node';
6
+ *
7
+ * const finger = new SfmCommands({ baudRate: 115200 });
8
+ * await finger.connect('/dev/ttyUSB0');
9
+ * await finger.fingerprint.enroll(1);
10
+ * await finger.disconnect();
11
+ */
12
+ export { SfmCommands } from './commands';
13
+ export type { SfmClientOptions } from './core';
14
+ export type { SerialPortInfo } from './core';
15
+ export type { EncryptionMode } from './constants';
16
+ export { ENCRYPTION_MODE } from './constants';
17
+ export { SFM_ERROR } from './constants';
18
+ export type { EnrollResult, CommandResult, IdentifyResult, VerifyResult, ListUserIdsResult, CaptureImageResult, SystemStatusResult, ParamResult, SelfTestResult, FirmwareOptions, FreeScanResult, FreeScanCallback, } from './commands';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,YAAY,EACV,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EACzD,iBAAiB,EAAE,kBAAkB,EACrC,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAC/C,eAAe,EACf,cAAc,EAAE,gBAAgB,GACjC,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * sfm-node - SFM Protocol Manual V3.6.0 기반 지문인식 라이브러리
3
+ *
4
+ * 사용법:
5
+ * import { SfmCommands } from './sfm-node';
6
+ *
7
+ * const finger = new SfmCommands({ baudRate: 115200 });
8
+ * await finger.connect('/dev/ttyUSB0');
9
+ * await finger.fingerprint.enroll(1);
10
+ * await finger.disconnect();
11
+ */
12
+ // 공개 API
13
+ export { SfmCommands } from './commands';
14
+ export { ENCRYPTION_MODE } from './constants';
15
+ export { SFM_ERROR } from './constants';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@samlab-corp/sfm-node",
3
+ "version": "0.1.0",
4
+ "description": "SFM Protocol V3.6.0 based fingerprint recognition library for Node.js",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "LICENSE",
10
+ "README.md"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "clean": "rm -rf dist"
18
+ },
19
+ "keywords": [
20
+ "sfm",
21
+ "fingerprint",
22
+ "suprema",
23
+ "biometric",
24
+ "serial",
25
+ "serialport",
26
+ "node"
27
+ ],
28
+ "author": "Samlab Corp",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/Samlab-Corp/samlab-lib.git",
33
+ "directory": "packages/sfm-node"
34
+ },
35
+ "homepage": "https://github.com/Samlab-Corp/samlab-lib/tree/main/packages/sfm-node",
36
+ "bugs": {
37
+ "url": "https://github.com/Samlab-Corp/samlab-lib/issues"
38
+ },
39
+ "engines": {
40
+ "node": ">=18"
41
+ },
42
+ "dependencies": {
43
+ "serialport": "^13.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^25.2.3",
47
+ "typescript": "^5.9.3"
48
+ }
49
+ }