{"_id":"@brynrgnzls/nfc-listener","_rev":"3-129070fdb3c86c3d715d8767f39eef0c","name":"@brynrgnzls/nfc-listener","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@brynrgnzls/nfc-listener","version":"1.0.0","keywords":["socket.io","nfc","card","uid","realtime"],"author":{"name":"Bryan Gonzales"},"license":"MIT","_id":"@brynrgnzls/nfc-listener@1.0.0","maintainers":[{"name":"brynrgnzls","email":"brynrgnzls@gmail.com"}],"dist":{"shasum":"062f9a8dca6667a7229d0e344b17527c6e2c3891","tarball":"https://registry.npmjs.org/@brynrgnzls/nfc-listener/-/nfc-listener-1.0.0.tgz","fileCount":5,"integrity":"sha512-l1Sg0y25x1hRuVAZZ7Wjyzn16FJU7ItbESw1XigcmPkbEGRm6ptb7sksHc+mQAoIa67k+7fOwpYWqB4UeyvH5Q==","signatures":[{"sig":"MEUCIQD0+bCYWvgnudiwfzZkwOxCGxDXzXcbQrI4drk59auqVgIgDNzdFKK69Ft4kKhZTd6zvanOdTYr1dHxn9di4CpL1+k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2979},"main":"./dist/index.js","type":"module","_from":"file:brynrgnzls-nfc-listener-1.0.0.tgz","types":"./dist/index.d.ts","scripts":{"build":"tsc"},"_npmUser":{"name":"brynrgnzls","email":"brynrgnzls@gmail.com"},"_resolved":"C:\\Users\\brynr\\AppData\\Local\\Temp\\36609baf630c9922fa2f7004b3cd9adb\\brynrgnzls-nfc-listener-1.0.0.tgz","_integrity":"sha512-l1Sg0y25x1hRuVAZZ7Wjyzn16FJU7ItbESw1XigcmPkbEGRm6ptb7sksHc+mQAoIa67k+7fOwpYWqB4UeyvH5Q==","_npmVersion":"10.9.2","description":"Bataeno Pass-Socket IO NFC listener","directories":{},"_nodeVersion":"22.14.0","dependencies":{"socket.io-client":"^4.8.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^24.9.1"},"_npmOperationalInternal":{"tmp":"tmp/nfc-listener_1.0.0_1761097752479_0.5708356892907847","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@brynrgnzls/nfc-listener","version":"1.0.1","keywords":["socket.io","nfc","card","uid","realtime"],"author":{"name":"Bryan Gonzales"},"license":"MIT","_id":"@brynrgnzls/nfc-listener@1.0.1","maintainers":[{"name":"brynrgnzls","email":"brynrgnzls@gmail.com"}],"dist":{"shasum":"a507c47bfb0c7a6f6e73a1ef189288d2c16022b6","tarball":"https://registry.npmjs.org/@brynrgnzls/nfc-listener/-/nfc-listener-1.0.1.tgz","fileCount":6,"integrity":"sha512-ESC40kyWc4k8PqrF6LuCe1ZKLrBrSdahB1BhWekOBC2pWhLIOjcBUxcX1mZIdrmAJ4DopmxV/tYQ18CwrUicZQ==","signatures":[{"sig":"MEYCIQCTUGsR9nc1WsxoZovq6Neq61/2KB87eC4oNhQu7Sek6wIhAKwn9OuOHNSgx9wv5qZmACs3pzoWVWjcHPVsy/i520fy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5754},"main":"./dist/index.js","type":"module","_from":"file:brynrgnzls-nfc-listener-1.0.1.tgz","types":"./dist/index.d.ts","scripts":{"build":"tsc"},"_npmUser":{"name":"brynrgnzls","email":"brynrgnzls@gmail.com"},"_resolved":"C:\\Users\\brynr\\AppData\\Local\\Temp\\d0fdc3364004c043c51ba04aab871f97\\brynrgnzls-nfc-listener-1.0.1.tgz","_integrity":"sha512-ESC40kyWc4k8PqrF6LuCe1ZKLrBrSdahB1BhWekOBC2pWhLIOjcBUxcX1mZIdrmAJ4DopmxV/tYQ18CwrUicZQ==","_npmVersion":"10.9.2","description":"Bataeno Pass-Socket IO NFC listener","directories":{},"_nodeVersion":"22.14.0","dependencies":{"socket.io-client":"^4.8.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^24.9.1"},"_npmOperationalInternal":{"tmp":"tmp/nfc-listener_1.0.1_1761103310714_0.7909919692210938","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@brynrgnzls/nfc-listener","version":"1.0.2","description":"Bataeno Pass-Socket IO NFC listener","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"tsc","prepublishOnly":"pnpm run build"},"keywords":["socket.io","nfc","card","uid","realtime"],"author":{"name":"Bryan Gonzales"},"license":"MIT","packageManager":"pnpm@10.9.0","dependencies":{"socket.io-client":"^4.8.1"},"devDependencies":{"@types/node":"^24.9.1","typescript":"^5.9.3"},"_id":"@brynrgnzls/nfc-listener@1.0.2","_nodeVersion":"24.3.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-RIOEHJaEpfbfOAcHrBuVT0ALrISc6oBeOEBKN1fuWRcwW0ZAe46SefhnhVzve8INWrTloNsO+Z4gjZDUWpvITA==","shasum":"eda4802fcb49037faac434efc3755274624e72f0","tarball":"https://registry.npmjs.org/@brynrgnzls/nfc-listener/-/nfc-listener-1.0.2.tgz","fileCount":6,"unpackedSize":5835,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC13s8Oprk7Z12OShLqrd8reHpGLpGotATnyV8FFY2qXwIgONsXq/Ca0JkjTRCAGKsf63jw2wQmeOSGmzgLdUmLQ9w="}]},"_npmUser":{"name":"brynrgnzls","email":"brynrgnzls@gmail.com"},"directories":{},"maintainers":[{"name":"brynrgnzls","email":"brynrgnzls@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nfc-listener_1.0.2_1761111622418_0.859118947799574"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-22T01:49:12.371Z","modified":"2025-10-22T05:40:22.835Z","1.0.0":"2025-10-22T01:49:12.675Z","1.0.1":"2025-10-22T03:21:50.908Z","1.0.2":"2025-10-22T05:40:22.616Z"},"author":{"name":"Bryan Gonzales"},"license":"MIT","keywords":["socket.io","nfc","card","uid","realtime"],"description":"Bataeno Pass-Socket IO NFC listener","maintainers":[{"name":"brynrgnzls","email":"brynrgnzls@gmail.com"}],"readme":"# 📡 @bryan/nfc-listener\r\n\r\nA lightweight Socket.IO-based NFC listener for JavaScript/TypeScript projects.  \r\nWorks with any frontend framework and provides real-time events for NFC card readers and UID verification.\r\n\r\n---\r\n\r\n## 🚀 Features\r\n\r\n- Connects to any Socket.IO endpoint using WebSocket transport\r\n- Listens for Card UID and Verified UID events\r\n- Handles connection and disconnection\r\n- Tracks reader connect/disconnect events\r\n- Handles read errors gracefully\r\n- Framework-agnostic: works with React, Next.js, Vue, Angular, plain JS\r\n\r\n---\r\n\r\n## 📦 Installation\r\n\r\n```bash\r\n# Using npm\r\nnpm install @bryan/nfc-listener\r\n\r\n# Using pnpm\r\npnpm add @bryan/nfc-listener\r\n\r\n# Using yarn\r\nyarn add @bryan/nfc-listener\r\n\r\n\r\n# NFC Listener Standalone Page (React/Next.js)\r\n\r\nThis is a standalone page example using the `@bryan/nfc-listener` package with React/Next.js.\r\n```\r\n\r\n---\r\n\r\n## 🛠 Example Usage In React\r\n\r\n```tsx\r\n\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport { NfcHandler } from \"@brynrgnzls/nfc-listener\";\r\n\r\nconst SOCKET_URL = \"http://127.0.0.1:8000\";\r\n\r\nexport default function NfcPage() {\r\n  const [connected, setConnected] = useState(false);\r\n  const [cardUid, setCardUid] = useState<string | null>(null);\r\n  const [verifiedUid, setVerifiedUid] = useState<string | null>(null);\r\n  const [readerStatus, setReaderStatus] = useState<string[]>([]);\r\n  const [readErrors, setReadErrors] = useState<string[]>([]);\r\n\r\n  useEffect(() => {\r\n    const nfc = new NfcHandler(SOCKET_URL);\r\n\r\n    nfc.onConnect(() => setConnected(true));\r\n    nfc.onDisconnect(() => setConnected(false));\r\n    nfc.onCardUid((uid) => setCardUid(uid));\r\n    nfc.onVerifiedUid((uid) => setVerifiedUid(uid));\r\n    nfc.onReaderConnect((name) =>\r\n      setReaderStatus((prev) => [...prev, `${name} connected`])\r\n    );\r\n    nfc.onReaderDisconnect((name) =>\r\n      setReaderStatus((prev) => [...prev, `${name} disconnected`])\r\n    );\r\n    nfc.onReadError((err) => setReadErrors((prev) => [...prev, err]));\r\n\r\n    nfc.open();\r\n    return () => nfc.close();\r\n  }, []);\r\n\r\n  return (\r\n    <main>\r\n      <h1>NFC Listener Standalone Page</h1>\r\n      <p>Status: {connected ? \"Connected\" : \"Disconnected\"}</p>\r\n      <p>Last Card UID: {cardUid ?? \"None\"}</p>\r\n      <p>Last Verified UID: {verifiedUid ?? \"None\"}</p>\r\n\r\n      <h2>Reader Status</h2>\r\n      {readerStatus.length === 0 ? (\r\n        \"No reader events\"\r\n      ) : (\r\n        <ul>\r\n          {readerStatus.map((r, i) => (\r\n            <li key={i}>{r}</li>\r\n          ))}\r\n        </ul>\r\n      )}\r\n\r\n      <h2>Read Errors</h2>\r\n      {readErrors.length === 0 ? (\r\n        \"No errors\"\r\n      ) : (\r\n        <ul>\r\n          {readErrors.map((e, i) => (\r\n            <li key={i}>{e}</li>\r\n          ))}\r\n        </ul>\r\n      )}\r\n    </main>\r\n  );\r\n}\r\n```\r\n\r\n---\r\n","readmeFilename":"readme.md"}