react-native-telpo 1.0.0

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.
Files changed (37) hide show
  1. package/README.md +300 -0
  2. package/lib/commonjs/index.js +40 -0
  3. package/lib/commonjs/index.js.map +1 -0
  4. package/lib/commonjs/nfc/index.js +322 -0
  5. package/lib/commonjs/nfc/index.js.map +1 -0
  6. package/lib/commonjs/printer/index.js +379 -0
  7. package/lib/commonjs/printer/index.js.map +1 -0
  8. package/lib/commonjs/scanner/index.js +301 -0
  9. package/lib/commonjs/scanner/index.js.map +1 -0
  10. package/lib/commonjs/types/index.js +37 -0
  11. package/lib/commonjs/types/index.js.map +1 -0
  12. package/lib/module/index.js +27 -0
  13. package/lib/module/index.js.map +1 -0
  14. package/lib/module/nfc/index.js +317 -0
  15. package/lib/module/nfc/index.js.map +1 -0
  16. package/lib/module/printer/index.js +374 -0
  17. package/lib/module/printer/index.js.map +1 -0
  18. package/lib/module/scanner/index.js +294 -0
  19. package/lib/module/scanner/index.js.map +1 -0
  20. package/lib/module/types/index.js +38 -0
  21. package/lib/module/types/index.js.map +1 -0
  22. package/lib/typescript/index.d.ts +21 -0
  23. package/lib/typescript/index.d.ts.map +1 -0
  24. package/lib/typescript/nfc/index.d.ts +83 -0
  25. package/lib/typescript/nfc/index.d.ts.map +1 -0
  26. package/lib/typescript/printer/index.d.ts +91 -0
  27. package/lib/typescript/printer/index.d.ts.map +1 -0
  28. package/lib/typescript/scanner/index.d.ts +81 -0
  29. package/lib/typescript/scanner/index.d.ts.map +1 -0
  30. package/lib/typescript/types/index.d.ts +114 -0
  31. package/lib/typescript/types/index.d.ts.map +1 -0
  32. package/package.json +104 -0
  33. package/src/index.ts +55 -0
  34. package/src/nfc/index.ts +362 -0
  35. package/src/printer/index.ts +432 -0
  36. package/src/scanner/index.tsx +397 -0
  37. package/src/types/index.ts +161 -0
