@trustchex/react-native-sdk 1.520.1 → 1.520.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/module/Shared/EIDReader/nfcManagerCardService.js +25 -3
- package/lib/module/Shared/Libs/diagnostics.js +3 -0
- package/lib/module/version.js +1 -1
- package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts +12 -0
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/Shared/EIDReader/nfcManagerCardService.ts +29 -7
- package/src/Shared/Libs/diagnostics.ts +15 -0
- package/src/version.ts +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import NFCManager, { NfcTech } from 'react-native-nfc-manager';
|
|
3
|
+
import NFCManager, { NfcTech, NfcAdapter } from 'react-native-nfc-manager';
|
|
4
4
|
import { CardService } from "./cardService.js";
|
|
5
5
|
import { ResponseAPDU } from "./smartcards/responseAPDU.js";
|
|
6
6
|
import { Platform } from 'react-native';
|
|
7
|
+
import { diagnostics } from "../Libs/diagnostics.js";
|
|
7
8
|
|
|
8
9
|
// iOS CoreNFC "Tag connection lost" (NFCError 100) is a well-known issue whose
|
|
9
10
|
// likelihood scales with the number of APDU round-trips in a session — a large
|
|
@@ -22,14 +23,35 @@ const isTagLostError = e => {
|
|
|
22
23
|
// an empty message is also treated as a lost tag (the observed DG2 failure).
|
|
23
24
|
return msg === '' || msg.includes('lost') || msg.includes('not connected') || msg.includes('tag was') || msg.includes('session') || msg.includes('invalidated') || msg.includes('timeout') || msg.includes('100');
|
|
24
25
|
};
|
|
26
|
+
const NFC_TECHS = [NfcTech.IsoDep, NfcTech.NfcA, NfcTech.NfcB];
|
|
25
27
|
export class NFCManagerCardService extends CardService {
|
|
26
28
|
isOpened = false;
|
|
27
29
|
async open() {
|
|
28
30
|
await NFCManager.start();
|
|
29
|
-
|
|
30
|
-
//
|
|
31
|
+
// Explicitly enable Android's NfcAdapter.enableReaderMode() polling path.
|
|
32
|
+
// Without isReaderModeEnabled, requestTechnology() falls back to the
|
|
33
|
+
// legacy enableForegroundDispatch()/ACTION_TECH_DISCOVERED intent path,
|
|
34
|
+
// which several OEM NFC stacks (observed: OPPO/ColorOS) fail to deliver
|
|
35
|
+
// reliably for non-NDEF, IsoDep-only tags like eID/ePassport chips —
|
|
36
|
+
// chipDetected never fires, with no error (looks like the chip was never
|
|
37
|
+
// presented). FLAG_READER_SKIP_NDEF_CHECK avoids a slow NDEF probe delaying
|
|
38
|
+
// IsoDep connect on chips with no NDEF message.
|
|
31
39
|
if (Platform.OS === 'android') {
|
|
40
|
+
const readerModeOptions = {
|
|
41
|
+
isReaderModeEnabled: true,
|
|
42
|
+
readerModeFlags: NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_NFC_B | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
|
|
43
|
+
};
|
|
44
|
+
// Record AFTER requestTechnology resolves: it only means reader mode
|
|
45
|
+
// was successfully engaged if the call didn't throw. Recording it
|
|
46
|
+
// beforehand would mark a request that failed to even start (e.g.
|
|
47
|
+
// reader mode rejected by the OEM stack) as 'readerMode', defeating the
|
|
48
|
+
// point of this field for exactly the failure case it exists to catch.
|
|
49
|
+
await NFCManager.requestTechnology(NFC_TECHS, readerModeOptions);
|
|
50
|
+
diagnostics.nfcSetDiscoveryMode('readerMode');
|
|
51
|
+
// Increase transceive timeout for slow curves (e.g. brainpoolP512r1 ECDH on passport chip)
|
|
32
52
|
await NFCManager.setTimeout(10000);
|
|
53
|
+
} else {
|
|
54
|
+
await NFCManager.requestTechnology(NFC_TECHS);
|
|
33
55
|
}
|
|
34
56
|
this.isOpened = true;
|
|
35
57
|
}
|
|
@@ -191,6 +191,9 @@ export class DiagnosticsCollector {
|
|
|
191
191
|
nfcChipDetected() {
|
|
192
192
|
this.nfc.chipDetected = true;
|
|
193
193
|
}
|
|
194
|
+
nfcSetDiscoveryMode(mode) {
|
|
195
|
+
this.nfc.discoveryMode = mode;
|
|
196
|
+
}
|
|
194
197
|
nfcSetAuth(protocol, oid) {
|
|
195
198
|
this.nfc.authProtocol = protocol;
|
|
196
199
|
if (oid) this.nfc.paceOid = oid;
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAoCzD,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAS;IACZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B,SAAS,IAAI,OAAO;IAQ3B,OAAO,CAAC,qBAAqB,CAAS;IAE/B,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwC/D,MAAM,IAAI,UAAU;IAIpB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKjD;sDACkD;IAC3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIzC;2DACuD;IAC1C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC"}
|
|
@@ -32,6 +32,17 @@ export interface NfcStep {
|
|
|
32
32
|
export interface NfcDiagnostics {
|
|
33
33
|
attempted: boolean;
|
|
34
34
|
chipDetected: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Android tag-discovery mechanism requested for this attempt:
|
|
37
|
+
* 'readerMode' (NfcAdapter.enableReaderMode — the polling path we now force)
|
|
38
|
+
* or 'foregroundDispatch' (legacy ACTION_TECH_DISCOVERED intent path, known
|
|
39
|
+
* to be unreliable on some OEM NFC stacks for non-NDEF IsoDep-only tags).
|
|
40
|
+
* Undefined on iOS, where discovery goes through CoreNFC instead.
|
|
41
|
+
* Recorded so a `chipDetected: false` report can distinguish "the modern
|
|
42
|
+
* polling path still didn't see a chip" (device/positioning issue) from
|
|
43
|
+
* "we were silently on the legacy path" (a config regression).
|
|
44
|
+
*/
|
|
45
|
+
discoveryMode?: 'readerMode' | 'foregroundDispatch';
|
|
35
46
|
/** 'PACE' | 'BAC' | 'none' */
|
|
36
47
|
authProtocol: 'PACE' | 'BAC' | 'none';
|
|
37
48
|
paceFellBackToBac: boolean;
|
|
@@ -177,6 +188,7 @@ export declare class DiagnosticsCollector {
|
|
|
177
188
|
setMrz(m: Partial<MrzDiagnostics>): void;
|
|
178
189
|
nfcAttemptStarted(): void;
|
|
179
190
|
nfcChipDetected(): void;
|
|
191
|
+
nfcSetDiscoveryMode(mode: 'readerMode' | 'foregroundDispatch'): void;
|
|
180
192
|
nfcSetAuth(protocol: 'PACE' | 'BAC' | 'none', oid?: string): void;
|
|
181
193
|
nfcPaceFellBackToBac(reason?: string): void;
|
|
182
194
|
/** Record one completed step. Keep messages short and free of PII. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "1.520.
|
|
1
|
+
export declare const SDK_VERSION = "1.520.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import NFCManager, { NfcTech } from 'react-native-nfc-manager';
|
|
1
|
+
import NFCManager, { NfcTech, NfcAdapter } from 'react-native-nfc-manager';
|
|
2
2
|
import { CardService } from './cardService';
|
|
3
3
|
import { CommandAPDU } from './smartcards/commandAPDU';
|
|
4
4
|
import { ResponseAPDU } from './smartcards/responseAPDU';
|
|
5
5
|
import { Platform } from 'react-native';
|
|
6
|
+
import { diagnostics } from '../Libs/diagnostics';
|
|
6
7
|
|
|
7
8
|
// iOS CoreNFC "Tag connection lost" (NFCError 100) is a well-known issue whose
|
|
8
9
|
// likelihood scales with the number of APDU round-trips in a session — a large
|
|
@@ -34,18 +35,39 @@ const isTagLostError = (e: unknown): boolean => {
|
|
|
34
35
|
);
|
|
35
36
|
};
|
|
36
37
|
|
|
38
|
+
const NFC_TECHS = [NfcTech.IsoDep, NfcTech.NfcA, NfcTech.NfcB];
|
|
39
|
+
|
|
37
40
|
export class NFCManagerCardService extends CardService {
|
|
38
41
|
private isOpened = false;
|
|
39
42
|
public async open(): Promise<void> {
|
|
40
43
|
await NFCManager.start();
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
//
|
|
44
|
+
// Explicitly enable Android's NfcAdapter.enableReaderMode() polling path.
|
|
45
|
+
// Without isReaderModeEnabled, requestTechnology() falls back to the
|
|
46
|
+
// legacy enableForegroundDispatch()/ACTION_TECH_DISCOVERED intent path,
|
|
47
|
+
// which several OEM NFC stacks (observed: OPPO/ColorOS) fail to deliver
|
|
48
|
+
// reliably for non-NDEF, IsoDep-only tags like eID/ePassport chips —
|
|
49
|
+
// chipDetected never fires, with no error (looks like the chip was never
|
|
50
|
+
// presented). FLAG_READER_SKIP_NDEF_CHECK avoids a slow NDEF probe delaying
|
|
51
|
+
// IsoDep connect on chips with no NDEF message.
|
|
47
52
|
if (Platform.OS === 'android') {
|
|
53
|
+
const readerModeOptions = {
|
|
54
|
+
isReaderModeEnabled: true,
|
|
55
|
+
readerModeFlags:
|
|
56
|
+
NfcAdapter.FLAG_READER_NFC_A |
|
|
57
|
+
NfcAdapter.FLAG_READER_NFC_B |
|
|
58
|
+
NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
|
|
59
|
+
};
|
|
60
|
+
// Record AFTER requestTechnology resolves: it only means reader mode
|
|
61
|
+
// was successfully engaged if the call didn't throw. Recording it
|
|
62
|
+
// beforehand would mark a request that failed to even start (e.g.
|
|
63
|
+
// reader mode rejected by the OEM stack) as 'readerMode', defeating the
|
|
64
|
+
// point of this field for exactly the failure case it exists to catch.
|
|
65
|
+
await NFCManager.requestTechnology(NFC_TECHS, readerModeOptions);
|
|
66
|
+
diagnostics.nfcSetDiscoveryMode('readerMode');
|
|
67
|
+
// Increase transceive timeout for slow curves (e.g. brainpoolP512r1 ECDH on passport chip)
|
|
48
68
|
await NFCManager.setTimeout(10000);
|
|
69
|
+
} else {
|
|
70
|
+
await NFCManager.requestTechnology(NFC_TECHS);
|
|
49
71
|
}
|
|
50
72
|
this.isOpened = true;
|
|
51
73
|
}
|
|
@@ -34,6 +34,17 @@ export interface NfcStep {
|
|
|
34
34
|
export interface NfcDiagnostics {
|
|
35
35
|
attempted: boolean;
|
|
36
36
|
chipDetected: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Android tag-discovery mechanism requested for this attempt:
|
|
39
|
+
* 'readerMode' (NfcAdapter.enableReaderMode — the polling path we now force)
|
|
40
|
+
* or 'foregroundDispatch' (legacy ACTION_TECH_DISCOVERED intent path, known
|
|
41
|
+
* to be unreliable on some OEM NFC stacks for non-NDEF IsoDep-only tags).
|
|
42
|
+
* Undefined on iOS, where discovery goes through CoreNFC instead.
|
|
43
|
+
* Recorded so a `chipDetected: false` report can distinguish "the modern
|
|
44
|
+
* polling path still didn't see a chip" (device/positioning issue) from
|
|
45
|
+
* "we were silently on the legacy path" (a config regression).
|
|
46
|
+
*/
|
|
47
|
+
discoveryMode?: 'readerMode' | 'foregroundDispatch';
|
|
37
48
|
/** 'PACE' | 'BAC' | 'none' */
|
|
38
49
|
authProtocol: 'PACE' | 'BAC' | 'none';
|
|
39
50
|
paceFellBackToBac: boolean;
|
|
@@ -297,6 +308,10 @@ export class DiagnosticsCollector {
|
|
|
297
308
|
this.nfc.chipDetected = true;
|
|
298
309
|
}
|
|
299
310
|
|
|
311
|
+
nfcSetDiscoveryMode(mode: 'readerMode' | 'foregroundDispatch'): void {
|
|
312
|
+
this.nfc.discoveryMode = mode;
|
|
313
|
+
}
|
|
314
|
+
|
|
300
315
|
nfcSetAuth(protocol: 'PACE' | 'BAC' | 'none', oid?: string): void {
|
|
301
316
|
this.nfc.authProtocol = protocol;
|
|
302
317
|
if (oid) this.nfc.paceOid = oid;
|
package/src/version.ts
CHANGED