react-native-nfc-manager 4.0.0-beta.1 → 4.0.0-beta.10

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 (109) hide show
  1. package/README.md +146 -49
  2. package/android/src/main/java/community/revteltech/nfc/MifareClassicHandler.java +419 -0
  3. package/android/src/main/java/community/revteltech/nfc/MifareUltralightHandler.java +84 -0
  4. package/android/src/main/java/community/revteltech/nfc/NdefHandler.java +373 -0
  5. package/android/src/main/java/community/revteltech/nfc/NfcAdapterStateChangedReceiver.java +48 -0
  6. package/android/src/main/java/community/revteltech/nfc/NfcErrorCodes.java +16 -0
  7. package/android/src/main/java/community/revteltech/nfc/NfcManager.java +348 -1087
  8. package/android/src/main/java/community/revteltech/nfc/NfcManagerIOSStubBase.java +130 -0
  9. package/android/src/main/java/community/revteltech/nfc/NfcTechIoRouter.java +258 -0
  10. package/android/src/main/java/community/revteltech/nfc/TagTechnologyRequest.java +19 -7
  11. package/android/src/main/java/community/revteltech/nfc/Util.java +275 -2
  12. package/app.plugin.js +8 -9
  13. package/dist/ndef-lib/constants.js +67 -0
  14. package/dist/ndef-lib/constants.js.map +1 -0
  15. package/dist/ndef-lib/index.js +79 -0
  16. package/dist/ndef-lib/index.js.map +1 -0
  17. package/dist/ndef-lib/ndef-text.js +29 -0
  18. package/dist/ndef-lib/ndef-text.js.map +1 -0
  19. package/dist/ndef-lib/ndef-uri.js +40 -0
  20. package/dist/ndef-lib/ndef-uri.js.map +1 -0
  21. package/dist/ndef-lib/ndef-wifi-simple.js +100 -0
  22. package/dist/ndef-lib/ndef-wifi-simple.js.map +1 -0
  23. package/dist/ndef-lib/ndef.js +152 -0
  24. package/dist/ndef-lib/ndef.js.map +1 -0
  25. package/dist/ndef-lib/stringifier.js +155 -0
  26. package/dist/ndef-lib/stringifier.js.map +1 -0
  27. package/dist/ndef-lib/util.js +126 -0
  28. package/dist/ndef-lib/util.js.map +1 -0
  29. package/dist/specs/NativeNfcManager.js +5 -0
  30. package/dist/specs/NativeNfcManager.js.map +1 -0
  31. package/dist/src/NativeNfcManager.js +55 -0
  32. package/dist/src/NativeNfcManager.js.map +1 -0
  33. package/dist/src/NfcError.js +220 -0
  34. package/dist/src/NfcError.js.map +1 -0
  35. package/dist/src/NfcManager.js +175 -0
  36. package/dist/src/NfcManager.js.map +1 -0
  37. package/dist/src/NfcManagerAndroid.js +112 -0
  38. package/dist/src/NfcManagerAndroid.js.map +1 -0
  39. package/dist/src/NfcManagerIOS.js +119 -0
  40. package/dist/src/NfcManagerIOS.js.map +1 -0
  41. package/dist/src/NfcTech/Iso15693HandlerIOS.js +99 -0
  42. package/dist/src/NfcTech/Iso15693HandlerIOS.js.map +1 -0
  43. package/dist/src/NfcTech/IsoDepHandler.js +29 -0
  44. package/dist/src/NfcTech/IsoDepHandler.js.map +1 -0
  45. package/dist/src/NfcTech/MifareClassicHandlerAndroid.js +68 -0
  46. package/dist/src/NfcTech/MifareClassicHandlerAndroid.js.map +1 -0
  47. package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js +23 -0
  48. package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js.map +1 -0
  49. package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js +16 -0
  50. package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js.map +1 -0
  51. package/dist/src/NfcTech/NdefHandler.js +54 -0
  52. package/dist/src/NfcTech/NdefHandler.js.map +1 -0
  53. package/dist/src/NfcTech/NfcAHandler.js +16 -0
  54. package/dist/src/NfcTech/NfcAHandler.js.map +1 -0
  55. package/dist/src/NfcTech/NfcVHandler.js +33 -0
  56. package/dist/src/NfcTech/NfcVHandler.js.map +1 -0
  57. package/dist/src/index.js +53 -0
  58. package/dist/src/index.js.map +1 -0
  59. package/index.d.ts +110 -46
  60. package/ios/NfcManager.h +2 -11
  61. package/ios/NfcManager.mm +264 -438
  62. package/ios/RNNfcBridgeUtil.h +28 -0
  63. package/ios/RNNfcBridgeUtil.mm +52 -0
  64. package/ios/RNNfcManager+Felica.swift +61 -0
  65. package/ios/RNNfcManager+Iso15693.swift +895 -0
  66. package/ios/RNNfcManager+IsoDep.swift +145 -0
  67. package/ios/RNNfcManager+Mifare.swift +61 -0
  68. package/ios/RNNfcManager+Ndef.swift +120 -0
  69. package/ios/RNNfcManager.h +251 -0
  70. package/ios/RNNfcManager.swift +648 -0
  71. package/ios/RNNfcSessionDelegateProxy.swift +104 -0
  72. package/ios/RNNfcSwiftUtil.swift +34 -0
  73. package/ndef-lib/{constants.js → constants.ts} +2 -0
  74. package/ndef-lib/{index.js → index.ts} +23 -12
  75. package/ndef-lib/{ndef-text.js → ndef-text.ts} +7 -2
  76. package/ndef-lib/{ndef-uri.js → ndef-uri.ts} +8 -3
  77. package/ndef-lib/{ndef-wifi-simple.js → ndef-wifi-simple.ts} +34 -11
  78. package/ndef-lib/{ndef.js → ndef.ts} +53 -25
  79. package/ndef-lib/{stringifier.js → stringifier.ts} +27 -10
  80. package/ndef-lib/{util.js → util.ts} +13 -8
  81. package/package.json +42 -13
  82. package/react-native-nfc-manager.podspec +3 -2
  83. package/specs/NativeNfcManager.ts +18 -4
  84. package/src/NativeNfcManager.ts +84 -0
  85. package/src/{NfcError.js → NfcError.ts} +6 -17
  86. package/src/{NfcManager.js → NfcManager.ts} +51 -34
  87. package/src/{NfcManagerAndroid.js → NfcManagerAndroid.ts} +27 -8
  88. package/src/{NfcManagerIOS.js → NfcManagerIOS.ts} +31 -10
  89. package/src/NfcTech/{Iso15693HandlerIOS.js → Iso15693HandlerIOS.ts} +64 -36
  90. package/src/NfcTech/{IsoDepHandler.js → IsoDepHandler.ts} +8 -5
  91. package/src/NfcTech/{MifareClassicHandlerAndroid.js → MifareClassicHandlerAndroid.ts} +33 -24
  92. package/src/NfcTech/{MifareUltralightHandlerAndroid.js → MifareUltralightHandlerAndroid.ts} +14 -5
  93. package/src/NfcTech/{NdefFormatableHandlerAndroid.js → NdefFormatableHandlerAndroid.ts} +9 -2
  94. package/src/NfcTech/{NdefHandler.js → NdefHandler.ts} +19 -6
  95. package/src/NfcTech/{NfcAHandler.js → NfcAHandler.ts} +6 -3
  96. package/src/NfcTech/{NfcVHandler.js → NfcVHandler.ts} +8 -5
  97. package/src/__mocks__/{NativeNfcManager.js → NativeNfcManager.ts} +4 -1
  98. package/src/{index.js → index.ts} +1 -1
  99. package/android/src/main/java/community/revteltech/nfc/JsonConvert.java +0 -141
  100. package/android/src/main/java/community/revteltech/nfc/MifareUtil.java +0 -84
  101. package/ios/NfcManager+Felica.mm +0 -43
  102. package/ios/NfcManager+Iso15693.mm +0 -600
  103. package/ios/NfcManager+IsoDep.mm +0 -83
  104. package/ios/NfcManager+Mifare.mm +0 -43
  105. package/ios/Util.mm +0 -55
  106. package/specs/NativeNfcManager.d.ts +0 -6
  107. package/specs/NativeNfcManager.js +0 -3
  108. package/specs/NativeNfcManager.js.map +0 -1
  109. package/src/NativeNfcManager.js +0 -37
