@iotize/device-com-nfc.cordova 3.8.1 → 3.9.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 (74) hide show
  1. package/LICENSE +30 -30
  2. package/README.md +673 -673
  3. package/bundles/iotize-device-com-nfc.cordova.umd.js +1108 -967
  4. package/bundles/iotize-device-com-nfc.cordova.umd.js.map +1 -1
  5. package/bundles/iotize-device-com-nfc.cordova.umd.min.js +1 -1
  6. package/bundles/iotize-device-com-nfc.cordova.umd.min.js.map +1 -1
  7. package/esm2015/iotize-device-com-nfc.cordova.js +4 -4
  8. package/esm2015/iotize-device-com-nfc.cordova.ngsummary.json +1 -1
  9. package/esm2015/public_api.js +1 -1
  10. package/esm2015/public_api.ngsummary.json +1 -1
  11. package/esm2015/www/cordova-interface.js +1 -1
  12. package/esm2015/www/cordova-interface.js.map +1 -1
  13. package/esm2015/www/errors.js +30 -30
  14. package/esm2015/www/errors.js.map +1 -1
  15. package/esm2015/www/index.js +6 -6
  16. package/esm2015/www/index.js.map +1 -1
  17. package/esm2015/www/index.metadata.json +1 -1
  18. package/esm2015/www/index.ngsummary.json +1 -1
  19. package/esm2015/www/logger.js +2 -2
  20. package/esm2015/www/logger.js.map +1 -1
  21. package/esm2015/www/ndef/definitions.js +16 -16
  22. package/esm2015/www/ndef/definitions.js.map +1 -1
  23. package/esm2015/www/ndef/parse-ndef-message.js +293 -164
  24. package/esm2015/www/ndef/parse-ndef-message.js.map +1 -1
  25. package/esm2015/www/ndef/parse-ndef-message.metadata.json +1 -1
  26. package/esm2015/www/ndef/parse-ndef-message.ngsummary.json +1 -1
  27. package/esm2015/www/nfc-com-protocol.js +169 -169
  28. package/esm2015/www/nfc-com-protocol.js.map +1 -1
  29. package/esm2015/www/tap-ndef/definitions.js +1 -1
  30. package/esm2015/www/tap-ndef/definitions.js.map +1 -1
  31. package/esm2015/www/tap-ndef/index.js +2 -2
  32. package/esm2015/www/tap-ndef/index.js.map +1 -1
  33. package/esm2015/www/tap-ndef/parse-ndef-message.js +51 -51
  34. package/esm2015/www/tap-ndef/parse-ndef-message.js.map +1 -1
  35. package/esm2015/www/utility.js +10 -10
  36. package/esm2015/www/utility.js.map +1 -1
  37. package/esm2015/www/utility.ngsummary.json +1 -1
  38. package/fesm2015/iotize-device-com-nfc.cordova.js +555 -427
  39. package/fesm2015/iotize-device-com-nfc.cordova.js.map +1 -1
  40. package/iotize-device-com-nfc.cordova.d.ts +4 -4
  41. package/iotize-device-com-nfc.cordova.metadata.json +1 -1
  42. package/package.json +2 -2
  43. package/plugin.xml +98 -98
  44. package/public_api.d.ts +1 -1
  45. package/src/android/.gradle/4.10.1/fileChanges/last-build.bin +0 -0
  46. package/src/android/.gradle/4.10.1/fileHashes/fileHashes.bin +0 -0
  47. package/src/android/.gradle/4.10.1/fileHashes/fileHashes.lock +0 -0
  48. package/src/android/.gradle/4.10.1/gc.properties +0 -0
  49. package/src/android/build.gradle +38 -38
  50. package/src/android/gradle/wrapper/gradle-wrapper.properties +6 -6
  51. package/src/android/gradlew +172 -172
  52. package/src/android/gradlew.bat +84 -84
  53. package/src/android/local.properties +8 -8
  54. package/src/android/src/com/chariotsolutions/nfc/plugin/JSONBuilder.java +60 -60
  55. package/src/android/src/com/chariotsolutions/nfc/plugin/NfcPlugin.java +1151 -1151
  56. package/src/android/src/com/chariotsolutions/nfc/plugin/NfcPluginError.java +15 -15
  57. package/src/android/src/com/chariotsolutions/nfc/plugin/PluginResponse.java +85 -85
  58. package/src/android/src/com/chariotsolutions/nfc/plugin/Util.java +140 -140
  59. package/src/ios/AppDelegate+NFC.swift +51 -51
  60. package/src/ios/NFCHelpers.swift +144 -144
  61. package/src/ios/NFCNDEFDelegate.swift +78 -78
  62. package/src/ios/NFCTagReader.swift +506 -506
  63. package/www/cordova-interface.d.ts +34 -34
  64. package/www/errors.d.ts +17 -17
  65. package/www/index.d.ts +6 -6
  66. package/www/logger.d.ts +2 -2
  67. package/www/ndef/definitions.d.ts +15 -15
  68. package/www/ndef/parse-ndef-message.d.ts +12 -69
  69. package/www/nfc-com-protocol.d.ts +36 -36
  70. package/www/phonegap-nfc.js +911 -911
  71. package/www/tap-ndef/definitions.d.ts +25 -25
  72. package/www/tap-ndef/index.d.ts +2 -2
  73. package/www/tap-ndef/parse-ndef-message.d.ts +6 -6
  74. package/www/utility.d.ts +2 -2
