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 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 12+ without recompilation. Built on N-API for long-term stability.
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 12, 14, 16, 18, 20, 22, 24+ without recompilation
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
- // @ts-check
2
- 'use strict';
3
-
4
- const EventEmitter = require('events');
5
- const addon = require('../build/Release/smartcard_napi.node');
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
- constructor() {
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
- /** @type {ReaderMonitorType|null} */
46
- this._monitor = null;
47
- /** @type {ContextType|null} */
48
- this._context = null;
49
- /** @type {boolean} */
50
- this._running = false;
51
- /** @type {Map<string, ReaderState>} */
52
- this._readers = new Map();
53
- /** @type {Promise<void>} Event queue to serialize event handling */
54
- this._eventQueue = Promise.resolve();
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 Context();
68
-
58
+ this._context = new this._Context();
69
59
  // Create native monitor
70
- this._monitor = new ReaderMonitor();
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
- } catch (err) {
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
- } catch (err) {
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 [name, state] of this._readers) {
86
+ for (const [, state] of this._readers) {
99
87
  if (state.card) {
100
88
  try {
101
89
  state.card.disconnect();
102
- } catch (err) {
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
- } catch (err) {
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
- } catch (err) {
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 & SCARD_STATE_PRESENT) !== 0) {
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
- SCARD_SHARE_SHARED,
254
- SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1
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
- if (dualProtocolErr.message &&
260
- dualProtocolErr.message.toLowerCase().includes('unresponsive')) {
261
- card = await reader.connect(
262
- SCARD_SHARE_SHARED,
263
- SCARD_PROTOCOL_T0
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
- } catch (err) {
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
- } catch (err) {
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
- module.exports = { Devices };
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":";;;AAAA,mCAAsC;AAatC,MAAM,KAAK,GAAG,OAAO,CAAC,yCAAyC,CAO9D,CAAC;AAOF;;;;;;;;;;;;GAYG;AACH,MAAa,OAAQ,SAAQ,qBAAY;IAC7B,QAAQ,GAAyB,IAAI,CAAC;IACtC,QAAQ,GAAmB,IAAI,CAAC;IAChC,QAAQ,GAAG,KAAK,CAAC;IACjB,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IAClD,WAAW,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEvD,6CAA6C;IACrC,QAAQ,CAAqB;IAC7B,cAAc,CAA2B;IACzC,oBAAoB,CAAS;IAC7B,mBAAmB,CAAS;IAC5B,kBAAkB,CAAS;IAC3B,kBAAkB,CAAS;IAEnC;;;OAGG;IACH,YAAY,OAAwB;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC;QACpE,IAAI,CAAC,oBAAoB;YACrB,OAAO,EAAE,mBAAmB,IAAI,KAAK,CAAC,mBAAmB,CAAC;QAC9D,IAAI,CAAC,mBAAmB;YACpB,OAAO,EAAE,kBAAkB,IAAI,KAAK,CAAC,kBAAkB,CAAC;QAC5D,IAAI,CAAC,kBAAkB;YACnB,OAAO,EAAE,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,CAAC;QAC1D,IAAI,CAAC,kBAAkB;YACnB,OAAO,EAAE,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,sCAAsC;YACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEpC,wBAAwB;YACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,wCAAwC;YACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAmB,EAAE,EAAE;gBACxC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAY,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;QACA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACL,qBAAqB;YACzB,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,iCAAiC;QACjC,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,IAAI,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACL,2BAA2B;gBAC/B,CAAC;YACL,CAAC;QACL,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACL,sBAAsB;YAC1B,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW;QACP,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,YAAY,CAAC,KAAmB;QACpC,0DAA0D;QAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC5B,CAAC;IACN,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,KAAmB;QAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;QAEvD,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,iBAAiB;gBAClB,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBACzD,MAAM;YAEV,KAAK,iBAAiB;gBAClB,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;gBACvC,MAAM;YAEV,KAAK,eAAe;gBAChB,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBACvD,MAAM;YAEV,KAAK,cAAc;gBACf,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBACpC,MAAM;YAEV,KAAK,OAAO;gBACR,qDAAqD;gBACrD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1C,MAAM;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAC/B,UAAkB,EAClB,KAAa,EACb,GAAkB;QAElB,0BAA0B;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE;YAC1B,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,MAAM,GAAG;YACX,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,GAAG;SACX,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAErC,mCAAmC;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,UAAkB;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE5C,iDAAiD;QACjD,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC7B,UAAkB,EAClB,UAAkB,EAClB,GAAkB;QAElB,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,KAAK,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QAErB,6BAA6B;QAC7B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAS,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAE1D,IAAI,MAAM,EAAE,CAAC;gBACT,IAAI,IAAU,CAAC;gBACf,IAAI,CAAC;oBACD,4CAA4C;oBAC5C,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CACvB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CACpD,CAAC;gBACN,CAAC;gBAAC,OAAO,eAAe,EAAE,CAAC;oBACvB,4DAA4D;oBAC5D,mCAAmC;oBACnC,MAAM,GAAG,GAAG,eAAwB,CAAC;oBACrC,IACI,GAAG,CAAC,OAAO;wBACX,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,EACpD,CAAC;wBACC,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CACvB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,kBAAkB,CAC1B,CAAC;oBACN,CAAC;yBAAM,CAAC;wBACJ,qCAAqC;wBACrC,MAAM,eAAe,CAAC;oBAC1B,CAAC;gBACL,CAAC;gBAED,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;gBAElB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBACvB,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE;oBACzD,IAAI,EAAE,IAAI;iBACb,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,4BAA4B;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAY,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,UAAkB;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAElB,IAAI,IAAI,EAAE,CAAC;YACP,IAAI,CAAC;gBACD,IAAI,CAAC,UAAU,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACL,mCAAmC;YACvC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;YAC5B,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;IACP,CAAC;IAED,oCAAoC;IACpC,EAAE,CACE,KAAQ,EACR,QAAyB;QAEzB,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CACA,KAAQ,EACR,QAAyB;QAEzB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CACC,KAAQ,EACR,QAAyB;QAEzB,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CACA,KAAQ,EACR,GAAG,IAAiC;QAEpC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;CACJ;AA3TD,0BA2TC"}
@@ -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"}