diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..f6ac7ed --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/dictionaries/pokusew.xml b/.idea/dictionaries/pokusew.xml index ac8d182..9a90d44 100644 --- a/.idea/dictionaries/pokusew.xml +++ b/.idea/dictionaries/pokusew.xml @@ -1,6 +1,7 @@ + pcsc pcsclite diff --git a/README.md b/README.md index 3bbb1bb..249da8c 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,9 @@ Emitted whenever a new card reader is detected. It frees the resources associated with this PCSCLite instance. At a low level it calls [`SCardCancel`](https://pcsclite.alioth.debian.org/api/group__API.html#gaacbbc0c6d6c0cbbeb4f4debf6fbeeee6) so it stops watching for new readers. +#### pcsclite.readers + +An object containing all detected readers by name. Updated as readers are attached and removed. ### Class: CardReader diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..53e26b8 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,111 @@ +import { EventEmitter } from "events"; + +type ConnectOptions = { + share_mode?: number; + protocol?: number; +}; + +type Status = { + atr?: Buffer; + state: number; +}; + +type AnyOrNothing = any | undefined | null; + +interface PCSCLite extends EventEmitter { + on(type: "error", listener: (error: any) => void): this; + + once(type: "error", listener: (error: any) => void): this; + + on(type: "reader", listener: (reader: CardReader) => void): this; + + once(type: "reader", listener: (reader: CardReader) => void): this; + + close(): void; +} + +interface CardReader extends EventEmitter { + // Share Mode + SCARD_SHARE_SHARED: number; + SCARD_SHARE_EXCLUSIVE: number; + SCARD_SHARE_DIRECT: number; + // Protocol + SCARD_PROTOCOL_T0: number; + SCARD_PROTOCOL_T1: number; + SCARD_PROTOCOL_RAW: number; + // State + SCARD_STATE_UNAWARE: number; + SCARD_STATE_IGNORE: number; + SCARD_STATE_CHANGED: number; + SCARD_STATE_UNKNOWN: number; + SCARD_STATE_UNAVAILABLE: number; + SCARD_STATE_EMPTY: number; + SCARD_STATE_PRESENT: number; + SCARD_STATE_ATRMATCH: number; + SCARD_STATE_EXCLUSIVE: number; + SCARD_STATE_INUSE: number; + SCARD_STATE_MUTE: number; + // Disconnect disposition + SCARD_LEAVE_CARD: number; + SCARD_RESET_CARD: number; + SCARD_UNPOWER_CARD: number; + SCARD_EJECT_CARD: number; + name: string; + state: number; + connected: boolean; + + on(type: "error", listener: (this: CardReader, error: any) => void): this; + + once(type: "error", listener: (this: CardReader, error: any) => void): this; + + on(type: "end", listener: (this: CardReader) => void): this; + + once(type: "end", listener: (this: CardReader) => void): this; + + on( + type: "status", + listener: (this: CardReader, status: Status) => void + ): this; + + once( + type: "status", + listener: (this: CardReader, status: Status) => void + ): this; + + SCARD_CTL_CODE(code: number): number; + + get_status( + cb: (err: AnyOrNothing, state: number, atr?: Buffer) => void + ): void; + + connect(callback: (err: AnyOrNothing, protocol: number) => void): void; + + connect( + options: ConnectOptions, + callback: (err: AnyOrNothing, protocol: number) => void + ): void; + + disconnect(callback: (err: AnyOrNothing) => void): void; + + disconnect(disposition: number, callback: (err: AnyOrNothing) => void): void; + + transmit( + data: Buffer, + res_len: number, + protocol: number, + cb: (err: AnyOrNothing, response: Buffer) => void + ): void; + + control( + data: Buffer, + control_code: number, + res_len: number, + cb: (err: AnyOrNothing, response: Buffer) => void + ): void; + + close(): void; +} + +declare function pcsc(): PCSCLite; + +export = pcsc; diff --git a/lib/pcsclite.js b/lib/pcsclite.js index 65c23a3..d66d75c 100644 --- a/lib/pcsclite.js +++ b/lib/pcsclite.js @@ -45,6 +45,8 @@ module.exports = function () { const p = new PCSCLite(); + p.readers = readers; + process.nextTick(function () { p.start(function (err, data) {