@spencerls/react-native-nfc 1.0.0 → 1.0.2
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/README.md +9 -8
- package/dist/index.d.mts +142 -110
- package/dist/index.d.ts +142 -110
- package/dist/index.js +304 -188
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +310 -189
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -30,35 +30,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/services/nfc/index.ts
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
|
-
|
|
33
|
+
ndef: () => ndef_exports,
|
|
34
|
+
nfc: () => nfc,
|
|
35
|
+
nfcA: () => a_exports,
|
|
34
36
|
nfcService: () => nfcService,
|
|
35
|
-
|
|
37
|
+
nfcV: () => v_exports
|
|
36
38
|
});
|
|
37
39
|
module.exports = __toCommonJS(index_exports);
|
|
38
40
|
|
|
39
|
-
// src/services/nfc/
|
|
41
|
+
// src/services/nfc/service.ts
|
|
40
42
|
var import_react_native = require("react-native");
|
|
41
43
|
var import_react_native_nfc_manager = __toESM(require("react-native-nfc-manager"));
|
|
42
44
|
var NfcService = class {
|
|
43
45
|
constructor() {
|
|
44
|
-
this.state = "idle";
|
|
45
|
-
this.lastTag = null;
|
|
46
|
+
this.state = { mode: "idle", tag: null };
|
|
46
47
|
this.listeners = /* @__PURE__ */ new Set();
|
|
47
48
|
import_react_native_nfc_manager.default.start();
|
|
48
49
|
}
|
|
49
50
|
// --- internal state mgmt ---
|
|
50
|
-
setState(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
for (const listener of this.listeners) listener(next);
|
|
54
|
-
}
|
|
51
|
+
setState(partial) {
|
|
52
|
+
this.state = { ...this.state, ...partial };
|
|
53
|
+
for (const listener of this.listeners) listener(this.state);
|
|
55
54
|
}
|
|
56
55
|
getState() {
|
|
57
56
|
return this.state;
|
|
58
57
|
}
|
|
59
|
-
getLastTag() {
|
|
60
|
-
return this.lastTag;
|
|
61
|
-
}
|
|
62
58
|
subscribe(fn) {
|
|
63
59
|
this.listeners.add(fn);
|
|
64
60
|
fn(this.state);
|
|
@@ -68,13 +64,13 @@ var NfcService = class {
|
|
|
68
64
|
}
|
|
69
65
|
// --- Reader lifecycle ---
|
|
70
66
|
async startReader(readerModeFlags, onTag) {
|
|
71
|
-
if (this.state !== "idle") {
|
|
72
|
-
console.warn(`[NFC] Cannot start reader while ${this.state}`);
|
|
67
|
+
if (this.state.mode !== "idle") {
|
|
68
|
+
console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);
|
|
73
69
|
return;
|
|
74
70
|
}
|
|
75
|
-
this.setState("starting");
|
|
71
|
+
this.setState({ mode: "starting" });
|
|
76
72
|
import_react_native_nfc_manager.default.setEventListener(import_react_native_nfc_manager.NfcEvents.DiscoverTag, (tag) => {
|
|
77
|
-
this.
|
|
73
|
+
this.setState({ tag });
|
|
78
74
|
onTag == null ? void 0 : onTag(tag);
|
|
79
75
|
});
|
|
80
76
|
try {
|
|
@@ -82,211 +78,331 @@ var NfcService = class {
|
|
|
82
78
|
isReaderModeEnabled: true,
|
|
83
79
|
readerModeFlags
|
|
84
80
|
});
|
|
85
|
-
if (this.state === "starting") {
|
|
86
|
-
this.setState("active");
|
|
81
|
+
if (this.state.mode === "starting") {
|
|
82
|
+
this.setState({ mode: "active" });
|
|
87
83
|
}
|
|
88
84
|
} catch (err) {
|
|
89
85
|
console.warn("[NFC] startReader error:", err);
|
|
90
|
-
this.setState("idle");
|
|
86
|
+
this.setState({ mode: "idle" });
|
|
91
87
|
}
|
|
92
88
|
}
|
|
93
89
|
async stopReader() {
|
|
94
|
-
if (["idle", "stopping"].includes(this.state)) return;
|
|
95
|
-
this.setState("stopping");
|
|
90
|
+
if (["idle", "stopping"].includes(this.state.mode)) return;
|
|
91
|
+
this.setState({ mode: "stopping" });
|
|
96
92
|
try {
|
|
97
93
|
await import_react_native_nfc_manager.default.unregisterTagEvent();
|
|
98
94
|
} catch {
|
|
99
95
|
}
|
|
100
|
-
this.setState("idle");
|
|
96
|
+
this.setState({ mode: "idle" });
|
|
101
97
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
throw new Error(`Cannot write while reader is ${this.state}`);
|
|
98
|
+
async withTechnology(tech, handler) {
|
|
99
|
+
if (this.state.mode === "technology") {
|
|
100
|
+
throw new Error(`[NFC] Technology is already in use!`);
|
|
106
101
|
}
|
|
107
|
-
this.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
102
|
+
if (this.state.mode === "starting" || this.state.mode === "active" || this.state.mode === "stopping") {
|
|
103
|
+
await this.stopReader();
|
|
104
|
+
}
|
|
105
|
+
if (this.state.mode !== "idle") {
|
|
106
|
+
throw new Error(
|
|
107
|
+
`[NFC] Cannot start technology session in mode ${this.state.mode}`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
this.setState({ mode: "technology" });
|
|
112
111
|
try {
|
|
113
|
-
await import_react_native_nfc_manager.default.requestTechnology(
|
|
114
|
-
alertMessage: "Hold near NFC tag
|
|
112
|
+
await import_react_native_nfc_manager.default.requestTechnology(tech, {
|
|
113
|
+
alertMessage: "Hold near NFC tag"
|
|
114
|
+
// iOS
|
|
115
115
|
});
|
|
116
|
-
const
|
|
117
|
-
await import_react_native_nfc_manager.default.ndefHandler.writeNdefMessage(bytes);
|
|
116
|
+
const result = await handler();
|
|
118
117
|
if (import_react_native.Platform.OS === "ios")
|
|
119
|
-
import_react_native_nfc_manager.default.setAlertMessageIOS("
|
|
118
|
+
await import_react_native_nfc_manager.default.setAlertMessageIOS("Success!");
|
|
119
|
+
return result;
|
|
120
120
|
} catch (err) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
res.error = err;
|
|
121
|
+
const message = typeof err === "string" ? err : (err == null ? void 0 : err.message) || "Unknown NFC error";
|
|
122
|
+
throw new Error(`[NFC] withTechnology error: ${message}`);
|
|
124
123
|
} finally {
|
|
125
124
|
try {
|
|
126
125
|
await import_react_native_nfc_manager.default.cancelTechnologyRequest();
|
|
127
|
-
} catch {
|
|
128
|
-
|
|
129
|
-
this.setState("idle");
|
|
130
|
-
return res;
|
|
126
|
+
} catch (cancelErr) {
|
|
127
|
+
console.warn("[NFC] cancelTechnologyRequest failed:", cancelErr);
|
|
131
128
|
}
|
|
129
|
+
this.setState({ mode: "idle" });
|
|
132
130
|
}
|
|
133
131
|
}
|
|
134
132
|
};
|
|
135
133
|
var nfcService = new NfcService();
|
|
136
134
|
|
|
137
|
-
// src/services/nfc/
|
|
138
|
-
var
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
typeStr = toAscii(toU8(record.type));
|
|
152
|
-
}
|
|
153
|
-
const payloadU8 = toU8(record.payload);
|
|
154
|
-
if (tnf === import_react_native_nfc_manager2.Ndef.TNF_WELL_KNOWN && typeStr === "T") {
|
|
155
|
-
const status = payloadU8[0];
|
|
156
|
-
const langLen = status & 63;
|
|
157
|
-
const lang = toAscii(payloadU8.subarray(1, 1 + langLen));
|
|
158
|
-
const textBytes = payloadU8.subarray(1 + langLen);
|
|
159
|
-
const text = new TextDecoder().decode(textBytes);
|
|
160
|
-
return { kind: "text", text, lang };
|
|
135
|
+
// src/services/nfc/a/index.ts
|
|
136
|
+
var a_exports = {};
|
|
137
|
+
__export(a_exports, {
|
|
138
|
+
operations: () => operations,
|
|
139
|
+
utils: () => utils_exports
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// src/services/nfc/a/operations.ts
|
|
143
|
+
var import_react_native_nfc_manager2 = __toESM(require("react-native-nfc-manager"));
|
|
144
|
+
var operations = {
|
|
145
|
+
async transceive(data) {
|
|
146
|
+
return nfcService.withTechnology(import_react_native_nfc_manager2.NfcTech.NfcA, async () => {
|
|
147
|
+
return await import_react_native_nfc_manager2.default.transceive(data);
|
|
148
|
+
});
|
|
161
149
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// src/services/nfc/a/utils.ts
|
|
153
|
+
var utils_exports = {};
|
|
154
|
+
__export(utils_exports, {
|
|
155
|
+
NfcAUtils: () => NfcAUtils
|
|
156
|
+
});
|
|
157
|
+
var NfcAUtils = {};
|
|
158
|
+
|
|
159
|
+
// src/services/nfc/ndef/index.ts
|
|
160
|
+
var ndef_exports = {};
|
|
161
|
+
__export(ndef_exports, {
|
|
162
|
+
operations: () => operations2,
|
|
163
|
+
utils: () => utils_exports2
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// src/services/nfc/ndef/operations.ts
|
|
167
|
+
var import_react_native_nfc_manager3 = __toESM(require("react-native-nfc-manager"));
|
|
168
|
+
var operations2 = {
|
|
169
|
+
async writeNdef(records) {
|
|
170
|
+
await nfcService.withTechnology([import_react_native_nfc_manager3.NfcTech.Ndef, import_react_native_nfc_manager3.NfcTech.NfcA], async () => {
|
|
171
|
+
const bytes = import_react_native_nfc_manager3.Ndef.encodeMessage(records);
|
|
172
|
+
await import_react_native_nfc_manager3.default.ndefHandler.writeNdefMessage(bytes);
|
|
173
|
+
});
|
|
174
|
+
},
|
|
175
|
+
writeTextNdef(text) {
|
|
176
|
+
const record = import_react_native_nfc_manager3.Ndef.textRecord(text);
|
|
177
|
+
return this.writeNdef([record]);
|
|
178
|
+
},
|
|
179
|
+
writeUriNdef(uri) {
|
|
180
|
+
const record = import_react_native_nfc_manager3.Ndef.uriRecord(uri);
|
|
181
|
+
return this.writeNdef([record]);
|
|
165
182
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// src/services/nfc/ndef/utils.ts
|
|
186
|
+
var utils_exports2 = {};
|
|
187
|
+
__export(utils_exports2, {
|
|
188
|
+
NdefUtils: () => NdefUtils
|
|
189
|
+
});
|
|
190
|
+
var NdefUtils = {};
|
|
191
|
+
|
|
192
|
+
// src/services/nfc/v/index.ts
|
|
193
|
+
var v_exports = {};
|
|
194
|
+
__export(v_exports, {
|
|
195
|
+
operations: () => operations3,
|
|
196
|
+
utils: () => utils_exports3
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// src/services/nfc/v/operations.ts
|
|
200
|
+
var import_react_native_nfc_manager5 = __toESM(require("react-native-nfc-manager"));
|
|
201
|
+
|
|
202
|
+
// src/services/nfc/v/utils.ts
|
|
203
|
+
var utils_exports3 = {};
|
|
204
|
+
__export(utils_exports3, {
|
|
205
|
+
NfcVUtils: () => NfcVUtils
|
|
206
|
+
});
|
|
207
|
+
var import_react_native2 = require("react-native");
|
|
208
|
+
var import_react_native_nfc_manager4 = require("react-native-nfc-manager");
|
|
209
|
+
var NfcVUtils = {
|
|
210
|
+
tech: import_react_native2.Platform.OS === "ios" ? [import_react_native_nfc_manager4.NfcTech.Iso15693IOS] : [import_react_native_nfc_manager4.NfcTech.NfcV],
|
|
211
|
+
Flags: {
|
|
212
|
+
HIGH_DATA_RATE: 2,
|
|
213
|
+
ADDRESSED: 32
|
|
214
|
+
// If needed later: OPTION: 0x40 (not commonly used)
|
|
215
|
+
},
|
|
216
|
+
Commands: {
|
|
217
|
+
READ_SINGLE_BLOCK: 32,
|
|
218
|
+
WRITE_SINGLE_BLOCK: 33,
|
|
219
|
+
GET_SYSTEM_INFO: 43
|
|
220
|
+
},
|
|
221
|
+
/**
|
|
222
|
+
* Combine multiple flag bits into one byte.
|
|
223
|
+
* Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE
|
|
224
|
+
*/
|
|
225
|
+
flags(...bits) {
|
|
226
|
+
return bits.reduce((acc, bit) => acc | bit, 0);
|
|
227
|
+
},
|
|
228
|
+
/**
|
|
229
|
+
* Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)
|
|
230
|
+
* ISO15693 requires reversed UID for addressed commands.
|
|
231
|
+
*/
|
|
232
|
+
reverseUid(tagIdHex) {
|
|
233
|
+
const bytes = [];
|
|
234
|
+
for (let i = 0; i < tagIdHex.length; i += 2) {
|
|
235
|
+
bytes.unshift(parseInt(tagIdHex.substring(i, i + 2), 16));
|
|
181
236
|
}
|
|
182
|
-
return
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
return
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
237
|
+
return bytes;
|
|
238
|
+
},
|
|
239
|
+
/**
|
|
240
|
+
* Build READ_SINGLE_BLOCK command.
|
|
241
|
+
* FLAGS: addressed + high data rate by default.
|
|
242
|
+
*/
|
|
243
|
+
buildReadBlock(uidReversed, blockNumber) {
|
|
244
|
+
const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);
|
|
245
|
+
return [
|
|
246
|
+
flags,
|
|
247
|
+
this.Commands.READ_SINGLE_BLOCK,
|
|
248
|
+
...uidReversed,
|
|
249
|
+
blockNumber
|
|
250
|
+
];
|
|
251
|
+
},
|
|
252
|
+
/**
|
|
253
|
+
* Build WRITE_SINGLE_BLOCK command.
|
|
254
|
+
* Note: data must match the block size (usually 4 or 8 bytes).
|
|
255
|
+
*/
|
|
256
|
+
buildWriteBlock(uidReversed, blockNumber, data) {
|
|
257
|
+
const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);
|
|
258
|
+
return [
|
|
259
|
+
flags,
|
|
260
|
+
this.Commands.WRITE_SINGLE_BLOCK,
|
|
261
|
+
...uidReversed,
|
|
262
|
+
blockNumber,
|
|
263
|
+
...data
|
|
264
|
+
];
|
|
265
|
+
},
|
|
266
|
+
/**
|
|
267
|
+
* Build GET_SYSTEM_INFO command.
|
|
268
|
+
*/
|
|
269
|
+
buildGetSystemInfo(uidReversed) {
|
|
270
|
+
const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);
|
|
271
|
+
return [flags, this.Commands.GET_SYSTEM_INFO, ...uidReversed];
|
|
272
|
+
},
|
|
273
|
+
/**
|
|
274
|
+
* Parse a READ_SINGLE_BLOCK response.
|
|
275
|
+
* Response format:
|
|
276
|
+
* - byte[0] = status (0x00 = success)
|
|
277
|
+
* - byte[1..] = block payload bytes
|
|
278
|
+
*/
|
|
279
|
+
parseReadResponse(resp) {
|
|
280
|
+
if (!resp || resp.length === 0) {
|
|
281
|
+
throw new Error("Empty NFC-V response");
|
|
282
|
+
}
|
|
283
|
+
if (resp[0] !== 0) {
|
|
284
|
+
throw new Error(`Read failed. Status: 0x${resp[0].toString(16)}`);
|
|
285
|
+
}
|
|
286
|
+
return new Uint8Array(resp.slice(1));
|
|
287
|
+
},
|
|
288
|
+
/**
|
|
289
|
+
* Parse WRITE_SINGLE_BLOCK response.
|
|
290
|
+
* Successful write has resp[0] === 0x00.
|
|
291
|
+
*/
|
|
292
|
+
parseWriteResponse(resp) {
|
|
293
|
+
if (!resp || resp.length === 0) {
|
|
294
|
+
throw new Error("Empty NFC-V response");
|
|
295
|
+
}
|
|
296
|
+
if (resp[0] !== 0) {
|
|
297
|
+
throw new Error(`Write failed. Status: 0x${resp[0].toString(16)}`);
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
/**
|
|
301
|
+
* Parse GET_SYSTEM_INFO response.
|
|
302
|
+
* Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer
|
|
303
|
+
*/
|
|
304
|
+
parseSystemInfo(resp) {
|
|
305
|
+
var _a;
|
|
306
|
+
if (!resp || resp.length < 2 || resp[0] !== 0) {
|
|
307
|
+
throw new Error("Invalid System Info response");
|
|
308
|
+
}
|
|
309
|
+
const infoFlags = resp[1] & 15;
|
|
310
|
+
let offset = 2;
|
|
311
|
+
const result = {};
|
|
312
|
+
if (resp.length >= offset + 8) {
|
|
313
|
+
const uidBytes = resp.slice(offset, offset + 8);
|
|
314
|
+
result.uid = uidBytes.slice().reverse().map((b) => b.toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
315
|
+
offset += 8;
|
|
316
|
+
}
|
|
317
|
+
if (infoFlags & 1 && resp.length > offset) {
|
|
318
|
+
result.dsfid = resp[offset++];
|
|
319
|
+
}
|
|
320
|
+
if (infoFlags & 2 && resp.length > offset) {
|
|
321
|
+
result.afi = resp[offset++];
|
|
322
|
+
}
|
|
323
|
+
if (infoFlags & 4 && resp.length >= offset + 2) {
|
|
324
|
+
result.numberOfBlocks = resp[offset++] + 1;
|
|
325
|
+
result.blockSize = resp[offset++] + 1;
|
|
326
|
+
}
|
|
327
|
+
if (infoFlags & 8 && resp.length > offset) {
|
|
328
|
+
result.icReference = resp[offset++];
|
|
329
|
+
}
|
|
330
|
+
if (!result.blockSize) result.blockSize = 4;
|
|
331
|
+
result.manufacturer = this.detectManufacturer((_a = result.uid) != null ? _a : "");
|
|
332
|
+
return result;
|
|
333
|
+
},
|
|
334
|
+
/** Identify common manufacturers based on UID prefix */
|
|
335
|
+
detectManufacturer(uid) {
|
|
336
|
+
if (uid.startsWith("E004") || uid.startsWith("E006"))
|
|
337
|
+
return "EM Microelectronic";
|
|
338
|
+
if (uid.startsWith("E002")) return "STMicroelectronics";
|
|
339
|
+
if (uid.startsWith("E007")) return "Texas Instruments";
|
|
340
|
+
if (uid.startsWith("E010")) return "NXP";
|
|
341
|
+
return "Unknown";
|
|
228
342
|
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
263
|
-
var NfcUtils = {
|
|
264
|
-
Ndef: {
|
|
265
|
-
decodeRecord,
|
|
266
|
-
decodeJson,
|
|
267
|
-
encodeText,
|
|
268
|
-
encodeUri,
|
|
269
|
-
encodeJson,
|
|
270
|
-
encodeMime,
|
|
271
|
-
willFit,
|
|
272
|
-
spaceLeft
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
// src/services/nfc/v/operations.ts
|
|
346
|
+
var operations3 = {
|
|
347
|
+
async withVTag(handler) {
|
|
348
|
+
return nfcService.withTechnology(NfcVUtils.tech, async () => {
|
|
349
|
+
const tag = await import_react_native_nfc_manager5.default.getTag();
|
|
350
|
+
if (!(tag == null ? void 0 : tag.id)) throw new Error("No NFC-V tag detected");
|
|
351
|
+
return handler(tag);
|
|
352
|
+
});
|
|
353
|
+
},
|
|
354
|
+
async writeBlockNfcV(blockNumber, data) {
|
|
355
|
+
return this.withVTag(async (tag) => {
|
|
356
|
+
const uid = NfcVUtils.reverseUid(tag.id);
|
|
357
|
+
const cmd = NfcVUtils.buildWriteBlock(uid, blockNumber, data);
|
|
358
|
+
const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
|
|
359
|
+
NfcVUtils.parseWriteResponse(resp);
|
|
360
|
+
});
|
|
361
|
+
},
|
|
362
|
+
async readBlockNfcV(blockNumber) {
|
|
363
|
+
return this.withVTag(async (tag) => {
|
|
364
|
+
const uid = NfcVUtils.reverseUid(tag.id);
|
|
365
|
+
const cmd = NfcVUtils.buildReadBlock(uid, blockNumber);
|
|
366
|
+
const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
|
|
367
|
+
return NfcVUtils.parseReadResponse(resp);
|
|
368
|
+
});
|
|
369
|
+
},
|
|
370
|
+
async getSystemInfoNfcV() {
|
|
371
|
+
return this.withVTag(async (tag) => {
|
|
372
|
+
const uid = NfcVUtils.reverseUid(tag.id);
|
|
373
|
+
const cmd = NfcVUtils.buildGetSystemInfo(uid);
|
|
374
|
+
const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
|
|
375
|
+
return NfcVUtils.parseSystemInfo(resp);
|
|
376
|
+
});
|
|
273
377
|
}
|
|
274
378
|
};
|
|
275
379
|
|
|
276
|
-
// src/services/nfc/
|
|
277
|
-
var
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
}
|
|
285
|
-
|
|
380
|
+
// src/services/nfc/namespace.ts
|
|
381
|
+
var nfc = {
|
|
382
|
+
service: nfcService,
|
|
383
|
+
/** ISO15693 protocol helpers and high-level operations */
|
|
384
|
+
v: {
|
|
385
|
+
...operations3,
|
|
386
|
+
// NfcVOperations, nfcV
|
|
387
|
+
utils: utils_exports3
|
|
388
|
+
},
|
|
389
|
+
/** NFC-A / Type 2 helpers and operations */
|
|
390
|
+
a: {
|
|
391
|
+
...operations,
|
|
392
|
+
utils: utils_exports
|
|
393
|
+
},
|
|
394
|
+
/** NDEF read/write utilities and operations */
|
|
395
|
+
ndef: {
|
|
396
|
+
...operations2,
|
|
397
|
+
utils: utils_exports2
|
|
398
|
+
}
|
|
399
|
+
};
|
|
286
400
|
// Annotate the CommonJS export names for ESM import in node:
|
|
287
401
|
0 && (module.exports = {
|
|
288
|
-
|
|
402
|
+
ndef,
|
|
403
|
+
nfc,
|
|
404
|
+
nfcA,
|
|
289
405
|
nfcService,
|
|
290
|
-
|
|
406
|
+
nfcV
|
|
291
407
|
});
|
|
292
408
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/services/nfc/index.ts","../src/services/nfc/NfcService.ts","../src/services/nfc/NfcUtils.ts","../src/services/nfc/useNfcState.ts"],"sourcesContent":["export * from \"./NfcService\";\r\nexport * from \"./NfcUtils\";\r\nexport * from \"./useNfcState\";\r\n","// NfcService.ts\r\nimport { Platform } from \"react-native\";\r\nimport NfcManager, {\r\n Ndef,\r\n NdefRecord,\r\n NfcEvents,\r\n NfcTech,\r\n TagEvent,\r\n} from \"react-native-nfc-manager\";\r\n\r\nexport type NfcState = \"idle\" | \"starting\" | \"active\" | \"stopping\" | \"writing\";\r\n\r\nexport type NfcListener = (state: NfcState) => void;\r\n\r\nclass NfcService {\r\n private state: NfcState = \"idle\";\r\n private lastTag: TagEvent | null = null;\r\n private listeners = new Set<NfcListener>();\r\n\r\n constructor() {\r\n NfcManager.start();\r\n }\r\n\r\n // --- internal state mgmt ---\r\n private setState(next: NfcState) {\r\n if (this.state !== next) {\r\n this.state = next;\r\n for (const listener of this.listeners) listener(next);\r\n }\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n getLastTag() {\r\n return this.lastTag;\r\n }\r\n\r\n subscribe(fn: NfcListener) {\r\n this.listeners.add(fn);\r\n fn(this.state); // emit current state immediately\r\n return () => {\r\n this.listeners.delete(fn);\r\n };\r\n }\r\n\r\n // --- Reader lifecycle ---\r\n async startReader(readerModeFlags: number, onTag?: (tag: TagEvent) => void) {\r\n if (this.state !== \"idle\") {\r\n console.warn(`[NFC] Cannot start reader while ${this.state}`);\r\n return;\r\n }\r\n\r\n this.setState(\"starting\");\r\n\r\n NfcManager.setEventListener(NfcEvents.DiscoverTag, (tag: TagEvent) => {\r\n this.lastTag = tag;\r\n onTag?.(tag);\r\n });\r\n\r\n try {\r\n await NfcManager.registerTagEvent({\r\n isReaderModeEnabled: true,\r\n readerModeFlags,\r\n });\r\n if ((this.state as NfcState) === \"starting\") {\r\n this.setState(\"active\");\r\n }\r\n } catch (err) {\r\n console.warn(\"[NFC] startReader error:\", err);\r\n this.setState(\"idle\");\r\n }\r\n }\r\n\r\n async stopReader() {\r\n if ([\"idle\", \"stopping\"].includes(this.state)) return;\r\n this.setState(\"stopping\");\r\n try {\r\n await NfcManager.unregisterTagEvent();\r\n } catch {}\r\n this.setState(\"idle\");\r\n }\r\n\r\n // --- Writer ---\r\n async writeNdef(records: NdefRecord[]) {\r\n if (this.state !== \"idle\") {\r\n throw new Error(`Cannot write while reader is ${this.state}`);\r\n }\r\n\r\n this.setState(\"writing\");\r\n\r\n let res = {\r\n success: false,\r\n error: undefined,\r\n };\r\n\r\n try {\r\n await NfcManager.requestTechnology(NfcTech.Ndef, {\r\n alertMessage: \"Hold near NFC tag to write\",\r\n });\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n if (Platform.OS === \"ios\")\r\n NfcManager.setAlertMessageIOS(\"Write successful\");\r\n } catch (err: any) {\r\n console.warn(\"[NFC] writeNdef error:\", err);\r\n\r\n res.success = false;\r\n res.error = err;\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch {\r\n } finally {\r\n this.setState(\"idle\");\r\n return res;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Export one stable instance\r\nexport const nfcService = new NfcService();\r\n","import { Ndef, NdefRecord, TagEvent } from \"react-native-nfc-manager\";\r\n\r\nconst toU8 = (v: number[] | Uint8Array | ArrayBuffer): Uint8Array => {\r\n if (v instanceof Uint8Array) return v;\r\n if (Array.isArray(v)) return Uint8Array.from(v);\r\n return new Uint8Array(v);\r\n};\r\n\r\nconst toAscii = (u8: Uint8Array): string => String.fromCharCode(...u8);\r\n\r\nfunction decodeRecord(record: {\r\n tnf: number;\r\n type: number[] | string;\r\n id?: number[];\r\n payload: number[];\r\n}) {\r\n const { tnf } = record;\r\n\r\n // --- TYPE STRING -----------------------------------------------------\r\n let typeStr: string;\r\n if (typeof record.type === \"string\") {\r\n // iOS\r\n typeStr = record.type;\r\n } else {\r\n // Android\r\n typeStr = toAscii(toU8(record.type));\r\n }\r\n\r\n // --- PAYLOAD ---------------------------------------------------------\r\n const payloadU8 = toU8(record.payload);\r\n\r\n // ✅ TEXT RECORD\r\n if (tnf === Ndef.TNF_WELL_KNOWN && typeStr === \"T\") {\r\n const status = payloadU8[0];\r\n const langLen = status & 0x3f;\r\n const lang = toAscii(payloadU8.subarray(1, 1 + langLen));\r\n const textBytes = payloadU8.subarray(1 + langLen);\r\n const text = new TextDecoder().decode(textBytes);\r\n return { kind: \"text\", text, lang };\r\n }\r\n\r\n // ✅ URI RECORD\r\n if (tnf === Ndef.TNF_WELL_KNOWN && typeStr === \"U\") {\r\n const uri = Ndef.uri.decodePayload(payloadU8);\r\n return { kind: \"uri\", uri };\r\n }\r\n\r\n // ✅ MIME RECORD\r\n if (tnf === Ndef.TNF_MIME_MEDIA) {\r\n if (typeStr === \"application/json\") {\r\n return {\r\n kind: \"mime\",\r\n mimeType: typeStr,\r\n data: JSON.parse(new TextDecoder().decode(payloadU8)),\r\n };\r\n }\r\n\r\n function tryDecodeAsText(u8: Uint8Array): string | null {\r\n try {\r\n return new TextDecoder().decode(u8);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n return {\r\n kind: \"mime\",\r\n mimeType: typeStr,\r\n data: payloadU8,\r\n text: typeStr.startsWith(\"text/\") ? tryDecodeAsText(payloadU8) : null,\r\n };\r\n }\r\n\r\n // ✅ ABSOLUTE URI RECORD\r\n if (tnf === Ndef.TNF_ABSOLUTE_URI) {\r\n return {\r\n kind: \"abs-uri\",\r\n uri: typeStr,\r\n data: payloadU8,\r\n };\r\n }\r\n\r\n // ✅ EXTERNAL RECORD\r\n if (tnf === Ndef.TNF_EXTERNAL_TYPE) {\r\n return {\r\n kind: \"external\",\r\n type: typeStr,\r\n data: payloadU8,\r\n };\r\n }\r\n\r\n // ✅ UNKNOWN RECORD\r\n if (tnf === Ndef.TNF_UNKNOWN) {\r\n return {\r\n kind: \"unknown\",\r\n type: typeStr,\r\n data: payloadU8,\r\n };\r\n }\r\n\r\n // ✅ FALLBACK\r\n return {\r\n kind: \"unknown\",\r\n tnf,\r\n type: typeStr,\r\n payload: payloadU8,\r\n };\r\n}\r\n\r\nfunction decodeJson(record: NdefRecord) {\r\n if (record.tnf !== Ndef.TNF_MIME_MEDIA) return null;\r\n\r\n // Convert type to string\r\n const typeStr =\r\n typeof record.type === \"string\" ? record.type : toAscii(toU8(record.type));\r\n\r\n if (typeStr !== \"application/json\") return null;\r\n\r\n const payloadU8 = toU8(record.payload);\r\n const jsonText = new TextDecoder().decode(payloadU8);\r\n\r\n try {\r\n return JSON.parse(jsonText);\r\n } catch (err) {\r\n console.warn(\"Invalid JSON in NDEF:\", err);\r\n return null;\r\n }\r\n}\r\n\r\nconst encodeText = (text: string, lang = \"en\") => Ndef.textRecord(text, lang);\r\n\r\nconst encodeUri = (uri: string) => Ndef.uriRecord(uri);\r\n\r\nfunction encodeJson(obj: any) {\r\n const json = JSON.stringify(obj);\r\n const payload = new TextEncoder().encode(json); // Uint8Array\r\n const typeArray = Array.from(new TextEncoder().encode(\"application/json\"));\r\n\r\n return {\r\n tnf: Ndef.TNF_MIME_MEDIA,\r\n type: typeArray, // MUST be a number[] of ASCII bytes\r\n id: [],\r\n payload,\r\n };\r\n}\r\n\r\nfunction encodeMime(mimeType: string, data: Uint8Array) {\r\n const typeBytes = Array.from(new TextEncoder().encode(mimeType));\r\n\r\n return {\r\n tnf: Ndef.TNF_MIME_MEDIA,\r\n type: typeBytes,\r\n id: [],\r\n payload: data,\r\n };\r\n}\r\n\r\n// Android only\r\nfunction willFit(tag: TagEvent, records: NdefRecord[]) {\r\n if (tag.maxSize === undefined) return null;\r\n\r\n const totalSize = Ndef.encodeMessage(records).length;\r\n return totalSize <= tag.maxSize;\r\n}\r\n\r\n// Android only\r\nfunction spaceLeft(tag: TagEvent, records: NdefRecord[]) {\r\n if (tag.maxSize === undefined) return null;\r\n\r\n const totalSize = Ndef.encodeMessage(records).length;\r\n return tag.maxSize - totalSize;\r\n}\r\n\r\nexport const NfcUtils = {\r\n Ndef: {\r\n decodeRecord,\r\n decodeJson,\r\n encodeText,\r\n encodeUri,\r\n encodeJson,\r\n encodeMime,\r\n willFit,\r\n spaceLeft,\r\n },\r\n};\r\n","import { useEffect, useState } from \"react\";\r\nimport { nfcService, NfcState } from \"./NfcService\";\r\n\r\nexport function useNfcState() {\r\n const [state, setState] = useState<NfcState>(nfcService.getState());\r\n\r\n useEffect(() => nfcService.subscribe(setState), []);\r\n\r\n return {\r\n state,\r\n lastTag: nfcService.getLastTag(),\r\n };\r\n}\r\n"],"mappings":"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","names":["NfcManager","import_react_native_nfc_manager","tryDecodeAsText"]}
|
|
1
|
+
{"version":3,"sources":["../src/services/nfc/index.ts","../src/services/nfc/service.ts","../src/services/nfc/a/index.ts","../src/services/nfc/a/operations.ts","../src/services/nfc/a/utils.ts","../src/services/nfc/ndef/index.ts","../src/services/nfc/ndef/operations.ts","../src/services/nfc/ndef/utils.ts","../src/services/nfc/v/index.ts","../src/services/nfc/v/operations.ts","../src/services/nfc/v/utils.ts","../src/services/nfc/namespace.ts"],"sourcesContent":["export { nfc } from \"./namespace\";\r\nexport { nfcService } from \"./service\";\r\n\r\n// Export all protocol bundles\r\nexport * as nfcA from \"./a\";\r\nexport * as ndef from \"./ndef\";\r\nexport * as nfcV from \"./v\";\r\n\r\n// Export shared types\r\nexport * from \"./types\";\r\n","import { Platform } from \"react-native\";\r\nimport NfcManager, {\r\n NfcEvents,\r\n NfcTech,\r\n TagEvent,\r\n} from \"react-native-nfc-manager\";\r\nimport { 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\r\n private listeners = new Set<NfcListener>();\r\n\r\n constructor() {\r\n NfcManager.start();\r\n }\r\n\r\n // --- internal state mgmt ---\r\n private setState(partial: Partial<NfcState>) {\r\n this.state = { ...this.state, ...partial };\r\n\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 current state immediately\r\n return () => {\r\n this.listeners.delete(fn);\r\n };\r\n }\r\n\r\n // --- Reader lifecycle ---\r\n async startReader(readerModeFlags: number, onTag?: (tag: TagEvent) => void) {\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.setState({ mode: \"starting\" });\r\n\r\n NfcManager.setEventListener(NfcEvents.DiscoverTag, (tag: TagEvent) => {\r\n this.setState({ tag: tag });\r\n onTag?.(tag);\r\n });\r\n\r\n try {\r\n await NfcManager.registerTagEvent({\r\n isReaderModeEnabled: true,\r\n readerModeFlags,\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.setState({ mode: \"idle\" });\r\n }\r\n }\r\n\r\n async stopReader() {\r\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\r\n this.setState({ mode: \"stopping\" });\r\n try {\r\n await NfcManager.unregisterTagEvent();\r\n } catch {}\r\n this.setState({ mode: \"idle\" });\r\n }\r\n\r\n async withTechnology<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>\r\n ): Promise<T> {\r\n if (this.state.mode === \"technology\") {\r\n throw new Error(`[NFC] Technology is already in use!`);\r\n }\r\n if (\r\n this.state.mode === \"starting\" ||\r\n this.state.mode === \"active\" ||\r\n this.state.mode === \"stopping\"\r\n ) {\r\n await this.stopReader();\r\n }\r\n\r\n if (this.state.mode !== \"idle\") {\r\n throw new Error(\r\n `[NFC] Cannot start technology session in mode ${this.state.mode}`\r\n );\r\n }\r\n\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await NfcManager.requestTechnology(tech, {\r\n alertMessage: \"Hold near NFC tag\", // iOS\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 return result;\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new Error(`[NFC] withTechnology error: ${message}`);\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch (cancelErr) {\r\n console.warn(\"[NFC] cancelTechnologyRequest failed:\", cancelErr);\r\n }\r\n this.setState({ mode: \"idle\" });\r\n }\r\n }\r\n}\r\n\r\n// Export one stable instance\r\nexport const nfcService = new NfcService();\r\n","export { operations } from \"./operations\";\r\nexport * as utils from \"./utils\";\r\n","import NfcManager, { NfcTech } from \"react-native-nfc-manager\";\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async transceive(data: number[]) {\r\n return nfcService.withTechnology(NfcTech.NfcA, async () => {\r\n return await NfcManager.transceive(data);\r\n });\r\n },\r\n};\r\n","export const NfcAUtils = {};\r\n","export { operations } from \"./operations\";\r\nexport * as utils from \"./utils\";\r\n","import NfcManager, {\r\n Ndef,\r\n NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async writeNdef(records: NdefRecord[]) {\r\n // Use NFC-A/Type 2 as fallback (often required on Android)\r\n await nfcService.withTechnology([NfcTech.Ndef, NfcTech.NfcA], async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n },\r\n\r\n writeTextNdef(text: string) {\r\n const record = Ndef.textRecord(text);\r\n return this.writeNdef([record]);\r\n },\r\n\r\n writeUriNdef(uri: string) {\r\n const record = Ndef.uriRecord(uri);\r\n return this.writeNdef([record]);\r\n },\r\n};\r\n","export const NdefUtils = {};\r\n","export { operations } from \"./operations\";\r\nexport * as utils from \"./utils\";\r\n","import NfcManager, { TagEvent } from \"react-native-nfc-manager\";\r\nimport { nfcService } from \"../service\";\r\nimport { NfcVUtils } from \"./utils\";\r\n\r\nexport const operations = {\r\n async withVTag<T>(\r\n handler: (tag: TagEvent & { id: string }) => Promise<T>\r\n ): Promise<T> {\r\n return nfcService.withTechnology(NfcVUtils.tech, async () => {\r\n const tag = await NfcManager.getTag();\r\n if (!tag?.id) throw new Error(\"No NFC-V tag detected\");\r\n return handler(tag as TagEvent & { id: string });\r\n });\r\n },\r\n\r\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\r\n return this.withVTag(async (tag) => {\r\n const uid = NfcVUtils.reverseUid(tag.id);\r\n const cmd = NfcVUtils.buildWriteBlock(uid, blockNumber, data);\r\n const resp = await NfcManager.transceive(cmd);\r\n NfcVUtils.parseWriteResponse(resp);\r\n });\r\n },\r\n\r\n async readBlockNfcV(blockNumber: number) {\r\n return this.withVTag(async (tag) => {\r\n const uid = NfcVUtils.reverseUid(tag.id);\r\n const cmd = NfcVUtils.buildReadBlock(uid, blockNumber);\r\n const resp = await NfcManager.transceive(cmd);\r\n return NfcVUtils.parseReadResponse(resp);\r\n });\r\n },\r\n\r\n async getSystemInfoNfcV() {\r\n return this.withVTag(async (tag) => {\r\n const uid = NfcVUtils.reverseUid(tag.id);\r\n const cmd = NfcVUtils.buildGetSystemInfo(uid);\r\n const resp = await NfcManager.transceive(cmd);\r\n return NfcVUtils.parseSystemInfo(resp);\r\n });\r\n },\r\n};\r\n","import { Platform } from \"react-native\";\r\nimport { NfcTech } from \"react-native-nfc-manager\";\r\n\r\n// Here's where things get REAL\r\n//\r\n// Only iPhone 7+ supports ISO15693; writing may require\r\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\r\n// transceive (depends on firmware)\r\n//\r\n// | Byte | Meaning |\r\n// | ------------- | ---------------------------------------------------- |\r\n// | `0x02` | Flags (high data rate) |\r\n// | `0x20` | Flags (addressed) |\r\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\r\n// | `0x20` | Command code: Read Single Block |\r\n// | `0x21` | Command code: Write Single Block |\r\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\r\n// | `blockNumber` | Which memory block to write |\r\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\r\n//\r\n// Each command is a byte array\r\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\r\n//\r\n// Tag response:\r\n// The tag response has this structure:\r\n//\r\n// | Byte | Meaning |\r\n// | ---- | --------------------------------------------- |\r\n// | `0` | **Status** (0x00 = success) |\r\n// | `1` | **Info Flags** |\r\n// | … | Data fields, conditional based on those flags |\r\n//\r\n// Info Flags bitmask:\r\n// | Bit | Hex | Meaning |\r\n// | --- | ---- | ------------------------------------------------------------- |\r\n// | 0 | 0x01 | DSFID present |\r\n// | 1 | 0x02 | AFI present |\r\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\r\n// | 3 | 0x08 | IC reference present |\r\n// | 4–7 | — | RFU (reserved) |\r\n\r\nexport const NfcVUtils = {\r\n tech: Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : [NfcTech.NfcV],\r\n\r\n Flags: {\r\n HIGH_DATA_RATE: 0x02,\r\n ADDRESSED: 0x20,\r\n // If needed later: OPTION: 0x40 (not commonly used)\r\n },\r\n\r\n Commands: {\r\n READ_SINGLE_BLOCK: 0x20,\r\n WRITE_SINGLE_BLOCK: 0x21,\r\n GET_SYSTEM_INFO: 0x2b,\r\n },\r\n\r\n /**\r\n * Combine multiple flag bits into one byte.\r\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\r\n */\r\n flags(...bits: number[]): number {\r\n return bits.reduce((acc, bit) => acc | bit, 0);\r\n },\r\n\r\n /**\r\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\r\n * ISO15693 requires reversed UID for addressed commands.\r\n */\r\n reverseUid(tagIdHex: string): number[] {\r\n const bytes = [];\r\n for (let i = 0; i < tagIdHex.length; i += 2) {\r\n bytes.unshift(parseInt(tagIdHex.substring(i, i + 2), 16));\r\n }\r\n return bytes;\r\n },\r\n\r\n /**\r\n * Build READ_SINGLE_BLOCK command.\r\n * FLAGS: addressed + high data rate by default.\r\n */\r\n buildReadBlock(uidReversed: number[], blockNumber: number): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.READ_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ];\r\n },\r\n\r\n /**\r\n * Build WRITE_SINGLE_BLOCK command.\r\n * Note: data must match the block size (usually 4 or 8 bytes).\r\n */\r\n buildWriteBlock(\r\n uidReversed: number[],\r\n blockNumber: number,\r\n data: Uint8Array\r\n ): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.WRITE_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ...data,\r\n ];\r\n },\r\n\r\n /**\r\n * Build GET_SYSTEM_INFO command.\r\n */\r\n buildGetSystemInfo(uidReversed: number[]): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [flags, this.Commands.GET_SYSTEM_INFO, ...uidReversed];\r\n },\r\n\r\n /**\r\n * Parse a READ_SINGLE_BLOCK response.\r\n * Response format:\r\n * - byte[0] = status (0x00 = success)\r\n * - byte[1..] = block payload bytes\r\n */\r\n parseReadResponse(resp: number[]): Uint8Array {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n if (resp[0] !== 0x00) {\r\n throw new Error(`Read failed. Status: 0x${resp[0].toString(16)}`);\r\n }\r\n return new Uint8Array(resp.slice(1));\r\n },\r\n\r\n /**\r\n * Parse WRITE_SINGLE_BLOCK response.\r\n * Successful write has resp[0] === 0x00.\r\n */\r\n parseWriteResponse(resp: number[]): void {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n if (resp[0] !== 0x00) {\r\n throw new Error(`Write failed. Status: 0x${resp[0].toString(16)}`);\r\n }\r\n },\r\n\r\n /**\r\n * Parse GET_SYSTEM_INFO response.\r\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\r\n */\r\n parseSystemInfo(resp: number[]) {\r\n if (!resp || resp.length < 2 || resp[0] !== 0x00) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n\r\n const infoFlags = resp[1] & 0x0f;\r\n let offset = 2;\r\n\r\n const result: any = {};\r\n\r\n // UID (always present – next 8 bytes)\r\n if (resp.length >= offset + 8) {\r\n const uidBytes = resp.slice(offset, offset + 8);\r\n result.uid = uidBytes\r\n .slice()\r\n .reverse()\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\")\r\n .toUpperCase();\r\n offset += 8;\r\n }\r\n\r\n // DSFID\r\n if (infoFlags & 0x01 && resp.length > offset) {\r\n result.dsfid = resp[offset++];\r\n }\r\n\r\n // AFI\r\n if (infoFlags & 0x02 && resp.length > offset) {\r\n result.afi = resp[offset++];\r\n }\r\n\r\n // Memory size info\r\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\r\n result.numberOfBlocks = resp[offset++] + 1;\r\n result.blockSize = resp[offset++] + 1;\r\n }\r\n\r\n // IC Reference\r\n if (infoFlags & 0x08 && resp.length > offset) {\r\n result.icReference = resp[offset++];\r\n }\r\n\r\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\r\n\r\n result.manufacturer = this.detectManufacturer(result.uid ?? \"\");\r\n\r\n return result;\r\n },\r\n\r\n /** Identify common manufacturers based on UID prefix */\r\n detectManufacturer(uid: string): string {\r\n if (uid.startsWith(\"E004\") || uid.startsWith(\"E006\"))\r\n return \"EM Microelectronic\";\r\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\r\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\r\n if (uid.startsWith(\"E010\")) return \"NXP\";\r\n return \"Unknown\";\r\n },\r\n} as const;\r\n","import { nfcService } from \"./service\";\r\n\r\nimport { operations as aOps, utils as aUtils } from \"./a\";\r\nimport { operations as ndefOps, utils as ndefUtils } from \"./ndef\";\r\nimport { operations as vOps, utils as vUtils } from \"./v\";\r\n/**\r\n * NFC root namespace providing access to:\r\n * - NfcService\r\n * - ISO15693 NFC-V ops\r\n * - NFC-A ops\r\n * - NDEF operations\r\n */\r\nexport const nfc = {\r\n service: nfcService,\r\n\r\n /** ISO15693 protocol helpers and high-level operations */\r\n v: {\r\n ...vOps, // NfcVOperations, nfcV\r\n utils: vUtils,\r\n },\r\n\r\n /** NFC-A / Type 2 helpers and operations */\r\n a: {\r\n ...aOps,\r\n utils: aUtils,\r\n },\r\n\r\n /** NDEF read/write utilities and operations */\r\n ndef: {\r\n ...ndefOps,\r\n utils: ndefUtils,\r\n },\r\n} as const;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,0BAAyB;AACzB,sCAIO;AAKA,IAAM,aAAN,MAAiB;AAAA,EAKtB,cAAc;AAJd,SAAQ,QAAkB,EAAE,MAAM,QAAQ,KAAK,KAAK;AAEpD,SAAQ,YAAY,oBAAI,IAAiB;AAGvC,oCAAAA,QAAW,MAAM;AAAA,EACnB;AAAA;AAAA,EAGQ,SAAS,SAA4B;AAC3C,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,QAAQ;AAEzC,eAAW,YAAY,KAAK,UAAW,UAAS,KAAK,KAAK;AAAA,EAC5D;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,IAAiB;AACzB,SAAK,UAAU,IAAI,EAAE;AACrB,OAAG,KAAK,KAAK;AACb,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YAAY,iBAAyB,OAAiC;AAC1E,QAAI,KAAK,MAAM,SAAS,QAAQ;AAC9B,cAAQ,KAAK,mCAAmC,KAAK,MAAM,IAAI,EAAE;AACjE;AAAA,IACF;AAEA,SAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAElC,oCAAAA,QAAW,iBAAiB,0CAAU,aAAa,CAAC,QAAkB;AACpE,WAAK,SAAS,EAAE,IAAS,CAAC;AAC1B,qCAAQ;AAAA,IACV,CAAC;AAED,QAAI;AACF,YAAM,gCAAAA,QAAW,iBAAiB;AAAA,QAChC,qBAAqB;AAAA,QACrB;AAAA,MACF,CAAC;AACD,UAAK,KAAK,MAAM,SAAqB,YAAY;AAC/C,aAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B,GAAG;AAC5C,WAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,aAAa;AACjB,QAAI,CAAC,QAAQ,UAAU,EAAE,SAAS,KAAK,MAAM,IAAI,EAAG;AACpD,SAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAClC,QAAI;AACF,YAAM,gCAAAA,QAAW,mBAAmB;AAAA,IACtC,QAAQ;AAAA,IAAC;AACT,SAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,EAChC;AAAA,EAEA,MAAM,eACJ,MACA,SACY;AACZ,QAAI,KAAK,MAAM,SAAS,cAAc;AACpC,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,QACE,KAAK,MAAM,SAAS,cACpB,KAAK,MAAM,SAAS,YACpB,KAAK,MAAM,SAAS,YACpB;AACA,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI,KAAK,MAAM,SAAS,QAAQ;AAC9B,YAAM,IAAI;AAAA,QACR,iDAAiD,KAAK,MAAM,IAAI;AAAA,MAClE;AAAA,IACF;AAEA,SAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpC,QAAI;AACF,YAAM,gCAAAA,QAAW,kBAAkB,MAAM;AAAA,QACvC,cAAc;AAAA;AAAA,MAChB,CAAC;AAED,YAAM,SAAS,MAAM,QAAQ;AAE7B,UAAI,6BAAS,OAAO;AAClB,cAAM,gCAAAA,QAAW,mBAAmB,UAAU;AAEhD,aAAO;AAAA,IACT,SAAS,KAAU;AACjB,YAAM,UACJ,OAAO,QAAQ,WAAW,OAAM,2BAAK,YAAW;AAClD,YAAM,IAAI,MAAM,+BAA+B,OAAO,EAAE;AAAA,IAC1D,UAAE;AACA,UAAI;AACF,cAAM,gCAAAA,QAAW,wBAAwB;AAAA,MAC3C,SAAS,WAAW;AAClB,gBAAQ,KAAK,yCAAyC,SAAS;AAAA,MACjE;AACA,WAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,IAChC;AAAA,EACF;AACF;AAGO,IAAM,aAAa,IAAI,WAAW;;;AC7HzC;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,mCAAoC;AAG7B,IAAM,aAAa;AAAA,EACxB,MAAM,WAAW,MAAgB;AAC/B,WAAO,WAAW,eAAe,yCAAQ,MAAM,YAAY;AACzD,aAAO,MAAM,iCAAAC,QAAW,WAAW,IAAI;AAAA,IACzC,CAAC;AAAA,EACH;AACF;;;ACTA;AAAA;AAAA;AAAA;AAAO,IAAM,YAAY,CAAC;;;ACA1B;AAAA;AAAA,oBAAAC;AAAA,EAAA,aAAAC;AAAA;;;ACAA,IAAAC,mCAIO;AAGA,IAAMC,cAAa;AAAA,EACxB,MAAM,UAAU,SAAuB;AAErC,UAAM,WAAW,eAAe,CAAC,yCAAQ,MAAM,yCAAQ,IAAI,GAAG,YAAY;AACxE,YAAM,QAAQ,sCAAK,cAAc,OAAO;AACxC,YAAM,iCAAAC,QAAW,YAAY,iBAAiB,KAAK;AAAA,IACrD,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,MAAc;AAC1B,UAAM,SAAS,sCAAK,WAAW,IAAI;AACnC,WAAO,KAAK,UAAU,CAAC,MAAM,CAAC;AAAA,EAChC;AAAA,EAEA,aAAa,KAAa;AACxB,UAAM,SAAS,sCAAK,UAAU,GAAG;AACjC,WAAO,KAAK,UAAU,CAAC,MAAM,CAAC;AAAA,EAChC;AACF;;;ACzBA,IAAAC,iBAAA;AAAA,SAAAA,gBAAA;AAAA;AAAA;AAAO,IAAM,YAAY,CAAC;;;ACA1B;AAAA;AAAA,oBAAAC;AAAA,EAAA,aAAAC;AAAA;;;ACAA,IAAAC,mCAAqC;;;ACArC,IAAAC,iBAAA;AAAA,SAAAA,gBAAA;AAAA;AAAA;AAAA,IAAAC,uBAAyB;AACzB,IAAAC,mCAAwB;AAwCjB,IAAM,YAAY;AAAA,EACvB,MAAM,8BAAS,OAAO,QAAQ,CAAC,yCAAQ,WAAW,IAAI,CAAC,yCAAQ,IAAI;AAAA,EAEnE,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,WAAW;AAAA;AAAA,EAEb;AAAA,EAEA,UAAU;AAAA,IACR,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,MAAwB;AAC/B,WAAO,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,CAAC;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,UAA4B;AACrC,UAAM,QAAQ,CAAC;AACf,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC3C,YAAM,QAAQ,SAAS,SAAS,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,aAAuB,aAA+B;AACnE,UAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,WAAW,KAAK,MAAM,cAAc;AACxE,WAAO;AAAA,MACL;AAAA,MACA,KAAK,SAAS;AAAA,MACd,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBACE,aACA,aACA,MACU;AACV,UAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,WAAW,KAAK,MAAM,cAAc;AACxE,WAAO;AAAA,MACL;AAAA,MACA,KAAK,SAAS;AAAA,MACd,GAAG;AAAA,MACH;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,aAAiC;AAClD,UAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,WAAW,KAAK,MAAM,cAAc;AACxE,WAAO,CAAC,OAAO,KAAK,SAAS,iBAAiB,GAAG,WAAW;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,MAA4B;AAC5C,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,QAAI,KAAK,CAAC,MAAM,GAAM;AACpB,YAAM,IAAI,MAAM,0BAA0B,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AAAA,IAClE;AACA,WAAO,IAAI,WAAW,KAAK,MAAM,CAAC,CAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,MAAsB;AACvC,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,QAAI,KAAK,CAAC,MAAM,GAAM;AACpB,YAAM,IAAI,MAAM,2BAA2B,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,MAAgB;AAtJlC;AAuJI,QAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,KAAK,CAAC,MAAM,GAAM;AAChD,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,UAAM,YAAY,KAAK,CAAC,IAAI;AAC5B,QAAI,SAAS;AAEb,UAAM,SAAc,CAAC;AAGrB,QAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,YAAM,WAAW,KAAK,MAAM,QAAQ,SAAS,CAAC;AAC9C,aAAO,MAAM,SACV,MAAM,EACN,QAAQ,EACR,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,EACP,YAAY;AACf,gBAAU;AAAA,IACZ;AAGA,QAAI,YAAY,KAAQ,KAAK,SAAS,QAAQ;AAC5C,aAAO,QAAQ,KAAK,QAAQ;AAAA,IAC9B;AAGA,QAAI,YAAY,KAAQ,KAAK,SAAS,QAAQ;AAC5C,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B;AAGA,QAAI,YAAY,KAAQ,KAAK,UAAU,SAAS,GAAG;AACjD,aAAO,iBAAiB,KAAK,QAAQ,IAAI;AACzC,aAAO,YAAY,KAAK,QAAQ,IAAI;AAAA,IACtC;AAGA,QAAI,YAAY,KAAQ,KAAK,SAAS,QAAQ;AAC5C,aAAO,cAAc,KAAK,QAAQ;AAAA,IACpC;AAEA,QAAI,CAAC,OAAO,UAAW,QAAO,YAAY;AAE1C,WAAO,eAAe,KAAK,oBAAmB,YAAO,QAAP,YAAc,EAAE;AAE9D,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,mBAAmB,KAAqB;AACtC,QAAI,IAAI,WAAW,MAAM,KAAK,IAAI,WAAW,MAAM;AACjD,aAAO;AACT,QAAI,IAAI,WAAW,MAAM,EAAG,QAAO;AACnC,QAAI,IAAI,WAAW,MAAM,EAAG,QAAO;AACnC,QAAI,IAAI,WAAW,MAAM,EAAG,QAAO;AACnC,WAAO;AAAA,EACT;AACF;;;AD7MO,IAAMC,cAAa;AAAA,EACxB,MAAM,SACJ,SACY;AACZ,WAAO,WAAW,eAAe,UAAU,MAAM,YAAY;AAC3D,YAAM,MAAM,MAAM,iCAAAC,QAAW,OAAO;AACpC,UAAI,EAAC,2BAAK,IAAI,OAAM,IAAI,MAAM,uBAAuB;AACrD,aAAO,QAAQ,GAAgC;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,aAAqB,MAAkB;AAC1D,WAAO,KAAK,SAAS,OAAO,QAAQ;AAClC,YAAM,MAAM,UAAU,WAAW,IAAI,EAAE;AACvC,YAAM,MAAM,UAAU,gBAAgB,KAAK,aAAa,IAAI;AAC5D,YAAM,OAAO,MAAM,iCAAAA,QAAW,WAAW,GAAG;AAC5C,gBAAU,mBAAmB,IAAI;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,aAAqB;AACvC,WAAO,KAAK,SAAS,OAAO,QAAQ;AAClC,YAAM,MAAM,UAAU,WAAW,IAAI,EAAE;AACvC,YAAM,MAAM,UAAU,eAAe,KAAK,WAAW;AACrD,YAAM,OAAO,MAAM,iCAAAA,QAAW,WAAW,GAAG;AAC5C,aAAO,UAAU,kBAAkB,IAAI;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB;AACxB,WAAO,KAAK,SAAS,OAAO,QAAQ;AAClC,YAAM,MAAM,UAAU,WAAW,IAAI,EAAE;AACvC,YAAM,MAAM,UAAU,mBAAmB,GAAG;AAC5C,YAAM,OAAO,MAAM,iCAAAA,QAAW,WAAW,GAAG;AAC5C,aAAO,UAAU,gBAAgB,IAAI;AAAA,IACvC,CAAC;AAAA,EACH;AACF;;;AE7BO,IAAM,MAAM;AAAA,EACjB,SAAS;AAAA;AAAA,EAGT,GAAG;AAAA,IACD,GAAGC;AAAA;AAAA,IACH,OAAOC;AAAA,EACT;AAAA;AAAA,EAGA,GAAG;AAAA,IACD,GAAG;AAAA,IACH,OAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM;AAAA,IACJ,GAAGD;AAAA,IACH,OAAOC;AAAA,EACT;AACF;","names":["NfcManager","import_react_native_nfc_manager","NfcManager","operations","utils_exports","import_react_native_nfc_manager","operations","NfcManager","utils_exports","operations","utils_exports","import_react_native_nfc_manager","utils_exports","import_react_native","import_react_native_nfc_manager","operations","NfcManager","operations","utils_exports"]}
|