@spencerls/react-native-nfc 1.0.3 → 1.0.4
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 +17 -1
- package/dist/index.d.mts +13 -15
- package/dist/index.d.ts +13 -15
- package/dist/index.js +40 -35
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -35
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,7 +38,23 @@ export default function Example() {
|
|
|
38
38
|
return () => nfc.service.stopReader();
|
|
39
39
|
}, []);
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
const start = async () => {
|
|
42
|
+
await nfc.v
|
|
43
|
+
.getSystemInfoNfcV()
|
|
44
|
+
.then((i) => {
|
|
45
|
+
console.log("info:", i);
|
|
46
|
+
})
|
|
47
|
+
.catch((e) => {
|
|
48
|
+
console.error("error:", e);
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<View style={{ padding: 100 }}>
|
|
54
|
+
<Text style={{ color: "#999" }}>NFC Mode: {nfcState.mode}</Text>
|
|
55
|
+
<Button title="Scan Tag" onPress={start} />
|
|
56
|
+
</View>
|
|
57
|
+
);
|
|
42
58
|
}
|
|
43
59
|
```
|
|
44
60
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import * as react_native_nfc_manager from 'react-native-nfc-manager';
|
|
2
2
|
import { TagEvent, NfcTech, NdefRecord } from 'react-native-nfc-manager';
|
|
3
3
|
|
|
4
|
+
type StrictTagEvent = TagEvent & {
|
|
5
|
+
id: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
4
8
|
type NfcMode = "idle" | "starting" | "active" | "stopping" | "technology";
|
|
5
9
|
|
|
6
10
|
interface NfcState {
|
|
@@ -54,9 +58,7 @@ declare const nfc: {
|
|
|
54
58
|
readonly parseSystemInfo: (resp: number[]) => any;
|
|
55
59
|
readonly detectManufacturer: (uid: string) => string;
|
|
56
60
|
};
|
|
57
|
-
readonly withVTag: <T>(handler: (tag:
|
|
58
|
-
id: string;
|
|
59
|
-
}) => Promise<T>) => Promise<T>;
|
|
61
|
+
readonly withVTag: <T>(handler: (tag: StrictTagEvent) => Promise<T>) => Promise<T>;
|
|
60
62
|
readonly writeBlockNfcV: (blockNumber: number, data: Uint8Array) => Promise<void>;
|
|
61
63
|
readonly readBlockNfcV: (blockNumber: number) => Promise<Uint8Array<ArrayBufferLike>>;
|
|
62
64
|
readonly getSystemInfoNfcV: () => Promise<any>;
|
|
@@ -79,11 +81,10 @@ declare const operations$2: {
|
|
|
79
81
|
transceive(data: number[]): Promise<number[]>;
|
|
80
82
|
};
|
|
81
83
|
|
|
82
|
-
declare const
|
|
84
|
+
declare const utils$2: {};
|
|
83
85
|
|
|
84
|
-
declare const index$2_NfcAUtils: typeof NfcAUtils;
|
|
85
86
|
declare namespace index$2 {
|
|
86
|
-
export {
|
|
87
|
+
export { operations$2 as operations, utils$2 as utils };
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
declare const operations$1: {
|
|
@@ -92,23 +93,20 @@ declare const operations$1: {
|
|
|
92
93
|
writeUriNdef(uri: string): Promise<void>;
|
|
93
94
|
};
|
|
94
95
|
|
|
95
|
-
declare const
|
|
96
|
+
declare const utils$1: {};
|
|
96
97
|
|
|
97
|
-
declare const index$1_NdefUtils: typeof NdefUtils;
|
|
98
98
|
declare namespace index$1 {
|
|
99
|
-
export {
|
|
99
|
+
export { operations$1 as operations, utils$1 as utils };
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
declare const operations: {
|
|
103
|
-
withVTag<T>(handler: (tag:
|
|
104
|
-
id: string;
|
|
105
|
-
}) => Promise<T>): Promise<T>;
|
|
103
|
+
withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T>;
|
|
106
104
|
writeBlockNfcV(blockNumber: number, data: Uint8Array): Promise<void>;
|
|
107
105
|
readBlockNfcV(blockNumber: number): Promise<Uint8Array<ArrayBufferLike>>;
|
|
108
106
|
getSystemInfoNfcV(): Promise<any>;
|
|
109
107
|
};
|
|
110
108
|
|
|
111
|
-
declare const
|
|
109
|
+
declare const utils: {
|
|
112
110
|
readonly tech: NfcTech.NfcV | NfcTech[];
|
|
113
111
|
readonly Flags: {
|
|
114
112
|
readonly HIGH_DATA_RATE: 2;
|
|
@@ -164,10 +162,10 @@ declare const NfcVUtils: {
|
|
|
164
162
|
readonly detectManufacturer: (uid: string) => string;
|
|
165
163
|
};
|
|
166
164
|
|
|
167
|
-
declare const index_NfcVUtils: typeof NfcVUtils;
|
|
168
165
|
declare const index_operations: typeof operations;
|
|
166
|
+
declare const index_utils: typeof utils;
|
|
169
167
|
declare namespace index {
|
|
170
|
-
export {
|
|
168
|
+
export { index_operations as operations, index_utils as utils };
|
|
171
169
|
}
|
|
172
170
|
|
|
173
171
|
export { type NfcMode, type NfcState, index$1 as ndef, nfc, index$2 as nfcA, nfcService, index as nfcV };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import * as react_native_nfc_manager from 'react-native-nfc-manager';
|
|
2
2
|
import { TagEvent, NfcTech, NdefRecord } from 'react-native-nfc-manager';
|
|
3
3
|
|
|
4
|
+
type StrictTagEvent = TagEvent & {
|
|
5
|
+
id: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
4
8
|
type NfcMode = "idle" | "starting" | "active" | "stopping" | "technology";
|
|
5
9
|
|
|
6
10
|
interface NfcState {
|
|
@@ -54,9 +58,7 @@ declare const nfc: {
|
|
|
54
58
|
readonly parseSystemInfo: (resp: number[]) => any;
|
|
55
59
|
readonly detectManufacturer: (uid: string) => string;
|
|
56
60
|
};
|
|
57
|
-
readonly withVTag: <T>(handler: (tag:
|
|
58
|
-
id: string;
|
|
59
|
-
}) => Promise<T>) => Promise<T>;
|
|
61
|
+
readonly withVTag: <T>(handler: (tag: StrictTagEvent) => Promise<T>) => Promise<T>;
|
|
60
62
|
readonly writeBlockNfcV: (blockNumber: number, data: Uint8Array) => Promise<void>;
|
|
61
63
|
readonly readBlockNfcV: (blockNumber: number) => Promise<Uint8Array<ArrayBufferLike>>;
|
|
62
64
|
readonly getSystemInfoNfcV: () => Promise<any>;
|
|
@@ -79,11 +81,10 @@ declare const operations$2: {
|
|
|
79
81
|
transceive(data: number[]): Promise<number[]>;
|
|
80
82
|
};
|
|
81
83
|
|
|
82
|
-
declare const
|
|
84
|
+
declare const utils$2: {};
|
|
83
85
|
|
|
84
|
-
declare const index$2_NfcAUtils: typeof NfcAUtils;
|
|
85
86
|
declare namespace index$2 {
|
|
86
|
-
export {
|
|
87
|
+
export { operations$2 as operations, utils$2 as utils };
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
declare const operations$1: {
|
|
@@ -92,23 +93,20 @@ declare const operations$1: {
|
|
|
92
93
|
writeUriNdef(uri: string): Promise<void>;
|
|
93
94
|
};
|
|
94
95
|
|
|
95
|
-
declare const
|
|
96
|
+
declare const utils$1: {};
|
|
96
97
|
|
|
97
|
-
declare const index$1_NdefUtils: typeof NdefUtils;
|
|
98
98
|
declare namespace index$1 {
|
|
99
|
-
export {
|
|
99
|
+
export { operations$1 as operations, utils$1 as utils };
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
declare const operations: {
|
|
103
|
-
withVTag<T>(handler: (tag:
|
|
104
|
-
id: string;
|
|
105
|
-
}) => Promise<T>): Promise<T>;
|
|
103
|
+
withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T>;
|
|
106
104
|
writeBlockNfcV(blockNumber: number, data: Uint8Array): Promise<void>;
|
|
107
105
|
readBlockNfcV(blockNumber: number): Promise<Uint8Array<ArrayBufferLike>>;
|
|
108
106
|
getSystemInfoNfcV(): Promise<any>;
|
|
109
107
|
};
|
|
110
108
|
|
|
111
|
-
declare const
|
|
109
|
+
declare const utils: {
|
|
112
110
|
readonly tech: NfcTech.NfcV | NfcTech[];
|
|
113
111
|
readonly Flags: {
|
|
114
112
|
readonly HIGH_DATA_RATE: 2;
|
|
@@ -164,10 +162,10 @@ declare const NfcVUtils: {
|
|
|
164
162
|
readonly detectManufacturer: (uid: string) => string;
|
|
165
163
|
};
|
|
166
164
|
|
|
167
|
-
declare const index_NfcVUtils: typeof NfcVUtils;
|
|
168
165
|
declare const index_operations: typeof operations;
|
|
166
|
+
declare const index_utils: typeof utils;
|
|
169
167
|
declare namespace index {
|
|
170
|
-
export {
|
|
168
|
+
export { index_operations as operations, index_utils as utils };
|
|
171
169
|
}
|
|
172
170
|
|
|
173
171
|
export { type NfcMode, type NfcState, index$1 as ndef, nfc, index$2 as nfcA, nfcService, index as nfcV };
|
package/dist/index.js
CHANGED
|
@@ -135,8 +135,8 @@ var nfcService = new NfcService();
|
|
|
135
135
|
// src/services/nfc/a/index.ts
|
|
136
136
|
var a_exports = {};
|
|
137
137
|
__export(a_exports, {
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
operations: () => operations,
|
|
139
|
+
utils: () => utils
|
|
140
140
|
});
|
|
141
141
|
|
|
142
142
|
// src/services/nfc/a/operations.ts
|
|
@@ -150,13 +150,13 @@ var operations = {
|
|
|
150
150
|
};
|
|
151
151
|
|
|
152
152
|
// src/services/nfc/a/utils.ts
|
|
153
|
-
var
|
|
153
|
+
var utils = {};
|
|
154
154
|
|
|
155
155
|
// src/services/nfc/ndef/index.ts
|
|
156
156
|
var ndef_exports = {};
|
|
157
157
|
__export(ndef_exports, {
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
operations: () => operations2,
|
|
159
|
+
utils: () => utils2
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
// src/services/nfc/ndef/operations.ts
|
|
@@ -179,22 +179,25 @@ var operations2 = {
|
|
|
179
179
|
};
|
|
180
180
|
|
|
181
181
|
// src/services/nfc/ndef/utils.ts
|
|
182
|
-
var
|
|
182
|
+
var utils2 = {};
|
|
183
183
|
|
|
184
184
|
// src/services/nfc/v/index.ts
|
|
185
185
|
var v_exports = {};
|
|
186
186
|
__export(v_exports, {
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
operations: () => operations3,
|
|
188
|
+
utils: () => utils3
|
|
189
189
|
});
|
|
190
190
|
|
|
191
191
|
// src/services/nfc/v/operations.ts
|
|
192
|
+
var import_react_native_nfc_manager6 = __toESM(require("react-native-nfc-manager"));
|
|
193
|
+
|
|
194
|
+
// src/services/nfc/v/internal.ts
|
|
192
195
|
var import_react_native_nfc_manager5 = __toESM(require("react-native-nfc-manager"));
|
|
193
196
|
|
|
194
197
|
// src/services/nfc/v/utils.ts
|
|
195
198
|
var import_react_native2 = require("react-native");
|
|
196
199
|
var import_react_native_nfc_manager4 = require("react-native-nfc-manager");
|
|
197
|
-
var
|
|
200
|
+
var utils3 = {
|
|
198
201
|
tech: import_react_native2.Platform.OS === "ios" ? [import_react_native_nfc_manager4.NfcTech.Iso15693IOS] : import_react_native_nfc_manager4.NfcTech.NfcV,
|
|
199
202
|
Flags: {
|
|
200
203
|
HIGH_DATA_RATE: 2,
|
|
@@ -329,41 +332,43 @@ var NfcVUtils = {
|
|
|
329
332
|
}
|
|
330
333
|
};
|
|
331
334
|
|
|
335
|
+
// src/services/nfc/v/internal.ts
|
|
336
|
+
async function readBlockRaw(tag, blockNumber) {
|
|
337
|
+
const uid = utils3.reverseUid(tag.id);
|
|
338
|
+
const cmd = utils3.buildReadBlock(uid, blockNumber);
|
|
339
|
+
const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
|
|
340
|
+
return utils3.parseReadResponse(resp);
|
|
341
|
+
}
|
|
342
|
+
async function writeBlockRaw(tag, blockNumber, data) {
|
|
343
|
+
const uid = utils3.reverseUid(tag.id);
|
|
344
|
+
const cmd = utils3.buildWriteBlock(uid, blockNumber, data);
|
|
345
|
+
const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
|
|
346
|
+
return utils3.parseWriteResponse(resp);
|
|
347
|
+
}
|
|
348
|
+
async function getSystemInfoRaw(tag) {
|
|
349
|
+
const uid = utils3.reverseUid(tag.id);
|
|
350
|
+
const cmd = utils3.buildGetSystemInfo(uid);
|
|
351
|
+
const resp = await import_react_native_nfc_manager5.default.transceive(cmd);
|
|
352
|
+
return utils3.parseSystemInfo(resp);
|
|
353
|
+
}
|
|
354
|
+
|
|
332
355
|
// src/services/nfc/v/operations.ts
|
|
333
356
|
var operations3 = {
|
|
334
357
|
async withVTag(handler) {
|
|
335
|
-
return nfcService.withTechnology(
|
|
336
|
-
const tag = await
|
|
358
|
+
return nfcService.withTechnology(utils3.tech, async () => {
|
|
359
|
+
const tag = await import_react_native_nfc_manager6.default.getTag();
|
|
337
360
|
if (!(tag == null ? void 0 : tag.id)) throw new Error("No NFC-V tag detected");
|
|
338
361
|
return handler(tag);
|
|
339
362
|
});
|
|
340
363
|
},
|
|
341
364
|
async writeBlockNfcV(blockNumber, data) {
|
|
342
|
-
return this.withVTag(
|
|
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
|
-
});
|
|
365
|
+
return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));
|
|
348
366
|
},
|
|
349
367
|
async readBlockNfcV(blockNumber) {
|
|
350
|
-
return this.withVTag(
|
|
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
|
-
});
|
|
368
|
+
return this.withVTag((tag) => readBlockRaw(tag, blockNumber));
|
|
356
369
|
},
|
|
357
370
|
async getSystemInfoNfcV() {
|
|
358
|
-
return this.withVTag(
|
|
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);
|
|
366
|
-
});
|
|
371
|
+
return this.withVTag((tag) => getSystemInfoRaw(tag));
|
|
367
372
|
}
|
|
368
373
|
};
|
|
369
374
|
|
|
@@ -374,17 +379,17 @@ var nfc = {
|
|
|
374
379
|
v: {
|
|
375
380
|
...operations3,
|
|
376
381
|
// NfcVOperations, nfcV
|
|
377
|
-
utils:
|
|
382
|
+
utils: utils3
|
|
378
383
|
},
|
|
379
384
|
/** NFC-A / Type 2 helpers and operations */
|
|
380
385
|
a: {
|
|
381
386
|
...operations,
|
|
382
|
-
utils
|
|
387
|
+
utils
|
|
383
388
|
},
|
|
384
389
|
/** NDEF read/write utilities and operations */
|
|
385
390
|
ndef: {
|
|
386
391
|
...operations2,
|
|
387
|
-
utils:
|
|
392
|
+
utils: utils2
|
|
388
393
|
}
|
|
389
394
|
};
|
|
390
395
|
// Annotate the CommonJS export names for ESM import in node:
|
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/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/internal.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 { 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 utils = {};\r\n","export { operations } from \"./operations\";\r\nexport { 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 utils = {};\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager from \"react-native-nfc-manager\";\r\nimport { nfcService } from \"../service\";\r\nimport {\r\n getSystemInfoRaw,\r\n readBlockRaw,\r\n StrictTagEvent,\r\n writeBlockRaw,\r\n} from \"./internal\";\r\nimport { utils } from \"./utils\";\r\n\r\nexport const operations = {\r\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\r\n return nfcService.withTechnology(utils.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 StrictTagEvent);\r\n });\r\n },\r\n\r\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\r\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\r\n },\r\n\r\n async readBlockNfcV(blockNumber: number) {\r\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\r\n },\r\n\r\n async getSystemInfoNfcV() {\r\n return this.withVTag((tag) => getSystemInfoRaw(tag));\r\n },\r\n};\r\n","import NfcManager, { TagEvent } from \"react-native-nfc-manager\";\r\nimport { utils } from \"./utils\";\r\n\r\nexport type StrictTagEvent = TagEvent & {\r\n id: string;\r\n};\r\n\r\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildReadBlock(uid, blockNumber);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseReadResponse(resp);\r\n}\r\n\r\nexport async function writeBlockRaw(\r\n tag: StrictTagEvent,\r\n blockNumber: number,\r\n data: Uint8Array\r\n) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseWriteResponse(resp);\r\n}\r\n\r\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildGetSystemInfo(uid);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseSystemInfo(resp);\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 utils = {\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, 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":"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","names":["NfcManager","import_react_native_nfc_manager","NfcManager","operations","utils","import_react_native_nfc_manager","operations","NfcManager","utils","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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -103,8 +103,8 @@ var nfcService = new NfcService();
|
|
|
103
103
|
// src/services/nfc/a/index.ts
|
|
104
104
|
var a_exports = {};
|
|
105
105
|
__export(a_exports, {
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
operations: () => operations,
|
|
107
|
+
utils: () => utils
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
// src/services/nfc/a/operations.ts
|
|
@@ -118,13 +118,13 @@ var operations = {
|
|
|
118
118
|
};
|
|
119
119
|
|
|
120
120
|
// src/services/nfc/a/utils.ts
|
|
121
|
-
var
|
|
121
|
+
var utils = {};
|
|
122
122
|
|
|
123
123
|
// src/services/nfc/ndef/index.ts
|
|
124
124
|
var ndef_exports = {};
|
|
125
125
|
__export(ndef_exports, {
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
operations: () => operations2,
|
|
127
|
+
utils: () => utils2
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
// src/services/nfc/ndef/operations.ts
|
|
@@ -150,22 +150,25 @@ var operations2 = {
|
|
|
150
150
|
};
|
|
151
151
|
|
|
152
152
|
// src/services/nfc/ndef/utils.ts
|
|
153
|
-
var
|
|
153
|
+
var utils2 = {};
|
|
154
154
|
|
|
155
155
|
// src/services/nfc/v/index.ts
|
|
156
156
|
var v_exports = {};
|
|
157
157
|
__export(v_exports, {
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
operations: () => operations3,
|
|
159
|
+
utils: () => utils3
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
// src/services/nfc/v/operations.ts
|
|
163
|
+
import NfcManager5 from "react-native-nfc-manager";
|
|
164
|
+
|
|
165
|
+
// src/services/nfc/v/internal.ts
|
|
163
166
|
import NfcManager4 from "react-native-nfc-manager";
|
|
164
167
|
|
|
165
168
|
// src/services/nfc/v/utils.ts
|
|
166
169
|
import { Platform as Platform2 } from "react-native";
|
|
167
170
|
import { NfcTech as NfcTech4 } from "react-native-nfc-manager";
|
|
168
|
-
var
|
|
171
|
+
var utils3 = {
|
|
169
172
|
tech: Platform2.OS === "ios" ? [NfcTech4.Iso15693IOS] : NfcTech4.NfcV,
|
|
170
173
|
Flags: {
|
|
171
174
|
HIGH_DATA_RATE: 2,
|
|
@@ -300,41 +303,43 @@ var NfcVUtils = {
|
|
|
300
303
|
}
|
|
301
304
|
};
|
|
302
305
|
|
|
306
|
+
// src/services/nfc/v/internal.ts
|
|
307
|
+
async function readBlockRaw(tag, blockNumber) {
|
|
308
|
+
const uid = utils3.reverseUid(tag.id);
|
|
309
|
+
const cmd = utils3.buildReadBlock(uid, blockNumber);
|
|
310
|
+
const resp = await NfcManager4.transceive(cmd);
|
|
311
|
+
return utils3.parseReadResponse(resp);
|
|
312
|
+
}
|
|
313
|
+
async function writeBlockRaw(tag, blockNumber, data) {
|
|
314
|
+
const uid = utils3.reverseUid(tag.id);
|
|
315
|
+
const cmd = utils3.buildWriteBlock(uid, blockNumber, data);
|
|
316
|
+
const resp = await NfcManager4.transceive(cmd);
|
|
317
|
+
return utils3.parseWriteResponse(resp);
|
|
318
|
+
}
|
|
319
|
+
async function getSystemInfoRaw(tag) {
|
|
320
|
+
const uid = utils3.reverseUid(tag.id);
|
|
321
|
+
const cmd = utils3.buildGetSystemInfo(uid);
|
|
322
|
+
const resp = await NfcManager4.transceive(cmd);
|
|
323
|
+
return utils3.parseSystemInfo(resp);
|
|
324
|
+
}
|
|
325
|
+
|
|
303
326
|
// src/services/nfc/v/operations.ts
|
|
304
327
|
var operations3 = {
|
|
305
328
|
async withVTag(handler) {
|
|
306
|
-
return nfcService.withTechnology(
|
|
307
|
-
const tag = await
|
|
329
|
+
return nfcService.withTechnology(utils3.tech, async () => {
|
|
330
|
+
const tag = await NfcManager5.getTag();
|
|
308
331
|
if (!(tag == null ? void 0 : tag.id)) throw new Error("No NFC-V tag detected");
|
|
309
332
|
return handler(tag);
|
|
310
333
|
});
|
|
311
334
|
},
|
|
312
335
|
async writeBlockNfcV(blockNumber, data) {
|
|
313
|
-
return this.withVTag(
|
|
314
|
-
const uid = NfcVUtils.reverseUid(tag.id);
|
|
315
|
-
const cmd = NfcVUtils.buildWriteBlock(uid, blockNumber, data);
|
|
316
|
-
const resp = await NfcManager4.transceive(cmd);
|
|
317
|
-
NfcVUtils.parseWriteResponse(resp);
|
|
318
|
-
});
|
|
336
|
+
return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));
|
|
319
337
|
},
|
|
320
338
|
async readBlockNfcV(blockNumber) {
|
|
321
|
-
return this.withVTag(
|
|
322
|
-
const uid = NfcVUtils.reverseUid(tag.id);
|
|
323
|
-
const cmd = NfcVUtils.buildReadBlock(uid, blockNumber);
|
|
324
|
-
const resp = await NfcManager4.transceive(cmd);
|
|
325
|
-
return NfcVUtils.parseReadResponse(resp);
|
|
326
|
-
});
|
|
339
|
+
return this.withVTag((tag) => readBlockRaw(tag, blockNumber));
|
|
327
340
|
},
|
|
328
341
|
async getSystemInfoNfcV() {
|
|
329
|
-
return this.withVTag(
|
|
330
|
-
const uid = NfcVUtils.reverseUid(tag.id);
|
|
331
|
-
console.log(`UID: ${uid}`);
|
|
332
|
-
const cmd = NfcVUtils.buildGetSystemInfo(uid);
|
|
333
|
-
console.log(`CMD: ${cmd}`);
|
|
334
|
-
const resp = await NfcManager4.transceive(cmd);
|
|
335
|
-
console.log(`RESP: ${resp}`);
|
|
336
|
-
return NfcVUtils.parseSystemInfo(resp);
|
|
337
|
-
});
|
|
342
|
+
return this.withVTag((tag) => getSystemInfoRaw(tag));
|
|
338
343
|
}
|
|
339
344
|
};
|
|
340
345
|
|
|
@@ -345,17 +350,17 @@ var nfc = {
|
|
|
345
350
|
v: {
|
|
346
351
|
...operations3,
|
|
347
352
|
// NfcVOperations, nfcV
|
|
348
|
-
utils:
|
|
353
|
+
utils: utils3
|
|
349
354
|
},
|
|
350
355
|
/** NFC-A / Type 2 helpers and operations */
|
|
351
356
|
a: {
|
|
352
357
|
...operations,
|
|
353
|
-
utils
|
|
358
|
+
utils
|
|
354
359
|
},
|
|
355
360
|
/** NDEF read/write utilities and operations */
|
|
356
361
|
ndef: {
|
|
357
362
|
...operations2,
|
|
358
|
-
utils:
|
|
363
|
+
utils: utils2
|
|
359
364
|
}
|
|
360
365
|
};
|
|
361
366
|
export {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["// 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","NfcTech","NfcTech","NfcManager","operations","NfcManager","NfcTech","operations","NfcTech","NfcManager","operations","NfcManager","Platform","NfcTech","operations","NfcManager","operations"]}
|
|
1
|
+
{"version":3,"sources":["../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/internal.ts","../src/services/nfc/v/utils.ts","../src/services/nfc/namespace.ts"],"sourcesContent":["// 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 { 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 utils = {};\r\n","export { operations } from \"./operations\";\r\nexport { 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 utils = {};\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager from \"react-native-nfc-manager\";\r\nimport { nfcService } from \"../service\";\r\nimport {\r\n getSystemInfoRaw,\r\n readBlockRaw,\r\n StrictTagEvent,\r\n writeBlockRaw,\r\n} from \"./internal\";\r\nimport { utils } from \"./utils\";\r\n\r\nexport const operations = {\r\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\r\n return nfcService.withTechnology(utils.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 StrictTagEvent);\r\n });\r\n },\r\n\r\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\r\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\r\n },\r\n\r\n async readBlockNfcV(blockNumber: number) {\r\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\r\n },\r\n\r\n async getSystemInfoNfcV() {\r\n return this.withVTag((tag) => getSystemInfoRaw(tag));\r\n },\r\n};\r\n","import NfcManager, { TagEvent } from \"react-native-nfc-manager\";\r\nimport { utils } from \"./utils\";\r\n\r\nexport type StrictTagEvent = TagEvent & {\r\n id: string;\r\n};\r\n\r\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildReadBlock(uid, blockNumber);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseReadResponse(resp);\r\n}\r\n\r\nexport async function writeBlockRaw(\r\n tag: StrictTagEvent,\r\n blockNumber: number,\r\n data: Uint8Array\r\n) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseWriteResponse(resp);\r\n}\r\n\r\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildGetSystemInfo(uid);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseSystemInfo(resp);\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 utils = {\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, 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":"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","names":["NfcManager","NfcTech","NfcTech","NfcManager","operations","utils","NfcManager","NfcTech","operations","NfcTech","NfcManager","utils","operations","utils","NfcManager","NfcManager","Platform","NfcTech","utils","utils","NfcManager","operations","utils","NfcManager","operations","utils"]}
|
package/package.json
CHANGED