@spencerls/react-native-nfc 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -27,27 +27,43 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
- // src/services/nfc/index.ts
30
+ // src/nfc/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
- ndef: () => ndef_exports,
34
33
  nfc: () => nfc,
35
34
  nfcA: () => a_exports,
35
+ nfcNdef: () => ndef_exports,
36
36
  nfcService: () => nfcService,
37
37
  nfcV: () => v_exports
38
38
  });
39
39
  module.exports = __toCommonJS(index_exports);
40
40
 
41
- // src/services/nfc/service.ts
41
+ // src/nfc/a/index.ts
42
+ var a_exports = {};
43
+ __export(a_exports, {
44
+ operations: () => operations,
45
+ utils: () => utils
46
+ });
47
+
48
+ // src/nfc/a/operations.ts
49
+ var import_react_native_nfc_manager2 = __toESM(require("react-native-nfc-manager"));
50
+
51
+ // src/nfc/service.ts
42
52
  var import_react_native = require("react-native");
43
53
  var import_react_native_nfc_manager = __toESM(require("react-native-nfc-manager"));
44
54
  var NfcService = class {
55
+ // needed for iOS restart
45
56
  constructor() {
46
57
  this.state = { mode: "idle", tag: null };
47
58
  this.listeners = /* @__PURE__ */ new Set();
59
+ this.isProcessingTag = false;
60
+ this.currentCooldownMs = 1500;
61
+ this.lastUsedReaderFlags = null;
48
62
  import_react_native_nfc_manager.default.start();
49
63
  }
50
- // --- internal state mgmt ---
64
+ // -----------------------------
65
+ // Internal state management
66
+ // -----------------------------
51
67
  setState(partial) {
52
68
  this.state = { ...this.state, ...partial };
53
69
  for (const listener of this.listeners) listener(this.state);
@@ -62,17 +78,45 @@ var NfcService = class {
62
78
  this.listeners.delete(fn);
63
79
  };
64
80
  }
65
- // --- Reader lifecycle ---
66
- async startReader(readerModeFlags, onTag) {
81
+ // -----------------------------
82
+ // START READER
83
+ // -----------------------------
84
+ async startReader(readerModeFlags, onTag, options) {
85
+ var _a;
67
86
  if (this.state.mode !== "idle") {
68
87
  console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);
69
88
  return;
70
89
  }
71
- this.setState({ mode: "starting" });
72
- import_react_native_nfc_manager.default.setEventListener(import_react_native_nfc_manager.NfcEvents.DiscoverTag, (tag) => {
73
- this.setState({ tag });
74
- onTag == null ? void 0 : onTag(tag);
75
- });
90
+ this.currentOnTag = onTag;
91
+ this.currentCooldownMs = (_a = options == null ? void 0 : options.cooldownMs) != null ? _a : 1500;
92
+ this.lastUsedReaderFlags = readerModeFlags;
93
+ this.isProcessingTag = false;
94
+ this.setState({ mode: "starting", tag: null });
95
+ import_react_native_nfc_manager.default.setEventListener(
96
+ import_react_native_nfc_manager.NfcEvents.DiscoverTag,
97
+ async (tag) => {
98
+ if (!tag) return;
99
+ if (this.isProcessingTag) return;
100
+ this.isProcessingTag = true;
101
+ this.setState({ tag, mode: "active" });
102
+ try {
103
+ if (this.currentOnTag) {
104
+ await this.currentOnTag(tag);
105
+ }
106
+ } catch (err) {
107
+ console.warn("[NFC] onTag handler error:", err);
108
+ } finally {
109
+ const cooldown = this.currentCooldownMs;
110
+ setTimeout(async () => {
111
+ this.isProcessingTag = false;
112
+ this.setState({ tag: null, mode: "active" });
113
+ if (import_react_native.Platform.OS === "ios") {
114
+ await this._restartIosReader();
115
+ }
116
+ }, cooldown);
117
+ }
118
+ }
119
+ );
76
120
  try {
77
121
  await import_react_native_nfc_manager.default.registerTagEvent({
78
122
  isReaderModeEnabled: true,
@@ -83,23 +127,53 @@ var NfcService = class {
83
127
  }
84
128
  } catch (err) {
85
129
  console.warn("[NFC] startReader error:", err);
86
- this.setState({ mode: "idle" });
130
+ this._resetReaderState();
87
131
  }
88
132
  }
133
+ // -----------------------------
134
+ // STOP READER
135
+ // -----------------------------
89
136
  async stopReader() {
90
137
  if (["idle", "stopping"].includes(this.state.mode)) return;
91
138
  this.setState({ mode: "stopping" });
92
139
  try {
93
140
  await import_react_native_nfc_manager.default.unregisterTagEvent();
94
- } catch {
141
+ } catch (err) {
142
+ console.warn("[NFC] unregisterTagEvent error:", err);
143
+ }
144
+ this._resetReaderState();
145
+ }
146
+ _resetReaderState() {
147
+ this.setState({ mode: "idle", tag: null });
148
+ this.currentOnTag = void 0;
149
+ this.isProcessingTag = false;
150
+ }
151
+ // -----------------------------
152
+ // iOS RESTART
153
+ // -----------------------------
154
+ async _restartIosReader() {
155
+ if (import_react_native.Platform.OS !== "ios") return;
156
+ if (this.lastUsedReaderFlags == null) return;
157
+ try {
158
+ await import_react_native_nfc_manager.default.unregisterTagEvent();
159
+ await import_react_native_nfc_manager.default.registerTagEvent({
160
+ isReaderModeEnabled: true,
161
+ readerModeFlags: this.lastUsedReaderFlags
162
+ });
163
+ this.setState({ mode: "active" });
164
+ } catch (err) {
165
+ console.warn("[NFC] iOS restart error:", err);
166
+ this._resetReaderState();
95
167
  }
96
- this.setState({ mode: "idle" });
97
168
  }
169
+ // -----------------------------
170
+ // Technology sessions (NDEF, NfcV, etc.)
171
+ // -----------------------------
98
172
  async withTechnology(tech, handler) {
99
173
  if (this.state.mode === "technology") {
100
- throw new Error(`[NFC] Technology is already in use!`);
174
+ throw new Error("[NFC] Technology is already in use!");
101
175
  }
102
- if (this.state.mode === "starting" || this.state.mode === "active" || this.state.mode === "stopping") {
176
+ if (["starting", "active", "stopping"].includes(this.state.mode)) {
103
177
  await this.stopReader();
104
178
  }
105
179
  if (this.state.mode !== "idle") {
@@ -107,15 +181,15 @@ var NfcService = class {
107
181
  `[NFC] Cannot start technology session in mode ${this.state.mode}`
108
182
  );
109
183
  }
110
- this.setState({ mode: "technology" });
184
+ this.setState({ mode: "technology", tag: null });
111
185
  try {
112
186
  await import_react_native_nfc_manager.default.requestTechnology(tech, {
113
187
  alertMessage: "Hold near NFC tag"
114
- // iOS
115
188
  });
116
189
  const result = await handler();
117
- if (import_react_native.Platform.OS === "ios")
190
+ if (import_react_native.Platform.OS === "ios") {
118
191
  await import_react_native_nfc_manager.default.setAlertMessageIOS("Success!");
192
+ }
119
193
  return result;
120
194
  } catch (err) {
121
195
  const message = typeof err === "string" ? err : (err == null ? void 0 : err.message) || "Unknown NFC error";
@@ -123,24 +197,15 @@ var NfcService = class {
123
197
  } finally {
124
198
  try {
125
199
  await import_react_native_nfc_manager.default.cancelTechnologyRequest();
126
- } catch (cancelErr) {
127
- console.warn("[NFC] cancelTechnologyRequest failed:", cancelErr);
200
+ } catch {
128
201
  }
129
- this.setState({ mode: "idle" });
202
+ this.setState({ mode: "idle", tag: null });
130
203
  }
131
204
  }
132
205
  };
133
206
  var nfcService = new NfcService();
134
207
 
135
- // src/services/nfc/a/index.ts
136
- var a_exports = {};
137
- __export(a_exports, {
138
- NfcAUtils: () => NfcAUtils,
139
- operations: () => operations
140
- });
141
-
142
- // src/services/nfc/a/operations.ts
143
- var import_react_native_nfc_manager2 = __toESM(require("react-native-nfc-manager"));
208
+ // src/nfc/a/operations.ts
144
209
  var operations = {
145
210
  async transceive(data) {
146
211
  return nfcService.withTechnology(import_react_native_nfc_manager2.NfcTech.NfcA, async () => {
@@ -149,53 +214,27 @@ var operations = {
149
214
  }
150
215
  };
151
216
 
152
- // src/services/nfc/a/utils.ts
153
- var NfcAUtils = {};
154
-
155
- // src/services/nfc/ndef/index.ts
156
- var ndef_exports = {};
157
- __export(ndef_exports, {
158
- NdefUtils: () => NdefUtils,
159
- operations: () => operations2
160
- });
217
+ // src/nfc/a/utils.ts
218
+ var utils = {};
161
219
 
162
- // src/services/nfc/ndef/operations.ts
163
- var import_react_native_nfc_manager3 = __toESM(require("react-native-nfc-manager"));
164
- var operations2 = {
165
- async writeNdef(records) {
166
- await nfcService.withTechnology([import_react_native_nfc_manager3.NfcTech.Ndef, import_react_native_nfc_manager3.NfcTech.NfcA], async () => {
167
- const bytes = import_react_native_nfc_manager3.Ndef.encodeMessage(records);
168
- await import_react_native_nfc_manager3.default.ndefHandler.writeNdefMessage(bytes);
169
- });
170
- },
171
- writeTextNdef(text) {
172
- const record = import_react_native_nfc_manager3.Ndef.textRecord(text);
173
- return this.writeNdef([record]);
174
- },
175
- writeUriNdef(uri) {
176
- const record = import_react_native_nfc_manager3.Ndef.uriRecord(uri);
177
- return this.writeNdef([record]);
178
- }
179
- };
180
-
181
- // src/services/nfc/ndef/utils.ts
182
- var NdefUtils = {};
183
-
184
- // src/services/nfc/v/index.ts
220
+ // src/nfc/v/index.ts
185
221
  var v_exports = {};
186
222
  __export(v_exports, {
187
- NfcVUtils: () => NfcVUtils,
188
- operations: () => operations3
223
+ operations: () => operations2,
224
+ utils: () => utils2
189
225
  });
190
226
 
191
- // src/services/nfc/v/operations.ts
227
+ // src/nfc/v/operations.ts
192
228
  var import_react_native_nfc_manager5 = __toESM(require("react-native-nfc-manager"));
193
229
 
194
- // src/services/nfc/v/utils.ts
230
+ // src/nfc/v/internal.ts
231
+ var import_react_native_nfc_manager4 = __toESM(require("react-native-nfc-manager"));
232
+
233
+ // src/nfc/v/utils.ts
195
234
  var import_react_native2 = require("react-native");
196
- var import_react_native_nfc_manager4 = require("react-native-nfc-manager");
197
- var NfcVUtils = {
198
- tech: import_react_native2.Platform.OS === "ios" ? [import_react_native_nfc_manager4.NfcTech.Iso15693IOS] : import_react_native_nfc_manager4.NfcTech.NfcV,
235
+ var import_react_native_nfc_manager3 = require("react-native-nfc-manager");
236
+ var utils2 = {
237
+ tech: import_react_native2.Platform.OS === "ios" ? [import_react_native_nfc_manager3.NfcTech.Iso15693IOS] : import_react_native_nfc_manager3.NfcTech.NfcV,
199
238
  Flags: {
200
239
  HIGH_DATA_RATE: 2,
201
240
  ADDRESSED: 32
@@ -220,7 +259,7 @@ var NfcVUtils = {
220
259
  reverseUid(tagIdHex) {
221
260
  const bytes = [];
222
261
  for (let i = 0; i < tagIdHex.length; i += 2) {
223
- bytes.unshift(parseInt(tagIdHex.substring(i, i + 2), 16));
262
+ bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));
224
263
  }
225
264
  return bytes;
226
265
  },
@@ -267,8 +306,12 @@ var NfcVUtils = {
267
306
  if (!resp || resp.length === 0) {
268
307
  throw new Error("Empty NFC-V response");
269
308
  }
270
- if (resp[0] !== 0) {
271
- throw new Error(`Read failed. Status: 0x${resp[0].toString(16)}`);
309
+ const status = resp[0];
310
+ if (status === void 0) {
311
+ throw new Error("Invalid NFC-V response: missing status byte");
312
+ }
313
+ if (status !== 0) {
314
+ throw new Error(`Read failed. Status: 0x${status.toString(16)}`);
272
315
  }
273
316
  return new Uint8Array(resp.slice(1));
274
317
  },
@@ -280,8 +323,12 @@ var NfcVUtils = {
280
323
  if (!resp || resp.length === 0) {
281
324
  throw new Error("Empty NFC-V response");
282
325
  }
283
- if (resp[0] !== 0) {
284
- throw new Error(`Write failed. Status: 0x${resp[0].toString(16)}`);
326
+ const status = resp[0];
327
+ if (status === void 0) {
328
+ throw new Error("Invalid NFC-V response: missing status byte");
329
+ }
330
+ if (status !== 0) {
331
+ throw new Error(`Write failed. Status: 0x${status.toString(16)}`);
285
332
  }
286
333
  },
287
334
  /**
@@ -290,10 +337,18 @@ var NfcVUtils = {
290
337
  */
291
338
  parseSystemInfo(resp) {
292
339
  var _a;
293
- if (!resp || resp.length < 2 || resp[0] !== 0) {
340
+ if (!resp || resp.length < 2) {
294
341
  throw new Error("Invalid System Info response");
295
342
  }
296
- const infoFlags = resp[1] & 15;
343
+ const status = resp[0];
344
+ if (status === void 0 || status !== 0) {
345
+ throw new Error("Invalid System Info response");
346
+ }
347
+ const flagsByte = resp[1];
348
+ if (flagsByte === void 0) {
349
+ throw new Error("Invalid System Info response: missing flags byte");
350
+ }
351
+ const infoFlags = flagsByte & 15;
297
352
  let offset = 2;
298
353
  const result = {};
299
354
  if (resp.length >= offset + 8) {
@@ -308,8 +363,14 @@ var NfcVUtils = {
308
363
  result.afi = resp[offset++];
309
364
  }
310
365
  if (infoFlags & 4 && resp.length >= offset + 2) {
311
- result.numberOfBlocks = resp[offset++] + 1;
312
- result.blockSize = resp[offset++] + 1;
366
+ const numBlocks = resp[offset++];
367
+ const blkSize = resp[offset++];
368
+ if (numBlocks !== void 0) {
369
+ result.numberOfBlocks = numBlocks + 1;
370
+ }
371
+ if (blkSize !== void 0) {
372
+ result.blockSize = blkSize + 1;
373
+ }
313
374
  }
314
375
  if (infoFlags & 8 && resp.length > offset) {
315
376
  result.icReference = resp[offset++];
@@ -329,69 +390,100 @@ var NfcVUtils = {
329
390
  }
330
391
  };
331
392
 
332
- // src/services/nfc/v/operations.ts
333
- var operations3 = {
393
+ // src/nfc/v/internal.ts
394
+ async function readBlockRaw(tag, blockNumber) {
395
+ const uid = utils2.reverseUid(tag.id);
396
+ const cmd = utils2.buildReadBlock(uid, blockNumber);
397
+ const resp = await import_react_native_nfc_manager4.default.transceive(cmd);
398
+ return utils2.parseReadResponse(resp);
399
+ }
400
+ async function writeBlockRaw(tag, blockNumber, data) {
401
+ const uid = utils2.reverseUid(tag.id);
402
+ const cmd = utils2.buildWriteBlock(uid, blockNumber, data);
403
+ const resp = await import_react_native_nfc_manager4.default.transceive(cmd);
404
+ return utils2.parseWriteResponse(resp);
405
+ }
406
+ async function getSystemInfoRaw(tag) {
407
+ const uid = utils2.reverseUid(tag.id);
408
+ const cmd = utils2.buildGetSystemInfo(uid);
409
+ const resp = await import_react_native_nfc_manager4.default.transceive(cmd);
410
+ return utils2.parseSystemInfo(resp);
411
+ }
412
+
413
+ // src/nfc/v/operations.ts
414
+ var operations2 = {
334
415
  async withVTag(handler) {
335
- return nfcService.withTechnology(NfcVUtils.tech, async () => {
416
+ return nfcService.withTechnology(utils2.tech, async () => {
336
417
  const tag = await import_react_native_nfc_manager5.default.getTag();
337
418
  if (!(tag == null ? void 0 : tag.id)) throw new Error("No NFC-V tag detected");
338
419
  return handler(tag);
339
420
  });
340
421
  },
341
422
  async writeBlockNfcV(blockNumber, data) {
342
- return this.withVTag(async (tag) => {
343
- const uid = NfcVUtils.reverseUid(tag.id);
344
- const cmd = NfcVUtils.buildWriteBlock(uid, blockNumber, data);
345
- const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
346
- NfcVUtils.parseWriteResponse(resp);
347
- });
423
+ return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));
348
424
  },
349
425
  async readBlockNfcV(blockNumber) {
350
- return this.withVTag(async (tag) => {
351
- const uid = NfcVUtils.reverseUid(tag.id);
352
- const cmd = NfcVUtils.buildReadBlock(uid, blockNumber);
353
- const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
354
- return NfcVUtils.parseReadResponse(resp);
355
- });
426
+ return this.withVTag((tag) => readBlockRaw(tag, blockNumber));
356
427
  },
357
428
  async getSystemInfoNfcV() {
358
- return this.withVTag(async (tag) => {
359
- const uid = NfcVUtils.reverseUid(tag.id);
360
- console.log(`UID: ${uid}`);
361
- const cmd = NfcVUtils.buildGetSystemInfo(uid);
362
- console.log(`CMD: ${cmd}`);
363
- const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
364
- console.log(`RESP: ${resp}`);
365
- return NfcVUtils.parseSystemInfo(resp);
429
+ return this.withVTag((tag) => getSystemInfoRaw(tag));
430
+ }
431
+ };
432
+
433
+ // src/nfc/ndef/index.ts
434
+ var ndef_exports = {};
435
+ __export(ndef_exports, {
436
+ operations: () => operations3,
437
+ utils: () => utils3
438
+ });
439
+
440
+ // src/nfc/ndef/operations.ts
441
+ var import_react_native_nfc_manager6 = __toESM(require("react-native-nfc-manager"));
442
+ var operations3 = {
443
+ async writeNdef(records) {
444
+ await nfcService.withTechnology([import_react_native_nfc_manager6.NfcTech.Ndef, import_react_native_nfc_manager6.NfcTech.NfcA], async () => {
445
+ const bytes = import_react_native_nfc_manager6.Ndef.encodeMessage(records);
446
+ await import_react_native_nfc_manager6.default.ndefHandler.writeNdefMessage(bytes);
366
447
  });
448
+ },
449
+ writeTextNdef(text) {
450
+ const record = import_react_native_nfc_manager6.Ndef.textRecord(text);
451
+ return this.writeNdef([record]);
452
+ },
453
+ writeUriNdef(uri) {
454
+ const record = import_react_native_nfc_manager6.Ndef.uriRecord(uri);
455
+ return this.writeNdef([record]);
367
456
  }
368
457
  };
369
458
 
370
- // src/services/nfc/namespace.ts
459
+ // src/nfc/ndef/utils.ts
460
+ var utils3 = {};
461
+
462
+ // src/nfc/namespace.ts
371
463
  var nfc = {
372
464
  service: nfcService,
373
465
  /** ISO15693 protocol helpers and high-level operations */
374
466
  v: {
375
- ...operations3,
467
+ ...operations2,
376
468
  // NfcVOperations, nfcV
377
- utils: NfcVUtils
469
+ utils: utils2
378
470
  },
379
471
  /** NFC-A / Type 2 helpers and operations */
380
472
  a: {
381
473
  ...operations,
382
- utils: NfcAUtils
474
+ utils
383
475
  },
384
476
  /** NDEF read/write utilities and operations */
385
477
  ndef: {
386
- ...operations2,
387
- utils: NdefUtils
478
+ ...operations3,
479
+ utils: utils3
388
480
  }
389
481
  };
390
482
  // Annotate the CommonJS export names for ESM import in node:
391
483
  0 && (module.exports = {
392
- ndef,
393
484
  nfc,
394
485
  nfcA,
486
+ nfcNdef,
395
487
  nfcService,
396
488
  nfcV
397
489
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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","// NfcService.ts\r\nimport { 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 { NfcAUtils } 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 { NdefUtils } 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 { NfcVUtils } 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 console.log(`UID: ${uid}`);\r\n const cmd = NfcVUtils.buildGetSystemInfo(uid);\r\n console.log(`CMD: ${cmd}`);\r\n const resp = await NfcManager.transceive(cmd);\r\n console.log(`RESP: ${resp}`);\r\n\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 return [this.Flags.HIGH_DATA_RATE, this.Commands.GET_SYSTEM_INFO];\r\n },\r\n\r\n /**\r\n * Parse a READ_SINGLE_BLOCK response.\r\n * Response format:\r\n * - byte[0] = status (0x00 = success)\r\n * - byte[1..] = block payload bytes\r\n */\r\n parseReadResponse(resp: number[]): Uint8Array {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n 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 (\r\n uid.startsWith(\"E004\") ||\r\n uid.startsWith(\"E006\") ||\r\n uid.startsWith(\"E016\")\r\n )\r\n return \"EM Microelectronic\";\r\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\r\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\r\n if (uid.startsWith(\"E010\")) return \"NXP\";\r\n return \"Unknown\";\r\n },\r\n} as const;\r\n","import { nfcService } from \"./service\";\r\n\r\nimport { operations as aOps, NfcAUtils } from \"./a\";\r\nimport { operations as ndefOps, NdefUtils } from \"./ndef\";\r\nimport { NfcVUtils, 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 * - 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: NfcVUtils,\r\n },\r\n\r\n /** NFC-A / Type 2 helpers and operations */\r\n a: {\r\n ...aOps,\r\n utils: NfcAUtils,\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":"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","names":["NfcManager","import_react_native_nfc_manager","NfcManager","operations","import_react_native_nfc_manager","operations","NfcManager","operations","import_react_native_nfc_manager","import_react_native","import_react_native_nfc_manager","operations","NfcManager","operations"]}
1
+ {"version":3,"sources":["../src/nfc/index.ts","../src/nfc/a/index.ts","../src/nfc/a/operations.ts","../src/nfc/service.ts","../src/nfc/a/utils.ts","../src/nfc/v/index.ts","../src/nfc/v/operations.ts","../src/nfc/v/internal.ts","../src/nfc/v/utils.ts","../src/nfc/ndef/index.ts","../src/nfc/ndef/operations.ts","../src/nfc/ndef/utils.ts","../src/nfc/namespace.ts"],"sourcesContent":["// biome-ignore assist/source/organizeImports: It is already organized well\nexport * as nfcA from \"./a\";\nexport * as nfcV from \"./v\";\nexport * as nfcNdef from \"./ndef\";\n\nexport { nfc } from \"./namespace\";\nexport { nfcService } from \"./service\";\nexport * from \"./types\";\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager, { NfcTech } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\n\nexport const operations = {\n async transceive(data: number[]) {\n return nfcService.withTechnology(NfcTech.NfcA, async () => {\n return await NfcManager.transceive(data);\n });\n },\n};\n","import { Platform } from \"react-native\";\nimport NfcManager, {\n NfcEvents,\n type NfcTech,\n type TagEvent,\n} from \"react-native-nfc-manager\";\n\nimport type { NfcMode, NfcState } from \"./types\";\n\nexport type NfcListener = (state: NfcState) => void;\n\nexport class NfcService {\n private state: NfcState = { mode: \"idle\", tag: null };\n private listeners = new Set<NfcListener>();\n\n private isProcessingTag = false;\n private currentOnTag?: (tag: TagEvent) => Promise<void> | void;\n private currentCooldownMs = 1500;\n private lastUsedReaderFlags: number | null = null; // needed for iOS restart\n\n constructor() {\n NfcManager.start();\n }\n\n // -----------------------------\n // Internal state management\n // -----------------------------\n private setState(partial: Partial<NfcState>) {\n this.state = { ...this.state, ...partial };\n for (const listener of this.listeners) listener(this.state);\n }\n\n getState() {\n return this.state;\n }\n\n subscribe(fn: NfcListener) {\n this.listeners.add(fn);\n fn(this.state);\n return () => {\n this.listeners.delete(fn); // ignore boolean\n };\n }\n\n // -----------------------------\n // START READER\n // -----------------------------\n async startReader(\n readerModeFlags: number,\n onTag?: (tag: TagEvent) => Promise<void> | void,\n options?: { cooldownMs?: number },\n ) {\n if (this.state.mode !== \"idle\") {\n console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);\n return;\n }\n\n this.currentOnTag = onTag;\n this.currentCooldownMs = options?.cooldownMs ?? 1500;\n this.lastUsedReaderFlags = readerModeFlags;\n this.isProcessingTag = false;\n\n this.setState({ mode: \"starting\", tag: null });\n\n NfcManager.setEventListener(\n NfcEvents.DiscoverTag,\n async (tag: TagEvent) => {\n if (!tag) return;\n\n // Soft lock to avoid duplicate processing\n if (this.isProcessingTag) return;\n\n this.isProcessingTag = true;\n this.setState({ tag, mode: \"active\" });\n\n try {\n if (this.currentOnTag) {\n await this.currentOnTag(tag);\n }\n } catch (err) {\n console.warn(\"[NFC] onTag handler error:\", err);\n } finally {\n const cooldown = this.currentCooldownMs;\n\n setTimeout(async () => {\n this.isProcessingTag = false;\n this.setState({ tag: null, mode: \"active\" });\n\n // -----------------------------\n // iOS MUST restart reader\n // -----------------------------\n if (Platform.OS === \"ios\") {\n await this._restartIosReader();\n }\n }, cooldown);\n }\n },\n );\n\n try {\n await NfcManager.registerTagEvent({\n isReaderModeEnabled: true,\n readerModeFlags,\n });\n\n if ((this.state.mode as NfcMode) === \"starting\") {\n this.setState({ mode: \"active\" });\n }\n } catch (err) {\n console.warn(\"[NFC] startReader error:\", err);\n this._resetReaderState();\n }\n }\n\n // -----------------------------\n // STOP READER\n // -----------------------------\n async stopReader() {\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\n\n this.setState({ mode: \"stopping\" });\n\n try {\n await NfcManager.unregisterTagEvent();\n } catch (err) {\n console.warn(\"[NFC] unregisterTagEvent error:\", err);\n }\n\n this._resetReaderState();\n }\n\n private _resetReaderState() {\n this.setState({ mode: \"idle\", tag: null });\n this.currentOnTag = undefined;\n this.isProcessingTag = false;\n // keep lastUsedReaderFlags so iOS restart can keep using them\n }\n\n // -----------------------------\n // iOS RESTART\n // -----------------------------\n private async _restartIosReader() {\n if (Platform.OS !== \"ios\") return;\n if (this.lastUsedReaderFlags == null) return;\n\n try {\n await NfcManager.unregisterTagEvent();\n await NfcManager.registerTagEvent({\n isReaderModeEnabled: true,\n readerModeFlags: this.lastUsedReaderFlags,\n });\n\n this.setState({ mode: \"active\" });\n } catch (err) {\n console.warn(\"[NFC] iOS restart error:\", err);\n this._resetReaderState();\n }\n }\n\n // -----------------------------\n // Technology sessions (NDEF, NfcV, etc.)\n // -----------------------------\n async withTechnology<T>(\n tech: NfcTech | NfcTech[],\n handler: () => Promise<T>,\n ): Promise<T> {\n if (this.state.mode === \"technology\") {\n throw new Error(\"[NFC] Technology is already in use!\");\n }\n\n // Reader must be stopped for tech sessions\n if ([\"starting\", \"active\", \"stopping\"].includes(this.state.mode)) {\n await this.stopReader();\n }\n\n if (this.state.mode !== \"idle\") {\n throw new Error(\n `[NFC] Cannot start technology session in mode ${this.state.mode}`,\n );\n }\n\n this.setState({ mode: \"technology\", tag: null });\n\n try {\n await NfcManager.requestTechnology(tech, {\n alertMessage: \"Hold near NFC tag\",\n });\n\n const result = await handler();\n\n if (Platform.OS === \"ios\") {\n await NfcManager.setAlertMessageIOS(\"Success!\");\n }\n\n return result;\n } catch (err: any) {\n const message =\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\n throw new Error(`[NFC] withTechnology error: ${message}`);\n } finally {\n try {\n await NfcManager.cancelTechnologyRequest();\n } catch {}\n\n this.setState({ mode: \"idle\", tag: null });\n }\n }\n}\n\n// Export one stable instance\nexport const nfcService = new NfcService();\n","export const utils = {};\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\nimport {\n getSystemInfoRaw,\n readBlockRaw,\n type StrictTagEvent,\n writeBlockRaw,\n} from \"./internal\";\nimport { utils } from \"./utils\";\n\nexport const operations = {\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\n return nfcService.withTechnology(utils.tech, async () => {\n const tag = await NfcManager.getTag();\n if (!tag?.id) throw new Error(\"No NFC-V tag detected\");\n return handler(tag as StrictTagEvent);\n });\n },\n\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\n },\n\n async readBlockNfcV(blockNumber: number) {\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\n },\n\n async getSystemInfoNfcV() {\n return this.withVTag((tag) => getSystemInfoRaw(tag));\n },\n};\n","import NfcManager, { type TagEvent } from \"react-native-nfc-manager\";\n\nimport { utils } from \"./utils\";\n\nexport type StrictTagEvent = TagEvent & {\n id: string;\n};\n\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildReadBlock(uid, blockNumber);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseReadResponse(resp);\n}\n\nexport async function writeBlockRaw(\n tag: StrictTagEvent,\n blockNumber: number,\n data: Uint8Array,\n) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseWriteResponse(resp);\n}\n\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildGetSystemInfo(uid);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseSystemInfo(resp);\n}\n","import { Platform } from \"react-native\";\nimport { NfcTech } from \"react-native-nfc-manager\";\n\n// Here's where things get REAL\n//\n// Only iPhone 7+ supports ISO15693; writing may require\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\n// transceive (depends on firmware)\n//\n// | Byte | Meaning |\n// | ------------- | ---------------------------------------------------- |\n// | `0x02` | Flags (high data rate) |\n// | `0x20` | Flags (addressed) |\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\n// | `0x20` | Command code: Read Single Block |\n// | `0x21` | Command code: Write Single Block |\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\n// | `blockNumber` | Which memory block to write |\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\n//\n// Each command is a byte array\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\n//\n// Tag response:\n// The tag response has this structure:\n//\n// | Byte | Meaning |\n// | ---- | --------------------------------------------- |\n// | `0` | **Status** (0x00 = success) |\n// | `1` | **Info Flags** |\n// | … | Data fields, conditional based on those flags |\n//\n// Info Flags bitmask:\n// | Bit | Hex | Meaning |\n// | --- | ---- | ------------------------------------------------------------- |\n// | 0 | 0x01 | DSFID present |\n// | 1 | 0x02 | AFI present |\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\n// | 3 | 0x08 | IC reference present |\n// | 4–7 | — | RFU (reserved) |\n\nexport const utils = {\n tech: Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : NfcTech.NfcV,\n\n Flags: {\n HIGH_DATA_RATE: 0x02,\n ADDRESSED: 0x20,\n // If needed later: OPTION: 0x40 (not commonly used)\n },\n\n Commands: {\n READ_SINGLE_BLOCK: 0x20,\n WRITE_SINGLE_BLOCK: 0x21,\n GET_SYSTEM_INFO: 0x2b,\n },\n\n /**\n * Combine multiple flag bits into one byte.\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\n */\n flags(...bits: number[]): number {\n return bits.reduce((acc, bit) => acc | bit, 0);\n },\n\n /**\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\n * ISO15693 requires reversed UID for addressed commands.\n */\n reverseUid(tagIdHex: string): number[] {\n const bytes = [];\n for (let i = 0; i < tagIdHex.length; i += 2) {\n bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));\n }\n return bytes;\n },\n\n /**\n * Build READ_SINGLE_BLOCK command.\n * FLAGS: addressed + high data rate by default.\n */\n buildReadBlock(uidReversed: number[], blockNumber: number): number[] {\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\n return [\n flags,\n this.Commands.READ_SINGLE_BLOCK,\n ...uidReversed,\n blockNumber,\n ];\n },\n\n /**\n * Build WRITE_SINGLE_BLOCK command.\n * Note: data must match the block size (usually 4 or 8 bytes).\n */\n buildWriteBlock(\n uidReversed: number[],\n blockNumber: number,\n data: Uint8Array,\n ): number[] {\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\n return [\n flags,\n this.Commands.WRITE_SINGLE_BLOCK,\n ...uidReversed,\n blockNumber,\n ...data,\n ];\n },\n\n /**\n * Build GET_SYSTEM_INFO command.\n */\n buildGetSystemInfo(uidReversed: number[]): number[] {\n return [this.Flags.HIGH_DATA_RATE, this.Commands.GET_SYSTEM_INFO];\n },\n\n /**\n * Parse a READ_SINGLE_BLOCK response.\n * Response format:\n * - byte[0] = status (0x00 = success)\n * - byte[1..] = block payload bytes\n */\n parseReadResponse(resp: number[]): Uint8Array {\n if (!resp || resp.length === 0) {\n throw new Error(\"Empty NFC-V response\");\n }\n const status = resp[0];\n if (status === undefined) {\n throw new Error(\"Invalid NFC-V response: missing status byte\");\n }\n if (status !== 0x00) {\n throw new Error(`Read failed. Status: 0x${status.toString(16)}`);\n }\n return new Uint8Array(resp.slice(1));\n },\n\n /**\n * Parse WRITE_SINGLE_BLOCK response.\n * Successful write has resp[0] === 0x00.\n */\n parseWriteResponse(resp: number[]): void {\n if (!resp || resp.length === 0) {\n throw new Error(\"Empty NFC-V response\");\n }\n const status = resp[0];\n if (status === undefined) {\n throw new Error(\"Invalid NFC-V response: missing status byte\");\n }\n if (status !== 0x00) {\n throw new Error(`Write failed. Status: 0x${status.toString(16)}`);\n }\n },\n\n /**\n * Parse GET_SYSTEM_INFO response.\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\n */\n parseSystemInfo(resp: number[]) {\n if (!resp || resp.length < 2) {\n throw new Error(\"Invalid System Info response\");\n }\n const status = resp[0];\n if (status === undefined || status !== 0x00) {\n throw new Error(\"Invalid System Info response\");\n }\n const flagsByte = resp[1];\n if (flagsByte === undefined) {\n throw new Error(\"Invalid System Info response: missing flags byte\");\n }\n\n const infoFlags = flagsByte & 0x0f;\n let offset = 2;\n\n const result: any = {};\n\n // UID (always present – next 8 bytes)\n if (resp.length >= offset + 8) {\n const uidBytes = resp.slice(offset, offset + 8);\n result.uid = uidBytes\n .slice()\n .reverse()\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n offset += 8;\n }\n\n // DSFID\n if (infoFlags & 0x01 && resp.length > offset) {\n result.dsfid = resp[offset++];\n }\n\n // AFI\n if (infoFlags & 0x02 && resp.length > offset) {\n result.afi = resp[offset++];\n }\n\n // Memory size info\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\n const numBlocks = resp[offset++];\n const blkSize = resp[offset++];\n if (numBlocks !== undefined) {\n result.numberOfBlocks = numBlocks + 1;\n }\n if (blkSize !== undefined) {\n result.blockSize = blkSize + 1;\n }\n }\n\n // IC Reference\n if (infoFlags & 0x08 && resp.length > offset) {\n result.icReference = resp[offset++];\n }\n\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\n\n result.manufacturer = this.detectManufacturer(result.uid ?? \"\");\n\n return result;\n },\n\n /** Identify common manufacturers based on UID prefix */\n detectManufacturer(uid: string): string {\n if (\n uid.startsWith(\"E004\") ||\n uid.startsWith(\"E006\") ||\n uid.startsWith(\"E016\")\n )\n return \"EM Microelectronic\";\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\n if (uid.startsWith(\"E010\")) return \"NXP\";\n return \"Unknown\";\n },\n} as const;\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager, {\n Ndef,\n type NdefRecord,\n NfcTech,\n} from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\n\nexport const operations = {\n async writeNdef(records: NdefRecord[]) {\n // Use NFC-A/Type 2 as fallback (often required on Android)\n await nfcService.withTechnology([NfcTech.Ndef, NfcTech.NfcA], async () => {\n const bytes = Ndef.encodeMessage(records);\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\n });\n },\n\n writeTextNdef(text: string) {\n const record = Ndef.textRecord(text);\n return this.writeNdef([record]);\n },\n\n writeUriNdef(uri: string) {\n const record = Ndef.uriRecord(uri);\n return this.writeNdef([record]);\n },\n};\n","export const utils = {};\n","import { operations as aOps, utils as aUtils } from \"./a\";\nimport { operations as ndefOps, utils as ndefUtils } from \"./ndef\";\nimport { nfcService } from \"./service\";\nimport { operations as vOps, utils as vUtils } from \"./v\";\n/**\n * NFC root namespace providing access to:\n * - NfcService\n * - ISO15693 NFC-V ops\n * - NFC-A ops\n * - NDEF operations\n */\nexport const nfc = {\n service: nfcService,\n\n /** ISO15693 protocol helpers and high-level operations */\n v: {\n ...vOps, // NfcVOperations, nfcV\n utils: vUtils,\n },\n\n /** NFC-A / Type 2 helpers and operations */\n a: {\n ...aOps,\n utils: aUtils,\n },\n\n /** NDEF read/write utilities and operations */\n ndef: {\n ...ndefOps,\n utils: ndefUtils,\n },\n} as const;\n"],"mappings":"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","names":["import_react_native_nfc_manager","NfcManager","NfcManager","operations","utils","import_react_native_nfc_manager","import_react_native_nfc_manager","import_react_native","import_react_native_nfc_manager","utils","utils","NfcManager","operations","utils","NfcManager","operations","utils","import_react_native_nfc_manager","operations","NfcManager","utils","operations","utils"]}