@spencerls/react-native-nfc 1.0.9 → 1.0.11

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/dist/index.js.map CHANGED
@@ -1 +1 @@
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/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","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 {\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sCAIO;AAIA,IAAM,YAAY;AAAA,EACvB,MAAM;AAAA,EACN,MAAM;AACR;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EACnB,OAAO,QAAQ,GAA8B;AAC3C,WAAO,EAAE,QAAO;AAAA,EAClB;AAAA,EAEA,OAAO,QAAQ,GAA0B;AACvC,WAAO,qCAAK,cAAc,EAAE,QAAO,CAAC;AAAA,EACtC;AAAA,EAEA,OAAO,OAAO,MAAmC;AAC/C,UAAM,EAAE,KAAK,MAAM,KAAK,CAAC,GAAG,UAAU,CAAC,EAAE,IAAI;AAG7C,UAAM,UAAU,CAAC,MACf,OAAO,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,GAAG,MAAM,CAAC,IAAI;AAE/D,WAAO;AAAA,MACL;AAAA,MACA,MAAM,QAAQ,IAAI;AAAA,MAClB,IAAI,QAAQ,EAAE;AAAA,MACd,SAAS,QAAQ,OAAO;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,WACL,MACA,OAAoB,MACpB,WAA6B,QAC7B,IACY;AACZ,UAAM,SAAS,qCAAK,WAAW,MAAM,MAAM,QAAQ;AACnD,QAAI,GAAI,QAAO,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,MAAM,CAAC;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,UAAU,KAAa,IAAyB;AACrD,WAAO,qCAAK,UAAU,KAAK,EAAE;AAAA,EAC/B;AAAA,EAEA,OAAO,WACL,SACA,IACY;AACZ,WAAO,SAAQ,WAAW,UAAU,MAAM,SAAS,EAAE;AAAA,EACvD;AAAA,EAEA,OAAO,WACL,UACA,SACA,IACY;AACZ,UAAM,eACJ,OAAO,YAAY,WACf,MAAM,KAAK,OAAO,KAAK,SAAS,MAAM,CAAC,IACvC,mBAAmB,aACjB,MAAM,KAAK,OAAO,IAClB;AAER,UAAM,UAAU,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC;AAE5D,WAAO,SAAQ,OAAO;AAAA,MACpB,KAAK,qCAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,eACL,QACA,MACA,SACA,IACY;AACZ,UAAM,aAAa,GAAG,MAAM,IAAI,IAAI;AACpC,UAAM,eACJ,OAAO,YAAY,WACf,MAAM,KAAK,OAAO,KAAK,SAAS,MAAM,CAAC,IACvC,mBAAmB,aACjB,MAAM,KAAK,OAAO,IAClB;AAER,UAAM,UAAU,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC;AAE5D,WAAO,SAAQ,OAAO;AAAA,MACpB,KAAK,qCAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,cAA0B;AAC/B,WAAO,SAAQ,OAAO;AAAA,MACpB,KAAK,qCAAK;AAAA,MACV,MAAM,CAAC;AAAA,MACP,IAAI,CAAC;AAAA,MACL,SAAS,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AACF;;;ACjHA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,mCAAkD;;;ACA3C,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YAAY,SAAiB;AAC3B,UAAM,UAAU,OAAO,EAAE;AAAA,EAC3B;AACF;;;ADCA,SAAS,cAAc,KAAwB;AAC7C,MAAI,CAAC,IAAI,eAAe,IAAI,YAAY,WAAW,GAAG;AACpD,UAAM,IAAI,UAAU,uCAAuC;AAAA,EAC7D;AACF;AAEA,eAAsB,cAA0C;AAE9D,QAAM,MACH,MAAM,iCAAAC,QAAW,YAAY,eAAe;AAC/C,MAAI,CAAC,IAAK,OAAM,IAAI,UAAU,0BAA0B;AAExD,gBAAc,GAAG;AAEjB,SAAO;AACT;AACA,eAAsB,MAAM,SAAsC;AAChE,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,UAAU,qCAAqC;AAAA,EAC3D;AAEA,QAAM,QAAQ,sCAAK,cAAc,OAAO;AACxC,QAAM,iCAAAA,QAAW,YAAY,iBAAiB,KAAK;AACrD;;;AE5BA,0BAAyB;AACzB,IAAAC,mCAAwB;AAEjB,IAAM,OACX,6BAAS,OAAO,YAAY,CAAC,yCAAQ,MAAM,yCAAQ,IAAI,IAAI,CAAC,yCAAQ,IAAI;;;ACDnE,IAAM,aAAa;AAAA,EACxB,GAAG;AAAA,EACH;AACF;;;ACNA,IAAAC,sBAAA;AAAA,SAAAA,qBAAA;AAAA;AAAA;AAAA;AAAA,qBAAAC;AAAA,EAAA,aAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAC,mCAKO;;;ACLP,IAAAC,uBAAyB;AACzB,IAAAC,mCAIO;;;ACLA,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,SAAS,OAAO,EAAE;AAAA,EAC1B;AACF;;;ADQO,IAAM,aAAN,MAAiB;AAAA,EAWtB,cAAc;AAVd,SAAQ,QAAkB,EAAE,MAAM,QAAQ,KAAK,KAAK;AACpD,SAAQ,YAAY,oBAAI,IAAiB;AAEzC,SAAQ,kBAAkB;AAE1B,SAAQ,oBAAoB;AAG5B,SAAQ,0BAAyC;AAG/C,qCAAAC,QAAW,MAAM;AAAA,EACnB;AAAA,EAEA,yBAAyB,OAAe;AACtC,QAAI,8BAAS,OAAO,UAAW;AAC/B,SAAK,0BAA0B;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,SAA4B;AAC3C,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,QAAQ;AACzC,eAAW,YAAY,KAAK,UAAW,UAAS,KAAK,KAAK;AAAA,EAC5D;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,IAAiB;AACzB,SAAK,UAAU,IAAI,EAAE;AACrB,OAAG,KAAK,KAAK;AACb,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,OACA,SACA;AA1DJ;AA2DI,QAAI,KAAK,MAAM,SAAS,QAAQ;AAC9B,cAAQ,KAAK,mCAAmC,KAAK,MAAM,IAAI,EAAE;AACjE;AAAA,IACF;AAEA,SAAK,eAAe;AACpB,SAAK,qBAAoB,wCAAS,eAAT,YAAuB;AAChD,SAAK,kBAAkB;AAEvB,SAAK,SAAS,EAAE,MAAM,YAAY,KAAK,KAAK,CAAC;AAG7C,qCAAAA,QAAW;AAAA,MACT,2CAAU;AAAA,MACV,OAAO,QAAkB;AAzE/B,YAAAC;AA0EQ,YAAI,CAAC,IAAK;AAGV,YAAI,KAAK,gBAAiB;AAE1B,aAAK,kBAAkB;AACvB,aAAK,SAAS,EAAE,KAAK,MAAM,SAAS,CAAC;AAErC,YAAI;AACF,kBAAMA,MAAA,KAAK,iBAAL,gBAAAA,IAAA,WAAoB;AAAA,QAC5B,SAAS,KAAK;AACZ,kBAAQ,KAAK,8BAA8B,GAAG;AAAA,QAChD,UAAE;AACA,gBAAM,WAAW,KAAK;AAGtB,cAAI,KAAK,eAAe;AACtB,yBAAa,KAAK,aAAa;AAAA,UACjC;AACA,eAAK,gBAAgB,WAAW,MAAM;AACpC,iBAAK,kBAAkB;AACvB,iBAAK,SAAS,EAAE,KAAK,KAAK,CAAC;AAC3B,iBAAK,gBAAgB;AAAA,UACvB,GAAG,QAAQ;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACF,UAAI,KAAK,yBAAyB;AAChC,cAAM,iCAAAD,QAAW,iBAAiB;AAAA,UAChC,qBAAqB;AAAA,UACrB,iBAAiB,KAAK;AAAA,QACxB,CAAC;AAAA,MACH,OAAO;AACL,cAAM,iCAAAA,QAAW,iBAAiB;AAAA,MACpC;AAEA,UAAK,KAAK,MAAM,SAAqB,YAAY;AAC/C,aAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B,GAAG;AAC5C,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa;AACjB,QAAI,CAAC,QAAQ,UAAU,EAAE,SAAS,KAAK,MAAM,IAAI,EAAG;AAEpD,SAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAElC,qCAAAA,QAAW,iBAAiB,2CAAU,aAAa,MAAM;AAAA,IAAC,CAAC;AAC3D,QAAI,KAAK,eAAe;AACtB,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AAEA,QAAI;AACF,YAAM,iCAAAA,QAAW,mBAAmB;AAAA,IACtC,SAAS,KAAK;AACZ,cAAQ,KAAK,mCAAmC,GAAG;AAAA,IACrD;AAEA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,KAAK,eAAe;AACtB,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,SAAS,EAAE,MAAM,QAAQ,KAAK,KAAK,CAAC;AACzC,SAAK,eAAe;AACpB,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJE,OACA,SACY;AACZ,QAAI,KAAK,MAAM,SAAS,cAAc;AACpC,YAAM,IAAI,SAAS,+BAA+B;AAAA,IACpD;AAEA,QAAI,KAAK,yBAAyB;AAChC,aAAO,KAAK;AAAA,QACVA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AAGA,UAAM,kBAAkB,CAAC,YAAY,UAAU,UAAU,EAAE;AAAA,MACzD,KAAK,MAAM;AAAA,IACb;AACA,UAAM,aAAa,KAAK;AACxB,UAAM,gBAAgB,KAAK;AAE3B,QAAI,iBAAiB;AACnB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI,KAAK,MAAM,SAAS,QAAQ;AAC9B,YAAM,IAAI;AAAA,QACR,2CAA2C,KAAK,MAAM,IAAI;AAAA,MAC5D;AAAA,IACF;AAEA,SAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpC,QAAI;AACF,YAAM,iCAAAF,QAAW,kBAAkBE,OAAM;AAAA,QACvC,cAAc;AAAA,MAChB,CAAC;AAED,YAAM,SAAS,MAAM,QAAQ;AAE7B,UAAI,8BAAS,OAAO,OAAO;AACzB,cAAM,iCAAAF,QAAW,mBAAmB,UAAU;AAAA,MAChD;AAEA,aAAO;AAAA,IACT,SAAS,KAAU;AACjB,YAAM,UACJ,OAAO,QAAQ,WAAW,OAAM,2BAAK,YAAW;AAClD,YAAM,IAAI,SAAS,yBAAyB,OAAO,EAAE;AAAA,IACvD,UAAE;AACA,UAAI;AACF,cAAM,iCAAAA,QAAW,wBAAwB;AAAA,MAC3C,QAAQ;AAAA,MAAC;AAET,WAAK,SAAS,EAAE,MAAM,QAAQ,KAAK,KAAK,CAAC;AAGzC,UAAI,iBAAiB;AACnB,YAAI;AACF,gBAAM,KAAK,YAAY,YAAY,EAAE,YAAY,cAAc,CAAC;AAAA,QAClE,SAAS,KAAK;AACZ,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iCACZE,OACA,SACA,OACY;AACZ,UAAM,kBAAkB,CAAC,YAAY,UAAU,UAAU,EAAE;AAAA,MACzD,KAAK,MAAM;AAAA,IACb;AAGA,SAAK,kBAAkB;AACvB,SAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpC,QAAI;AACF,YAAM,iCAAAF,QAAW,kBAAkBE,OAAM;AAAA,QACvC,qBAAqB;AAAA,QACrB,iBAAiB;AAAA,MACnB,CAAC;AAED,aAAO,MAAM,QAAQ;AAAA,IACvB,SAAS,KAAU;AACjB,YAAM,UACJ,OAAO,QAAQ,WAAW,OAAM,2BAAK,YAAW;AAClD,YAAM,IAAI,SAAS,2CAA2C,OAAO,EAAE;AAAA,IACzE,UAAE;AACA,UAAI;AACF,cAAM,iCAAAF,QAAW,wBAAwB;AAAA,MAC3C,QAAQ;AAAA,MAAC;AAET,WAAK,kBAAkB;AACvB,WAAK,SAAS,EAAE,MAAM,kBAAkB,WAAW,OAAO,CAAC;AAAA,IAC7D;AAAA,EACF;AACF;AAGO,IAAM,aAAa,IAAI,WAAW;;;AE1QzC,IAAAG,sBAAA;AAAA,SAAAA,qBAAA;AAAA;AAAA;AAAA,IAAAC,mCAAuB;AAEvB,eAAsB,SAAS;AAC7B,QAAM,WAAW,MAAM,iCAAAC,QAAW,OAAO;AACzC,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,iBAAiB;AAChD,SAAO;AACT;;;ACJO,IAAM,SAAS;AAAA,EACpB,GAAGC;AACL;;;ACJA,IAAAC,sBAAA;AAAA,SAAAA,qBAAA;AAAA,gBAAAC;AAAA;AAKA,eAAsBC,QAAOC,OAA8C;AACzE,SAAO,WAAW,eAAeA,OAAM,OAAO,MAAM;AACtD;;;ALOA,eAAsB,YAGnB;AACD,SAAO,MAAM,iCAAAC,QAAW,YAAY,cAAc;AACpD;AAEA,eAAsBC,eAA0C;AAC9D,SAAO,MAAM,WAAW;AAAA,IACtB,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAEA,eAAsB,WAGnB;AACD,SAAO,MAAM,WAAW,eAAe,WAAW,MAAM,YAAY;AAClE,UAAM,MAAM,MAAM,OAAO,OAAO;AAChC,UAAM,UAAU,MAAM,WAAW,YAAY;AAC7C,WAAO,EAAE,SAAS,IAAI;AAAA,EACxB,CAAC;AACH;AAEA,eAAsBC,OAAM,SAAsC;AAChE,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,UAAM,IAAI,UAAU,iCAAiC;AAAA,EACvD;AACA,QAAM,WAAW;AAAA,IACf,WAAW;AAAA,IACX,YAAY,MAAM,WAAW,MAAM,OAAO;AAAA,EAC5C;AACF;AAEA,eAAsB,UACpB,MACA,MACA,UACA,IACe;AACf,QAAM,MAAM,QAAQ,WAAW,MAAM,MAAM,UAAU,EAAE;AACvD,QAAMA,OAAM,CAAC,GAAG,CAAC;AACnB;AAEA,eAAsB,SAAS,KAAa,IAA4B;AACtE,QAAM,MAAM,QAAQ,UAAU,KAAK,EAAE;AACrC,QAAMA,OAAM,CAAC,GAAG,CAAC;AACnB;AAEA,eAAsB,UAAU,MAAe,IAA4B;AACzE,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B,SAAS,GAAG;AACV,UAAM,IAAI,UAAU,8CAA8C,CAAC,EAAE;AAAA,EACvE;AAEA,QAAM,MAAM,QAAQ,WAAW,MAAM,EAAE;AACvC,QAAMA,OAAM,CAAC,GAAG,CAAC;AACnB;AAEA,eAAsB,UACpB,UACA,SACA,IACe;AACf,MAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,UAAM,IAAI,UAAU,gDAAgD;AAAA,EACtE;AAEA,QAAM,MAAM,QAAQ,WAAW,UAAU,SAAS,EAAE;AACpD,QAAMA,OAAM,CAAC,GAAG,CAAC;AACnB;AAEA,eAAsB,cACpB,QACA,MACA,SACA,IACe;AACf,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,UAAU,kDAAkD;AAAA,EACxE;AACA,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,UAAM,IAAI,UAAU,gDAAgD;AAAA,EACtE;AAEA,QAAM,MAAM,QAAQ,eAAe,QAAQ,MAAM,SAAS,EAAE;AAC5D,QAAMA,OAAM,CAAC,GAAG,CAAC;AACnB;AAEA,eAAsB,eAA8B;AAClD,QAAM,WAAW;AAAA,IACf,WAAW;AAAA,IACX,iCAAAF,QAAW,YAAY;AAAA,EACzB;AACF;;;AM/GA,IAAAG,sBAAA;AAAA,SAAAA,qBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAC,mCAAuB;;;ACAhB,IAAM,SAAN,cAAqB,MAAM;AAAA,EAChC,YAAY,SAAiB;AAC3B,UAAM,OAAO,OAAO,EAAE;AAAA,EACxB;AACF;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCO,IAAM,QAAQ;AAAA,EACnB,gBAAgB;AAAA,EAChB,WAAW;AAAA;AAEb;AAEO,IAAM,WAAW;AAAA,EACtB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,iBAAiB;AACnB;AAMO,SAAS,cAAc,MAAwB;AACpD,SAAO,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,CAAC;AAC/C;AAMO,SAAS,WAAW,UAA4B;AACrD,QAAM,QAAQ,CAAC;AACf,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC3C,UAAM,QAAQ,OAAO,SAAS,SAAS,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAAA,EACjE;AACA,SAAO;AACT;AAMO,SAAS,eACd,aACA,aACU;AACV,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,cAAc;AAC9D,SAAO,CAAC,OAAO,SAAS,mBAAmB,GAAG,aAAa,WAAW;AACxE;AAMO,SAAS,gBACd,aACA,aACA,MACU;AACV,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,cAAc;AAC9D,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,GAAG;AAAA,IACH;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAKO,SAAS,qBAA+B;AAC7C,SAAO,CAAC,MAAM,gBAAgB,SAAS,eAAe;AACxD;AAQO,SAAS,kBAAkB,MAA4B;AAC5D,MAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AACA,QAAM,SAAS,KAAK,CAAC;AACrB,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,MAAI,WAAW,GAAM;AACnB,UAAM,IAAI,MAAM,0BAA0B,OAAO,SAAS,EAAE,CAAC,EAAE;AAAA,EACjE;AACA,SAAO,IAAI,WAAW,KAAK,MAAM,CAAC,CAAC;AACrC;AAMO,SAAS,mBAAmB,MAAsB;AACvD,MAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AACA,QAAM,SAAS,KAAK,CAAC;AACrB,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,MAAI,WAAW,GAAM;AACnB,UAAM,IAAI,MAAM,2BAA2B,OAAO,SAAS,EAAE,CAAC,EAAE;AAAA,EAClE;AACF;AAOO,SAAS,gBAAgB,MAAgB;AAxJhD;AAyJE,MAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;AAC5B,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,QAAM,SAAS,KAAK,CAAC;AACrB,MAAI,WAAW,UAAa,WAAW,GAAM;AAC3C,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,QAAM,YAAY,KAAK,CAAC;AACxB,MAAI,cAAc,QAAW;AAC3B,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,QAAM,YAAY,YAAY;AAC9B,MAAI,SAAS;AAEb,QAAM,SAAqB,CAAC;AAG5B,MAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,UAAM,WAAW,KAAK,MAAM,QAAQ,SAAS,CAAC;AAC9C,WAAO,MAAM,SACV,MAAM,EACN,QAAQ,EACR,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,EACP,YAAY;AACf,cAAU;AAAA,EACZ;AAGA,MAAI,YAAY,KAAQ,KAAK,SAAS,QAAQ;AAC5C,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC9B;AAGA,MAAI,YAAY,KAAQ,KAAK,SAAS,QAAQ;AAC5C,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC5B;AAGA,MAAI,YAAY,KAAQ,KAAK,UAAU,SAAS,GAAG;AACjD,UAAM,YAAY,KAAK,QAAQ;AAC/B,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,cAAc,QAAW;AAC3B,aAAO,iBAAiB,YAAY;AAAA,IACtC;AACA,QAAI,YAAY,QAAW;AACzB,aAAO,YAAY,UAAU;AAAA,IAC/B;AAAA,EACF;AAGA,MAAI,YAAY,KAAQ,KAAK,SAAS,QAAQ;AAC5C,WAAO,cAAc,KAAK,QAAQ;AAAA,EACpC;AAEA,MAAI,CAAC,OAAO,UAAW,QAAO,YAAY;AAE1C,SAAO,eAAe,oBAAmB,YAAO,QAAP,YAAc,EAAE;AAEzD,SAAO;AACT;AAGO,SAAS,mBAAmB,KAAqB;AACtD,MACE,IAAI,WAAW,MAAM,KACrB,IAAI,WAAW,MAAM,KACrB,IAAI,WAAW,MAAM;AAErB,WAAO;AACT,MAAI,IAAI,WAAW,MAAM,EAAG,QAAO;AACnC,MAAI,IAAI,WAAW,MAAM,EAAG,QAAO;AACnC,MAAI,IAAI,WAAW,MAAM,EAAG,QAAO;AACnC,SAAO;AACT;;;AF9NA,eAAsB,WAAW,OAAiB;AAChD,SAAO,MAAM,iCAAAC,QAAW,YAAY,WAAW,KAAK;AACtD;AAEA,eAAsB,UACpB,OACA,aACqB;AACrB,QAAM,MAAY,WAAW,KAAK;AAClC,QAAM,MAAY,eAAe,KAAK,WAAW;AACjD,QAAM,OAAO,MAAM,WAAW,GAAG;AACjC,SAAa,kBAAkB,IAAI;AACrC;AAEA,eAAsB,WACpB,OACA,YACA,UACA;AACA,QAAM,OAAO,IAAI,WAAW;AAC5B,MAAI,SAAS;AACb,WAAS,IAAI,YAAY,IAAI,UAAU,KAAK;AAC1C,UAAM,QAAQ,MAAM,UAAU,OAAO,CAAC;AACtC,SAAK,IAAI,OAAO,MAAM;AACtB,cAAU,MAAM;AAAA,EAClB;AACA,SAAO;AACT;AAEA,eAAsB,WACpB,OACA,aACA,MACe;AACf,QAAM,MAAY,WAAW,KAAK;AAClC,QAAM,MAAY,gBAAgB,KAAK,aAAa,IAAI;AACxD,QAAM,OAAO,MAAM,WAAW,GAAG;AACjC,EAAM,mBAAmB,IAAI;AAC/B;AAEA,eAAsB,YACpB,OACA,aACA,MACe;AACf,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,YAAY,KAAK,CAAC;AACxB,QAAI,cAAc,QAAW;AAC3B,YAAM,IAAI,OAAO,uCAAuC,CAAC,EAAE;AAAA,IAC7D;AACA,UAAM,WAAW,OAAO,cAAc,GAAG,SAAS;AAAA,EACpD;AACF;AAEA,eAAsB,gBAAqC;AACzD,QAAM,MAAY,mBAAmB;AACrC,QAAM,OAAO,MAAM,WAAW,GAAG;AACjC,SAAa,gBAAgB,IAAI;AACnC;;;AGhEA,IAAAC,uBAAyB;AACzB,IAAAC,mCAAwB;AAEjB,IAAMC,QACX,8BAAS,OAAO,QAAQ,CAAC,yCAAQ,WAAW,IAAI,yCAAQ;;;ACAnD,IAAM,UAAU;AAAA,EACrB,GAAGC;AAAA,EACH,MAAAC;AAAA,EACA;AACF;;;ACRA,IAAAC,sBAAA;AAAA,SAAAA,qBAAA;AAAA,uBAAAC;AAAA,EAAA,iBAAAC;AAAA,EAAA,kBAAAC;AAAA,EAAA,kBAAAC;AAAA,EAAA,mBAAAC;AAAA;AAMA,eAAsBC,YACpB,aACA,MACe;AACf,QAAM,WAAW,eAAe,QAAQ,MAAM,YAAY;AACxD,UAAM,MAAM,MAAM,OAAO,OAAO;AAChC,QAAI,EAAC,2BAAK,IAAI,OAAM,IAAI,OAAO,0BAA0B;AACzD,UAAM,QAAQ,WAAW,IAAI,IAAI,aAAa,IAAI;AAAA,EACpD,CAAC;AACH;AAEA,eAAsBC,aACpB,aACA,MACe;AACf,QAAM,WAAW,eAAe,QAAQ,MAAM,YAAY;AACxD,UAAM,MAAM,MAAM,OAAO,OAAO;AAChC,QAAI,EAAC,2BAAK,IAAI,OAAM,IAAI,OAAO,0BAA0B;AACzD,YAAQ,YAAY,IAAI,IAAI,aAAa,IAAI;AAAA,EAC/C,CAAC;AACH;AAEA,eAAsBC,WAAU,aAA0C;AACxE,SAAO,MAAM,WAAW,eAAe,QAAQ,MAAM,YAAY;AAC/D,UAAM,MAAM,MAAM,OAAO,OAAO;AAChC,QAAI,EAAC,2BAAK,IAAI,OAAM,IAAI,OAAO,0BAA0B;AACzD,WAAO,MAAM,QAAQ,UAAU,IAAI,IAAI,WAAW;AAAA,EACpD,CAAC;AACH;AAEA,eAAsBC,YACpB,YACA,UACqB;AACrB,SAAO,MAAM,WAAW,eAAe,QAAQ,MAAM,YAAY;AAC/D,UAAM,MAAM,MAAM,OAAO,OAAO;AAChC,QAAI,EAAC,2BAAK,IAAI,OAAM,IAAI,MAAM,0BAA0B;AACxD,WAAO,MAAM,QAAQ,WAAW,IAAI,IAAI,YAAY,QAAQ;AAAA,EAC9D,CAAC;AACH;AAEA,eAAsBC,iBAAqC;AACzD,SAAO,MAAM,WAAW,eAAe,QAAQ,MAAM,QAAQ,aAAa;AAC5E;;;ACvCO,IAAM,MAAM;AAAA,EACjB,SAAS;AAAA,EACT,GAAG,EAAE,GAAGC,oBAAK;AAAA,EACb,MAAM,EAAE,GAAGA,qBAAS,QAAqB;AAAA,EACzC,KAAK,EAAE,GAAGA,oBAAO;AACnB;;;ACfA,mBAMO;AAqBH;AAXJ,IAAM,iBAAa,4BAAsC,IAAI;AAEtD,SAAS,YAAY,EAAE,SAAS,GAAsB;AAC3D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,WAAW,SAAS,CAAC;AAExD,8BAAU,MAAM;AACd,UAAM,cAAc,WAAW,UAAU,QAAQ;AACjD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SACE,4CAAC,WAAW,UAAX,EAAoB,OAAO,EAAE,OAAO,SAAS,WAAW,GACtD,UACH;AAEJ;AAEO,SAAS,gBAAgB;AAC9B,QAAM,UAAM,yBAAW,UAAU;AACjC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,4CAA4C;AACtE,SAAO;AACT;;;ACrCA,IAAAC,gBAA0B;AAKnB,SAAS,OACd,OACA,SACA;AACA,+BAAU,MAAM;AACd,eAAW;AAAA,MACT,OAAO,QAAkB;AACvB,YAAI,CAAC,IAAI,GAAI;AACb,cAAM,IAAI,EAAE;AAAA,MACd;AAAA,MACA,EAAE,YAAY,mCAAS,WAAW;AAAA,IACpC;AAEA,WAAO,MAAM;AACX,iBAAW,WAAW;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AACZ;;;ACtBA,IAAAC,gBAA4B;AAKrB,SAAS,eAAe;AAC7B,QAAM,YAAQ;AAAA,IACZ,CAAC,OAAiD,eAAwB;AACxE,iBAAW,YAAY,OAAO,EAAE,WAAW,CAAC;AAAA,IAC9C;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,WAAO,2BAAY,MAAM;AAC7B,eAAW,WAAW;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,OAAO,KAAK;AACvB;;;AClBA,IAAAC,gBAAoC;AAI7B,SAAS,cAAc;AAC5B,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,WAAW,SAAS,CAAC;AAE9D,+BAAU,MAAM,WAAW,UAAU,WAAW,GAAG,CAAC,CAAC;AAErD,SAAO;AACT;;;ACVA,IAAAC,mCAIO;AAIA,SAAS,mBAAmB;AACjC,iBAAe,UAAU,SAAuB;AAC9C,WAAO,WAAW,eAAe,yCAAQ,MAAM,YAAY;AACzD,YAAM,QAAQ,sCAAK,cAAc,OAAO;AACxC,YAAM,iCAAAC,QAAW,YAAY,iBAAiB,KAAK;AAAA,IACrD,CAAC;AAAA,EACH;AAEA,iBAAe,YACbC,OACA,IACA;AACA,WAAO,WAAW,eAAeA,OAAM,EAAE;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","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","import_react_native_nfc_manager","NfcManager","tech"]}
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/tag/internal/operations.ts","../src/nfc/tag/internal/index.ts","../src/nfc/tag/operations.ts","../src/nfc/primitives.ts","../src/nfc/service/state/index.ts","../src/nfc/error.ts","../src/nfc/service/strategies/error.ts","../src/nfc/service/strategies/tag-event.ts","../src/nfc/service/strategies/tag-event-loop.ts","../src/nfc/service/strategies/tech.ts","../src/nfc/service/strategies/tech-loop.ts","../src/nfc/service/index.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-tech.ts","../src/react/use-nfc-tech-loop.ts","../src/react/use-nfc-tag-event.ts","../src/react/use-nfc-tag-event-loop.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 { 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\nimport { NfcPrimitives } from \"../primitives\";\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 NfcPrimitives.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 NfcPrimitives.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 NfcPrimitives.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 NfcPrimitives.withTechnology(\r\n nfcNdefTag.tech,\r\n nfcManager.ndefHandler.makeReadOnly,\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 { nfcTag } from \"./internal\";\r\nimport { NfcPrimitives } from \"../primitives\";\r\n\r\nexport async function getTag(tech: NfcTech[]): Promise<TagEvent> {\r\n return NfcPrimitives.withTechnology(tech, nfcTag.getTag);\r\n}\r\n","import nfcManager, {\r\n type NfcEvents,\r\n type NfcTech,\r\n type OnNfcEvents,\r\n type RegisterTagEventOpts,\r\n} from \"react-native-nfc-manager\";\r\n\r\nexport class NfcPrimitives {\r\n private static isRequestingTechnology = false;\r\n private static isCancellingTechnology = false;\r\n\r\n static async cleanTechnology(): Promise<void> {\r\n await NfcPrimitives.stopTechnology();\r\n NfcPrimitives.isCancellingTechnology = false;\r\n }\r\n\r\n static async startTechnology(\r\n tech: NfcTech[],\r\n options?: RegisterTagEventOpts,\r\n ): Promise<void> {\r\n if (NfcPrimitives.isRequestingTechnology) {\r\n throw new Error(\"Technology already started\");\r\n }\r\n NfcPrimitives.isRequestingTechnology = true;\r\n\r\n try {\r\n console.log(\"Technology started\");\r\n await nfcManager.requestTechnology(tech, options);\r\n } finally {\r\n NfcPrimitives.isRequestingTechnology = false;\r\n }\r\n }\r\n\r\n static async stopTechnology(): Promise<void> {\r\n if (NfcPrimitives.isCancellingTechnology) return;\r\n NfcPrimitives.isCancellingTechnology = true;\r\n try {\r\n await nfcManager.cancelTechnologyRequest();\r\n console.log(\"Technology stopped\");\r\n } catch (_e) {\r\n } finally {\r\n NfcPrimitives.isCancellingTechnology = false;\r\n }\r\n }\r\n\r\n static async withTechnology<T>(\r\n tech: NfcTech[],\r\n callback: () => Promise<T>,\r\n options?: RegisterTagEventOpts,\r\n ): Promise<T> {\r\n let res: T | undefined;\r\n try {\r\n await NfcPrimitives.startTechnology(tech, options);\r\n res = await callback();\r\n } finally {\r\n await NfcPrimitives.stopTechnology();\r\n }\r\n return res;\r\n }\r\n\r\n static async getTag(): Promise<any> {\r\n return await nfcManager.getTag();\r\n }\r\n\r\n static async registerTagEvent(options?: RegisterTagEventOpts): Promise<void> {\r\n await nfcManager.registerTagEvent(options);\r\n }\r\n\r\n static async unregisterTagEvent(): Promise<void> {\r\n await nfcManager.unregisterTagEvent();\r\n }\r\n\r\n static setEventListener(event: NfcEvents, handler: OnNfcEvents | null): void {\r\n nfcManager.setEventListener(event, handler);\r\n }\r\n}\r\n","import { NfcState } from \"../state/types\";\r\nimport type { NfcStrategy } from \"../strategies/types\";\r\nimport { type Job } from \"../types\";\r\n\r\nexport class NfcStateMachine {\r\n private state: NfcState = NfcState.IDLE;\r\n private currentJob: Job | null = null;\r\n\r\n async transition(to: NfcState, strategy: NfcStrategy): Promise<void> {\r\n if (!this.currentJob) {\r\n throw new Error(\"No current job\");\r\n }\r\n if (!strategy.canHandle(this.currentJob)) {\r\n throw new Error(\r\n `Strategy ${strategy.constructor.name} cannot handle ${this.currentJob.type}`,\r\n );\r\n }\r\n\r\n console.log(`🔄 ${this.state} → ${to}`);\r\n this.state = to;\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n setCurrentJob(job: Job): void {\r\n this.currentJob = job;\r\n }\r\n\r\n async transitionToIdle(): Promise<void> {\r\n console.log(\"🔄 Transitioning to idle\");\r\n this.state = NfcState.IDLE;\r\n this.currentJob = null;\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.state === NfcState.IDLE) return;\r\n if (!this.isLoopingState()) return;\r\n console.log(\"🔄 Transitioning to stopping\");\r\n this.state = NfcState.STOPPING;\r\n }\r\n\r\n private isLoopingState(): boolean {\r\n return [NfcState.TECH_LOOP, NfcState.TAG_EVENT_LOOP].includes(this.state);\r\n }\r\n}\r\n","export class NfcError extends Error {\r\n constructor(message: string) {\r\n super(`[NFC] ${message}`);\r\n }\r\n}\r\n","import { NfcError } from \"../../error\";\r\n\r\nexport class NfcStrategyError extends NfcError {\r\n constructor(message: string, strategy: string) {\r\n super(`[${strategy}] ${message}`);\r\n }\r\n}\r\n","import { NfcPrimitives } from \"../../primitives\";\r\nimport type { NfcStateMachine } from \"../state\";\r\nimport { NfcStrategyError } from \"../strategies/error\";\r\nimport { NfcEvents, type TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport {\r\n type NfcStrategy,\r\n} from \"../strategies/types\";\r\n\r\nimport { type Job, type TagEventJob, JobType } from \"../types\";\r\n\r\nexport class TagEventStrategy implements NfcStrategy {\r\n canHandle(job: Job): boolean {\r\n return job.type === JobType.TAG_EVENT;\r\n }\r\n\r\n async execute(\r\n job: TagEventJob,\r\n stateMachine: NfcStateMachine,\r\n ): Promise<void> {\r\n const { onTag, options } = job;\r\n\r\n NfcPrimitives.setEventListener(NfcEvents.DiscoverTag, null);\r\n\r\n try {\r\n await NfcPrimitives.registerTagEvent(options);\r\n } catch (err: any) {\r\n NfcPrimitives.setEventListener(NfcEvents.DiscoverTag, null);\r\n throw new NfcStrategyError(\r\n `TagEvent registration failed: ${err.message}`,\r\n this.constructor.name,\r\n );\r\n }\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n let done = false;\r\n\r\n const handler = async (tag: TagEvent) => {\r\n if (done) return;\r\n done = true;\r\n\r\n try {\r\n await onTag(tag);\r\n resolve();\r\n } catch (err: any) {\r\n reject(\r\n new NfcStrategyError(\r\n `Tag processing failed: ${err.message}`,\r\n this.constructor.name,\r\n ),\r\n );\r\n } finally {\r\n NfcPrimitives.setEventListener(NfcEvents.DiscoverTag, null);\r\n try {\r\n await NfcPrimitives.unregisterTagEvent();\r\n } catch {}\r\n }\r\n };\r\n\r\n NfcPrimitives.setEventListener(NfcEvents.DiscoverTag, handler);\r\n });\r\n }\r\n}\r\n","import { NfcPrimitives } from \"../../primitives\";\r\nimport type { NfcStateMachine } from \"../state\";\r\nimport { NfcState } from \"../state/types\";\r\nimport { NfcStrategyError } from \"../strategies/error\";\r\nimport { NfcEvents, type TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport {\r\n type NfcStrategy,\r\n} from \"../strategies/types\";\r\n\r\nimport { type Job, type TagEventLoopJob, JobType } from \"../types\";\r\n\r\nexport class TagEventLoopStrategy implements NfcStrategy {\r\n canHandle(job: Job): boolean {\r\n return job.type === JobType.TAG_EVENT_LOOP;\r\n }\r\n\r\n async execute(\r\n job: TagEventLoopJob,\r\n stateMachine: NfcStateMachine,\r\n ): Promise<void> {\r\n const { onTag, options } = job;\r\n\r\n let isProcessingTag = false;\r\n let cooldownTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const handleTagEvent = async (tag: TagEvent) => {\r\n if (!tag || isProcessingTag) return;\r\n\r\n isProcessingTag = true;\r\n try {\r\n await onTag(tag);\r\n } catch (err: any) {\r\n console.warn(\"[NFC] Tag processing failed:\", err);\r\n } finally {\r\n isProcessingTag = false;\r\n }\r\n };\r\n\r\n NfcPrimitives.setEventListener(NfcEvents.DiscoverTag, handleTagEvent);\r\n\r\n try {\r\n await NfcPrimitives.registerTagEvent(options);\r\n\r\n // INDUSTRY STANDARD: 100ms state poll\r\n await new Promise<void>((resolve) => {\r\n const interval = setInterval(() => {\r\n if (stateMachine.getState() === NfcState.STOPPING) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n } catch (err: any) {\r\n throw new NfcStrategyError(\r\n `TagEvent loop failed: ${err.message}`,\r\n this.constructor.name,\r\n );\r\n } finally {\r\n NfcPrimitives.setEventListener(NfcEvents.DiscoverTag, null);\r\n await NfcPrimitives.unregisterTagEvent().catch(() => {});\r\n if (cooldownTimer) clearTimeout(cooldownTimer);\r\n }\r\n }\r\n}\r\n","import { NfcPrimitives } from \"../../primitives\";\r\nimport type { NfcStateMachine } from \"../state\";\r\nimport {\r\n type NfcStrategy,\r\n} from \"../strategies/types\";\r\n\r\nimport { type Job, type TechJob, JobType } from \"../types\";\r\n\r\nexport class TechStrategy implements NfcStrategy {\r\n canHandle(job: Job): boolean {\r\n return job.type === JobType.TECH;\r\n }\r\n\r\n async execute(job: Job, stateMachine: NfcStateMachine): Promise<void> {\r\n const { tech, withTechnology, afterTechnology, options } = job as TechJob;\r\n await NfcPrimitives.withTechnology(tech, withTechnology, options);\r\n if (afterTechnology) {\r\n await afterTechnology();\r\n }\r\n }\r\n}\r\n","import { NfcPrimitives } from \"../../primitives\";\r\nimport type { NfcStateMachine } from \"../state\";\r\nimport { NfcState } from \"../state/types\";\r\nimport {\r\n type NfcStrategy,\r\n} from \"../strategies/types\";\r\n\r\nimport { type Job, type TechLoopJob, JobType } from \"../types\";\r\n\r\nexport class TechLoopStrategy implements NfcStrategy {\r\n canHandle(job: Job): boolean {\r\n return job.type === JobType.TECH_LOOP;\r\n }\r\n\r\n async execute(\r\n job: TechLoopJob,\r\n stateMachine: NfcStateMachine,\r\n ): Promise<void> {\r\n const { tech, withTechnology, afterTechnology, options } = job;\r\n\r\n while (true) {\r\n if (stateMachine.getState() === NfcState.STOPPING) break;\r\n\r\n try {\r\n await NfcPrimitives.withTechnology(tech, withTechnology, options);\r\n } catch (e) {\r\n if (await handleStartTechError(e)) {\r\n continue;\r\n }\r\n break;\r\n }\r\n\r\n if (afterTechnology) {\r\n await afterTechnology();\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function handleStartTechError(e: any): Promise<boolean> {\r\n if (e.message.includes(\"UserCancel\")) {\r\n console.log(\"withTechnology() Cancelled\");\r\n return true;\r\n }\r\n if (e.message === \"Technology already started\") {\r\n console.warn(\"withTechnology() Already started\");\r\n await NfcPrimitives.stopTechnology();\r\n return true;\r\n }\r\n console.error(\"withTechnology() failed\", e.message);\r\n return false;\r\n}\r\n","import type {\r\n NfcTech,\r\n RegisterTagEventOpts,\r\n TagEvent,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { NfcStateMachine } from \"./state\";\r\nimport { NfcState } from \"./state/types\";\r\nimport { TagEventStrategy } from \"./strategies/tag-event\";\r\nimport { TagEventLoopStrategy } from \"./strategies/tag-event-loop\";\r\nimport { TechStrategy } from \"./strategies/tech\";\r\nimport { TechLoopStrategy } from \"./strategies/tech-loop\";\r\nimport type { NfcStrategy } from \"./strategies/types\";\r\nimport {\r\n type Job,\r\n JobType,\r\n type TagEventJob,\r\n type TagEventLoopJob,\r\n type TechJob,\r\n type TechLoopJob,\r\n} from \"./types\";\r\n\r\nexport class NfcService {\r\n private static instance: NfcService;\r\n\r\n private strategies: NfcStrategy[] = [\r\n new TagEventStrategy(),\r\n new TagEventLoopStrategy(),\r\n new TechStrategy(),\r\n new TechLoopStrategy(),\r\n ];\r\n\r\n private stateMachine = new NfcStateMachine();\r\n private jobRetry: Job | null = null;\r\n private isExecutingJobs = false;\r\n\r\n static getInstance(): NfcService {\r\n if (!NfcService.instance) NfcService.instance = new NfcService();\r\n return NfcService.instance;\r\n }\r\n\r\n async startTech(\r\n tech: NfcTech[],\r\n withTechnology: () => Promise<void>,\r\n afterTechnology?: () => Promise<void>,\r\n options?: RegisterTagEventOpts,\r\n ) {\r\n const job: TechJob = {\r\n type: JobType.TECH,\r\n tech,\r\n withTechnology,\r\n afterTechnology,\r\n options,\r\n };\r\n await this.executeOrQueue(job);\r\n }\r\n\r\n async startTechLoop(\r\n tech: NfcTech[],\r\n withTechnology: () => Promise<void>,\r\n afterTechnology?: () => Promise<void>,\r\n options?: RegisterTagEventOpts,\r\n ): Promise<void> {\r\n const job: TechLoopJob = {\r\n type: JobType.TECH_LOOP,\r\n tech,\r\n withTechnology,\r\n afterTechnology,\r\n options,\r\n };\r\n this.executeOrQueue(job);\r\n }\r\n\r\n async startTagEvent(onTag: (tag: TagEvent) => Promise<void>) {\r\n const job: TagEventJob = {\r\n type: JobType.TAG_EVENT,\r\n onTag,\r\n };\r\n await this.executeOrQueue(job);\r\n }\r\n\r\n async startTagEventLoop(\r\n onTag: (tag: TagEvent) => Promise<void>,\r\n options?: RegisterTagEventOpts,\r\n ) {\r\n const job: TagEventLoopJob = {\r\n type: JobType.TAG_EVENT_LOOP,\r\n onTag,\r\n options,\r\n };\r\n await this.executeOrQueue(job);\r\n }\r\n\r\n async stop(): Promise<void> {\r\n console.log(\"🛑 Stopping NFC\");\r\n this.jobRetry = null;\r\n await this.stateMachine.stop();\r\n }\r\n\r\n private async executeOrQueue(job: Job): Promise<void> {\r\n const state = this.stateMachine.getState();\r\n\r\n if (state === NfcState.STOPPING) {\r\n console.log(\"🔄 Setting retry job:\", job.type);\r\n this.jobRetry = job;\r\n return;\r\n }\r\n await this.executeJob(job);\r\n }\r\n\r\n private async executeJob(job: Job): Promise<void> {\r\n if (this.isExecutingJobs) return;\r\n this.isExecutingJobs = true;\r\n\r\n let _nextJob: Job | null = job;\r\n while (_nextJob) {\r\n const strategy = this.strategies.find((s) => s.canHandle(job));\r\n if (!strategy) throw new Error(`No strategy for ${job.type}`);\r\n\r\n this.stateMachine.setCurrentJob(job);\r\n\r\n try {\r\n const targetState = mapJobTypeToState(job.type);\r\n await this.stateMachine.transition(targetState, strategy);\r\n\r\n console.log(`🚀 Starting ${job.type} via ${strategy.constructor.name}`);\r\n await strategy.execute(job, this.stateMachine);\r\n console.log(`✅ Completed ${job.type}`);\r\n } catch (error: any) {\r\n console.error(`❌ ${job.type} failed:`, error); //reload\r\n throw error;\r\n } finally {\r\n await this.stateMachine.transitionToIdle();\r\n\r\n if (this.jobRetry) {\r\n console.log(\"🔄 Retrying job:\", this.jobRetry.type);\r\n }\r\n _nextJob = this.jobRetry;\r\n }\r\n }\r\n this.isExecutingJobs = false;\r\n }\r\n}\r\n\r\nfunction mapJobTypeToState(type: JobType): NfcState {\r\n switch (type) {\r\n case JobType.TECH:\r\n return NfcState.TECH;\r\n case JobType.TECH_LOOP:\r\n return NfcState.TECH_LOOP;\r\n case JobType.TAG_EVENT:\r\n return NfcState.TAG_EVENT;\r\n case JobType.TAG_EVENT_LOOP:\r\n return NfcState.TAG_EVENT_LOOP;\r\n }\r\n}\r\n\r\nexport const nfcService = NfcService.getInstance();\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 { NfcPrimitives } from \"../primitives\";\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 NfcPrimitives.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 NfcPrimitives.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 NfcPrimitives.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 NfcPrimitives.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 NfcPrimitives.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 { useCallback } from \"react\";\r\nimport type { NfcTech, RegisterTagEventOpts } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTech(\r\n tech: NfcTech[],\r\n withTechnology: () => Promise<void>,\r\n afterTechnology?: () => Promise<void>,\r\n options?: RegisterTagEventOpts,\r\n) {\r\n const startTech = useCallback(() => {\r\n nfcService\r\n .startTech(tech, withTechnology, afterTechnology, options || {})\r\n .catch(console.error);\r\n }, [tech, withTechnology, afterTechnology, options]);\r\n\r\n return { startTech };\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport type { NfcTech, RegisterTagEventOpts } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTechLoop(\r\n tech: NfcTech[],\r\n withTechnology: () => Promise<void>,\r\n afterTechnology?: () => Promise<void>,\r\n options?: RegisterTagEventOpts,\r\n) {\r\n const [isRunning, setIsRunning] = useState(false);\r\n\r\n const start = useCallback(async () => {\r\n await nfcService.startTechLoop(\r\n tech,\r\n withTechnology,\r\n afterTechnology,\r\n options || {},\r\n );\r\n setIsRunning(true);\r\n }, [tech, withTechnology, afterTechnology, options]);\r\n\r\n const stop = useCallback(async () => {\r\n await nfcService.stop();\r\n setIsRunning(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n return () => {\r\n nfcService.stop(); // Graceful unmount...\r\n };\r\n }, []);\r\n\r\n return { start, stop, isRunning };\r\n}\r\n","import { nfcService } from \"../nfc/service\";\r\nimport { useCallback } from \"react\";\r\nimport type { TagEvent } from \"react-native-nfc-manager\";\r\n\r\nexport function useNfcTagEvent(onTag: (tag: TagEvent) => Promise<void>) {\r\n const startTech = useCallback(() => {\r\n nfcService.startTagEvent(onTag).catch(console.error);\r\n }, [onTag]);\r\n\r\n return { startTech };\r\n}\r\n","import { nfcService } from \"../nfc/service\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport type { RegisterTagEventOpts, TagEvent } from \"react-native-nfc-manager\";\r\n\r\nexport function useNfcTagEventLoop(\r\n onTag: (tag: TagEvent) => Promise<void>,\r\n options?: RegisterTagEventOpts,\r\n) {\r\n const [isRunning, setIsRunning] = useState(false);\r\n\r\n const start = useCallback(async () => {\r\n await nfcService.startTagEventLoop(onTag, options);\r\n setIsRunning(true);\r\n }, [onTag, options]);\r\n\r\n const stop = useCallback(async () => {\r\n await nfcService.stop();\r\n setIsRunning(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n return () => {\r\n nfcService.stop(); // Graceful unmount...\r\n };\r\n }, []);\r\n\r\n return { start, stop, isRunning };\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","operations_exports","import_react_native_nfc_manager","nfcManager","operations_exports","operations_exports","getTag","import_react_native_nfc_manager","tech","nfcManager","getTag","tech","nfcManager","readMessage","write","import_react_native_nfc_manager","import_react_native_nfc_manager","tech","tech","tech","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","tech","import_react","tech","import_react","import_react"]}