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) {