@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 +0 -13
- package/README.md +0 -16
- package/dist/index.d.mts +1 -10
- package/dist/index.d.ts +1 -10
- package/dist/index.js +8 -30
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -30
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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,
|
|
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,
|
|
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
|
|
728
|
+
var import_react = require("react");
|
|
749
729
|
function useNfc(onTag, options) {
|
|
750
|
-
(0,
|
|
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
|
|
745
|
+
var import_react2 = require("react");
|
|
766
746
|
function useNfcReader() {
|
|
767
|
-
const start = (0,
|
|
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,
|
|
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
|
|
760
|
+
var import_react3 = require("react");
|
|
781
761
|
function useNfcState() {
|
|
782
|
-
const [nfcState, setNfcState] = (0,
|
|
783
|
-
(0,
|
|
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":"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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","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
|
|
694
|
+
import { useEffect } from "react";
|
|
718
695
|
function useNfc(onTag, options) {
|
|
719
|
-
|
|
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
|
|
726
|
+
import { useEffect as useEffect2, useState } from "react";
|
|
750
727
|
function useNfcState() {
|
|
751
|
-
const [nfcState, setNfcState] =
|
|
752
|
-
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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