@@ -1,165 +1,294 @@
1
- import { Buffer } from 'buffer';
2
- import { arrayEquals, toAsciiString } from '../utility';
3
- import { TNF, WellKnownType } from './definitions';
4
- export function parseNdefMessages(messages) {
5
- return (messages || []).map(parseNdefMessage);
6
- }
7
- export function parseNdefMessage(message) {
8
- switch (message.tnf) {
9
- case TNF.ABSOLUTE_URI:
10
- return {
11
- tnf: 'uri',
12
- value: toAsciiString(message.payload),
13
- };
14
- case TNF.WELL_KNOWN_TYPE:
15
- return {
16
- tnf: 'wkt',
17
- value: parseWellKnownType(message),
18
- };
19
- case TNF.EMPTY:
20
- return {
21
- tnf: 'empty',
22
- value: {
23
- type: message.type,
24
- payload: message.payload,
25
- },
26
- };
27
- case TNF.EXTERNAL:
28
- return {
29
- tnf: 'external',
30
- value: paseExternalType(message),
31
- };
32
- case TNF.MIME_TYPE:
33
- return {
34
- tnf: 'mimetype',
35
- value: parseMimeType(message),
36
- };
37
- case TNF.RFU:
38
- return {
39
- tnf: 'rfu',
40
- value: {
41
- type: message.type,
42
- payload: message.payload,
43
- },
44
- };
45
- case TNF.UNCHANGED:
46
- return {
47
- tnf: 'unchanged',
48
- value: {
49
- type: message.type,
50
- payload: message.payload,
51
- },
52
- };
53
- case TNF.UNKNOWN:
54
- return {
55
- tnf: 'unknown',
56
- value: {
57
- type: message.type,
58
- payload: message.payload,
59
- },
60
- };
61
- default:
62
- return {
63
- tnf: message.tnf,
64
- value: {
65
- type: message.type,
66
- payload: message.payload,
67
- },
68
- };
69
- }
70
- }
71
- function parseWellKnownType(message) {
72
- if (arrayEquals(message.type, WellKnownType.URI)) {
73
- const prefixCode = message.payload[0];
74
- let prefix = WELL_KNOWN_TYPE_URI_PREFIX[prefixCode] || '';
75
- return {
76
- type: 'uri',
77
- value: prefix + toAsciiString(message.payload.slice(1)),
78
- };
79
- }
80
- else if (arrayEquals(message.type, WellKnownType.TEXT)) {
81
- const encodingNumber = message.payload[0];
82
- let encoding = 'utf8';
83
- let languageSizeInBytes = 0;
84
- if (typeof encodingNumber === 'number') {
85
- // b0: encodage utf8 s’il vaut 0 et utf16 s’il vaut 1.
86
- // b1: RFU (set to 0)
87
- // b2-b7: la taille en octets de la langue (n)
88
- // B8-B8+n-1: language
89
- // Bn: message
90
- const b0 = encodingNumber & 0b10000000;
91
- encoding = b0 ? 'utf16le' : 'utf8';
92
- languageSizeInBytes = encodingNumber & 0b00111111;
93
- }
94
- const text = message.payload.slice(languageSizeInBytes + 1);
95
- return {
96
- type: 'text',
97
- value: Buffer.from(text).toString(encoding),
98
- };
99
- }
100
- // else if (arrayEquals(message.type, WellKnownType.SMPART_POSTER)) {
101
- // return {
102
- // type: 'sp',
103
- // // TODO implement
104
- // payload: message.payload,
105
- // };
106
- // }
107
- else {
108
- return {
109
- type: 'unknown',
110
- value: {
111
- type: message.type,
112
- payload: message.payload,
113
- },
114
- };
115
- }
116
- }
117
- function paseExternalType(message) {
118
- const value = Buffer.from(message.payload).toString('utf8');
119
- const domain = Buffer.from(message.type).toString('utf8');
120
- return {
121
- domain,
122
- value,
123
- };
124
- }
125
- const WELL_KNOWN_TYPE_URI_PREFIX = {
126
- 0x0: '',
127
- 0x1: 'http://www.',
128
- 0x2: 'http://www.',
129
- 0x3: 'http://',
130
- 0x4: 'https://',
131
- 0x5: 'tel:',
132
- 0x6: 'mailto:',
133
- 0x07: 'ftp://anonymous:anonymous@',
134
- 0x1d: 'file://',
135
- 0x08: 'ftp://ftp.',
136
- 0x09: 'ftps://',
137
- 0x0a: 'sftp://',
138
- 0x0b: 'smb://',
139
- 0x0c: 'nfs://',
140
- 0x0d: 'ftp://',
141
- 0x0e: 'dav://',
142
- 0x0f: 'news:',
143
- 0x10: 'telnet://',
144
- 0x11: 'imap:',
145
- 0x12: 'rtsp://',
146
- 0x13: 'urn:',
147
- 0x14: 'pop:',
148
- 0x15: 'sip:',
149
- 0x16: 'sips:',
150
- 0x17: 'tftp:',
151
- 0x18: 'btspp://',
152
- 0x19: 'btl2cap://',
153
- 0x1a: 'btgoep://',
154
- 0x1b: 'tcpobex://',
155
- 0x1c: 'irdaobex://',
156
- 0x1e: 'urn:epc:id:',
157
- 0x1f: 'urn:epc:tag:',
158
- 0x20: 'urn:epc:pat:',
159
- 0x21: 'urn:epc:raw:',
160
- 0x22: 'urn:epc:',
161
- };
162
- function parseMimeType(message) {
163
- return Buffer.from(message.payload).toString('utf8');
164
- }
1
+ import { Buffer } from 'buffer';
2
+ import { arrayEquals, toAsciiString } from '../utility';
3
+ import { TNF, WellKnownType } from './definitions';
4
+ import { asciiStringToByteBuffer } from '@iotize/common/byte-converter';
5
+ export function parseNdefMessages(messages) {
6
+ return (messages || []).map(parseNdefMessage);
7
+ }
8
+ export function parseNdefMessage(message) {
9
+ switch (message.tnf) {
10
+ case TNF.ABSOLUTE_URI:
11
+ return {
12
+ id: message.id,
13
+ type: message.type,
14
+ tnf: 'uri',
15
+ value: toAsciiString(message.payload),
16
+ };
17
+ case TNF.WELL_KNOWN_TYPE:
18
+ return {
19
+ id: message.id,
20
+ type: message.type,
21
+ tnf: 'wkt',
22
+ value: parseWellKnownType(message),
23
+ };
24
+ case TNF.EMPTY:
25
+ return {
26
+ id: message.id,
27
+ type: message.type,
28
+ tnf: 'empty',
29
+ value: {
30
+ type: message.type,
31
+ payload: message.payload,
32
+ },
33
+ };
34
+ case TNF.EXTERNAL:
35
+ return {
36
+ id: message.id,
37
+ type: message.type,
38
+ tnf: 'external',
39
+ value: paseExternalType(message),
40
+ };
41
+ case TNF.MIME_TYPE:
42
+ return {
43
+ id: message.id,
44
+ type: message.type,
45
+ tnf: 'mimetype',
46
+ value: parseMimeType(message),
47
+ };
48
+ case TNF.RFU:
49
+ return {
50
+ id: message.id,
51
+ type: message.type,
52
+ tnf: 'rfu',
53
+ value: {
54
+ type: message.type,
55
+ payload: message.payload,
56
+ },
57
+ };
58
+ case TNF.UNCHANGED:
59
+ return {
60
+ id: message.id,
61
+ type: message.type,
62
+ tnf: 'unchanged',
63
+ value: {
64
+ type: message.type,
65
+ payload: message.payload,
66
+ },
67
+ };
68
+ case TNF.UNKNOWN:
69
+ return {
70
+ id: message.id,
71
+ type: message.type,
72
+ tnf: 'unknown',
73
+ value: {
74
+ type: message.type,
75
+ payload: message.payload,
76
+ },
77
+ };
78
+ default:
79
+ return {
80
+ id: message.id,
81
+ type: message.type,
82
+ tnf: message.tnf,
83
+ value: {
84
+ type: message.type,
85
+ payload: message.payload,
86
+ },
87
+ };
88
+ }
89
+ }
90
+ function parseWellKnownType(message) {
91
+ if (arrayEquals(message.type.slice(), WellKnownType.URI)) {
92
+ const prefixCode = message.payload[0];
93
+ let prefix = WELL_KNOWN_TYPE_URI_PREFIX[prefixCode] || '';
94
+ return {
95
+ type: 'uri',
96
+ value: prefix + toAsciiString(message.payload.slice(1)),
97
+ };
98
+ }
99
+ else if (arrayEquals(message.type.slice(), WellKnownType.TEXT)) {
100
+ const encodingNumber = message.payload[0];
101
+ let encoding = 'utf8';
102
+ let languageSizeInBytes = 0;
103
+ if (typeof encodingNumber === 'number') {
104
+ // b0: encodage utf8 s’il vaut 0 et utf16 s’il vaut 1.
105
+ // b1: RFU (set to 0)
106
+ // b2-b7: la taille en octets de la langue (n)
107
+ // B8-B8+n-1: language
108
+ // Bn: message
109
+ const b0 = encodingNumber & 0b10000000;
110
+ encoding = b0 ? 'utf16le' : 'utf8';
111
+ languageSizeInBytes = encodingNumber & 0b00111111;
112
+ }
113
+ const text = message.payload.slice(languageSizeInBytes + 1);
114
+ const language = message.payload.slice(8, languageSizeInBytes + 1);
115
+ return {
116
+ type: 'text',
117
+ value: Buffer.from(text).toString(encoding),
118
+ encoding,
119
+ language: Buffer.from(language).toString(encoding)
120
+ };
121
+ }
122
+ // else if (arrayEquals(message.type.slice(), WellKnownType.SMPART_POSTER)) {
123
+ // return {
124
+ // type: 'sp',
125
+ // // TODO implement
126
+ // payload: message.payload,
127
+ // };
128
+ // }
129
+ else {
130
+ return {
131
+ type: 'unknown',
132
+ value: {
133
+ type: message.type.slice(),
134
+ payload: message.payload,
135
+ },
136
+ };
137
+ }
138
+ }
139
+ function paseExternalType(message) {
140
+ const value = Buffer.from(message.payload).toString('utf8');
141
+ const domain = Buffer.from(message.type).toString('utf8');
142
+ return {
143
+ domain,
144
+ value,
145
+ };
146
+ }
147
+ const WELL_KNOWN_TYPE_URI_PREFIX = {
148
+ 0x0: '',
149
+ 0x1: 'http://www.',
150
+ 0x2: 'http://www.',
151
+ 0x3: 'http://',
152
+ 0x4: 'https://',
153
+ 0x5: 'tel:',
154
+ 0x6: 'mailto:',
155
+ 0x07: 'ftp://anonymous:anonymous@',
156
+ 0x1d: 'file://',
157
+ 0x08: 'ftp://ftp.',
158
+ 0x09: 'ftps://',
159
+ 0x0a: 'sftp://',
160
+ 0x0b: 'smb://',
161
+ 0x0c: 'nfs://',
162
+ 0x0d: 'ftp://',
163
+ 0x0e: 'dav://',
164
+ 0x0f: 'news:',
165
+ 0x10: 'telnet://',
166
+ 0x11: 'imap:',
167
+ 0x12: 'rtsp://',
168
+ 0x13: 'urn:',
169
+ 0x14: 'pop:',
170
+ 0x15: 'sip:',
171
+ 0x16: 'sips:',
172
+ 0x17: 'tftp:',
173
+ 0x18: 'btspp://',
174
+ 0x19: 'btl2cap://',
175
+ 0x1a: 'btgoep://',
176
+ 0x1b: 'tcpobex://',
177
+ 0x1c: 'irdaobex://',
178
+ 0x1e: 'urn:epc:id:',
179
+ 0x1f: 'urn:epc:tag:',
180
+ 0x20: 'urn:epc:pat:',
181
+ 0x21: 'urn:epc:raw:',
182
+ 0x22: 'urn:epc:',
183
+ };
184
+ function parseMimeType(message) {
185
+ return Buffer.from(message.payload).toString('utf8');
186
+ }
187
+ function encodeWellKnownType(message) {
188
+ if (message.value.type == 'uri') {
189
+ //identify the prefix
190
+ const prefixesEntries = Object.entries(WELL_KNOWN_TYPE_URI_PREFIX);
191
+ let prefixByte = 0;
192
+ for (const [id, prefix] of prefixesEntries) {
193
+ if (id == '0x0') // Skip first as it is always recognized. (what about 0x1 vs 0x2?)
194
+ continue;
195
+ if (message.value.value.startsWith(prefix)) {
196
+ prefixByte = parseInt(id, 16);
197
+ break;
198
+ }
199
+ }
200
+ const lengthToSlice = WELL_KNOWN_TYPE_URI_PREFIX[prefixByte].length;
201
+ const slicedString = message.value.value.slice(lengthToSlice);
202
+ return [prefixByte, ...(asciiStringToByteBuffer(slicedString))];
203
+ }
204
+ else if (message.value.type === 'text') {
205
+ // b1: RFU (set to 0)
206
+ // b2-b7: la taille en octets de la langue (n)
207
+ // B8-B8+n-1: language
208
+ // Bn: message
209
+ let firstByte = message.value.encoding == 'utf16le' ? 0b10000000 : 0;
210
+ firstByte &= (message.value.language & 0b00111111);
211
+ const languageBytes = Buffer.from(message.value.language, message.value.encoding);
212
+ const textBytes = Buffer.from(message.value.value, message.value.encoding);
213
+ return [firstByte, ...languageBytes, ...textBytes];
214
+ }
215
+ else
216
+ return [...message.value.type, ...message.value.payload];
217
+ }
218
+ function encodeExternalType(message) {
219
+ return Array.from(Buffer.from(message.value.value, 'utf8'));
220
+ }
221
+ function encodeMimeType(message) {
222
+ return Array.from(Buffer.from(message.value, 'utf8'));
223
+ }
224
+ export function encodeNDEFMessages(ndefRecords) {
225
+ return (ndefRecords || []).map(encodeNDEFMessage);
226
+ }
227
+ export function encodeNDEFMessage(ndefRecord) {
228
+ switch (ndefRecord.tnf) {
229
+ case 'uri':
230
+ return {
231
+ id: ndefRecord.id,
232
+ type: ndefRecord.type,
233
+ tnf: TNF.ABSOLUTE_URI,
234
+ payload: Array.from(asciiStringToByteBuffer(ndefRecord.value))
235
+ };
236
+ case 'wkt':
237
+ return {
238
+ id: ndefRecord.id,
239
+ type: ndefRecord.type,
240
+ tnf: TNF.WELL_KNOWN_TYPE,
241
+ payload: encodeWellKnownType(ndefRecord),
242
+ };
243
+ case 'empty':
244
+ return {
245
+ id: ndefRecord.id,
246
+ type: ndefRecord.type,
247
+ tnf: TNF.EMPTY,
248
+ payload: ndefRecord.payload,
249
+ };
250
+ case 'external':
251
+ return {
252
+ id: ndefRecord.id,
253
+ type: ndefRecord.type,
254
+ tnf: TNF.EXTERNAL,
255
+ payload: encodeExternalType(ndefRecord),
256
+ };
257
+ case 'mimetype':
258
+ return {
259
+ id: ndefRecord.id,
260
+ type: ndefRecord.type,
261
+ tnf: TNF.MIME_TYPE,
262
+ payload: encodeMimeType(ndefRecord),
263
+ };
264
+ case 'rfu':
265
+ return {
266
+ id: ndefRecord.id,
267
+ type: ndefRecord.type,
268
+ tnf: TNF.RFU,
269
+ payload: ndefRecord.payload
270
+ };
271
+ case 'unchanged':
272
+ return {
273
+ id: ndefRecord.id,
274
+ type: ndefRecord.type,
275
+ tnf: TNF.UNCHANGED,
276
+ payload: ndefRecord.payload,
277
+ };
278
+ case 'unknown':
279
+ return {
280
+ id: ndefRecord.id,
281
+ type: ndefRecord.type,
282
+ tnf: TNF.UNKNOWN,
283
+ payload: ndefRecord.payload,
284
+ };
285
+ default:
286
+ return {
287
+ id: ndefRecord.id,
288
+ type: ndefRecord.type,
289
+ tnf: Number(ndefRecord.tnf),
290
+ payload: ndefRecord.payload,
291
+ };
292
+ }
293
+ }
165
294
  //# sourceMappingURL=parse-ndef-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-ndef-message.js","sourceRoot":"","sources":["../../../../../../src/www/ndef/parse-ndef-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from 'buffer';\nimport { NdefRecord } from '../tap-ndef/definitions';\nimport { arrayEquals, toAsciiString } from '../utility';\nimport { TNF, WellKnownType } from './definitions';\n\nexport function parseNdefMessages(messages: NdefRecord[] | undefined | null) {\n return (messages || []).map(parseNdefMessage);\n}\n\nexport function parseNdefMessage(message: NdefRecord) {\n switch (message.tnf) {\n case TNF.ABSOLUTE_URI:\n return {\n tnf: 'uri',\n value: toAsciiString(message.payload),\n };\n case TNF.WELL_KNOWN_TYPE:\n return {\n tnf: 'wkt',\n value: parseWellKnownType(message),\n };\n case TNF.EMPTY:\n return {\n tnf: 'empty',\n value: {\n type: message.type,\n payload: message.payload,\n },\n };\n case TNF.EXTERNAL:\n return {\n tnf: 'external',\n value: paseExternalType(message),\n };\n case TNF.MIME_TYPE:\n return {\n tnf: 'mimetype',\n value: parseMimeType(message),\n };\n case TNF.RFU:\n return {\n tnf: 'rfu',\n value: {\n type: message.type,\n payload: message.payload,\n },\n };\n case TNF.UNCHANGED:\n return {\n tnf: 'unchanged',\n value: {\n type: message.type,\n payload: message.payload,\n },\n };\n case TNF.UNKNOWN:\n return {\n tnf: 'unknown',\n value: {\n type: message.type,\n payload: message.payload,\n },\n };\n default:\n return {\n tnf: message.tnf,\n value: {\n type: message.type,\n payload: message.payload,\n },\n };\n }\n}\n\nfunction parseWellKnownType(message: Pick<NdefRecord, 'payload' | 'type'>) {\n if (arrayEquals(message.type, WellKnownType.URI)) {\n const prefixCode = message.payload[0];\n let prefix: string =\n WELL_KNOWN_TYPE_URI_PREFIX[\n prefixCode as keyof typeof WELL_KNOWN_TYPE_URI_PREFIX\n ] || '';\n return {\n type: 'uri',\n value: prefix + toAsciiString(message.payload.slice(1)),\n };\n } else if (arrayEquals(message.type, WellKnownType.TEXT)) {\n const encodingNumber = message.payload[0];\n let encoding: 'utf16le' | 'utf8' = 'utf8';\n let languageSizeInBytes = 0;\n if (typeof encodingNumber === 'number') {\n // b0: encodage utf8 s’il vaut 0 et utf16 s’il vaut 1.\n // b1: RFU (set to 0)\n // b2-b7: la taille en octets de la langue (n)\n // B8-B8+n-1: language\n // Bn: message\n const b0 = encodingNumber & 0b10000000;\n encoding = b0 ? 'utf16le' : 'utf8';\n languageSizeInBytes = encodingNumber & 0b00111111;\n }\n const text = message.payload.slice(languageSizeInBytes + 1);\n return {\n type: 'text',\n value: Buffer.from(text).toString(encoding),\n };\n }\n // else if (arrayEquals(message.type, WellKnownType.SMPART_POSTER)) {\n // return {\n // type: 'sp',\n // // TODO implement\n // payload: message.payload,\n // };\n // }\n else {\n return {\n type: 'unknown',\n value: {\n type: message.type,\n payload: message.payload,\n },\n };\n }\n}\n\nfunction paseExternalType(message: Pick<NdefRecord, 'payload' | 'type'>) {\n const value = Buffer.from(message.payload).toString('utf8');\n const domain = Buffer.from(message.type).toString('utf8');\n return {\n domain,\n value,\n };\n}\n\nconst WELL_KNOWN_TYPE_URI_PREFIX = {\n 0x0: '',\n 0x1: 'http://www.',\n 0x2: 'http://www.',\n 0x3: 'http://',\n 0x4: 'https://',\n 0x5: 'tel:',\n 0x6: 'mailto:',\n 0x07: 'ftp://anonymous:anonymous@',\n 0x1d: 'file://',\n 0x08: 'ftp://ftp.',\n 0x09: 'ftps://',\n 0x0a: 'sftp://',\n 0x0b: 'smb://',\n 0x0c: 'nfs://',\n 0x0d: 'ftp://',\n 0x0e: 'dav://',\n 0x0f: 'news:',\n 0x10: 'telnet://',\n 0x11: 'imap:',\n 0x12: 'rtsp://',\n 0x13: 'urn:',\n 0x14: 'pop:',\n 0x15: 'sip:',\n 0x16: 'sips:',\n 0x17: 'tftp:',\n 0x18: 'btspp://',\n 0x19: 'btl2cap://',\n 0x1a: 'btgoep://',\n 0x1b: 'tcpobex://',\n 0x1c: 'irdaobex://',\n 0x1e: 'urn:epc:id:',\n 0x1f: 'urn:epc:tag:',\n 0x20: 'urn:epc:pat:',\n 0x21: 'urn:epc:raw:',\n 0x22: 'urn:epc:',\n};\n\nfunction parseMimeType(message: Pick<NdefRecord, 'payload'>) {\n return Buffer.from(message.payload).toString('utf8');\n}\n"]}
