smartcard 3.2.1 → 3.4.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.
- package/README.md +3 -3
- package/dist/lib/control-codes.d.ts +32 -0
- package/dist/lib/control-codes.d.ts.map +1 -0
- package/dist/lib/control-codes.js +66 -0
- package/dist/lib/control-codes.js.map +1 -0
- package/dist/lib/devices.d.ts +75 -0
- package/dist/lib/devices.d.ts.map +1 -0
- package/{lib → dist/lib}/devices.js +76 -115
- package/dist/lib/devices.js.map +1 -0
- package/dist/lib/errors.d.ts +42 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/{lib → dist/lib}/errors.js +21 -37
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/index.d.ts +31 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +71 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/types.d.ts +207 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +6 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +27 -16
- package/src/async_workers.cpp +6 -0
- package/src/async_workers.h +2 -0
- package/src/pcsc_card.cpp +1 -1
- package/lib/control-codes.js +0 -107
- package/lib/index.d.ts +0 -325
- package/lib/index.js +0 -151
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
Stable PC/SC smart card bindings for Node.js.
|
|
18
18
|
|
|
19
|
-
Works with Node.js
|
|
19
|
+
Works with Node.js 18+ without recompilation. Built on N-API for long-term stability.
|
|
20
20
|
|
|
21
21
|
## Getting Started
|
|
22
22
|
|
|
@@ -437,8 +437,8 @@ devices.on('card-inserted', ({ reader, card }) => {
|
|
|
437
437
|
devices.start();
|
|
438
438
|
```
|
|
439
439
|
|
|
440
|
-
### Key Improvements in v2.x
|
|
441
|
-
- Works on Node.js
|
|
440
|
+
### Key Improvements in v2.x/v3.x
|
|
441
|
+
- Works on Node.js 18+ without recompilation (v3.x requires Node.js 18+)
|
|
442
442
|
- Native N-API bindings (no more NAN compatibility issues)
|
|
443
443
|
- Simpler flat event model
|
|
444
444
|
- Full TypeScript definitions
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Control codes and feature constants for PC/SC smart card operations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generate a control code (platform-specific)
|
|
6
|
+
*/
|
|
7
|
+
export declare function SCARD_CTL_CODE(code: number): number;
|
|
8
|
+
export declare const CM_IOCTL_GET_FEATURE_REQUEST: number;
|
|
9
|
+
export declare const FEATURE_VERIFY_PIN_START = 1;
|
|
10
|
+
export declare const FEATURE_VERIFY_PIN_FINISH = 2;
|
|
11
|
+
export declare const FEATURE_MODIFY_PIN_START = 3;
|
|
12
|
+
export declare const FEATURE_MODIFY_PIN_FINISH = 4;
|
|
13
|
+
export declare const FEATURE_GET_KEY_PRESSED = 5;
|
|
14
|
+
export declare const FEATURE_VERIFY_PIN_DIRECT = 6;
|
|
15
|
+
export declare const FEATURE_MODIFY_PIN_DIRECT = 7;
|
|
16
|
+
export declare const FEATURE_MCT_READER_DIRECT = 8;
|
|
17
|
+
export declare const FEATURE_MCT_UNIVERSAL = 9;
|
|
18
|
+
export declare const FEATURE_IFD_PIN_PROPERTIES = 10;
|
|
19
|
+
export declare const FEATURE_ABORT = 11;
|
|
20
|
+
export declare const FEATURE_SET_SPE_MESSAGE = 12;
|
|
21
|
+
export declare const FEATURE_VERIFY_PIN_DIRECT_APP_ID = 13;
|
|
22
|
+
export declare const FEATURE_MODIFY_PIN_DIRECT_APP_ID = 14;
|
|
23
|
+
export declare const FEATURE_WRITE_DISPLAY = 15;
|
|
24
|
+
export declare const FEATURE_GET_KEY = 16;
|
|
25
|
+
export declare const FEATURE_IFD_DISPLAY_PROPERTIES = 17;
|
|
26
|
+
export declare const FEATURE_GET_TLV_PROPERTIES = 18;
|
|
27
|
+
export declare const FEATURE_CCID_ESC_COMMAND = 19;
|
|
28
|
+
/**
|
|
29
|
+
* Parse feature TLV response from CM_IOCTL_GET_FEATURE_REQUEST
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseFeatures(response: Buffer): Map<number, number>;
|
|
32
|
+
//# sourceMappingURL=control-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-codes.d.ts","sourceRoot":"","sources":["../../lib/control-codes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAGD,eAAO,MAAM,4BAA4B,QAAuB,CAAC;AAGjE,eAAO,MAAM,wBAAwB,IAAO,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,wBAAwB,IAAO,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,uBAAuB,IAAO,CAAC;AAC5C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,qBAAqB,IAAO,CAAC;AAC1C,eAAO,MAAM,0BAA0B,KAAO,CAAC;AAC/C,eAAO,MAAM,aAAa,KAAO,CAAC;AAClC,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAO,CAAC;AACrD,eAAO,MAAM,gCAAgC,KAAO,CAAC;AACrD,eAAO,MAAM,qBAAqB,KAAO,CAAC;AAC1C,eAAO,MAAM,eAAe,KAAO,CAAC;AACpC,eAAO,MAAM,8BAA8B,KAAO,CAAC;AACnD,eAAO,MAAM,0BAA0B,KAAO,CAAC;AAC/C,eAAO,MAAM,wBAAwB,KAAO,CAAC;AAE7C;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBnE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Control codes and feature constants for PC/SC smart card operations
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FEATURE_CCID_ESC_COMMAND = exports.FEATURE_GET_TLV_PROPERTIES = exports.FEATURE_IFD_DISPLAY_PROPERTIES = exports.FEATURE_GET_KEY = exports.FEATURE_WRITE_DISPLAY = exports.FEATURE_MODIFY_PIN_DIRECT_APP_ID = exports.FEATURE_VERIFY_PIN_DIRECT_APP_ID = exports.FEATURE_SET_SPE_MESSAGE = exports.FEATURE_ABORT = exports.FEATURE_IFD_PIN_PROPERTIES = exports.FEATURE_MCT_UNIVERSAL = exports.FEATURE_MCT_READER_DIRECT = exports.FEATURE_MODIFY_PIN_DIRECT = exports.FEATURE_VERIFY_PIN_DIRECT = exports.FEATURE_GET_KEY_PRESSED = exports.FEATURE_MODIFY_PIN_FINISH = exports.FEATURE_MODIFY_PIN_START = exports.FEATURE_VERIFY_PIN_FINISH = exports.FEATURE_VERIFY_PIN_START = exports.CM_IOCTL_GET_FEATURE_REQUEST = void 0;
|
|
7
|
+
exports.SCARD_CTL_CODE = SCARD_CTL_CODE;
|
|
8
|
+
exports.parseFeatures = parseFeatures;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a control code (platform-specific)
|
|
11
|
+
*/
|
|
12
|
+
function SCARD_CTL_CODE(code) {
|
|
13
|
+
if (process.platform === 'win32') {
|
|
14
|
+
// Windows: (FILE_DEVICE_SMARTCARD << 16) + (code << 2)
|
|
15
|
+
// FILE_DEVICE_SMARTCARD = 0x31
|
|
16
|
+
return (0x31 << 16) + (code << 2);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
// macOS/Linux: 0x42000000 + code
|
|
20
|
+
return 0x42000000 + code;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Common control codes
|
|
24
|
+
exports.CM_IOCTL_GET_FEATURE_REQUEST = SCARD_CTL_CODE(3400);
|
|
25
|
+
// CCID Feature tags (from CCID spec)
|
|
26
|
+
exports.FEATURE_VERIFY_PIN_START = 0x01;
|
|
27
|
+
exports.FEATURE_VERIFY_PIN_FINISH = 0x02;
|
|
28
|
+
exports.FEATURE_MODIFY_PIN_START = 0x03;
|
|
29
|
+
exports.FEATURE_MODIFY_PIN_FINISH = 0x04;
|
|
30
|
+
exports.FEATURE_GET_KEY_PRESSED = 0x05;
|
|
31
|
+
exports.FEATURE_VERIFY_PIN_DIRECT = 0x06;
|
|
32
|
+
exports.FEATURE_MODIFY_PIN_DIRECT = 0x07;
|
|
33
|
+
exports.FEATURE_MCT_READER_DIRECT = 0x08;
|
|
34
|
+
exports.FEATURE_MCT_UNIVERSAL = 0x09;
|
|
35
|
+
exports.FEATURE_IFD_PIN_PROPERTIES = 0x0a;
|
|
36
|
+
exports.FEATURE_ABORT = 0x0b;
|
|
37
|
+
exports.FEATURE_SET_SPE_MESSAGE = 0x0c;
|
|
38
|
+
exports.FEATURE_VERIFY_PIN_DIRECT_APP_ID = 0x0d;
|
|
39
|
+
exports.FEATURE_MODIFY_PIN_DIRECT_APP_ID = 0x0e;
|
|
40
|
+
exports.FEATURE_WRITE_DISPLAY = 0x0f;
|
|
41
|
+
exports.FEATURE_GET_KEY = 0x10;
|
|
42
|
+
exports.FEATURE_IFD_DISPLAY_PROPERTIES = 0x11;
|
|
43
|
+
exports.FEATURE_GET_TLV_PROPERTIES = 0x12;
|
|
44
|
+
exports.FEATURE_CCID_ESC_COMMAND = 0x13;
|
|
45
|
+
/**
|
|
46
|
+
* Parse feature TLV response from CM_IOCTL_GET_FEATURE_REQUEST
|
|
47
|
+
*/
|
|
48
|
+
function parseFeatures(response) {
|
|
49
|
+
const features = new Map();
|
|
50
|
+
let offset = 0;
|
|
51
|
+
while (offset + 4 <= response.length) {
|
|
52
|
+
const tag = response[offset];
|
|
53
|
+
const length = response[offset + 1];
|
|
54
|
+
if (length === 4 && offset + 2 + length <= response.length) {
|
|
55
|
+
// Big-endian control code
|
|
56
|
+
const controlCode = (response[offset + 2] << 24) |
|
|
57
|
+
(response[offset + 3] << 16) |
|
|
58
|
+
(response[offset + 4] << 8) |
|
|
59
|
+
response[offset + 5];
|
|
60
|
+
features.set(tag, controlCode);
|
|
61
|
+
}
|
|
62
|
+
offset += 2 + length;
|
|
63
|
+
}
|
|
64
|
+
return features;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=control-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-codes.js","sourceRoot":"","sources":["../../lib/control-codes.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH,wCASC;AA6BD,sCAsBC;AA/DD;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,uDAAuD;QACvD,+BAA+B;QAC/B,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,iCAAiC;QACjC,OAAO,UAAU,GAAG,IAAI,CAAC;IAC7B,CAAC;AACL,CAAC;AAED,uBAAuB;AACV,QAAA,4BAA4B,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;AAEjE,qCAAqC;AACxB,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAChC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAChC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,uBAAuB,GAAG,IAAI,CAAC;AAC/B,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAClC,QAAA,aAAa,GAAG,IAAI,CAAC;AACrB,QAAA,uBAAuB,GAAG,IAAI,CAAC;AAC/B,QAAA,gCAAgC,GAAG,IAAI,CAAC;AACxC,QAAA,gCAAgC,GAAG,IAAI,CAAC;AACxC,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,eAAe,GAAG,IAAI,CAAC;AACvB,QAAA,8BAA8B,GAAG,IAAI,CAAC;AACtC,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAClC,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAE7C;;GAEG;AACH,SAAgB,aAAa,CAAC,QAAgB;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,OAAO,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEpC,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzD,0BAA0B;YAC1B,MAAM,WAAW,GACb,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5B,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5B,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC3B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { DeviceEvents, DevicesOptions, Reader } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* High-level event-driven API for PC/SC devices
|
|
5
|
+
*
|
|
6
|
+
* Uses native ReaderMonitor for efficient background monitoring
|
|
7
|
+
* with ThreadSafeFunction to emit events from worker thread.
|
|
8
|
+
*
|
|
9
|
+
* Events:
|
|
10
|
+
* - 'reader-attached': Emitted when a reader is attached
|
|
11
|
+
* - 'reader-detached': Emitted when a reader is detached
|
|
12
|
+
* - 'card-inserted': Emitted when a card is inserted
|
|
13
|
+
* - 'card-removed': Emitted when a card is removed
|
|
14
|
+
* - 'error': Emitted on errors
|
|
15
|
+
*/
|
|
16
|
+
export declare class Devices extends EventEmitter {
|
|
17
|
+
private _monitor;
|
|
18
|
+
private _context;
|
|
19
|
+
private _running;
|
|
20
|
+
private _readers;
|
|
21
|
+
private _eventQueue;
|
|
22
|
+
private _Context;
|
|
23
|
+
private _ReaderMonitor;
|
|
24
|
+
private _SCARD_STATE_PRESENT;
|
|
25
|
+
private _SCARD_SHARE_SHARED;
|
|
26
|
+
private _SCARD_PROTOCOL_T0;
|
|
27
|
+
private _SCARD_PROTOCOL_T1;
|
|
28
|
+
/**
|
|
29
|
+
* Create a new Devices instance
|
|
30
|
+
* @param options Optional dependencies for testing
|
|
31
|
+
*/
|
|
32
|
+
constructor(options?: DevicesOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Start monitoring for device changes
|
|
35
|
+
*/
|
|
36
|
+
start(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Stop monitoring
|
|
39
|
+
*/
|
|
40
|
+
stop(): void;
|
|
41
|
+
/**
|
|
42
|
+
* List currently known readers
|
|
43
|
+
*/
|
|
44
|
+
listReaders(): Reader[];
|
|
45
|
+
/**
|
|
46
|
+
* Handle events from native monitor
|
|
47
|
+
* Queues events to prevent race conditions when multiple events arrive concurrently
|
|
48
|
+
*/
|
|
49
|
+
private _handleEvent;
|
|
50
|
+
/**
|
|
51
|
+
* Process a single event (called sequentially via queue)
|
|
52
|
+
*/
|
|
53
|
+
private _processEvent;
|
|
54
|
+
/**
|
|
55
|
+
* Handle reader attached
|
|
56
|
+
*/
|
|
57
|
+
private _handleReaderAttached;
|
|
58
|
+
/**
|
|
59
|
+
* Handle reader detached
|
|
60
|
+
*/
|
|
61
|
+
private _handleReaderDetached;
|
|
62
|
+
/**
|
|
63
|
+
* Handle card inserted
|
|
64
|
+
*/
|
|
65
|
+
private _handleCardInserted;
|
|
66
|
+
/**
|
|
67
|
+
* Handle card removed
|
|
68
|
+
*/
|
|
69
|
+
private _handleCardRemoved;
|
|
70
|
+
on<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
71
|
+
once<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
72
|
+
off<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
73
|
+
emit<K extends keyof DeviceEvents>(event: K, ...args: Parameters<DeviceEvents[K]>): boolean;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../lib/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAIR,YAAY,EACZ,cAAc,EAEd,MAAM,EAGT,MAAM,SAAS,CAAC;AAgBjB;;;;;;;;;;;;GAYG;AACH,qBAAa,OAAQ,SAAQ,YAAY;IACrC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,WAAW,CAAoC;IAGvD,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;IAEnC;;;OAGG;gBACS,OAAO,CAAC,EAAE,cAAc;IAcpC;;OAEG;IACH,KAAK,IAAI,IAAI;IAsBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAkCZ;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAWvB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;YACW,aAAa;IA+B3B;;OAEG;YACW,qBAAqB;IA0BnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;YACW,mBAAmB;IAyDjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyB1B,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAC3B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,IAAI,CAAC,CAAC,SAAS,MAAM,YAAY,EAC7B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,GAAG,CAAC,CAAC,SAAS,MAAM,YAAY,EAC5B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,IAAI,CAAC,CAAC,SAAS,MAAM,YAAY,EAC7B,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACrC,OAAO;CAGb"}
|
|
@@ -1,29 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const addon = require('
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @typedef {import('./index').Reader} Reader
|
|
9
|
-
* @typedef {import('./index').Card} Card
|
|
10
|
-
* @typedef {import('./index').MonitorEvent} MonitorEvent
|
|
11
|
-
* @typedef {import('./index').Context} ContextType
|
|
12
|
-
* @typedef {import('./index').ReaderMonitor} ReaderMonitorType
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
const { Context, ReaderMonitor } = addon;
|
|
16
|
-
const SCARD_STATE_PRESENT = addon.SCARD_STATE_PRESENT;
|
|
17
|
-
const SCARD_SHARE_SHARED = addon.SCARD_SHARE_SHARED;
|
|
18
|
-
const SCARD_PROTOCOL_T0 = addon.SCARD_PROTOCOL_T0;
|
|
19
|
-
const SCARD_PROTOCOL_T1 = addon.SCARD_PROTOCOL_T1;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @typedef {Object} ReaderState
|
|
23
|
-
* @property {boolean} hasCard
|
|
24
|
-
* @property {Card|null} card
|
|
25
|
-
*/
|
|
26
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Devices = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const addon = require('../../build/Release/smartcard_napi.node');
|
|
27
6
|
/**
|
|
28
7
|
* High-level event-driven API for PC/SC devices
|
|
29
8
|
*
|
|
@@ -36,24 +15,37 @@ const SCARD_PROTOCOL_T1 = addon.SCARD_PROTOCOL_T1;
|
|
|
36
15
|
* - 'card-inserted': Emitted when a card is inserted
|
|
37
16
|
* - 'card-removed': Emitted when a card is removed
|
|
38
17
|
* - 'error': Emitted on errors
|
|
39
|
-
*
|
|
40
|
-
* @extends EventEmitter
|
|
41
18
|
*/
|
|
42
|
-
class Devices extends EventEmitter {
|
|
43
|
-
|
|
19
|
+
class Devices extends events_1.EventEmitter {
|
|
20
|
+
_monitor = null;
|
|
21
|
+
_context = null;
|
|
22
|
+
_running = false;
|
|
23
|
+
_readers = new Map();
|
|
24
|
+
_eventQueue = Promise.resolve();
|
|
25
|
+
// Dependencies (can be injected for testing)
|
|
26
|
+
_Context;
|
|
27
|
+
_ReaderMonitor;
|
|
28
|
+
_SCARD_STATE_PRESENT;
|
|
29
|
+
_SCARD_SHARE_SHARED;
|
|
30
|
+
_SCARD_PROTOCOL_T0;
|
|
31
|
+
_SCARD_PROTOCOL_T1;
|
|
32
|
+
/**
|
|
33
|
+
* Create a new Devices instance
|
|
34
|
+
* @param options Optional dependencies for testing
|
|
35
|
+
*/
|
|
36
|
+
constructor(options) {
|
|
44
37
|
super();
|
|
45
|
-
|
|
46
|
-
this.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
38
|
+
this._Context = options?.Context ?? addon.Context;
|
|
39
|
+
this._ReaderMonitor = options?.ReaderMonitor ?? addon.ReaderMonitor;
|
|
40
|
+
this._SCARD_STATE_PRESENT =
|
|
41
|
+
options?.SCARD_STATE_PRESENT ?? addon.SCARD_STATE_PRESENT;
|
|
42
|
+
this._SCARD_SHARE_SHARED =
|
|
43
|
+
options?.SCARD_SHARE_SHARED ?? addon.SCARD_SHARE_SHARED;
|
|
44
|
+
this._SCARD_PROTOCOL_T0 =
|
|
45
|
+
options?.SCARD_PROTOCOL_T0 ?? addon.SCARD_PROTOCOL_T0;
|
|
46
|
+
this._SCARD_PROTOCOL_T1 =
|
|
47
|
+
options?.SCARD_PROTOCOL_T1 ?? addon.SCARD_PROTOCOL_T1;
|
|
55
48
|
}
|
|
56
|
-
|
|
57
49
|
/**
|
|
58
50
|
* Start monitoring for device changes
|
|
59
51
|
*/
|
|
@@ -61,64 +53,59 @@ class Devices extends EventEmitter {
|
|
|
61
53
|
if (this._running) {
|
|
62
54
|
return;
|
|
63
55
|
}
|
|
64
|
-
|
|
65
56
|
try {
|
|
66
57
|
// Create context for card connections
|
|
67
|
-
this._context = new
|
|
68
|
-
|
|
58
|
+
this._context = new this._Context();
|
|
69
59
|
// Create native monitor
|
|
70
|
-
this._monitor = new
|
|
60
|
+
this._monitor = new this._ReaderMonitor();
|
|
71
61
|
this._running = true;
|
|
72
|
-
|
|
73
62
|
// Start native monitoring with callback
|
|
74
63
|
this._monitor.start((event) => {
|
|
75
64
|
this._handleEvent(event);
|
|
76
65
|
});
|
|
77
|
-
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
78
68
|
this.emit('error', err);
|
|
79
69
|
}
|
|
80
70
|
}
|
|
81
|
-
|
|
82
71
|
/**
|
|
83
72
|
* Stop monitoring
|
|
84
73
|
*/
|
|
85
74
|
stop() {
|
|
86
75
|
this._running = false;
|
|
87
|
-
|
|
88
76
|
if (this._monitor) {
|
|
89
77
|
try {
|
|
90
78
|
this._monitor.stop();
|
|
91
|
-
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
92
81
|
// Ignore stop errors
|
|
93
82
|
}
|
|
94
83
|
this._monitor = null;
|
|
95
84
|
}
|
|
96
|
-
|
|
97
85
|
// Disconnect any connected cards
|
|
98
|
-
for (const [
|
|
86
|
+
for (const [, state] of this._readers) {
|
|
99
87
|
if (state.card) {
|
|
100
88
|
try {
|
|
101
89
|
state.card.disconnect();
|
|
102
|
-
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
103
92
|
// Ignore disconnect errors
|
|
104
93
|
}
|
|
105
94
|
}
|
|
106
95
|
}
|
|
107
96
|
this._readers.clear();
|
|
108
|
-
|
|
109
97
|
if (this._context) {
|
|
110
98
|
try {
|
|
111
99
|
this._context.close();
|
|
112
|
-
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
113
102
|
// Ignore close errors
|
|
114
103
|
}
|
|
115
104
|
this._context = null;
|
|
116
105
|
}
|
|
117
106
|
}
|
|
118
|
-
|
|
119
107
|
/**
|
|
120
108
|
* List currently known readers
|
|
121
|
-
* @returns {Reader[]} Array of readers
|
|
122
109
|
*/
|
|
123
110
|
listReaders() {
|
|
124
111
|
if (!this._context || !this._context.isValid) {
|
|
@@ -126,63 +113,48 @@ class Devices extends EventEmitter {
|
|
|
126
113
|
}
|
|
127
114
|
try {
|
|
128
115
|
return this._context.listReaders();
|
|
129
|
-
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
130
118
|
return [];
|
|
131
119
|
}
|
|
132
120
|
}
|
|
133
|
-
|
|
134
121
|
/**
|
|
135
122
|
* Handle events from native monitor
|
|
136
123
|
* Queues events to prevent race conditions when multiple events arrive concurrently
|
|
137
|
-
* @param {MonitorEvent} event
|
|
138
124
|
*/
|
|
139
125
|
_handleEvent(event) {
|
|
140
126
|
// Chain this event onto the queue to serialize processing
|
|
141
127
|
this._eventQueue = this._eventQueue.then(() => this._processEvent(event));
|
|
142
128
|
}
|
|
143
|
-
|
|
144
129
|
/**
|
|
145
130
|
* Process a single event (called sequentially via queue)
|
|
146
|
-
* @param {MonitorEvent} event
|
|
147
|
-
* @returns {Promise<void>}
|
|
148
131
|
*/
|
|
149
132
|
async _processEvent(event) {
|
|
150
133
|
if (!this._running) {
|
|
151
134
|
return;
|
|
152
135
|
}
|
|
153
|
-
|
|
154
136
|
const { type, reader: readerName, state, atr } = event;
|
|
155
|
-
|
|
156
137
|
switch (type) {
|
|
157
138
|
case 'reader-attached':
|
|
158
139
|
await this._handleReaderAttached(readerName, state, atr);
|
|
159
140
|
break;
|
|
160
|
-
|
|
161
141
|
case 'reader-detached':
|
|
162
142
|
this._handleReaderDetached(readerName);
|
|
163
143
|
break;
|
|
164
|
-
|
|
165
144
|
case 'card-inserted':
|
|
166
145
|
await this._handleCardInserted(readerName, state, atr);
|
|
167
146
|
break;
|
|
168
|
-
|
|
169
147
|
case 'card-removed':
|
|
170
148
|
this._handleCardRemoved(readerName);
|
|
171
149
|
break;
|
|
172
|
-
|
|
173
150
|
case 'error':
|
|
174
151
|
// readerName contains error message for error events
|
|
175
152
|
this.emit('error', new Error(readerName));
|
|
176
153
|
break;
|
|
177
154
|
}
|
|
178
155
|
}
|
|
179
|
-
|
|
180
156
|
/**
|
|
181
157
|
* Handle reader attached
|
|
182
|
-
* @param {string} readerName
|
|
183
|
-
* @param {number} state
|
|
184
|
-
* @param {Buffer|null} atr
|
|
185
|
-
* @returns {Promise<void>}
|
|
186
158
|
*/
|
|
187
159
|
async _handleReaderAttached(readerName, state, atr) {
|
|
188
160
|
// Initialize reader state
|
|
@@ -190,46 +162,33 @@ class Devices extends EventEmitter {
|
|
|
190
162
|
hasCard: false,
|
|
191
163
|
card: null,
|
|
192
164
|
});
|
|
193
|
-
|
|
194
165
|
// Create a reader-like object for the event
|
|
195
166
|
const reader = {
|
|
196
167
|
name: readerName,
|
|
197
168
|
state: state,
|
|
198
169
|
atr: atr,
|
|
199
170
|
};
|
|
200
|
-
|
|
201
171
|
this.emit('reader-attached', reader);
|
|
202
|
-
|
|
203
172
|
// Check if card is already present
|
|
204
|
-
if ((state &
|
|
173
|
+
if ((state & this._SCARD_STATE_PRESENT) !== 0) {
|
|
205
174
|
await this._handleCardInserted(readerName, state, atr);
|
|
206
175
|
}
|
|
207
176
|
}
|
|
208
|
-
|
|
209
177
|
/**
|
|
210
178
|
* Handle reader detached
|
|
211
|
-
* @param {string} readerName
|
|
212
179
|
*/
|
|
213
180
|
_handleReaderDetached(readerName) {
|
|
214
181
|
const state = this._readers.get(readerName);
|
|
215
|
-
|
|
216
182
|
// If card was connected, emit card-removed first
|
|
217
183
|
if (state && state.hasCard) {
|
|
218
184
|
this._handleCardRemoved(readerName);
|
|
219
185
|
}
|
|
220
|
-
|
|
221
186
|
this._readers.delete(readerName);
|
|
222
|
-
|
|
223
187
|
const reader = { name: readerName };
|
|
224
188
|
this.emit('reader-detached', reader);
|
|
225
189
|
}
|
|
226
|
-
|
|
227
190
|
/**
|
|
228
191
|
* Handle card inserted
|
|
229
|
-
* @param {string} readerName
|
|
230
|
-
* @param {number} eventState
|
|
231
|
-
* @param {Buffer|null} atr
|
|
232
|
-
* @returns {Promise<void>}
|
|
233
192
|
*/
|
|
234
193
|
async _handleCardInserted(readerName, eventState, atr) {
|
|
235
194
|
let state = this._readers.get(readerName);
|
|
@@ -237,77 +196,79 @@ class Devices extends EventEmitter {
|
|
|
237
196
|
state = { hasCard: false, card: null };
|
|
238
197
|
this._readers.set(readerName, state);
|
|
239
198
|
}
|
|
240
|
-
|
|
241
199
|
state.hasCard = true;
|
|
242
|
-
|
|
243
200
|
// Try to connect to the card
|
|
244
201
|
try {
|
|
245
202
|
const readers = this._context.listReaders();
|
|
246
|
-
const reader = readers.find(r => r.name === readerName);
|
|
247
|
-
|
|
203
|
+
const reader = readers.find((r) => r.name === readerName);
|
|
248
204
|
if (reader) {
|
|
249
205
|
let card;
|
|
250
206
|
try {
|
|
251
207
|
// First try with both T=0 and T=1 protocols
|
|
252
|
-
card = await reader.connect(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
);
|
|
256
|
-
} catch (dualProtocolErr) {
|
|
208
|
+
card = await reader.connect(this._SCARD_SHARE_SHARED, this._SCARD_PROTOCOL_T0 | this._SCARD_PROTOCOL_T1);
|
|
209
|
+
}
|
|
210
|
+
catch (dualProtocolErr) {
|
|
257
211
|
// If dual protocol fails (e.g., SCARD_W_UNRESPONSIVE_CARD),
|
|
258
212
|
// fallback to T=0 only (issue #34)
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
} else {
|
|
213
|
+
const err = dualProtocolErr;
|
|
214
|
+
if (err.message &&
|
|
215
|
+
err.message.toLowerCase().includes('unresponsive')) {
|
|
216
|
+
card = await reader.connect(this._SCARD_SHARE_SHARED, this._SCARD_PROTOCOL_T0);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
266
219
|
// Re-throw if it's a different error
|
|
267
220
|
throw dualProtocolErr;
|
|
268
221
|
}
|
|
269
222
|
}
|
|
270
|
-
|
|
271
223
|
state.card = card;
|
|
272
|
-
|
|
273
224
|
this.emit('card-inserted', {
|
|
274
225
|
reader: { name: readerName, state: eventState, atr: atr },
|
|
275
226
|
card: card,
|
|
276
227
|
});
|
|
277
228
|
}
|
|
278
|
-
}
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
279
231
|
// Emit error but don't fail
|
|
280
232
|
this.emit('error', err);
|
|
281
233
|
}
|
|
282
234
|
}
|
|
283
|
-
|
|
284
235
|
/**
|
|
285
236
|
* Handle card removed
|
|
286
|
-
* @param {string} readerName
|
|
287
237
|
*/
|
|
288
238
|
_handleCardRemoved(readerName) {
|
|
289
239
|
const state = this._readers.get(readerName);
|
|
290
240
|
if (!state) {
|
|
291
241
|
return;
|
|
292
242
|
}
|
|
293
|
-
|
|
294
243
|
const card = state.card;
|
|
295
244
|
state.hasCard = false;
|
|
296
245
|
state.card = null;
|
|
297
|
-
|
|
298
246
|
if (card) {
|
|
299
247
|
try {
|
|
300
248
|
card.disconnect();
|
|
301
|
-
}
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
302
251
|
// Ignore - card is already removed
|
|
303
252
|
}
|
|
304
253
|
}
|
|
305
|
-
|
|
306
254
|
this.emit('card-removed', {
|
|
307
255
|
reader: { name: readerName },
|
|
308
256
|
card: card,
|
|
309
257
|
});
|
|
310
258
|
}
|
|
259
|
+
// Type-safe event emitter overrides
|
|
260
|
+
on(event, listener) {
|
|
261
|
+
return super.on(event, listener);
|
|
262
|
+
}
|
|
263
|
+
once(event, listener) {
|
|
264
|
+
return super.once(event, listener);
|
|
265
|
+
}
|
|
266
|
+
off(event, listener) {
|
|
267
|
+
return super.off(event, listener);
|
|
268
|
+
}
|
|
269
|
+
emit(event, ...args) {
|
|
270
|
+
return super.emit(event, ...args);
|
|
271
|
+
}
|
|
311
272
|
}
|
|
312
|
-
|
|
313
|
-
|
|
273
|
+
exports.Devices = Devices;
|
|
274
|
+
//# sourceMappingURL=devices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../lib/devices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for PC/SC errors
|
|
3
|
+
*/
|
|
4
|
+
export declare class PCSCError extends Error {
|
|
5
|
+
readonly code: number;
|
|
6
|
+
constructor(message: string, code: number);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Error thrown when a card is removed during an operation
|
|
10
|
+
*/
|
|
11
|
+
export declare class CardRemovedError extends PCSCError {
|
|
12
|
+
constructor(message?: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when an operation times out
|
|
16
|
+
*/
|
|
17
|
+
export declare class TimeoutError extends PCSCError {
|
|
18
|
+
constructor(message?: string);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Error thrown when no readers are available
|
|
22
|
+
*/
|
|
23
|
+
export declare class NoReadersError extends PCSCError {
|
|
24
|
+
constructor(message?: string);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Error thrown when PC/SC service is not running
|
|
28
|
+
*/
|
|
29
|
+
export declare class ServiceNotRunningError extends PCSCError {
|
|
30
|
+
constructor(message?: string);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Error thrown when there's a sharing violation
|
|
34
|
+
*/
|
|
35
|
+
export declare class SharingViolationError extends PCSCError {
|
|
36
|
+
constructor(message?: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Factory function to create the appropriate error class based on PC/SC error code
|
|
40
|
+
*/
|
|
41
|
+
export declare function createPCSCError(message: string, code: number): PCSCError;
|
|
42
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../lib/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM5C;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;gBAC/B,OAAO,SAAqB;CAI3C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,SAAS;gBAC3B,OAAO,SAAwB;CAI9C;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,SAAS;gBAC7B,OAAO,SAAyB;CAI/C;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;gBACrC,OAAO,SAA8B;CAIpD;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,SAAS;gBACpC,OAAO,SAAuC;CAI7D;AAeD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAMxE"}
|