@spencerls/react-native-nfc 1.0.8 → 1.0.10
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/API.md +430 -32
- package/README.md +174 -47
- package/dist/index.d.mts +179 -139
- package/dist/index.d.ts +179 -139
- package/dist/index.js +500 -328
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +497 -329
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/nfc/a/index.ts","../src/nfc/a/operations.ts","../src/nfc/service.ts","../src/nfc/a/utils.ts","../src/nfc/v/index.ts","../src/nfc/v/operations.ts","../src/nfc/v/internal.ts","../src/nfc/v/utils.ts","../src/nfc/ndef/index.ts","../src/nfc/ndef/operations.ts","../src/nfc/ndef/utils.ts","../src/nfc/namespace.ts","../src/react/nfc-provider.tsx","../src/react/use-nfc.ts","../src/react/use-nfc-reader.ts","../src/react/use-nfc-state.ts","../src/react/use-nfc-technology.ts"],"sourcesContent":["export * from \"./nfc\";\r\nexport * from \"./react\";\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager, { NfcTech } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async transceive(data: number[]) {\r\n return nfcService.withTechnology(NfcTech.NfcA, async () => {\r\n return await NfcManager.transceive(data);\r\n });\r\n },\r\n};\r\n","import { Platform } from \"react-native\";\r\nimport NfcManager, {\r\n NfcEvents,\r\n type NfcTech,\r\n type TagEvent,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport type { NfcMode, NfcState } from \"./types\";\r\n\r\nexport type NfcListener = (state: NfcState) => void;\r\n\r\nexport class NfcService {\r\n private state: NfcState = { mode: \"idle\", tag: null };\r\n private listeners = new Set<NfcListener>();\r\n\r\n private isProcessingTag = false;\r\n private currentOnTag?: (tag: TagEvent) => Promise<void> | void;\r\n private currentCooldownMs = 1500;\r\n private cooldownTimer?: ReturnType<typeof setTimeout>;\r\n\r\n private readerModeFlags_ANDROID: number | null = null;\r\n\r\n constructor() {\r\n NfcManager.start();\r\n }\r\n\r\n enableReaderMode_ANDROID(flags: number) {\r\n if (Platform.OS !== \"android\") return;\r\n this.readerModeFlags_ANDROID = flags;\r\n }\r\n\r\n // -----------------------------\r\n // Internal state management\r\n // -----------------------------\r\n private setState(partial: Partial<NfcState>) {\r\n this.state = { ...this.state, ...partial };\r\n for (const listener of this.listeners) listener(this.state);\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n subscribe(fn: NfcListener) {\r\n this.listeners.add(fn);\r\n fn(this.state); // emit immediately\r\n return () => {\r\n this.listeners.delete(fn);\r\n };\r\n }\r\n\r\n // -----------------------------\r\n // START READER (Soft Continuous Mode)\r\n // -----------------------------\r\n async startReader(\r\n onTag?: (tag: TagEvent) => Promise<void> | void,\r\n options?: { cooldownMs?: number },\r\n ) {\r\n if (this.state.mode !== \"idle\") {\r\n console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);\r\n return;\r\n }\r\n\r\n this.currentOnTag = onTag;\r\n this.currentCooldownMs = options?.cooldownMs ?? 1500;\r\n this.isProcessingTag = false;\r\n\r\n this.setState({ mode: \"starting\", tag: null });\r\n\r\n // Tag listener\r\n NfcManager.setEventListener(\r\n NfcEvents.DiscoverTag,\r\n async (tag: TagEvent) => {\r\n if (!tag) return;\r\n\r\n // Prevent reprocessing until tag removed & cooldown completed\r\n if (this.isProcessingTag) return;\r\n\r\n this.isProcessingTag = true;\r\n this.setState({ tag, mode: \"active\" });\r\n\r\n try {\r\n await this.currentOnTag?.(tag);\r\n } catch (err) {\r\n console.warn(\"[NFC] onTag handler error:\", err);\r\n } finally {\r\n const cooldown = this.currentCooldownMs;\r\n\r\n // After cooldown, allow a new scan *only after tag is removed*\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n }\r\n this.cooldownTimer = setTimeout(() => {\r\n this.isProcessingTag = false;\r\n this.setState({ tag: null });\r\n this.cooldownTimer = undefined;\r\n }, cooldown);\r\n }\r\n },\r\n );\r\n\r\n // Start reader\r\n try {\r\n if (this.readerModeFlags_ANDROID) {\r\n await NfcManager.registerTagEvent({\r\n isReaderModeEnabled: true,\r\n readerModeFlags: this.readerModeFlags_ANDROID,\r\n });\r\n } else {\r\n await NfcManager.registerTagEvent();\r\n }\r\n\r\n if ((this.state.mode as NfcMode) === \"starting\") {\r\n this.setState({ mode: \"active\" });\r\n }\r\n } catch (err) {\r\n console.warn(\"[NFC] startReader error:\", err);\r\n this._resetReaderState();\r\n }\r\n }\r\n\r\n // -----------------------------\r\n // STOP READER (explicit only)\r\n // -----------------------------\r\n async stopReader() {\r\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\r\n\r\n this.setState({ mode: \"stopping\" });\r\n // Ignore any late tag events while we tear down the reader\r\n NfcManager.setEventListener(NfcEvents.DiscoverTag, () => {});\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n\r\n try {\r\n await NfcManager.unregisterTagEvent();\r\n } catch (err) {\r\n console.warn(\"[NFC] unregisterTagEvent error:\", err);\r\n }\r\n\r\n this._resetReaderState();\r\n }\r\n\r\n private _resetReaderState() {\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n this.setState({ mode: \"idle\", tag: null });\r\n this.currentOnTag = undefined;\r\n this.isProcessingTag = false;\r\n }\r\n\r\n // -----------------------------\r\n // Technology sessions (NDEF, NfcV, etc.)\r\n // -----------------------------\r\n async withTechnology<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n ): Promise<T> {\r\n if (this.state.mode === \"technology\") {\r\n throw new Error(\"[NFC] Technology is already in use!\");\r\n }\r\n\r\n if (this.readerModeFlags_ANDROID) {\r\n return this.withTechnologyReaderMode_ANDROID(\r\n tech,\r\n handler,\r\n this.readerModeFlags_ANDROID,\r\n );\r\n }\r\n\r\n // Stop reader before using tech session\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n const savedOnTag = this.currentOnTag;\r\n const savedCooldown = this.currentCooldownMs;\r\n\r\n if (readerWasActive) {\r\n await this.stopReader();\r\n }\r\n\r\n if (this.state.mode !== \"idle\") {\r\n throw new Error(\r\n `[NFC] Cannot start technology session in mode ${this.state.mode}`,\r\n );\r\n }\r\n\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await NfcManager.requestTechnology(tech, {\r\n alertMessage: \"Hold near NFC tag\",\r\n });\r\n\r\n const result = await handler();\r\n\r\n if (Platform.OS === \"ios\") {\r\n await NfcManager.setAlertMessageIOS(\"Success!\");\r\n }\r\n\r\n return result;\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new Error(`[NFC] withTechnology error: ${message}`);\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.setState({ mode: \"idle\", tag: null });\r\n\r\n // If reader was active before tech session, restart it automatically\r\n if (readerWasActive) {\r\n try {\r\n await this.startReader(savedOnTag, { cooldownMs: savedCooldown });\r\n } catch (err) {\r\n console.warn(\r\n \"[NFC] Failed to restart reader after tech session\",\r\n err,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async withTechnologyReaderMode_ANDROID<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n flags: number,\r\n ): Promise<T> {\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n\r\n // Keep reader mode active during tech request to avoid dispatch gap\r\n this.isProcessingTag = true;\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await NfcManager.requestTechnology(tech, {\r\n isReaderModeEnabled: true,\r\n readerModeFlags: flags,\r\n });\r\n\r\n return await handler();\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new Error(\r\n `[NFC] withTechnologyReaderMode_ANDROID error: ${message}`,\r\n );\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.isProcessingTag = false;\r\n this.setState({ mode: readerWasActive ? \"active\" : \"idle\" });\r\n }\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const nfcService = new NfcService();\r\n","export const utils = {};\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\nimport {\r\n getSystemInfoRaw,\r\n readBlockRaw,\r\n type StrictTagEvent,\r\n writeBlockRaw,\r\n} from \"./internal\";\r\nimport { utils } from \"./utils\";\r\n\r\nexport const operations = {\r\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\r\n return nfcService.withTechnology(utils.tech, async () => {\r\n const tag = await NfcManager.getTag();\r\n if (!tag?.id) throw new Error(\"No NFC-V tag detected\");\r\n return handler(tag as StrictTagEvent);\r\n });\r\n },\r\n\r\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\r\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\r\n },\r\n\r\n async readBlockNfcV(blockNumber: number) {\r\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\r\n },\r\n\r\n async getSystemInfoNfcV() {\r\n return this.withVTag((tag) => getSystemInfoRaw(tag));\r\n },\r\n};\r\n","import NfcManager, { type TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport { utils } from \"./utils\";\r\n\r\nexport type StrictTagEvent = TagEvent & {\r\n id: string;\r\n};\r\n\r\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildReadBlock(uid, blockNumber);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseReadResponse(resp);\r\n}\r\n\r\nexport async function writeBlockRaw(\r\n tag: StrictTagEvent,\r\n blockNumber: number,\r\n data: Uint8Array,\r\n) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseWriteResponse(resp);\r\n}\r\n\r\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildGetSystemInfo(uid);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseSystemInfo(resp);\r\n}\r\n","import { Platform } from \"react-native\";\r\nimport { NfcTech } from \"react-native-nfc-manager\";\r\n\r\n// Here's where things get REAL\r\n//\r\n// Only iPhone 7+ supports ISO15693; writing may require\r\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\r\n// transceive (depends on firmware)\r\n//\r\n// | Byte | Meaning |\r\n// | ------------- | ---------------------------------------------------- |\r\n// | `0x02` | Flags (high data rate) |\r\n// | `0x20` | Flags (addressed) |\r\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\r\n// | `0x20` | Command code: Read Single Block |\r\n// | `0x21` | Command code: Write Single Block |\r\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\r\n// | `blockNumber` | Which memory block to write |\r\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\r\n//\r\n// Each command is a byte array\r\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\r\n//\r\n// Tag response:\r\n// The tag response has this structure:\r\n//\r\n// | Byte | Meaning |\r\n// | ---- | --------------------------------------------- |\r\n// | `0` | **Status** (0x00 = success) |\r\n// | `1` | **Info Flags** |\r\n// | … | Data fields, conditional based on those flags |\r\n//\r\n// Info Flags bitmask:\r\n// | Bit | Hex | Meaning |\r\n// | --- | ---- | ------------------------------------------------------------- |\r\n// | 0 | 0x01 | DSFID present |\r\n// | 1 | 0x02 | AFI present |\r\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\r\n// | 3 | 0x08 | IC reference present |\r\n// | 4–7 | — | RFU (reserved) |\r\n\r\nexport const utils = {\r\n tech: Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : NfcTech.NfcV,\r\n\r\n Flags: {\r\n HIGH_DATA_RATE: 0x02,\r\n ADDRESSED: 0x20,\r\n // If needed later: OPTION: 0x40 (not commonly used)\r\n },\r\n\r\n Commands: {\r\n READ_SINGLE_BLOCK: 0x20,\r\n WRITE_SINGLE_BLOCK: 0x21,\r\n GET_SYSTEM_INFO: 0x2b,\r\n },\r\n\r\n /**\r\n * Combine multiple flag bits into one byte.\r\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\r\n */\r\n flags(...bits: number[]): number {\r\n return bits.reduce((acc, bit) => acc | bit, 0);\r\n },\r\n\r\n /**\r\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\r\n * ISO15693 requires reversed UID for addressed commands.\r\n */\r\n reverseUid(tagIdHex: string): number[] {\r\n const bytes = [];\r\n for (let i = 0; i < tagIdHex.length; i += 2) {\r\n bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));\r\n }\r\n return bytes;\r\n },\r\n\r\n /**\r\n * Build READ_SINGLE_BLOCK command.\r\n * FLAGS: addressed + high data rate by default.\r\n */\r\n buildReadBlock(uidReversed: number[], blockNumber: number): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.READ_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ];\r\n },\r\n\r\n /**\r\n * Build WRITE_SINGLE_BLOCK command.\r\n * Note: data must match the block size (usually 4 or 8 bytes).\r\n */\r\n buildWriteBlock(\r\n uidReversed: number[],\r\n blockNumber: number,\r\n data: Uint8Array,\r\n ): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.WRITE_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ...data,\r\n ];\r\n },\r\n\r\n /**\r\n * Build GET_SYSTEM_INFO command.\r\n */\r\n buildGetSystemInfo(uidReversed: number[]): number[] {\r\n return [this.Flags.HIGH_DATA_RATE, this.Commands.GET_SYSTEM_INFO];\r\n },\r\n\r\n /**\r\n * Parse a READ_SINGLE_BLOCK response.\r\n * Response format:\r\n * - byte[0] = status (0x00 = success)\r\n * - byte[1..] = block payload bytes\r\n */\r\n parseReadResponse(resp: number[]): Uint8Array {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Read failed. Status: 0x${status.toString(16)}`);\r\n }\r\n return new Uint8Array(resp.slice(1));\r\n },\r\n\r\n /**\r\n * Parse WRITE_SINGLE_BLOCK response.\r\n * Successful write has resp[0] === 0x00.\r\n */\r\n parseWriteResponse(resp: number[]): void {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Write failed. Status: 0x${status.toString(16)}`);\r\n }\r\n },\r\n\r\n /**\r\n * Parse GET_SYSTEM_INFO response.\r\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\r\n */\r\n parseSystemInfo(resp: number[]) {\r\n if (!resp || resp.length < 2) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined || status !== 0x00) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const flagsByte = resp[1];\r\n if (flagsByte === undefined) {\r\n throw new Error(\"Invalid System Info response: missing flags byte\");\r\n }\r\n\r\n const infoFlags = flagsByte & 0x0f;\r\n let offset = 2;\r\n\r\n const result: any = {};\r\n\r\n // UID (always present – next 8 bytes)\r\n if (resp.length >= offset + 8) {\r\n const uidBytes = resp.slice(offset, offset + 8);\r\n result.uid = uidBytes\r\n .slice()\r\n .reverse()\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\")\r\n .toUpperCase();\r\n offset += 8;\r\n }\r\n\r\n // DSFID\r\n if (infoFlags & 0x01 && resp.length > offset) {\r\n result.dsfid = resp[offset++];\r\n }\r\n\r\n // AFI\r\n if (infoFlags & 0x02 && resp.length > offset) {\r\n result.afi = resp[offset++];\r\n }\r\n\r\n // Memory size info\r\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\r\n const numBlocks = resp[offset++];\r\n const blkSize = resp[offset++];\r\n if (numBlocks !== undefined) {\r\n result.numberOfBlocks = numBlocks + 1;\r\n }\r\n if (blkSize !== undefined) {\r\n result.blockSize = blkSize + 1;\r\n }\r\n }\r\n\r\n // IC Reference\r\n if (infoFlags & 0x08 && resp.length > offset) {\r\n result.icReference = resp[offset++];\r\n }\r\n\r\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\r\n\r\n result.manufacturer = this.detectManufacturer(result.uid ?? \"\");\r\n\r\n return result;\r\n },\r\n\r\n /** Identify common manufacturers based on UID prefix */\r\n detectManufacturer(uid: string): string {\r\n if (\r\n uid.startsWith(\"E004\") ||\r\n uid.startsWith(\"E006\") ||\r\n uid.startsWith(\"E016\")\r\n )\r\n return \"EM Microelectronic\";\r\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\r\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\r\n if (uid.startsWith(\"E010\")) return \"NXP\";\r\n return \"Unknown\";\r\n },\r\n} as const;\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async writeNdef(records: NdefRecord[]) {\r\n // Use NFC-A/Type 2 as fallback (often required on Android)\r\n await nfcService.withTechnology([NfcTech.Ndef, NfcTech.NfcA], async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n },\r\n\r\n writeTextNdef(text: string) {\r\n const record = Ndef.textRecord(text);\r\n return this.writeNdef([record]);\r\n },\r\n\r\n writeUriNdef(uri: string) {\r\n const record = Ndef.uriRecord(uri);\r\n return this.writeNdef([record]);\r\n },\r\n};\r\n","export const utils = {};\r\n","import { operations as aOps, utils as aUtils } from \"./a\";\r\nimport { operations as ndefOps, utils as ndefUtils } from \"./ndef\";\r\nimport { nfcService } from \"./service\";\r\nimport { operations as vOps, utils as vUtils } from \"./v\";\r\n/**\r\n * NFC root namespace providing access to:\r\n * - NfcService\r\n * - ISO15693 NFC-V ops\r\n * - NFC-A ops\r\n * - NDEF operations\r\n */\r\nexport const nfc = {\r\n service: nfcService,\r\n\r\n /** ISO15693 protocol helpers and high-level operations */\r\n v: {\r\n ...vOps, // NfcVOperations, nfcV\r\n utils: vUtils,\r\n },\r\n\r\n /** NFC-A / Type 2 helpers and operations */\r\n a: {\r\n ...aOps,\r\n utils: aUtils,\r\n },\r\n\r\n /** NDEF read/write utilities and operations */\r\n ndef: {\r\n ...ndefOps,\r\n utils: ndefUtils,\r\n },\r\n} as const;\r\n","import {\r\n createContext,\r\n type PropsWithChildren,\r\n useContext,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\nimport type { NfcState } from \"../nfc/types\";\r\n\r\ninterface NfcContextValue {\r\n state: NfcState;\r\n service: typeof nfcService;\r\n}\r\n\r\nconst NfcContext = createContext<NfcContextValue | null>(null);\r\n\r\nexport function NfcProvider({ children }: PropsWithChildren) {\r\n const [state, setState] = useState(nfcService.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = nfcService.subscribe(setState);\r\n return unsubscribe;\r\n }, []);\r\n\r\n return (\r\n <NfcContext.Provider value={{ state, service: nfcService }}>\r\n {children}\r\n </NfcContext.Provider>\r\n );\r\n}\r\n\r\nexport function useNfcContext() {\r\n const ctx = useContext(NfcContext);\r\n if (!ctx) throw new Error(\"useNfcContext must be inside <NfcProvider>\");\r\n return ctx;\r\n}\r\n","import { useEffect } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfc(\n onTag: (tagId: string) => void,\n options: { cooldownMs?: number },\n) {\n useEffect(() => {\n nfcService.startReader(\n async (tag: TagEvent) => {\n if (!tag.id) return;\n onTag(tag.id);\n },\n { cooldownMs: options?.cooldownMs },\n );\n\n return () => {\n nfcService.stopReader();\n };\n }, [onTag]);\n}\n","import { useCallback } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfcReader() {\n const start = useCallback(\n (onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => {\n nfcService.startReader(onTag, { cooldownMs });\n },\n [],\n );\n\n const stop = useCallback(() => {\n nfcService.stopReader();\n }, []);\n\n return { start, stop };\n}\n","import { useEffect, useState } from \"react\";\r\n\r\nimport { nfcService } from \"../nfc\";\r\n\r\nexport function useNfcState() {\r\n const [nfcState, setNfcState] = useState(nfcService.getState());\r\n\r\n useEffect(() => nfcService.subscribe(setNfcState), []);\r\n\r\n return nfcState;\r\n}\r\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTechnology() {\r\n async function writeNdef(records: NdefRecord[]) {\r\n return nfcService.withTechnology(NfcTech.Ndef, async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n }\r\n\r\n async function runWithTech(\r\n tech: NfcTech | NfcTech[],\r\n fn: () => Promise<void>,\r\n ) {\r\n return nfcService.withTechnology(tech, fn);\r\n }\r\n\r\n return {\r\n writeNdef,\r\n runWithTech,\r\n };\r\n}\r\n"],"mappings":"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","names":["import_react_native_nfc_manager","NfcManager","_a","NfcManager","operations","utils","import_react_native_nfc_manager","import_react_native_nfc_manager","import_react_native","import_react_native_nfc_manager","utils","utils","NfcManager","operations","utils","NfcManager","operations","utils","import_react_native_nfc_manager","operations","NfcManager","utils","operations","utils","import_react","import_react","import_react","import_react_native_nfc_manager","NfcManager"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/nfc/ndef/builder.ts","../src/nfc/ndef/internal/operations.ts","../src/nfc/ndef/error.ts","../src/nfc/ndef/internal/tech.ts","../src/nfc/ndef/internal/index.ts","../src/nfc/ndef/operations.ts","../src/nfc/service.ts","../src/nfc/error.ts","../src/nfc/tag/internal/operations.ts","../src/nfc/tag/internal/index.ts","../src/nfc/tag/operations.ts","../src/nfc/v/internal/operations.ts","../src/nfc/v/error.ts","../src/nfc/v/internal/utils.ts","../src/nfc/v/internal/tech.ts","../src/nfc/v/internal/index.ts","../src/nfc/v/operations.ts","../src/nfc/namespace.ts","../src/react/use-nfc.ts","../src/react/use-nfc-reader.ts","../src/react/use-nfc-state.ts","../src/react/use-nfc-technology.ts"],"sourcesContent":["export * from \"./nfc\";\r\nexport * from \"./react\";\r\n","import {\r\n type ISOLangCode,\r\n Ndef,\r\n type NdefRecord,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport type { BuildRecordInit, NdefBuilder } from \"./types\";\r\n\r\nexport const mimeTypes = {\r\n TEXT: \"text/plain\",\r\n JSON: \"application/json\",\r\n};\r\n\r\nexport class Builder {\r\n static records(b: NdefBuilder): NdefRecord[] {\r\n return b(Builder);\r\n }\r\n\r\n static message(b: NdefBuilder): number[] {\r\n return Ndef.encodeMessage(b(Builder));\r\n }\r\n\r\n static record(init: BuildRecordInit): NdefRecord {\r\n const { tnf, type, id = [], payload = [] } = init;\r\n\r\n // Convert strings → UTF-8 bytes\r\n const toBytes = (v: string | number[]) =>\r\n typeof v === \"string\" ? Array.from(Buffer.from(v, \"utf8\")) : v;\r\n\r\n return {\r\n tnf,\r\n type: toBytes(type),\r\n id: toBytes(id),\r\n payload: toBytes(payload),\r\n };\r\n }\r\n\r\n static textRecord(\r\n text: string,\r\n lang: ISOLangCode = \"en\",\r\n encoding: \"utf8\" | \"utf16\" = \"utf8\",\r\n id?: string,\r\n ): NdefRecord {\r\n const record = Ndef.textRecord(text, lang, encoding);\r\n if (id) record.id = Array.from(Buffer.from(id, \"utf8\"));\r\n return record;\r\n }\r\n\r\n static uriRecord(uri: string, id?: string): NdefRecord {\r\n return Ndef.uriRecord(uri, id);\r\n }\r\n\r\n static jsonRecord(\r\n payload: string | Uint8Array | number[],\r\n id?: string,\r\n ): NdefRecord {\r\n return Builder.mimeRecord(mimeTypes.JSON, payload, id);\r\n }\r\n\r\n static mimeRecord(\r\n mimeType: string,\r\n payload: string | Uint8Array | number[],\r\n id?: string,\r\n ): NdefRecord {\r\n const payloadBytes =\r\n typeof payload === \"string\"\r\n ? Array.from(Buffer.from(payload, \"utf8\"))\r\n : payload instanceof Uint8Array\r\n ? Array.from(payload)\r\n : payload;\r\n\r\n const idBytes = id ? Array.from(Buffer.from(id, \"utf8\")) : [];\r\n\r\n return Builder.record({\r\n tnf: Ndef.TNF_MIME_MEDIA,\r\n type: mimeType,\r\n id: idBytes,\r\n payload: payloadBytes,\r\n });\r\n }\r\n\r\n static externalRecord(\r\n domain: string,\r\n type: string,\r\n payload: string | Uint8Array | number[],\r\n id?: string,\r\n ): NdefRecord {\r\n const recordType = `${domain}:${type}`;\r\n const payloadBytes =\r\n typeof payload === \"string\"\r\n ? Array.from(Buffer.from(payload, \"utf8\"))\r\n : payload instanceof Uint8Array\r\n ? Array.from(payload)\r\n : payload;\r\n\r\n const idBytes = id ? Array.from(Buffer.from(id, \"utf8\")) : [];\r\n\r\n return Builder.record({\r\n tnf: Ndef.TNF_EXTERNAL_TYPE,\r\n type: recordType,\r\n id: idBytes,\r\n payload: payloadBytes,\r\n });\r\n }\r\n\r\n static createEmpty(): NdefRecord {\r\n return Builder.record({\r\n tnf: Ndef.TNF_EMPTY,\r\n type: [],\r\n id: [],\r\n payload: [],\r\n });\r\n }\r\n}\r\n","import nfcManager, { Ndef, type NdefRecord } from \"react-native-nfc-manager\";\r\n\r\nimport { NdefError } from \"../error\";\r\nimport type { NdefMessageResult } from \"../types\";\r\n\r\nfunction assertMessage(msg: NdefMessageResult) {\r\n if (!msg.ndefMessage || msg.ndefMessage.length === 0) {\r\n throw new NdefError(\"NDEF message contains no NDEF records\");\r\n }\r\n}\r\n\r\nexport async function readMessage(): Promise<NdefMessageResult> {\r\n // getNdefMessage does NOT return TagEvent. NfcManager is wrong.\r\n const msg =\r\n (await nfcManager.ndefHandler.getNdefMessage()) as unknown as NdefMessageResult | null;\r\n if (!msg) throw new NdefError(\"No NDEF message detected\");\r\n\r\n assertMessage(msg);\r\n\r\n return msg;\r\n}\r\nexport async function write(records: NdefRecord[]): Promise<void> {\r\n if (records.length === 0) {\r\n throw new NdefError(\"Cannot write an empty records array\");\r\n }\r\n\r\n const bytes = Ndef.encodeMessage(records);\r\n await nfcManager.ndefHandler.writeNdefMessage(bytes);\r\n}\r\n","export class NdefError extends Error {\r\n constructor(message: string) {\r\n super(`[NDEF] ${message}`);\r\n }\r\n}\r\n","import { Platform } from \"react-native\";\r\nimport { NfcTech } from \"react-native-nfc-manager\";\r\n\r\nexport const tech =\r\n Platform.OS === \"android\" ? [NfcTech.Ndef, NfcTech.NfcA] : [NfcTech.Ndef];\r\n","import * as operations from \"./operations\";\r\nimport { tech } from \"./tech\";\r\n\r\nexport const nfcNdefTag = {\r\n ...operations,\r\n tech,\r\n} as const;\r\n","import nfcManager, {\r\n type ISOLangCode,\r\n type NdefRecord,\r\n type NdefStatus,\r\n type TagEvent,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\nimport { nfcTag } from \"../tag\";\r\nimport { Builder } from \"./builder\";\r\nimport { NdefError } from \"./error\";\r\nimport { nfcNdefTag } from \"./internal\";\r\nimport type { NdefMessageResult } from \"./types\";\r\n\r\nexport async function getStatus(): Promise<{\r\n status: NdefStatus;\r\n capacity: number;\r\n}> {\r\n return await nfcManager.ndefHandler.getNdefStatus();\r\n}\r\n\r\nexport async function readMessage(): Promise<NdefMessageResult> {\r\n return await nfcService.withTechnology(\r\n nfcNdefTag.tech,\r\n nfcNdefTag.readMessage,\r\n );\r\n}\r\n\r\nexport async function readFull(): Promise<{\r\n message: NdefMessageResult;\r\n tag: TagEvent;\r\n}> {\r\n return await nfcService.withTechnology(nfcNdefTag.tech, async () => {\r\n const tag = await nfcTag.getTag();\r\n const message = await nfcNdefTag.readMessage();\r\n return { message, tag };\r\n });\r\n}\r\n\r\nexport async function write(records: NdefRecord[]): Promise<void> {\r\n if (!records || records.length === 0) {\r\n throw new NdefError(\"write: no NDEF records provided\");\r\n }\r\n await nfcService.withTechnology(\r\n nfcNdefTag.tech,\r\n async () => await nfcNdefTag.write(records),\r\n );\r\n}\r\n\r\nexport async function writeText(\r\n text: string,\r\n lang?: ISOLangCode,\r\n encoding?: \"utf8\" | \"utf16\",\r\n id?: string,\r\n): Promise<void> {\r\n const rec = Builder.textRecord(text, lang, encoding, id);\r\n await write([rec]);\r\n}\r\n\r\nexport async function writeUri(uri: string, id?: string): Promise<void> {\r\n const rec = Builder.uriRecord(uri, id);\r\n await write([rec]);\r\n}\r\n\r\nexport async function writeJson(data: unknown, id?: string): Promise<void> {\r\n let json: string;\r\n try {\r\n json = JSON.stringify(data);\r\n } catch (e) {\r\n throw new NdefError(`writeJson: value is not JSON serializable: ${e}`);\r\n }\r\n\r\n const rec = Builder.jsonRecord(json, id);\r\n await write([rec]);\r\n}\r\n\r\nexport async function writeMime(\r\n mimeType: string,\r\n payload: string | Uint8Array | number[],\r\n id?: string,\r\n): Promise<void> {\r\n if (!mimeType || typeof mimeType !== \"string\") {\r\n throw new NdefError(\"writeMime: mimeType must be a non-empty string\");\r\n }\r\n\r\n const rec = Builder.mimeRecord(mimeType, payload, id);\r\n await write([rec]);\r\n}\r\n\r\nexport async function writeExternal(\r\n domain: string,\r\n type: string,\r\n payload: string | Uint8Array | number[],\r\n id?: string,\r\n): Promise<void> {\r\n if (!domain || typeof domain !== \"string\") {\r\n throw new NdefError(\"writeExternal: domain must be a non-empty string\");\r\n }\r\n if (!type || typeof type !== \"string\") {\r\n throw new NdefError(\"writeExternal: type must be a non-empty string\");\r\n }\r\n\r\n const rec = Builder.externalRecord(domain, type, payload, id);\r\n await write([rec]);\r\n}\r\n\r\nexport async function makeReadOnly(): Promise<void> {\r\n await nfcService.withTechnology(\r\n nfcNdefTag.tech,\r\n nfcManager.ndefHandler.makeReadOnly,\r\n );\r\n}\r\n","import { Platform } from \"react-native\";\r\nimport nfcManager, {\r\n NfcEvents,\r\n type NfcTech,\r\n type TagEvent,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { NfcError } from \"./error\";\r\nimport type { NfcMode, NfcState } from \"./types\";\r\n\r\nexport type NfcListener = (state: NfcState) => void;\r\n\r\nexport class NfcService {\r\n private state: NfcState = { mode: \"idle\", tag: null };\r\n private listeners = new Set<NfcListener>();\r\n\r\n private isProcessingTag = false;\r\n private currentOnTag?: (tag: TagEvent) => Promise<void> | void;\r\n private currentCooldownMs = 1500;\r\n private cooldownTimer?: ReturnType<typeof setTimeout>;\r\n\r\n private readerModeFlags_ANDROID: number | null = null;\r\n\r\n constructor() {\r\n nfcManager.start();\r\n }\r\n\r\n enableReaderMode_ANDROID(flags: number) {\r\n if (Platform.OS !== \"android\") return;\r\n this.readerModeFlags_ANDROID = flags;\r\n }\r\n\r\n // -----------------------------\r\n // Internal state management\r\n // -----------------------------\r\n private setState(partial: Partial<NfcState>) {\r\n this.state = { ...this.state, ...partial };\r\n for (const listener of this.listeners) listener(this.state);\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n subscribe(fn: NfcListener) {\r\n this.listeners.add(fn);\r\n fn(this.state); // emit immediately\r\n return () => {\r\n this.listeners.delete(fn);\r\n };\r\n }\r\n\r\n // -----------------------------\r\n // START READER (Soft Continuous Mode)\r\n // -----------------------------\r\n async startReader(\r\n onTag?: (tag: TagEvent) => Promise<void> | void,\r\n options?: { cooldownMs?: number },\r\n ) {\r\n if (this.state.mode !== \"idle\") {\r\n console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);\r\n return;\r\n }\r\n\r\n this.currentOnTag = onTag;\r\n this.currentCooldownMs = options?.cooldownMs ?? 1500;\r\n this.isProcessingTag = false;\r\n\r\n this.setState({ mode: \"starting\", tag: null });\r\n\r\n // Tag listener\r\n nfcManager.setEventListener(\r\n NfcEvents.DiscoverTag,\r\n async (tag: TagEvent) => {\r\n if (!tag) return;\r\n\r\n // Prevent reprocessing until tag removed & cooldown completed\r\n if (this.isProcessingTag) return;\r\n\r\n this.isProcessingTag = true;\r\n this.setState({ tag, mode: \"active\" });\r\n\r\n try {\r\n await this.currentOnTag?.(tag);\r\n } catch (err) {\r\n console.warn(\"[NFC] onTag handler error:\", err);\r\n } finally {\r\n const cooldown = this.currentCooldownMs;\r\n\r\n // After cooldown, allow a new scan *only after tag is removed*\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n }\r\n this.cooldownTimer = setTimeout(() => {\r\n this.isProcessingTag = false;\r\n this.setState({ tag: null });\r\n this.cooldownTimer = undefined;\r\n }, cooldown);\r\n }\r\n },\r\n );\r\n\r\n // Start reader\r\n try {\r\n if (this.readerModeFlags_ANDROID) {\r\n await nfcManager.registerTagEvent({\r\n isReaderModeEnabled: true,\r\n readerModeFlags: this.readerModeFlags_ANDROID,\r\n });\r\n } else {\r\n await nfcManager.registerTagEvent();\r\n }\r\n\r\n if ((this.state.mode as NfcMode) === \"starting\") {\r\n this.setState({ mode: \"active\" });\r\n }\r\n } catch (err) {\r\n console.warn(\"[NFC] startReader error:\", err);\r\n this._resetReaderState();\r\n }\r\n }\r\n\r\n // -----------------------------\r\n // STOP READER (explicit only)\r\n // -----------------------------\r\n async stopReader() {\r\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\r\n\r\n this.setState({ mode: \"stopping\" });\r\n // Ignore any late tag events while we tear down the reader\r\n nfcManager.setEventListener(NfcEvents.DiscoverTag, () => {});\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n\r\n try {\r\n await nfcManager.unregisterTagEvent();\r\n } catch (err) {\r\n console.warn(\"[NFC] unregisterTagEvent error:\", err);\r\n }\r\n\r\n this._resetReaderState();\r\n }\r\n\r\n private _resetReaderState() {\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n this.setState({ mode: \"idle\", tag: null });\r\n this.currentOnTag = undefined;\r\n this.isProcessingTag = false;\r\n }\r\n\r\n // -----------------------------\r\n // Technology sessions (NDEF, NfcV, etc.)\r\n // -----------------------------\r\n async withTechnology<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n ): Promise<T> {\r\n if (this.state.mode === \"technology\") {\r\n throw new NfcError(\"Technology is already in use!\");\r\n }\r\n\r\n if (this.readerModeFlags_ANDROID) {\r\n return this.withTechnologyReaderMode_ANDROID(\r\n tech,\r\n handler,\r\n this.readerModeFlags_ANDROID,\r\n );\r\n }\r\n\r\n // Stop reader before using tech session\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n const savedOnTag = this.currentOnTag;\r\n const savedCooldown = this.currentCooldownMs;\r\n\r\n if (readerWasActive) {\r\n await this.stopReader();\r\n }\r\n\r\n if (this.state.mode !== \"idle\") {\r\n throw new NfcError(\r\n `Cannot start technology session in mode ${this.state.mode}`,\r\n );\r\n }\r\n\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await nfcManager.requestTechnology(tech, {\r\n alertMessage: \"Hold near NFC tag\",\r\n });\r\n\r\n const result = await handler();\r\n\r\n if (Platform.OS === \"ios\") {\r\n await nfcManager.setAlertMessageIOS(\"Success!\");\r\n }\r\n\r\n return result;\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new NfcError(`withTechnology error: ${message}`);\r\n } finally {\r\n try {\r\n await nfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.setState({ mode: \"idle\", tag: null });\r\n\r\n // If reader was active before tech session, restart it automatically\r\n if (readerWasActive) {\r\n try {\r\n await this.startReader(savedOnTag, { cooldownMs: savedCooldown });\r\n } catch (err) {\r\n console.warn(\r\n \"[NFC] Failed to restart reader after tech session\",\r\n err,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async withTechnologyReaderMode_ANDROID<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n flags: number,\r\n ): Promise<T> {\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n\r\n // Keep reader mode active during tech request to avoid dispatch gap\r\n this.isProcessingTag = true;\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await nfcManager.requestTechnology(tech, {\r\n isReaderModeEnabled: true,\r\n readerModeFlags: flags,\r\n });\r\n\r\n return await handler();\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new NfcError(`withTechnologyReaderMode_ANDROID error: ${message}`);\r\n } finally {\r\n try {\r\n await nfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.isProcessingTag = false;\r\n this.setState({ mode: readerWasActive ? \"active\" : \"idle\" });\r\n }\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const nfcService = new NfcService();\r\n","export class NfcError extends Error {\r\n constructor(message: string) {\r\n super(`[NFC] ${message}`);\r\n }\r\n}\r\n","import nfcManager from \"react-native-nfc-manager\";\r\n\r\nexport async function getTag() {\r\n const tagEvent = await nfcManager.getTag();\r\n if (!tagEvent) throw new Error(\"No tag detected\");\r\n return tagEvent;\r\n}\r\n","import * as operations from \"./operations\";\r\n\r\nexport const nfcTag = {\r\n ...operations,\r\n} as const;\r\n","import type { NfcTech, TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\nimport { nfcTag } from \"./internal\";\r\n\r\nexport async function getTag(tech: NfcTech | NfcTech[]): Promise<TagEvent> {\r\n return nfcService.withTechnology(tech, nfcTag.getTag);\r\n}\r\n","import nfcManager from \"react-native-nfc-manager\";\r\n\r\nimport { VError } from \"../error\";\r\nimport type { SystemInfo } from \"../types\";\r\nimport * as utils from \"./utils\";\r\n\r\nexport async function transceive(bytes: number[]) {\r\n return await nfcManager.nfcVHandler.transceive(bytes);\r\n}\r\n\r\nexport async function readBlock(\r\n tagId: string,\r\n blockNumber: number,\r\n): Promise<Uint8Array> {\r\n const uid = utils.reverseUid(tagId);\r\n const cmd = utils.buildReadBlock(uid, blockNumber);\r\n const resp = await transceive(cmd);\r\n return utils.parseReadResponse(resp);\r\n}\r\n\r\nexport async function readBlocks(\r\n tagId: string,\r\n startBlock: number,\r\n endBlock: number,\r\n) {\r\n const data = new Uint8Array();\r\n let offset = 0;\r\n for (let i = startBlock; i < endBlock; i++) {\r\n const block = await readBlock(tagId, i);\r\n data.set(block, offset);\r\n offset += block.length;\r\n }\r\n return data;\r\n}\r\n\r\nexport async function writeBlock(\r\n tagId: string,\r\n blockNumber: number,\r\n data: Uint8Array,\r\n): Promise<void> {\r\n const uid = utils.reverseUid(tagId);\r\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\r\n const resp = await transceive(cmd);\r\n utils.parseWriteResponse(resp);\r\n}\r\n\r\nexport async function writeBlocks(\r\n tagId: string,\r\n blockNumber: number,\r\n data: Uint8Array[],\r\n): Promise<void> {\r\n for (let i = 0; i < data.length; i++) {\r\n const blockData = data[i];\r\n if (blockData === undefined) {\r\n throw new VError(`No data provided for block at index ${i}`);\r\n }\r\n await writeBlock(tagId, blockNumber + i, blockData);\r\n }\r\n}\r\n\r\nexport async function getSystemInfo(): Promise<SystemInfo> {\r\n const cmd = utils.buildGetSystemInfo();\r\n const resp = await transceive(cmd);\r\n return utils.parseSystemInfo(resp);\r\n}\r\n","export class VError extends Error {\r\n constructor(message: string) {\r\n super(`[V] ${message}`);\r\n }\r\n}\r\n","// Here's where things get REAL\r\n//\r\n// Only iPhone 7+ supports ISO15693; writing may require\r\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\r\n// transceive (depends on firmware)\r\n//\r\n// | Byte | Meaning |\r\n// | ------------- | ---------------------------------------------------- |\r\n// | `0x02` | Flags (high data rate) |\r\n// | `0x20` | Flags (addressed) |\r\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\r\n// | `0x20` | Command code: Read Single Block |\r\n// | `0x21` | Command code: Write Single Block |\r\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\r\n// | `blockNumber` | Which memory block to write |\r\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\r\n//\r\n// Each command is a byte array\r\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\r\n//\r\n// Tag response:\r\n// The tag response has this structure:\r\n//\r\n// | Byte | Meaning |\r\n// | ---- | --------------------------------------------- |\r\n// | `0` | **Status** (0x00 = success) |\r\n// | `1` | **Info Flags** |\r\n// | … | Data fields, conditional based on those flags |\r\n//\r\n// Info Flags bitmask:\r\n// | Bit | Hex | Meaning |\r\n// | --- | ---- | ------------------------------------------------------------- |\r\n// | 0 | 0x01 | DSFID present |\r\n// | 1 | 0x02 | AFI present |\r\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\r\n// | 3 | 0x08 | IC reference present |\r\n// | 4–7 | — | RFU (reserved) |\r\n\r\nimport type { SystemInfo } from \"../types\";\r\n\r\nexport const FLAGS = {\r\n HIGH_DATA_RATE: 0x02,\r\n ADDRESSED: 0x20,\r\n // If needed later: OPTION: 0x40 (not commonly used)\r\n};\r\n\r\nexport const COMMANDS = {\r\n READ_SINGLE_BLOCK: 0x20,\r\n WRITE_SINGLE_BLOCK: 0x21,\r\n GET_SYSTEM_INFO: 0x2b,\r\n};\r\n\r\n/**\r\n * Combine multiple flag bits into one byte.\r\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\r\n */\r\nexport function buildFlags(...bits: number[]): number {\r\n return bits.reduce((acc, bit) => acc | bit, 0);\r\n}\r\n\r\n/**\r\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\r\n * ISO15693 requires reversed UID for addressed commands.\r\n */\r\nexport function reverseUid(tagIdHex: string): number[] {\r\n const bytes = [];\r\n for (let i = 0; i < tagIdHex.length; i += 2) {\r\n bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Build READ_SINGLE_BLOCK command.\r\n * FLAGS: addressed + high data rate by default.\r\n */\r\nexport function buildReadBlock(\r\n uidReversed: number[],\r\n blockNumber: number,\r\n): number[] {\r\n const flags = buildFlags(FLAGS.ADDRESSED, FLAGS.HIGH_DATA_RATE);\r\n return [flags, COMMANDS.READ_SINGLE_BLOCK, ...uidReversed, blockNumber];\r\n}\r\n\r\n/**\r\n * Build WRITE_SINGLE_BLOCK command.\r\n * Note: data must match the block size (usually 4 or 8 bytes).\r\n */\r\nexport function buildWriteBlock(\r\n uidReversed: number[],\r\n blockNumber: number,\r\n data: Uint8Array,\r\n): number[] {\r\n const flags = buildFlags(FLAGS.ADDRESSED, FLAGS.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n COMMANDS.WRITE_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ...data,\r\n ];\r\n}\r\n\r\n/**\r\n * Build GET_SYSTEM_INFO command.\r\n */\r\nexport function buildGetSystemInfo(): number[] {\r\n return [FLAGS.HIGH_DATA_RATE, COMMANDS.GET_SYSTEM_INFO];\r\n}\r\n\r\n/**\r\n * Parse a READ_SINGLE_BLOCK response.\r\n * Response format:\r\n * - byte[0] = status (0x00 = success)\r\n * - byte[1..] = block payload bytes\r\n */\r\nexport function parseReadResponse(resp: number[]): Uint8Array {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Read failed. Status: 0x${status.toString(16)}`);\r\n }\r\n return new Uint8Array(resp.slice(1));\r\n}\r\n\r\n/**\r\n * Parse WRITE_SINGLE_BLOCK response.\r\n * Successful write has resp[0] === 0x00.\r\n */\r\nexport function parseWriteResponse(resp: number[]): void {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Write failed. Status: 0x${status.toString(16)}`);\r\n }\r\n}\r\n\r\n/**\r\n * Parse GET_SYSTEM_INFO response.\r\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\r\n */\r\n\r\nexport function parseSystemInfo(resp: number[]) {\r\n if (!resp || resp.length < 2) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined || status !== 0x00) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const flagsByte = resp[1];\r\n if (flagsByte === undefined) {\r\n throw new Error(\"Invalid System Info response: missing flags byte\");\r\n }\r\n\r\n const infoFlags = flagsByte & 0x0f;\r\n let offset = 2;\r\n\r\n const result: SystemInfo = {};\r\n\r\n // UID (always present – next 8 bytes)\r\n if (resp.length >= offset + 8) {\r\n const uidBytes = resp.slice(offset, offset + 8);\r\n result.uid = uidBytes\r\n .slice()\r\n .reverse()\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\")\r\n .toUpperCase();\r\n offset += 8;\r\n }\r\n\r\n // DSFID\r\n if (infoFlags & 0x01 && resp.length > offset) {\r\n result.dsfid = resp[offset++];\r\n }\r\n\r\n // AFI\r\n if (infoFlags & 0x02 && resp.length > offset) {\r\n result.afi = resp[offset++];\r\n }\r\n\r\n // Memory size info\r\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\r\n const numBlocks = resp[offset++];\r\n const blkSize = resp[offset++];\r\n if (numBlocks !== undefined) {\r\n result.numberOfBlocks = numBlocks + 1;\r\n }\r\n if (blkSize !== undefined) {\r\n result.blockSize = blkSize + 1;\r\n }\r\n }\r\n\r\n // IC Reference\r\n if (infoFlags & 0x08 && resp.length > offset) {\r\n result.icReference = resp[offset++];\r\n }\r\n\r\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\r\n\r\n result.manufacturer = detectManufacturer(result.uid ?? \"\");\r\n\r\n return result;\r\n}\r\n\r\n/** Identify common manufacturers based on UID prefix */\r\nexport function detectManufacturer(uid: string): string {\r\n if (\r\n uid.startsWith(\"E004\") ||\r\n uid.startsWith(\"E006\") ||\r\n uid.startsWith(\"E016\")\r\n )\r\n return \"EM Microelectronic\";\r\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\r\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\r\n if (uid.startsWith(\"E010\")) return \"NXP\";\r\n return \"Unknown\";\r\n}\r\n","import { Platform } from \"react-native\";\r\nimport { NfcTech } from \"react-native-nfc-manager\";\r\n\r\nexport const tech =\r\n Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : NfcTech.NfcV;\r\n","import * as operations from \"./operations\";\r\nimport { tech } from \"./tech\";\r\nimport * as utils from \"./utils\";\r\n\r\nexport const nfcVTag = {\r\n ...operations,\r\n tech,\r\n utils,\r\n} as const;\r\n","import { nfcService } from \"../service\";\r\nimport { nfcTag } from \"../tag\";\r\nimport { VError } from \"./error\";\r\nimport { nfcVTag } from \"./internal\";\r\nimport type { SystemInfo } from \"./types\";\r\n\r\nexport async function writeBlock(\r\n blockNumber: number,\r\n data: Uint8Array,\r\n): Promise<void> {\r\n await nfcService.withTechnology(nfcVTag.tech, async () => {\r\n const tag = await nfcTag.getTag();\r\n if (!tag?.id) throw new VError(\"No NFC-V tag id detected\");\r\n await nfcVTag.writeBlock(tag.id, blockNumber, data);\r\n });\r\n}\r\n\r\nexport async function writeBlocks(\r\n blockNumber: number,\r\n data: Uint8Array[],\r\n): Promise<void> {\r\n await nfcService.withTechnology(nfcVTag.tech, async () => {\r\n const tag = await nfcTag.getTag();\r\n if (!tag?.id) throw new VError(\"No NFC-V tag id detected\");\r\n nfcVTag.writeBlocks(tag.id, blockNumber, data);\r\n });\r\n}\r\n\r\nexport async function readBlock(blockNumber: number): Promise<Uint8Array> {\r\n return await nfcService.withTechnology(nfcVTag.tech, async () => {\r\n const tag = await nfcTag.getTag();\r\n if (!tag?.id) throw new VError(\"No NFC-V tag id detected\");\r\n return await nfcVTag.readBlock(tag.id, blockNumber);\r\n });\r\n}\r\n\r\nexport async function readBlocks(\r\n startBlock: number,\r\n endBlock: number,\r\n): Promise<Uint8Array> {\r\n return await nfcService.withTechnology(nfcVTag.tech, async () => {\r\n const tag = await nfcTag.getTag();\r\n if (!tag?.id) throw new Error(\"No NFC-V tag id detected\");\r\n return await nfcVTag.readBlocks(tag.id, startBlock, endBlock);\r\n });\r\n}\r\n\r\nexport async function getSystemInfo(): Promise<SystemInfo> {\r\n return await nfcService.withTechnology(nfcVTag.tech, nfcVTag.getSystemInfo);\r\n}\r\n","import { Builder as NdefBuilder, operations as ndefOps } from \"./ndef\";\r\nimport { nfcService } from \"./service\";\r\nimport { operations as tagOps } from \"./tag\";\r\nimport { operations as vOps } from \"./v\";\r\n/**\r\n * NFC root namespace providing access to:\r\n * - NfcService\r\n * - ISO15693 NFC-V ops\r\n * - NDEF operations\r\n */\r\nexport const nfc = {\r\n service: nfcService,\r\n v: { ...vOps },\r\n ndef: { ...ndefOps, Builder: NdefBuilder },\r\n tag: { ...tagOps },\r\n} as const;\r\n","import { useEffect } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfc(\n onTag: (tagId: string) => void,\n options: { cooldownMs?: number },\n) {\n useEffect(() => {\n nfcService.startReader(\n async (tag: TagEvent) => {\n if (!tag.id) return;\n onTag(tag.id);\n },\n { cooldownMs: options?.cooldownMs },\n );\n\n return () => {\n nfcService.stopReader();\n };\n }, [onTag]);\n}\n","import { useCallback } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfcReader() {\n const start = useCallback(\n (onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => {\n nfcService.startReader(onTag, { cooldownMs });\n },\n [],\n );\n\n const stop = useCallback(() => {\n nfcService.stopReader();\n }, []);\n\n return { start, stop };\n}\n","import { useEffect, useState } from \"react\";\r\n\r\nimport { nfcService } from \"../nfc\";\r\n\r\nexport function useNfcState() {\r\n const [nfcState, setNfcState] = useState(nfcService.getState());\r\n\r\n useEffect(() => nfcService.subscribe(setNfcState), []);\r\n\r\n return nfcState;\r\n}\r\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTechnology() {\r\n async function writeNdef(records: NdefRecord[]) {\r\n return nfcService.withTechnology(NfcTech.Ndef, async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n }\r\n\r\n async function runWithTech(\r\n tech: NfcTech | NfcTech[],\r\n fn: () => Promise<void>,\r\n ) {\r\n return nfcService.withTechnology(tech, fn);\r\n }\r\n\r\n return {\r\n writeNdef,\r\n runWithTech,\r\n };\r\n}\r\n"],"mappings":"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","names":["import_react_native_nfc_manager","nfcManager","import_react_native_nfc_manager","operations_exports","readMessage","write","import_react_native_nfc_manager","import_react_native","import_react_native_nfc_manager","nfcManager","_a","tech","operations_exports","import_react_native_nfc_manager","nfcManager","operations_exports","operations_exports","getTag","getTag","tech","nfcManager","readMessage","write","operations_exports","import_react_native_nfc_manager","nfcManager","import_react_native","import_react_native_nfc_manager","tech","operations_exports","tech","operations_exports","getSystemInfo","readBlock","readBlocks","writeBlock","writeBlocks","writeBlock","writeBlocks","readBlock","readBlocks","getSystemInfo","operations_exports","import_react","import_react","import_react_native_nfc_manager","NfcManager","tech"]}
|