1
+ {"version":3,"file":"parse-ndef-message.js","sourceRoot":"","sources":["../../../../../../src/www/ndef/parse-ndef-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from 'buffer';\r\nimport { NdefRecord } from '../tap-ndef/definitions';\r\nimport { arrayEquals, toAsciiString } from '../utility';\r\nimport { TNF, WellKnownType } from './definitions';\r\nimport { asciiStringToByteBuffer } from '@iotize/common/byte-converter';\r\n\r\nexport type NdefParsedRecord = {\r\n tnf: string | number,\r\n value?: any,\r\n payload?: any\r\n id: any[],\r\n type: number[]\r\n};\r\n\r\nexport function parseNdefMessages(messages: NdefRecord[] | undefined | null) {\r\n return (messages || []).map(parseNdefMessage);\r\n}\r\n\r\nexport function parseNdefMessage(message: NdefRecord): NdefParsedRecord {\r\n switch (message.tnf) {\r\n case TNF.ABSOLUTE_URI:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'uri',\r\n value: toAsciiString(message.payload),\r\n };\r\n case TNF.WELL_KNOWN_TYPE:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'wkt',\r\n value: parseWellKnownType(message),\r\n };\r\n case TNF.EMPTY:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'empty',\r\n value: {\r\n type: message.type,\r\n payload: message.payload,\r\n },\r\n };\r\n case TNF.EXTERNAL:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'external',\r\n value: paseExternalType(message),\r\n };\r\n case TNF.MIME_TYPE:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'mimetype',\r\n value: parseMimeType(message),\r\n };\r\n case TNF.RFU:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'rfu',\r\n value: {\r\n type: message.type,\r\n payload: message.payload,\r\n },\r\n };\r\n case TNF.UNCHANGED:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'unchanged',\r\n value: {\r\n type: message.type,\r\n payload: message.payload,\r\n },\r\n };\r\n case TNF.UNKNOWN:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: 'unknown',\r\n value: {\r\n type: message.type,\r\n payload: message.payload,\r\n },\r\n };\r\n default:\r\n return {\r\n id: message.id,\r\n type: message.type,\r\n tnf: message.tnf,\r\n value: {\r\n type: message.type,\r\n payload: message.payload,\r\n },\r\n };\r\n }\r\n}\r\n\r\nfunction parseWellKnownType(message: Pick<NdefRecord, 'payload' | 'type'>) {\r\n if (arrayEquals(message.type.slice(), WellKnownType.URI)) {\r\n const prefixCode = message.payload[0];\r\n let prefix: string =\r\n WELL_KNOWN_TYPE_URI_PREFIX[\r\n prefixCode as keyof typeof WELL_KNOWN_TYPE_URI_PREFIX\r\n ] || '';\r\n return {\r\n type: 'uri',\r\n value: prefix + toAsciiString(message.payload.slice(1)),\r\n };\r\n } else if (arrayEquals(message.type.slice(), WellKnownType.TEXT)) {\r\n const encodingNumber = message.payload[0];\r\n let encoding: 'utf16le' | 'utf8' = 'utf8';\r\n let languageSizeInBytes = 0;\r\n if (typeof encodingNumber === 'number') {\r\n // b0: encodage utf8 s’il vaut 0 et utf16 s’il vaut 1.\r\n // b1: RFU (set to 0)\r\n // b2-b7: la taille en octets de la langue (n)\r\n // B8-B8+n-1: language\r\n // Bn: message\r\n const b0 = encodingNumber & 0b10000000;\r\n encoding = b0 ? 'utf16le' : 'utf8';\r\n languageSizeInBytes = encodingNumber & 0b00111111;\r\n }\r\n const text = message.payload.slice(languageSizeInBytes + 1);\r\n const language = message.payload.slice(8, languageSizeInBytes + 1);\r\n return {\r\n type: 'text',\r\n value: Buffer.from(text).toString(encoding),\r\n encoding,\r\n language: Buffer.from(language).toString(encoding)\r\n };\r\n }\r\n // else if (arrayEquals(message.type.slice(), WellKnownType.SMPART_POSTER)) {\r\n // return {\r\n // type: 'sp',\r\n // // TODO implement\r\n // payload: message.payload,\r\n // };\r\n // }\r\n else {\r\n return {\r\n type: 'unknown',\r\n value: {\r\n type: message.type.slice(),\r\n payload: message.payload,\r\n },\r\n };\r\n }\r\n}\r\n\r\nfunction paseExternalType(message: Pick<NdefRecord, 'payload' | 'type'>) {\r\n const value = Buffer.from(message.payload).toString('utf8');\r\n const domain = Buffer.from(message.type).toString('utf8');\r\n return {\r\n domain,\r\n value,\r\n };\r\n}\r\n\r\nconst WELL_KNOWN_TYPE_URI_PREFIX = {\r\n 0x0: '',\r\n 0x1: 'http://www.',\r\n 0x2: 'http://www.',\r\n 0x3: 'http://',\r\n 0x4: 'https://',\r\n 0x5: 'tel:',\r\n 0x6: 'mailto:',\r\n 0x07: 'ftp://anonymous:anonymous@',\r\n 0x1d: 'file://',\r\n 0x08: 'ftp://ftp.',\r\n 0x09: 'ftps://',\r\n 0x0a: 'sftp://',\r\n 0x0b: 'smb://',\r\n 0x0c: 'nfs://',\r\n 0x0d: 'ftp://',\r\n 0x0e: 'dav://',\r\n 0x0f: 'news:',\r\n 0x10: 'telnet://',\r\n 0x11: 'imap:',\r\n 0x12: 'rtsp://',\r\n 0x13: 'urn:',\r\n 0x14: 'pop:',\r\n 0x15: 'sip:',\r\n 0x16: 'sips:',\r\n 0x17: 'tftp:',\r\n 0x18: 'btspp://',\r\n 0x19: 'btl2cap://',\r\n 0x1a: 'btgoep://',\r\n 0x1b: 'tcpobex://',\r\n 0x1c: 'irdaobex://',\r\n 0x1e: 'urn:epc:id:',\r\n 0x1f: 'urn:epc:tag:',\r\n 0x20: 'urn:epc:pat:',\r\n 0x21: 'urn:epc:raw:',\r\n 0x22: 'urn:epc:',\r\n};\r\n\r\nfunction parseMimeType(message: Pick<NdefRecord, 'payload'>) {\r\n return Buffer.from(message.payload).toString('utf8');\r\n}\r\n\r\nfunction encodeWellKnownType(message: NdefParsedRecord) {\r\n\r\n if (message.value.type == 'uri') {\r\n //identify the prefix\r\n const prefixesEntries = Object.entries(WELL_KNOWN_TYPE_URI_PREFIX);\r\n let prefixByte = 0;\r\n for (const [id, prefix] of prefixesEntries) {\r\n if (id == '0x0') // Skip first as it is always recognized. (what about 0x1 vs 0x2?)\r\n continue;\r\n if (message.value.value.startsWith(prefix)) {\r\n prefixByte = parseInt(id, 16);\r\n break;\r\n }\r\n }\r\n const lengthToSlice = WELL_KNOWN_TYPE_URI_PREFIX[prefixByte as keyof typeof WELL_KNOWN_TYPE_URI_PREFIX].length;\r\n const slicedString = message.value.value.slice(lengthToSlice);\r\n return [prefixByte, ...(asciiStringToByteBuffer(slicedString))];\r\n\r\n } else if (message.value.type === 'text') {\r\n // b1: RFU (set to 0)\r\n // b2-b7: la taille en octets de la langue (n)\r\n // B8-B8+n-1: language\r\n // Bn: message\r\n let firstByte = message.value.encoding == 'utf16le' ? 0b10000000 : 0;\r\n firstByte &= (message.value.language & 0b00111111);\r\n const languageBytes = Buffer.from(message.value.language, message.value.encoding);\r\n const textBytes = Buffer.from(message.value.value, message.value.encoding);\r\n return [firstByte, ...languageBytes, ...textBytes];\r\n }\r\n else return [...message.value.type, ...message.value.payload];\r\n}\r\n\r\nfunction encodeExternalType(message: NdefParsedRecord) {\r\n return Array.from(Buffer.from(message.value.value, 'utf8'));\r\n}\r\n\r\nfunction encodeMimeType(message: NdefParsedRecord) {\r\n return Array.from(Buffer.from(message.value, 'utf8'));\r\n}\r\n\r\nexport function encodeNDEFMessages(ndefRecords: NdefParsedRecord[]) {\r\n return (ndefRecords || []).map(encodeNDEFMessage)\r\n}\r\n\r\nexport function encodeNDEFMessage(ndefRecord: NdefParsedRecord): NdefRecord {\r\n switch (ndefRecord.tnf) {\r\n case 'uri':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.ABSOLUTE_URI,\r\n payload: Array.from(asciiStringToByteBuffer(ndefRecord.value))\r\n };\r\n case 'wkt':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.WELL_KNOWN_TYPE,\r\n payload: encodeWellKnownType(ndefRecord),\r\n };\r\n case 'empty':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.EMPTY,\r\n payload: ndefRecord.payload,\r\n };\r\n case 'external':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.EXTERNAL,\r\n payload: encodeExternalType(ndefRecord),\r\n };\r\n case 'mimetype':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.MIME_TYPE,\r\n payload: encodeMimeType(ndefRecord),\r\n };\r\n case 'rfu':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.RFU,\r\n payload: ndefRecord.payload\r\n };\r\n case 'unchanged':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.UNCHANGED,\r\n payload: ndefRecord.payload,\r\n };\r\n case 'unknown':\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: TNF.UNKNOWN,\r\n payload: ndefRecord.payload,\r\n };\r\n default:\r\n return {\r\n id: ndefRecord.id,\r\n type: ndefRecord.type,\r\n tnf: Number(ndefRecord.tnf),\r\n payload: ndefRecord.payload,\r\n };\r\n }\r\n}"]}
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"parseNdefMessages":{"__symbolic":"function","parameters":["messages"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"reference","name":"messages"},"right":[]},"member":"map"},"arguments":[{"__symbolic":"reference","name":"parseNdefMessage"}]}},"parseNdefMessage":{"__symbolic":"function"}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"NdefParsedRecord":{"__symbolic":"interface"},"parseNdefMessages":{"__symbolic":"function","parameters":["messages"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"reference","name":"messages"},"right":[]},"member":"map"},"arguments":[{"__symbolic":"reference","name":"parseNdefMessage"}]}},"parseNdefMessage":{"__symbolic":"function"},"encodeNDEFMessages":{"__symbolic":"function","parameters":["ndefRecords"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"reference","name":"ndefRecords"},"right":[]},"member":"map"},"arguments":[{"__symbolic":"reference","name":"encodeNDEFMessage"}]}},"encodeNDEFMessage":{"__symbolic":"function"}}}]
@@ -1 +1 @@
1
- {"moduleName":null,"summaries":[{"symbol":{"__symbol":0,"members":[]},"metadata":{"__symbolic":"function","parameters":["messages"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"reference","name":"messages"},"right":[]},"member":"map"},"arguments":[{"__symbol":1,"members":[]}]}}},{"symbol":{"__symbol":1,"members":[]},"metadata":{"__symbolic":"function"}}],"symbols":[{"__symbol":0,"name":"parseNdefMessages","filePath":"./parse-ndef-message"},{"__symbol":1,"name":"parseNdefMessage","filePath":"./parse-ndef-message"}]}
1
+ {"moduleName":null,"summaries":[{"symbol":{"__symbol":0,"members":[]},"metadata":{"__symbolic":"interface"}},{"symbol":{"__symbol":1,"members":[]},"metadata":{"__symbolic":"function","parameters":["messages"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"reference","name":"messages"},"right":[]},"member":"map"},"arguments":[{"__symbol":2,"members":[]}]}}},{"symbol":{"__symbol":2,"members":[]},"metadata":{"__symbolic":"function"}},{"symbol":{"__symbol":3,"members":[]},"metadata":{"__symbolic":"function","parameters":["ndefRecords"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"reference","name":"ndefRecords"},"right":[]},"member":"map"},"arguments":[{"__symbol":4,"members":[]}]}}},{"symbol":{"__symbol":4,"members":[]},"metadata":{"__symbolic":"function"}}],"symbols":[{"__symbol":0,"name":"NdefParsedRecord","filePath":"./parse-ndef-message"},{"__symbol":1,"name":"parseNdefMessages","filePath":"./parse-ndef-message"},{"__symbol":2,"name":"parseNdefMessage","filePath":"./parse-ndef-message"},{"__symbol":3,"name":"encodeNDEFMessages","filePath":"./parse-ndef-message"},{"__symbol":4,"name":"encodeNDEFMessage","filePath":"./parse-ndef-message"}]}