@@ -1,16 +1,33 @@
1
1
  package community.revteltech.nfc;
2
2
 
3
+ import android.app.Activity;
4
+ import android.content.pm.PackageManager;
3
5
  import android.nfc.NdefMessage;
4
6
  import android.nfc.NdefRecord;
5
7
  import android.nfc.Tag;
8
+ import android.nfc.tech.IsoDep;
6
9
  import android.nfc.tech.Ndef;
10
+ import android.nfc.tech.NfcA;
11
+ import android.nfc.tech.NfcV;
12
+ import android.os.Build;
7
13
  import android.util.Log;
14
+
15
+ import com.facebook.react.bridge.Arguments;
16
+ import com.facebook.react.bridge.ReadableArray;
17
+ import com.facebook.react.bridge.ReadableMap;
18
+ import com.facebook.react.bridge.ReadableMapKeySetIterator;
19
+ import com.facebook.react.bridge.ReadableType;
20
+ import com.facebook.react.bridge.WritableArray;
21
+ import com.facebook.react.bridge.WritableMap;
22
+
8
23
  import org.json.JSONArray;
9
24
  import org.json.JSONException;
10
25
  import org.json.JSONObject;
11
26
 
27
+ import java.io.File;
12
28
  import java.util.ArrayList;
13
29
  import java.util.Arrays;