@@ -0,0 +1,317 @@
1
+ /**
2
+ * TelpoNfc
3
+ *
4
+ * Wraps react-native-nfc-manager to provide a clean, typed API
5
+ * for reading NFC/contactless card UIDs on Telpo T20 and TPS320.
6
+ *
7
+ * Supports: ISO 14443-A/B (NfcA, NfcB), IsoDep, Mifare Classic,
8
+ * Mifare Ultralight, and NDEF tags.
9
+ *
10
+ * Returns the raw card UID as a hex string — you handle validation.
11
+ */
12
+
13
+ import { TelpoErrorCode } from '../types';
14
+
15
+ // Lazy-loaded to prevent crash if peer dep is missing
16
+ let NfcManager;
17
+ let NfcTechEnum;
18
+ let NfcEvents;
19
+ function loadNfcLib() {
20
+ try {
21
+ const lib = require('react-native-nfc-manager');
22
+ NfcManager = lib.default;
23
+ NfcTechEnum = lib.NfcTech;
24
+ NfcEvents = lib.NfcEvents;
25
+ } catch {
26
+ throw buildError(TelpoErrorCode.NFC_NOT_SUPPORTED, 'Peer dependency react-native-nfc-manager is not installed. Run: npm install react-native-nfc-manager');
27
+ }
28
+ }
29
+
30
+ // ── Helpers ───────────────────────────────────────────────────────────────────
31
+
32
+ function buildError(code, message, raw) {
33
+ return {
34
+ code,
35
+ message,
36
+ raw
37
+ };
38
+ }
39
+ function wrapSuccess(data) {
40
+ return {
41
+ success: true,
42
+ data
43
+ };
44
+ }
45
+ function wrapError(error) {
46
+ return {
47
+ success: false,
48
+ error
49
+ };
50
+ }
51
+
52
+ /**
53
+ * Convert a byte array to a colon-separated hex string.
54
+ * e.g. [0x04, 0xAB, 0x12] → "04:AB:12"
55
+ */
56
+ function bytesToHex(bytes) {
57
+ return bytes.map(b => b.toString(16).padStart(2, '0').toUpperCase()).join(':');
58
+ }
59
+ function mapTech(tech) {
60
+ // Map our type to the NfcTech enum values from the library
61
+ const map = {
62
+ NfcA: 'NfcA',
63
+ NfcB: 'NfcB',
64
+ IsoDep: 'IsoDep',
65
+ MifareClassic: 'MifareClassic',
66
+ MifareUltralight: 'MifareUltralight',
67
+ Ndef: 'Ndef'
68
+ };
69
+ return map[tech];
70
+ }
71
+ function detectTechnology(tag) {
72
+ if (tag.techTypes?.includes('android.nfc.tech.MifareClassic')) return 'MifareClassic';
73
+ if (tag.techTypes?.includes('android.nfc.tech.MifareUltralight')) return 'MifareUltralight';
74
+ if (tag.techTypes?.includes('android.nfc.tech.IsoDep')) return 'IsoDep';
75
+ if (tag.techTypes?.includes('android.nfc.tech.NfcB')) return 'NfcB';
76
+ if (tag.techTypes?.includes('android.nfc.tech.Ndef')) return 'Ndef';
77
+ return 'NfcA';
78
+ }
79
+
80
+ // ── State ─────────────────────────────────────────────────────────────────────
81
+
82
+ let _started = false;
83
+ let _listening = false;
84
+
85
+ // ── Module ────────────────────────────────────────────────────────────────────
86
+
87
+ /**
88
+ * TelpoNfc
89
+ *
90
+ * @example
91
+ * // One-time setup (call in your app root or screen init)
92
+ * await TelpoNfc.init();
93
+ *
94
+ * // Start listening for a card tap — resolves immediately on tap
95
+ * const result = await TelpoNfc.readTag();
96
+ * if (result.success) {
97
+ * console.log(result.data.uid); // "04:AB:12:CD:EF:01:23"
98
+ * }
99
+ *
100
+ * // For continuous listening (e.g. validator gate)
101
+ * TelpoNfc.startListening((result) => {
102
+ * if (result.success) {
103
+ * handleCard(result.data.uid);
104
+ * }
105
+ * });
106
+ * // Later:
107
+ * TelpoNfc.stopListening();
108
+ */
109
+ export const TelpoNfc = {
110
+ get _started() {
111
+ return _started;
112
+ },
113
+ set _started(value) {
114
+ _started = value;
115
+ },
116
+ get _listening() {
117
+ return _listening;
118
+ },
119
+ set _listening(value) {
120
+ _listening = value;
121
+ },
122
+ /**
123
+ * Initialise NFC and verify it is supported and enabled on the device.
124
+ * Call once on app start or screen mount.
125
+ */
126
+ async init() {
127
+ try {
128
+ loadNfcLib();
129
+ } catch (e) {
130
+ return wrapError(e);
131
+ }
132
+ try {
133
+ const supported = await NfcManager.isSupported();
134
+ if (!supported) {
135
+ return wrapError(buildError(TelpoErrorCode.NFC_NOT_SUPPORTED, 'NFC is not supported on this device.'));
136
+ }
137
+ if (!_started) {
138
+ await NfcManager.start();
139
+ _started = true;
140
+ }
141
+ const enabled = await NfcManager.isEnabled();
142
+ if (!enabled) {
143
+ return wrapError(buildError(TelpoErrorCode.NFC_DISABLED, 'NFC is disabled. Please enable NFC in device settings.'));
144
+ }
145
+ return wrapSuccess(undefined);
146
+ } catch (e) {
147
+ return wrapError(buildError(TelpoErrorCode.NFC_NOT_SUPPORTED, 'Failed to initialise NFC', e));
148
+ }
149
+ },
150
+ /**
151
+ * Wait for a single NFC tag tap and resolve with its UID.
152
+ * Rejects if cancelled or an error occurs.
153
+ *
154
+ * This is the recommended approach for a "tap once" validation flow.
155
+ *
156
+ * @param options.technologies NFC technologies to accept (default: all)
157
+ * @param timeoutMs Auto-cancel after N ms (default: no timeout)
158
+ */
159
+ async readTag(options = {}, timeoutMs) {
160
+ if (!_started) {
161
+ const initResult = await TelpoNfc.init();
162
+ if (!initResult.success) return initResult;
163
+ }
164
+ if (_listening) {
165
+ return wrapError(buildError(TelpoErrorCode.NFC_ALREADY_LISTENING, 'NFC is already in continuous-listen mode. Call stopListening() first.'));
166
+ }
167
+ const techs = (options.technologies ?? ['NfcA', 'NfcB', 'IsoDep', 'MifareClassic', 'MifareUltralight', 'Ndef']).map(mapTech).map(t => NfcTechEnum[t]).filter(Boolean);
168
+ let timeoutHandle = null;
169
+ try {
170
+ const tagPromise = new Promise(async (resolve, reject) => {
171
+ try {
172
+ await NfcManager.requestTechnology(techs);
173
+ const rawTag = await NfcManager.getTag();
174
+ if (!rawTag) {
175
+ reject(buildError(TelpoErrorCode.NFC_READ_FAILED, 'No tag data returned.'));
176
+ return;
177
+ }
178
+ const uid = rawTag.id ? bytesToHex(rawTag.id) : 'UNKNOWN';
179
+ const technology = detectTechnology(rawTag);
180
+ resolve({
181
+ uid,
182
+ technology,
183
+ raw: rawTag
184
+ });
185
+ } catch (e) {
186
+ if (e?.message?.includes('Cancel') || e?.message?.includes('cancel')) {
187
+ reject(buildError(TelpoErrorCode.NFC_SCAN_CANCELLED, 'NFC scan was cancelled.'));
188
+ } else {
189
+ reject(buildError(TelpoErrorCode.NFC_READ_FAILED, 'Failed to read NFC tag', e));
190
+ }
191
+ } finally {
192
+ await NfcManager.cancelTechnologyRequest().catch(() => null);
193
+ }
194
+ });
195
+ let tag;
196
+ if (timeoutMs) {
197
+ tag = await Promise.race([tagPromise, new Promise((_, reject) => {
198
+ timeoutHandle = setTimeout(() => {
199
+ NfcManager.cancelTechnologyRequest().catch(() => null);
200
+ reject(buildError(TelpoErrorCode.NFC_SCAN_CANCELLED, `NFC scan timed out after ${timeoutMs}ms.`));
201
+ }, timeoutMs);
202
+ })]);
203
+ } else {
204
+ tag = await tagPromise;
205
+ }
206
+ return wrapSuccess(tag);
207
+ } catch (e) {
208
+ const err = e;
209
+ if (err.code) return wrapError(err);
210
+ return wrapError(buildError(TelpoErrorCode.NFC_READ_FAILED, 'Unexpected NFC error', e));
211
+ } finally {
212
+ if (timeoutHandle !== null) clearTimeout(timeoutHandle);
213
+ }
214
+ },
215
+ /**
216
+ * Start continuous NFC listening — ideal for a validation gate that
217
+ * must handle many card taps without user interaction.
218
+ *
219
+ * The callback fires every time a card is tapped.
220
+ * Call `stopListening()` to end the session.
221
+ *
222
+ * @example
223
+ * TelpoNfc.startListening((result) => {
224
+ * if (result.success) {
225
+ * console.log('Card UID:', result.data.uid);
226
+ * }
227
+ * }, { technologies: ['NfcA', 'IsoDep'] });
228
+ */
229
+ startListening(onTag, options = {}) {
230
+ if (!_started) {
231
+ // Auto-init in background; errors surface via callback
232
+ TelpoNfc.init().then(initResult => {
233
+ if (!initResult.success) {
234
+ onTag(initResult);
235
+ return;
236
+ }
237
+ _startEventLoop(onTag, options);
238
+ });
239
+ return;
240
+ }
241
+ _startEventLoop(onTag, options);
242
+ },
243
+ /**
244
+ * Stop continuous NFC listening started by `startListening()`.
245
+ */
246
+ async stopListening() {
247
+ _listening = false;
248
+ if (!NfcManager) return;
249
+ NfcManager.setEventListener(NfcEvents.DiscoverTag, null);
250
+ NfcManager.setEventListener(NfcEvents.SessionClosed, null);
251
+ try {
252
+ await NfcManager.unregisterTagEvent();
253
+ } catch {
254
+ // Ignore — may already be unregistered
255
+ }
256
+ },
257
+ /**
258
+ * Whether NFC is supported and enabled on this device.
259
+ * Returns false if not initialised yet.
260
+ */
261
+ async isAvailable() {
262
+ try {
263
+ loadNfcLib();
264
+ const supported = await NfcManager.isSupported();
265
+ if (!supported) return false;
266
+ return await NfcManager.isEnabled();
267
+ } catch {
268
+ return false;
269
+ }
270
+ },
271
+ /** Whether the continuous listener is currently active. */
272
+ isListening() {
273
+ return _listening;
274
+ },
275
+ /** Whether NfcManager has been started. */
276
+ isStarted() {
277
+ return _started;
278
+ }
279
+ };
280
+
281
+ // ── Internal event loop for startListening ───────────────────────────────────
282
+
283
+ function _startEventLoop(onTag, _options) {
284
+ if (_listening) {
285
+ onTag(wrapError(buildError(TelpoErrorCode.NFC_ALREADY_LISTENING, 'NFC listener is already active.')));
286
+ return;
287
+ }
288
+ _listening = true;
289
+ const _handleTag = rawTag => {
290
+ if (!rawTag) {
291
+ onTag(wrapError(buildError(TelpoErrorCode.NFC_READ_FAILED, 'Empty tag received.')));
292
+ return;
293
+ }
294
+ const uid = rawTag.id ? bytesToHex(rawTag.id) : 'UNKNOWN';
295
+ const technology = detectTechnology(rawTag);
296
+ onTag(wrapSuccess({
297
+ uid,
298
+ technology,
299
+ raw: rawTag
300
+ }));
301
+ };
302
+ const _handleClose = () => {
303
+ if (_listening) {
304
+ // Session closed unexpectedly — restart
305
+ NfcManager.registerTagEvent().catch(() => {
306
+ _listening = false;
307
+ });
308
+ }
309
+ };
310
+ NfcManager.setEventListener(NfcEvents.DiscoverTag, _handleTag);
311
+ NfcManager.setEventListener(NfcEvents.SessionClosed, _handleClose);
312
+ NfcManager.registerTagEvent().catch(e => {
313
+ _listening = false;
314
+ onTag(wrapError(buildError(TelpoErrorCode.NFC_READ_FAILED, 'Failed to register NFC tag event', e)));
315
+ });
316
+ }
317
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TelpoErrorCode","NfcManager","NfcTechEnum","NfcEvents","loadNfcLib","lib","require","default","NfcTech","buildError","NFC_NOT_SUPPORTED","code","message","raw","wrapSuccess","data","success","wrapError","error","bytesToHex","bytes","map","b","toString","padStart","toUpperCase","join","mapTech","tech","NfcA","NfcB","IsoDep","MifareClassic","MifareUltralight","Ndef","detectTechnology","tag","techTypes","includes","_started","_listening","TelpoNfc","value","init","e","supported","isSupported","start","enabled","isEnabled","NFC_DISABLED","undefined","readTag","options","timeoutMs","initResult","NFC_ALREADY_LISTENING","techs","technologies","t","filter","Boolean","timeoutHandle","tagPromise","Promise","resolve","reject","requestTechnology","rawTag","getTag","NFC_READ_FAILED","uid","id","technology","NFC_SCAN_CANCELLED","cancelTechnologyRequest","catch","race","_","setTimeout","err","clearTimeout","startListening","onTag","then","_startEventLoop","stopListening","setEventListener","DiscoverTag","SessionClosed","unregisterTagEvent","isAvailable","isListening","isStarted","_options","_handleTag","_handleClose","registerTagEvent"],"sourceRoot":"..\\..\\..\\src","sources":["nfc/index.ts"],"mappings":"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","ignoreList":[]}