@spencerls/react-native-nfc 1.0.9 → 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 CHANGED
@@ -18,7 +18,6 @@ import {
18
18
  useNfcState,
19
19
  useNfcReader,
20
20
  useNfcTechnology,
21
- NfcProvider
22
21
  } from "@spencerls/react-native-nfc";
23
22
  ```
24
23
 
@@ -579,18 +578,6 @@ await runWithTech([NfcTech.NfcV], async () => {
579
578
 
580
579
  ---
581
580
 
582
- # NfcProvider
583
-
584
- Optional provider that exposes service state to React tree.
585
-
586
- ```tsx
587
- <NfcProvider>
588
- <App />
589
- </NfcProvider>
590
- ```
591
-
592
- ---
593
-
594
581
  # Types
595
582
 
596
583
  All types are exported from `@spencerls/react-native-nfc/nfc`.
package/README.md CHANGED
@@ -301,22 +301,6 @@ await nfc.service.stopReader(); // Cross-platform
301
301
 
302
302
  ---
303
303
 
304
- ## Global Provider (Optional)
305
-
306
- ```tsx
307
- import { NfcProvider } from "@spencerls/react-native-nfc";
308
-
309
- export default function App() {
310
- return (
311
- <NfcProvider>
312
- <RootApp />
313
- </NfcProvider>
314
- );
315
- }
316
- ```
317
-
318
- ---
319
-
320
304
  ## License
321
305
 
322
306
  MIT © Spencer Smith
package/dist/index.d.mts CHANGED
@@ -1,7 +1,5 @@
1
1
  import * as react_native_nfc_manager from 'react-native-nfc-manager';
2
2
  import { NdefRecord, ISOLangCode, TNF, TagEvent, NfcTech, NdefStatus } from 'react-native-nfc-manager';
3
- import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import { PropsWithChildren } from 'react';
5
3
 
6
4
  declare class Builder {
7
5
  static records(b: NdefBuilder): NdefRecord[];
@@ -229,13 +227,6 @@ declare const nfc: {
229
227
  };
230
228
  };
231
229
 
232
- interface NfcContextValue {
233
- state: NfcState;
234
- service: typeof nfcService;
235
- }
236
- declare function NfcProvider({ children }: PropsWithChildren): react_jsx_runtime.JSX.Element;
237
- declare function useNfcContext(): NfcContextValue;
238
-
239
230
  declare function useNfc(onTag: (tagId: string) => void, options: {
240
231
  cooldownMs?: number;
241
232
  }): void;
@@ -252,4 +243,4 @@ declare function useNfcTechnology(): {
252
243
  runWithTech: (tech: NfcTech | NfcTech[], fn: () => Promise<void>) => Promise<void>;
253
244
  };
254
245
 
255
- export { type BuildRecordInit, type NdefBuilder, type NdefMessageResult, type NfcMode, NfcProvider, type NfcState, type SystemInfo, nfc, nfcNdefTag, nfcService, nfcTag, nfcVTag, useNfc, useNfcContext, useNfcReader, useNfcState, useNfcTechnology };
246
+ export { type BuildRecordInit, type NdefBuilder, type NdefMessageResult, type NfcMode, type NfcState, type SystemInfo, nfc, nfcNdefTag, nfcService, nfcTag, nfcVTag, useNfc, useNfcReader, useNfcState, useNfcTechnology };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import * as react_native_nfc_manager from 'react-native-nfc-manager';
2
2
  import { NdefRecord, ISOLangCode, TNF, TagEvent, NfcTech, NdefStatus } from 'react-native-nfc-manager';
3
- import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import { PropsWithChildren } from 'react';
5
3
 
6
4
  declare class Builder {
7
5
  static records(b: NdefBuilder): NdefRecord[];
@@ -229,13 +227,6 @@ declare const nfc: {
229
227
  };
230
228
  };
231
229
 
232
- interface NfcContextValue {
233
- state: NfcState;
234
- service: typeof nfcService;
235
- }
236
- declare function NfcProvider({ children }: PropsWithChildren): react_jsx_runtime.JSX.Element;
237
- declare function useNfcContext(): NfcContextValue;
238
-
239
230
  declare function useNfc(onTag: (tagId: string) => void, options: {
240
231
  cooldownMs?: number;
241
232
  }): void;
@@ -252,4 +243,4 @@ declare function useNfcTechnology(): {
252
243
  runWithTech: (tech: NfcTech | NfcTech[], fn: () => Promise<void>) => Promise<void>;
253
244
  };
254
245
 
255
- export { type BuildRecordInit, type NdefBuilder, type NdefMessageResult, type NfcMode, NfcProvider, type NfcState, type SystemInfo, nfc, nfcNdefTag, nfcService, nfcTag, nfcVTag, useNfc, useNfcContext, useNfcReader, useNfcState, useNfcTechnology };
246
+ export { type BuildRecordInit, type NdefBuilder, type NdefMessageResult, type NfcMode, type NfcState, type SystemInfo, nfc, nfcNdefTag, nfcService, nfcTag, nfcVTag, useNfc, useNfcReader, useNfcState, useNfcTechnology };
package/dist/index.js CHANGED
@@ -30,14 +30,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
- NfcProvider: () => NfcProvider,
34
33
  nfc: () => nfc,
35
34
  nfcNdefTag: () => nfcNdefTag,
36
35
  nfcService: () => nfcService,
37
36
  nfcTag: () => nfcTag,
38
37
  nfcVTag: () => nfcVTag,
39
38
  useNfc: () => useNfc,
40
- useNfcContext: () => useNfcContext,
41
39
  useNfcReader: () => useNfcReader,
42
40
  useNfcState: () => useNfcState,
43
41
  useNfcTechnology: () => useNfcTechnology
@@ -726,28 +724,10 @@ var nfc = {
726
724
  tag: { ...operations_exports3 }
727
725
  };
728
726
 
729
- // src/react/nfc-provider.tsx
730
- var import_react = require("react");
731
- var import_jsx_runtime = require("react/jsx-runtime");
732
- var NfcContext = (0, import_react.createContext)(null);
733
- function NfcProvider({ children }) {
734
- const [state, setState] = (0, import_react.useState)(nfcService.getState());
735
- (0, import_react.useEffect)(() => {
736
- const unsubscribe = nfcService.subscribe(setState);
737
- return unsubscribe;
738
- }, []);
739
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NfcContext.Provider, { value: { state, service: nfcService }, children });
740
- }
741
- function useNfcContext() {
742
- const ctx = (0, import_react.useContext)(NfcContext);
743
- if (!ctx) throw new Error("useNfcContext must be inside <NfcProvider>");
744
- return ctx;
745
- }
746
-
747
727
  // src/react/use-nfc.ts
748
- var import_react2 = require("react");
728
+ var import_react = require("react");
749
729
  function useNfc(onTag, options) {
750
- (0, import_react2.useEffect)(() => {
730
+ (0, import_react.useEffect)(() => {
751
731
  nfcService.startReader(
752
732
  async (tag) => {
753
733
  if (!tag.id) return;
@@ -762,25 +742,25 @@ function useNfc(onTag, options) {
762
742
  }
763
743
 
764
744
  // src/react/use-nfc-reader.ts
765
- var import_react3 = require("react");
745
+ var import_react2 = require("react");
766
746
  function useNfcReader() {
767
- const start = (0, import_react3.useCallback)(
747
+ const start = (0, import_react2.useCallback)(
768
748
  (onTag, cooldownMs) => {
769
749
  nfcService.startReader(onTag, { cooldownMs });
770
750
  },
771
751
  []
772
752
  );
773
- const stop = (0, import_react3.useCallback)(() => {
753
+ const stop = (0, import_react2.useCallback)(() => {
774
754
  nfcService.stopReader();
775
755
  }, []);
776
756
  return { start, stop };
777
757
  }
778
758
 
779
759
  // src/react/use-nfc-state.ts
780
- var import_react4 = require("react");
760
+ var import_react3 = require("react");
781
761
  function useNfcState() {
782
- const [nfcState, setNfcState] = (0, import_react4.useState)(nfcService.getState());
783
- (0, import_react4.useEffect)(() => nfcService.subscribe(setNfcState), []);
762
+ const [nfcState, setNfcState] = (0, import_react3.useState)(nfcService.getState());
763
+ (0, import_react3.useEffect)(() => nfcService.subscribe(setNfcState), []);
784
764
  return nfcState;
785
765
  }
786
766
 
@@ -803,14 +783,12 @@ function useNfcTechnology() {
803
783
  }
804
784
  // Annotate the CommonJS export names for ESM import in node:
805
785
  0 && (module.exports = {
806
- NfcProvider,
807
786
  nfc,
808
787
  nfcNdefTag,
809
788
  nfcService,
810
789
  nfcTag,
811
790
  nfcVTag,
812
791
  useNfc,
813
- useNfcContext,
814
792
  useNfcReader,
815
793
  useNfcState,
816
794
  useNfcTechnology
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/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"]}
package/dist/index.mjs CHANGED
@@ -690,33 +690,10 @@ var nfc = {
690
690
  tag: { ...operations_exports3 }
691
691
  };
692
692
 
693
- // src/react/nfc-provider.tsx
694
- import {
695
- createContext,
696
- useContext,
697
- useEffect,
698
- useState
699
- } from "react";
700
- import { jsx } from "react/jsx-runtime";
701
- var NfcContext = createContext(null);
702
- function NfcProvider({ children }) {
703
- const [state, setState] = useState(nfcService.getState());
704
- useEffect(() => {
705
- const unsubscribe = nfcService.subscribe(setState);
706
- return unsubscribe;
707
- }, []);
708
- return /* @__PURE__ */ jsx(NfcContext.Provider, { value: { state, service: nfcService }, children });
709
- }
710
- function useNfcContext() {
711
- const ctx = useContext(NfcContext);
712
- if (!ctx) throw new Error("useNfcContext must be inside <NfcProvider>");
713
- return ctx;
714
- }
715
-
716
693
  // src/react/use-nfc.ts
717
- import { useEffect as useEffect2 } from "react";
694
+ import { useEffect } from "react";
718
695
  function useNfc(onTag, options) {
719
- useEffect2(() => {
696
+ useEffect(() => {
720
697
  nfcService.startReader(
721
698
  async (tag) => {
722
699
  if (!tag.id) return;
@@ -746,10 +723,10 @@ function useNfcReader() {
746
723
  }
747
724
 
748
725
  // src/react/use-nfc-state.ts
749
- import { useEffect as useEffect3, useState as useState2 } from "react";
726
+ import { useEffect as useEffect2, useState } from "react";
750
727
  function useNfcState() {
751
- const [nfcState, setNfcState] = useState2(nfcService.getState());
752
- useEffect3(() => nfcService.subscribe(setNfcState), []);
728
+ const [nfcState, setNfcState] = useState(nfcService.getState());
729
+ useEffect2(() => nfcService.subscribe(setNfcState), []);
753
730
  return nfcState;
754
731
  }
755
732
 
@@ -774,14 +751,12 @@ function useNfcTechnology() {
774
751
  };
775
752
  }
776
753
  export {
777
- NfcProvider,
778
754
  nfc,
779
755
  nfcNdefTag,
780
756
  nfcService,
781
757
  nfcTag,
782
758
  nfcVTag,
783
759
  useNfc,
784
- useNfcContext,
785
760
  useNfcReader,
786
761
  useNfcState,
787
762
  useNfcTechnology
@@ -1 +1 @@
1
- {"version":3,"sources":["../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":["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":"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","names":["Ndef","Ndef","operations_exports","readMessage","write","nfcManager","Platform","nfcManager","nfcManager","Platform","_a","tech","operations_exports","nfcManager","operations_exports","operations_exports","getTag","getTag","tech","nfcManager","readMessage","write","operations_exports","nfcManager","nfcManager","Platform","NfcTech","tech","operations_exports","tech","operations_exports","getSystemInfo","readBlock","readBlocks","writeBlock","writeBlocks","writeBlock","writeBlocks","readBlock","readBlocks","getSystemInfo","operations_exports","useEffect","useEffect","useEffect","useState","useState","useEffect","Ndef","NfcTech","NfcTech","Ndef","tech"]}
1
+ {"version":3,"sources":["../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":["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":["Ndef","Ndef","operations_exports","readMessage","write","nfcManager","Platform","nfcManager","nfcManager","Platform","_a","tech","operations_exports","nfcManager","operations_exports","operations_exports","getTag","getTag","tech","nfcManager","readMessage","write","operations_exports","nfcManager","nfcManager","Platform","NfcTech","tech","operations_exports","tech","operations_exports","getSystemInfo","readBlock","readBlocks","writeBlock","writeBlocks","writeBlock","writeBlocks","readBlock","readBlocks","getSystemInfo","operations_exports","useEffect","useEffect","Ndef","NfcTech","NfcTech","Ndef","tech"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spencerls/react-native-nfc",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "A lightweight NFC manager for React Native projects using react-native-nfc-manager.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",