30
+ import java.util.Iterator;
14
31
  import java.util.List;
15
32
 
16
33
  public class Util {
@@ -18,6 +35,128 @@ public class Util {
18
35
  static final String TAG = "NfcPlugin";
19
36
  final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
20
37
 
38
+ // region React-JSON Conversion
39
+
40
+ static JSONObject reactToJSON(ReadableMap readableMap) throws JSONException {
41
+ JSONObject jsonObject = new JSONObject();
42
+ ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
43
+ while(iterator.hasNextKey()){
44
+ String key = iterator.nextKey();
45
+ ReadableType valueType = readableMap.getType(key);
46
+ switch (valueType){
47
+ case Null:
48
+ jsonObject.put(key,JSONObject.NULL);
49
+ break;
50
+ case Boolean:
51
+ jsonObject.put(key, readableMap.getBoolean(key));
52
+ break;
53
+ case Number:
54
+ try {
55
+ jsonObject.put(key, readableMap.getInt(key));
56
+ } catch(Exception e) {
57
+ jsonObject.put(key, readableMap.getDouble(key));
58
+ }
59
+ break;
60
+ case String:
61
+ jsonObject.put(key, readableMap.getString(key));
62
+ break;
63
+ case Map:
64
+ jsonObject.put(key, reactToJSON(readableMap.getMap(key)));
65
+ break;
66
+ case Array:
67
+ jsonObject.put(key, reactToJSON(readableMap.getArray(key)));
68
+ break;
69
+ }
70
+ }
71
+
72
+ return jsonObject;
73
+ }
74
+
75
+ static JSONArray reactToJSON(ReadableArray readableArray) throws JSONException {
76
+ JSONArray jsonArray = new JSONArray();
77
+ for(int i=0; i < readableArray.size(); i++) {
78
+ ReadableType valueType = readableArray.getType(i);
79
+ switch (valueType){
80
+ case Null:
81
+ jsonArray.put(JSONObject.NULL);
82
+ break;
83
+ case Boolean:
84
+ jsonArray.put(readableArray.getBoolean(i));
85
+ break;
86
+ case Number:
87
+ try {
88
+ jsonArray.put(readableArray.getInt(i));
89
+ } catch(Exception e) {
90
+ jsonArray.put(readableArray.getDouble(i));
91
+ }
92
+ break;
93
+ case String:
94
+ jsonArray.put(readableArray.getString(i));
95
+ break;
96
+ case Map:
97
+ jsonArray.put(reactToJSON(readableArray.getMap(i)));
98
+ break;
99
+ case Array:
100
+ jsonArray.put(reactToJSON(readableArray.getArray(i)));
101
+ break;
102
+ }
103
+ }
104
+ return jsonArray;
105
+ }
106
+
107
+ static WritableMap jsonToReact(JSONObject jsonObject) throws JSONException {
108
+ WritableMap writableMap = Arguments.createMap();
109
+ Iterator<String> iterator = jsonObject.keys();
110
+ while(iterator.hasNext()) {
111
+ String key = iterator.next();
112
+ Object value = jsonObject.get(key);
113
+ if (value instanceof Float || value instanceof Double) {
114
+ writableMap.putDouble(key, jsonObject.getDouble(key));
115
+ } else if (value instanceof Number) {
116
+ writableMap.putInt(key, jsonObject.getInt(key));
117
+ } else if (value instanceof String) {
118
+ writableMap.putString(key, jsonObject.getString(key));
119
+ } else if (value instanceof JSONObject) {
120
+ writableMap.putMap(key,jsonToReact(jsonObject.getJSONObject(key)));
121
+ } else if (value instanceof JSONArray){
122
+ writableMap.putArray(key, jsonToReact(jsonObject.getJSONArray(key)));
123
+ } else if ("true".equals(value.toString()) || "false".equals(value.toString())){
124
+ writableMap.putBoolean(key, "true".equals(value.toString()));
125
+ } else if (value == JSONObject.NULL){
126
+ writableMap.putNull(key);
127
+ }
128
+ }
129
+
130
+ return writableMap;
131
+ }
132
+
133
+ static WritableArray jsonToReact(JSONArray jsonArray) throws JSONException {
134
+ WritableArray writableArray = Arguments.createArray();
135
+ for(int i=0; i < jsonArray.length(); i++) {
136
+ Object value = jsonArray.get(i);
137
+ if (value instanceof Float || value instanceof Double) {
138
+ writableArray.pushDouble(jsonArray.getDouble(i));
139
+ } else if (value instanceof Number) {
140
+ writableArray.pushInt(jsonArray.getInt(i));
141
+ } else if (value instanceof String) {
142
+ writableArray.pushString(jsonArray.getString(i));
143
+ } else if (value instanceof JSONObject) {
144
+ writableArray.pushMap(jsonToReact(jsonArray.getJSONObject(i)));
145
+ } else if (value instanceof JSONArray){
146
+ writableArray.pushArray(jsonToReact(jsonArray.getJSONArray(i)));
147
+ } else if ("true".equals(value.toString()) || "false".equals(value.toString())){
148
+ writableArray.pushBoolean("true".equals(value.toString()));
149
+ } else if (value == JSONObject.NULL){
150
+ writableArray.pushNull();
151
+ }
152
+ }
153
+ return writableArray;
154
+ }
155
+
156
+ // endregion
157
+
158
+ // region NFC Conversion
159
+
21
160
  static JSONObject ndefToJSON(Ndef ndef) {
22
161
  JSONObject json = new JSONObject();
23
162
 
@@ -27,8 +166,7 @@ public class Util {
27
166
  Tag tag = ndef.getTag();
28
167
  // tag is going to be null for NDEF_FORMATABLE until NfcUtil.parseMessage is refactored
29
168
  if (tag != null) {
30
- json.put("id", bytesToHex(tag.getId()));
31
- json.put("techTypes", new JSONArray(Arrays.asList(tag.getTechList())));
169
+ json = tagToJSON(tag);
32
170
  }
33
171
 
34
172
  json.put("type", translateType(ndef.getType()));
@@ -63,10 +201,89 @@ public class Util {
63
201
  } catch (JSONException e) {
64
202
  Log.e(TAG, "Failed to convert tag into json: " + tag, e);
65
203
  }
204
+
205
+ addCachedTechnologyMetadata(json, tag);
66
206
  }
67
207
  return json;
68
208
  }
69
209
 
210
+ private static void addCachedTechnologyMetadata(JSONObject json, Tag tag) {
211
+ NfcA nfcA = null;
212
+ try {
213
+ nfcA = NfcA.get(tag);
214
+ } catch (RuntimeException e) {
215
+ Log.w(TAG, "Failed to obtain cached NFC-A metadata", e);
216
+ }
217
+ if (nfcA != null) {
218
+ try {
219
+ byte[] atqa = nfcA.getAtqa();
220
+ if (atqa != null) {
221
+ json.put("atqa", byteArrayToJSON(atqa));
222
+ }
223
+ } catch (Exception e) {
224
+ Log.w(TAG, "Failed to read cached NFC-A ATQA", e);
225
+ }
226
+ try {
227
+ json.put("sak", nfcA.getSak() & 0xFFFF);
228
+ } catch (Exception e) {
229
+ Log.w(TAG, "Failed to read cached NFC-A SAK", e);
230
+ }
231
+ }
232
+
233
+ NfcV nfcV = null;
234
+ try {
235
+ nfcV = NfcV.get(tag);
236
+ } catch (RuntimeException e) {
237
+ Log.w(TAG, "Failed to obtain cached NFC-V metadata", e);
238
+ }
239
+ if (nfcV != null) {
240
+ try {
241
+ json.put("dsfid", nfcV.getDsfId() & 0xFF);
242
+ } catch (Exception e) {
243
+ Log.w(TAG, "Failed to read cached NFC-V DSFID", e);
244
+ }
245
+ try {
246
+ json.put("responseFlags", nfcV.getResponseFlags() & 0xFF);
247
+ } catch (Exception e) {
248
+ Log.w(TAG, "Failed to read cached NFC-V response flags", e);
249
+ }
250
+ }
251
+
252
+ IsoDep isoDep = null;
253
+ try {
254
+ isoDep = IsoDep.get(tag);
255
+ } catch (RuntimeException e) {
256
+ Log.w(TAG, "Failed to obtain cached ISO-DEP metadata", e);
257
+ }
258
+ if (isoDep != null) {
259
+ try {
260
+ byte[] historicalBytes = isoDep.getHistoricalBytes();
261
+ if (historicalBytes != null) {
262
+ json.put("historicalBytes", byteArrayToJSON(historicalBytes));
263
+ }
264
+ } catch (Exception e) {
265
+ Log.w(TAG, "Failed to read cached ISO-DEP historical bytes", e);
266
+ }
267
+ try {
268
+ byte[] hiLayerResponse = isoDep.getHiLayerResponse();
269
+ if (hiLayerResponse != null) {
270
+ json.put("hiLayerResponse", byteArrayToJSON(hiLayerResponse));
271
+ }
272
+ } catch (Exception e) {
273
+ Log.w(TAG, "Failed to read cached ISO-DEP higher-layer response", e);
274
+ }
275
+ }
276
+ }
277
+
278
+ static WritableMap tagToReact(Tag tag) {
279
+ try {
280
+ JSONObject json = tagToJSON(tag);
281
+ return jsonToReact(json);
282
+ } catch (JSONException ex) {
283
+ return null;
284
+ }
285
+ }
286
+
70
287
  static String translateType(String type) {
71
288
  String translation;
72
289
  switch (type) {
@@ -139,4 +356,60 @@ public class Util {
139
356
  return json;
140
357
  }
141
358
 
359
+ // endregion
360
+
361
+ // region Device Capability
362
+
363
+ /**
364
+ * Checks if Mifare is supported on a device with some heuristics.
365
+ * Will _try_ to detect if Mifare is supported on a device or not. Please note that it's not fool-proof:
366
+ * on some older devices this can still return true while actual read/write later fails when a tag is scanned.
367
+ *
368
+ * Credits: ikarus23 (https://github.com/ikarus23/MifareClassicTool)
369
+ * @see https://github.com/ikarus23/MifareClassicTool/blob/master/Mifare%20Classic%20Tool/app/src/main/java/de/syss/MifareClassicTool/Common.java#L588
370
+ * @see https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md
371
+ */
372
+ static boolean isDeviceSupported(Activity currentActivity) {
373
+ if (currentActivity == null) {
374
+ return false;
375
+ }
376
+
377
+ if (!currentActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
378
+ return false;
379
+ }
380
+
381
+ boolean foundViaFeatures = currentActivity.getPackageManager().hasSystemFeature("com.nxp.mifare");
382
+ if (!foundViaFeatures) {
383
+ return false;
384
+ }
385
+
386
+ boolean isLenovoP2 = Build.MANUFACTURER.equals("LENOVO")
387
+ && Build.MODEL.equals("Lenovo P2a42");
388
+ File device = new File("/dev/bcm2079x-i2c");
389
+ if (!isLenovoP2 && device.exists()) {
390
+ return false;
391
+ }
392
+
393
+ device = new File("/dev/pn544");
394
+ if (device.exists()) {
395
+ return true;
396
+ }
397
+
398
+ File libsFolder = new File("/system/lib");
399
+ File[] libs = libsFolder.listFiles();
400
+ if (libs != null) {
401
+ for (File lib : libs) {
402
+ if (lib.isFile()
403
+ && lib.getName().startsWith("libnfc")
404
+ && lib.getName().contains("brcm")) {
405
+ return false;
406
+ }
407
+ }
408
+ }
409
+
410
+ return true;
411
+ }
412
+
413
+ // endregion
414
+
142
415
  }
package/app.plugin.js CHANGED
@@ -42,9 +42,9 @@ function addValuesToArray(obj, key, values) {
42
42
  function withIosNfcEntitlement(c, {includeNdefEntitlement}) {
43
43
  return withEntitlementsPlist(c, (config) => {
44
44
  // Add the required formats
45
- let entitlements = ['NDEF', 'TAG']
45
+ let entitlements = ['NDEF', 'TAG'];
46
46
  if (includeNdefEntitlement === false) {
47
- entitlements = ['TAG']
47
+ entitlements = ['TAG'];
48
48
  }
49
49
  config.modResults = addValuesToArray(
50
50
  config.modResults,
@@ -90,18 +90,17 @@ function withNfc(config, props = {}) {
90
90
  config = withIosNfcSelectIdentifiers(config, {selectIdentifiers});
91
91
  config = withIosNfcSystemCodes(config, {systemCodes});
92
92
 
93
- // We start to support Android 12 from v3.11.1, and you will need to update compileSdkVersion to 31,
94
- // otherwise the build will fail:
95
- config = AndroidConfig.Version.withBuildScriptExtMinimumVersion(config, {
96
- name: 'compileSdkVersion',
97
- minVersion: 31,
98
- });
99
-
100
93
  if (nfcPermission !== false) {
101
94
  config = withIosPermission(config, props);
102
95
  config = AndroidConfig.Permissions.withPermissions(config, [
103
96
  'android.permission.NFC',
104
97
  ]);
98
+ } else {
99
+ // The library manifest declares NFC for React Native CLI consumers. Block it
100
+ // explicitly when an Expo consumer opts out so manifest merging removes it.
101
+ config = AndroidConfig.Permissions.withBlockedPermissions(config, [
102
+ 'android.permission.NFC',
103
+ ]);
105
104
  }
106
105
  return config;
107
106
  }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants = {
4
+ TNF_EMPTY: 0x0,
5
+ TNF_WELL_KNOWN: 0x01,
6
+ TNF_MIME_MEDIA: 0x02,
7
+ TNF_ABSOLUTE_URI: 0x03,
8
+ TNF_EXTERNAL_TYPE: 0x04,
9
+ TNF_UNKNOWN: 0x05,
10
+ TNF_UNCHANGED: 0x06,
11
+ TNF_RESERVED: 0x07,
12
+ RTD_TEXT: 'T',
13
+ RTD_URI: 'U',
14
+ RTD_SMART_POSTER: 'Sp',
15
+ RTD_ALTERNATIVE_CARRIER: 'ac',
16
+ RTD_HANDOVER_CARRIER: 'Hc',
17
+ RTD_HANDOVER_REQUEST: 'Hr',
18
+ RTD_HANDOVER_SELECT: 'Hs',
19
+ RTD_BYTES_TEXT: [0x54],
20
+ RTD_BYTES_URI: [0x55],
21
+ RTD_BYTES_SMART_POSTER: [0x53, 0x70],
22
+ RTD_BYTES_ALTERNATIVE_CARRIER: [0x61, 0x63],
23
+ RTD_BYTES_HANDOVER_CARRIER: [0x48, 0x63],
24
+ RTD_BYTES_HANDOVER_REQUEST: [0x48, 0x72],
25
+ RTD_BYTES_HANDOVER_SELECT: [0x48, 0x73],
26
+ MIME_WFA_WSC: 'application/vnd.wfa.wsc',
27
+ RTD_URI_PROTOCOLS: [
28
+ '',
29
+ 'http://www.',
30
+ 'https://www.',
31
+ 'http://',
32
+ 'https://',
33
+ 'tel:',
34
+ 'mailto:',
35
+ 'ftp://anonymous:anonymous@',
36
+ 'ftp://ftp.',
37
+ 'ftps://',
38
+ 'sftp://',
39
+ 'smb://',
40
+ 'nfs://',
41
+ 'ftp://',
42
+ 'dav://',
43
+ 'news:',
44
+ 'telnet://',
45
+ 'imap:',
46
+ 'rtsp://',
47
+ 'urn:',
48
+ 'pop:',
49
+ 'sip:',
50
+ 'sips:',
51
+ 'tftp:',
52
+ 'btspp://',
53
+ 'btl2cap://',
54
+ 'btgoep://',
55
+ 'tcpobex://',
56
+ 'irdaobex://',
57
+ 'file://',
58
+ 'urn:epc:id:',
59
+ 'urn:epc:tag:',
60
+ 'urn:epc:pat:',
61
+ 'urn:epc:raw:',
62
+ 'urn:epc:',
63
+ 'urn:nfc:',
64
+ ],
65
+ };
66
+ module.exports = constants;
67
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../ndef-lib/constants.ts"],"names":[],"mappings":";;AAAA,MAAM,SAAS,GAAG;IAChB,SAAS,EAAE,GAAG;IACd,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,IAAI;IAElB,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,gBAAgB,EAAE,IAAI;IACtB,uBAAuB,EAAE,IAAI;IAC7B,oBAAoB,EAAE,IAAI;IAC1B,oBAAoB,EAAE,IAAI;IAC1B,mBAAmB,EAAE,IAAI;IAEzB,cAAc,EAAE,CAAC,IAAI,CAAC;IACtB,aAAa,EAAE,CAAC,IAAI,CAAC;IACrB,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACpC,6BAA6B,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAC3C,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACxC,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACxC,yBAAyB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAEvC,YAAY,EAAE,yBAAyB;IAEvC,iBAAiB,EAAE;QACjB,EAAE;QACF,aAAa;QACb,cAAc;QACd,SAAS;QACT,UAAU;QACV,MAAM;QACN,SAAS;QACT,4BAA4B;QAC5B,YAAY;QACZ,SAAS;QACT,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,WAAW;QACX,OAAO;QACP,SAAS;QACT,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,UAAU;QACV,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,aAAa;QACb,SAAS;QACT,aAAa;QACb,cAAc;QACd,cAAc;QACd,cAAc;QACd,UAAU;QACV,UAAU;KACX;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ // originally from phonegap-nfc.js by Don Coleman
3
+ // adapted for react-native-nfc-manager by Richie Hsieh
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const { createNdefRecord, encodeNdefMessage, decodeNdefMessage, equalToRecordType, } = require('./ndef');
6
+ const constants = require('./constants');
7
+ const util = require('./util');
8
+ const textHelper = require('./ndef-text');
9
+ const uriHelper = require('./ndef-uri');
10
+ const wifiSimpleHelper = require('./ndef-wifi-simple');
11
+ const stringifier = require('./stringifier');
12
+ const PrimitiveRecord = {
13
+ emptyRecord() {
14
+ return createNdefRecord(constants.TNF_EMPTY, [], [], []);
15
+ },
16
+ absoluteUriRecord(uri, payload = [], id = []) {
17
+ return createNdefRecord(constants.TNF_ABSOLUTE_URI, uri, id, payload);
18
+ },
19
+ mimeMediaRecord(mimeType, payload, id = []) {
20
+ return createNdefRecord(constants.TNF_MIME_MEDIA, mimeType, id, payload);
21
+ },
22
+ externalTypeRecord(externalType, payload, id = []) {
23
+ return createNdefRecord(constants.TNF_EXTERNAL_TYPE, externalType, id, payload);
24
+ },
25
+ };
26
+ const WellKnownRecord = {
27
+ textRecord(text, languageCode, id = []) {
28
+ return createNdefRecord(constants.TNF_WELL_KNOWN, constants.RTD_TEXT, id, textHelper.encodePayload(text, languageCode));
29
+ },
30
+ uriRecord(uri, id = []) {
31
+ return createNdefRecord(constants.TNF_WELL_KNOWN, constants.RTD_URI, id, uriHelper.encodePayload(uri));
32
+ },
33
+ smartPoster(ndefRecords, id = []) {
34
+ let payload = [];
35
+ if (ndefRecords) {
36
+ // make sure we have an array of something like NDEF records before encoding
37
+ if (ndefRecords[0] instanceof Object &&
38
+ ndefRecords[0].hasOwnProperty('tnf')) {
39
+ payload = encodeNdefMessage(ndefRecords);
40
+ }
41
+ else {
42
+ // assume the caller has already encoded the NDEF records into a byte array
43
+ payload = ndefRecords;
44
+ }
45
+ }
46
+ else {
47
+ console.log('WARNING: Expecting an array of NDEF records');
48
+ }
49
+ return createNdefRecord(constants.TNF_WELL_KNOWN, constants.RTD_SMART_POSTER, id, payload);
50
+ },
51
+ };
52
+ const ExtraTypeRecord = {
53
+ androidApplicationRecord(packageName, id = []) {
54
+ return PrimitiveRecord.externalTypeRecord('android.com:pkg', packageName, id);
55
+ },
56
+ wifiSimpleRecord: function (credentials, id = []) {
57
+ let payload = wifiSimpleHelper.encodePayload(credentials);
58
+ return PrimitiveRecord.mimeMediaRecord(constants.MIME_WFA_WSC, payload, id);
59
+ },
60
+ };
61
+ const NDEF = {
62
+ ...constants,
63
+ ...PrimitiveRecord,
64
+ ...WellKnownRecord,
65
+ ...ExtraTypeRecord,
66
+ record: createNdefRecord,
67
+ encodeMessage: encodeNdefMessage,
68
+ decodeMessage: decodeNdefMessage,
69
+ isType: equalToRecordType,
70
+ // individual record type helpers
71
+ text: textHelper,
72
+ uri: uriHelper,
73
+ wifiSimple: wifiSimpleHelper,
74
+ // other helpers
75
+ util,
76
+ stringify: stringifier.stringify,
77
+ };
78
+ module.exports = NDEF;
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ndef-lib/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var util = require('./util');
4
+ // decode text bytes from ndef record payload
5
+ // @returns a string
6
+ function decode(data) {
7
+ var languageCodeLength = data[0] & 0x3f; // 6 LSBs
8
+ // languageCode = data.slice(1, 1 + languageCodeLength),
9
+ // utf16 = (data[0] & 0x80) !== 0; // assuming UTF-16BE
10
+ // TODO need to deal with UTF in the future
11
+ // console.log("lang " + languageCode + (utf16 ? " utf16" : " utf8"));
12
+ return util.bytesToString(data.slice(languageCodeLength + 1));
13
+ }
14
+ // encode text payload
15
+ // @returns an array of bytes
16
+ function encode(text, lang, encoding) {
17
+ // ISO/IANA language code, but we're not enforcing
18
+ if (!lang) {
19
+ lang = 'en';
20
+ }
21
+ var encoded = util.stringToBytes(lang + text);
22
+ encoded.unshift(lang.length);
23
+ return encoded;
24
+ }
25
+ module.exports = {
26
+ encodePayload: encode,
27
+ decodePayload: decode,
28
+ };
29
+ //# sourceMappingURL=ndef-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndef-text.js","sourceRoot":"","sources":["../../ndef-lib/ndef-text.ts"],"names":[],"mappings":";;AAAA,IAAI,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAK7B,6CAA6C;AAC7C,oBAAoB;AACpB,SAAS,MAAM,CAAC,IAAe;IAC7B,IAAI,kBAAkB,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,SAAS;IAClD,wDAAwD;IACxD,uDAAuD;IAEvD,2CAA2C;IAC3C,sEAAsE;IAEtE,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,sBAAsB;AACtB,6BAA6B;AAC7B,SAAS,MAAM,CAAC,IAAY,EAAE,IAAa,EAAE,QAAkB;IAC7D,kDAAkD;IAClD,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,IAAI,CAAC;KACb;IAED,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE7B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,OAAO,GAAG;IACf,aAAa,EAAE,MAAM;IACrB,aAAa,EAAE,MAAM;CACtB,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const util = require('./util');
4
+ const protocols = require('./constants').RTD_URI_PROTOCOLS;
5
+ // decode a URI payload bytes
6
+ // @returns a string
7
+ function decode(data) {
8
+ var prefix = protocols[data[0]];
9
+ if (!prefix) {
10
+ // 36 to 255 should be ""
11
+ prefix = '';
12
+ }
13
+ return prefix + util.bytesToString(data.slice(1));
14
+ }
15
+ // shorten a URI with standard prefix
16
+ // @returns an array of bytes
17
+ function encode(uri) {
18
+ var prefix, protocolCode, encoded;
19
+ // check each protocol, unless we've found a match
20
+ // "urn:" is the one exception where we need to keep checking
21
+ // slice so we don't check ""
22
+ protocols.slice(1).forEach(function (protocol) {
23
+ if ((!prefix || prefix === 'urn:') && uri.indexOf(protocol) === 0) {
24
+ prefix = protocol;
25
+ }
26
+ });
27
+ if (!prefix) {
28
+ prefix = '';
29
+ }
30
+ encoded = util.stringToBytes(uri.slice(prefix.length));
31
+ protocolCode = protocols.indexOf(prefix);
32
+ // prepend protocol code
33
+ encoded.unshift(protocolCode);
34
+ return encoded;
35
+ }
36
+ module.exports = {
37
+ encodePayload: encode,
38
+ decodePayload: decode,
39
+ };
40
+ //# sourceMappingURL=ndef-uri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndef-uri.js","sourceRoot":"","sources":["../../ndef-lib/ndef-uri.ts"],"names":[],"mappings":";;AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC;AAK3D,6BAA6B;AAC7B,oBAAoB;AACpB,SAAS,MAAM,CAAC,IAAe;IAC7B,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE;QACX,yBAAyB;QACzB,MAAM,GAAG,EAAE,CAAC;KACb;IACD,OAAO,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,qCAAqC;AACrC,6BAA6B;AAC7B,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,MAA0B,EAAE,YAAY,EAAE,OAAO,CAAC;IAEtD,kDAAkD;IAClD,6DAA6D;IAC7D,6BAA6B;IAC7B,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ;QAC3C,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACjE,MAAM,GAAG,QAAQ,CAAC;SACnB;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,EAAE,CAAC;KACb;IAED,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,wBAAwB;IACxB,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,OAAO,GAAG;IACf,aAAa,EAAE,MAAM;IACrB,aAAa,EAAE,MAAM;CACtB,CAAC"}