@exxili/capacitor-nfc 0.0.11 → 0.0.13

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/dist/esm/index.js CHANGED
@@ -1,16 +1,59 @@
1
+ var _a, _b;
1
2
  import { registerPlugin } from '@capacitor/core';
2
3
  const NFCPlug = registerPlugin('NFC', {
3
- web: () => import('./web').then(m => new m.NFCWeb()),
4
+ // Explicit .js extension required under node16/nodenext module resolution for emitted ES modules.
5
+ web: () => import('./web.js').then((m) => new m.NFCWeb()),
4
6
  });
5
- export * from './definitions';
7
+ export * from './definitions.js';
6
8
  export const NFC = {
7
9
  isSupported: NFCPlug.isSupported.bind(NFCPlug),
8
- startScan: NFCPlug.startScan.bind(NFCPlug),
10
+ startScan: (options) => {
11
+ const normalizedOptions = {};
12
+ if (options) {
13
+ for (const [key, value] of Object.entries(options)) {
14
+ if (value !== undefined && value !== null) {
15
+ normalizedOptions[key] = value;
16
+ }
17
+ }
18
+ }
19
+ return NFCPlug.startScan(normalizedOptions);
20
+ },
21
+ cancelScan: (_b = (_a = NFCPlug.cancelScan) === null || _a === void 0 ? void 0 : _a.bind(NFCPlug)) !== null && _b !== void 0 ? _b : (async () => {
22
+ /* Android no-op */
23
+ }),
9
24
  cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),
10
- onRead: (func) => NFC.wrapperListeners.push(func),
11
- onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),
25
+ onRead: (func) => {
26
+ NFC.wrapperListeners.push(func);
27
+ // Return unsubscribe function
28
+ return () => {
29
+ NFC.wrapperListeners = NFC.wrapperListeners.filter((l) => l !== func);
30
+ };
31
+ },
32
+ onWrite: (func) => {
33
+ let handle;
34
+ NFCPlug.addListener(`nfcWriteSuccess`, func).then((h) => (handle = h));
35
+ return () => {
36
+ var _a;
37
+ try {
38
+ (_a = handle === null || handle === void 0 ? void 0 : handle.remove) === null || _a === void 0 ? void 0 : _a.call(handle);
39
+ }
40
+ catch (_b) {
41
+ /* empty */
42
+ }
43
+ };
44
+ },
12
45
  onError: (errorFn) => {
13
- NFCPlug.addListener(`nfcError`, errorFn);
46
+ let handle;
47
+ NFCPlug.addListener(`nfcError`, errorFn).then((h) => (handle = h));
48
+ return () => {
49
+ var _a;
50
+ try {
51
+ (_a = handle === null || handle === void 0 ? void 0 : handle.remove) === null || _a === void 0 ? void 0 : _a.call(handle);
52
+ }
53
+ catch (_b) {
54
+ /* empty */
55
+ }
56
+ };
14
57
  },
15
58
  removeAllListeners: (eventName) => {
16
59
  NFC.wrapperListeners = [];
@@ -19,63 +62,201 @@ export const NFC = {
19
62
  wrapperListeners: [],
20
63
  async writeNDEF(options) {
21
64
  var _a;
65
+ // Helper encoders for well-known record types (only applied to string payloads)
66
+ const buildTextPayload = (text, lang = 'en') => {
67
+ const langBytes = Array.from(new TextEncoder().encode(lang));
68
+ const textBytes = Array.from(new TextEncoder().encode(text));
69
+ const status = langBytes.length & 0x3f; // UTF-8 encoding, language length (<= 63)
70
+ return [status, ...langBytes, ...textBytes];
71
+ };
72
+ const buildUriPayload = (uri, prefixCode = 0x00) => {
73
+ const uriBytes = Array.from(new TextEncoder().encode(uri));
74
+ return [prefixCode, ...uriBytes];
75
+ };
76
+ const recordsArray = (_a = options === null || options === void 0 ? void 0 : options.records) !== null && _a !== void 0 ? _a : [];
77
+ if (recordsArray.length === 0)
78
+ throw new Error('At least one NDEF record is required');
79
+ const isRawMode = (options === null || options === void 0 ? void 0 : options.rawMode) === true;
22
80
  const ndefMessage = {
23
- records: (_a = options === null || options === void 0 ? void 0 : options.records.map((record) => {
24
- const payload = typeof record.payload === 'string'
25
- ? Array.from(new TextEncoder().encode(record.payload))
26
- : Array.isArray(record.payload)
27
- ? record.payload
28
- : record.payload instanceof Uint8Array
29
- ? Array.from(record.payload)
30
- : null;
81
+ records: recordsArray.map((record) => {
82
+ let payload = null;
83
+ if (typeof record.payload === 'string') {
84
+ if (isRawMode) {
85
+ // Raw mode: write string payloads as UTF-8 bytes without any framing
86
+ payload = Array.from(new TextEncoder().encode(record.payload));
87
+ }
88
+ else {
89
+ // Apply spec-compliant formatting only for Well Known Text (T) & URI (U) types.
90
+ if (record.type === 'T') {
91
+ payload = buildTextPayload(record.payload);
92
+ }
93
+ else if (record.type === 'U') {
94
+ payload = buildUriPayload(record.payload);
95
+ }
96
+ else {
97
+ // Generic string: raw UTF-8 bytes (no extra framing)
98
+ payload = Array.from(new TextEncoder().encode(record.payload));
99
+ }
100
+ }
101
+ }
102
+ else if (Array.isArray(record.payload)) {
103
+ // Assume already raw bytes; do NOT modify
104
+ payload = record.payload;
105
+ }
106
+ else if (record.payload instanceof Uint8Array) {
107
+ payload = Array.from(record.payload);
108
+ }
31
109
  if (!payload)
32
- throw 'Unsupported payload type';
33
- return {
34
- type: record.type,
35
- payload,
36
- };
37
- })) !== null && _a !== void 0 ? _a : [],
110
+ throw new Error('Unsupported payload type');
111
+ return { type: record.type, payload };
112
+ }),
38
113
  };
39
114
  await NFCPlug.writeNDEF(ndefMessage);
40
115
  },
41
116
  };
42
- const decodeBase64 = (base64Payload) => {
43
- return atob(base64Payload)
44
- .split('')
45
- .map((char) => char.charCodeAt(0));
117
+ // Decode a base64 string into a Uint8Array (browser-safe). Existing code used atob already.
118
+ const decodeBase64ToBytes = (base64Payload) => {
119
+ const bin = atob(base64Payload);
120
+ const out = new Uint8Array(bin.length);
121
+ for (let i = 0; i < bin.length; i++)
122
+ out[i] = bin.charCodeAt(i);
123
+ return out;
124
+ };
125
+ // Parse NFC Forum "Text" (Well Known 'T') records according to spec.
126
+ const decodeTextRecord = (bytes) => {
127
+ if (bytes.length === 0)
128
+ return '';
129
+ const status = bytes[0];
130
+ const isUTF16 = (status & 0x80) !== 0; // Bit 7 indicates encoding
131
+ const langLength = status & 0x3f; // Bits 0-5 language code length
132
+ if (1 + langLength > bytes.length)
133
+ return ''; // Corrupt
134
+ const textBytes = bytes.slice(1 + langLength);
135
+ try {
136
+ const decoder = new TextDecoder(isUTF16 ? 'utf-16' : 'utf-8');
137
+ return decoder.decode(textBytes);
138
+ }
139
+ catch (_a) {
140
+ // Fallback: naive ASCII
141
+ return Array.from(textBytes)
142
+ .map((b) => String.fromCharCode(b))
143
+ .join('');
144
+ }
145
+ };
146
+ // Basic URI prefix table for Well Known 'U' records (optional convenience)
147
+ const URI_PREFIX = [
148
+ '',
149
+ 'http://www.',
150
+ 'https://www.',
151
+ 'http://',
152
+ 'https://',
153
+ 'tel:',
154
+ 'mailto:',
155
+ 'ftp://anonymous:anonymous@',
156
+ 'ftp://ftp.',
157
+ 'ftps://',
158
+ 'sftp://',
159
+ 'smb://',
160
+ 'nfs://',
161
+ 'ftp://',
162
+ 'dav://',
163
+ 'news:',
164
+ 'telnet://',
165
+ 'imap:',
166
+ 'rtsp://',
167
+ 'urn:',
168
+ 'pop:',
169
+ 'sip:',
170
+ 'sips:',
171
+ 'tftp:',
172
+ 'btspp://',
173
+ 'btl2cap://',
174
+ 'btgoep://',
175
+ 'tcpobex://',
176
+ 'irdaobex://',
177
+ 'file://',
178
+ 'urn:epc:id:',
179
+ 'urn:epc:tag:',
180
+ 'urn:epc:pat:',
181
+ 'urn:epc:raw:',
182
+ 'urn:epc:',
183
+ 'urn:nfc:',
184
+ ];
185
+ const decodeUriRecord = (bytes) => {
186
+ if (bytes.length === 0)
187
+ return '';
188
+ const prefixIndex = bytes[0];
189
+ const prefix = URI_PREFIX[prefixIndex] || '';
190
+ const remainder = bytes.slice(1);
191
+ try {
192
+ return prefix + new TextDecoder('utf-8').decode(remainder);
193
+ }
194
+ catch (_a) {
195
+ return (prefix +
196
+ Array.from(remainder)
197
+ .map((b) => String.fromCharCode(b))
198
+ .join(''));
199
+ }
200
+ };
201
+ const toStringPayload = (recordType, bytes) => {
202
+ // Well Known Text
203
+ if (recordType === 'T')
204
+ return decodeTextRecord(bytes);
205
+ // Well Known URI
206
+ if (recordType === 'U')
207
+ return decodeUriRecord(bytes);
208
+ // Default: attempt UTF-8 decode
209
+ try {
210
+ return new TextDecoder('utf-8').decode(bytes);
211
+ }
212
+ catch (_a) {
213
+ return Array.from(bytes)
214
+ .map((c) => String.fromCharCode(c))
215
+ .join('');
216
+ }
46
217
  };
47
218
  const mapPayloadTo = (type, data) => {
48
219
  return {
49
- messages: data.messages.map(message => ({
50
- records: message.records.map(record => ({
51
- type: record.type,
52
- payload: type === "b64"
53
- ? record.payload
54
- : type === "string"
55
- ? decodeBase64(record.payload)
56
- : type === "uint8Array"
57
- ? new Uint8Array(decodeBase64(record.payload))
58
- : type === "numberArray"
59
- ? Array.from(decodeBase64(record.payload))
60
- : record.payload
61
- }))
62
- }))
220
+ messages: data.messages.map((message) => ({
221
+ records: message.records.map((record) => {
222
+ const bytes = decodeBase64ToBytes(record.payload);
223
+ let payload;
224
+ switch (type) {
225
+ case 'b64':
226
+ payload = record.payload; // original base64 string
227
+ break;
228
+ case 'uint8Array':
229
+ payload = bytes;
230
+ break;
231
+ case 'numberArray':
232
+ payload = Array.from(bytes);
233
+ break;
234
+ case 'string':
235
+ payload = toStringPayload(record.type, bytes);
236
+ break;
237
+ default:
238
+ payload = record.payload;
239
+ }
240
+ return { type: record.type, payload };
241
+ }),
242
+ })),
243
+ tagInfo: data.tagInfo, // Include tag information
63
244
  };
64
245
  };
65
- NFCPlug.addListener(`nfcTag`, data => {
246
+ NFCPlug.addListener(`nfcTag`, (data) => {
66
247
  const wrappedData = {
67
248
  base64() {
68
- return mapPayloadTo("b64", data);
249
+ return mapPayloadTo('b64', data);
69
250
  },
70
251
  string() {
71
- return mapPayloadTo("string", data);
252
+ return mapPayloadTo('string', data);
72
253
  },
73
254
  uint8Array() {
74
- return mapPayloadTo("uint8Array", data);
255
+ return mapPayloadTo('uint8Array', data);
75
256
  },
76
257
  numberArray() {
77
- return mapPayloadTo("numberArray", data);
78
- }
258
+ return mapPayloadTo('numberArray', data);
259
+ },
79
260
  };
80
261
  for (const listener of NFC.wrapperListeners) {
81
262
  listener(wrappedData);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerPlugin } from '@capacitor/core';\n\nimport type {\n NDEFMessagesTransformable,\n NDEFWriteOptions,\n NFCPlugin,\n NFCPluginBasic,\n PayloadType,\n TagResultListenerFunc,\n NFCError,\n NDEFMessages\n} from './definitions';\n\nconst NFCPlug = registerPlugin<NFCPluginBasic>('NFC', {\n web: () => import('./web').then(m => new m.NFCWeb()),\n});\nexport * from './definitions';\nexport const NFC: NFCPlugin = {\n isSupported: NFCPlug.isSupported.bind(NFCPlug),\n startScan: NFCPlug.startScan.bind(NFCPlug),\n cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),\n onRead: (func: TagResultListenerFunc) => NFC.wrapperListeners.push(func),\n onWrite: (func: ()=> void) => NFCPlug.addListener(`nfcWriteSuccess`, func),\n onError: (errorFn: (error: NFCError) => void) => {\n NFCPlug.addListener(`nfcError`, errorFn);\n },\n removeAllListeners: (eventName: 'nfcTag' | 'nfcError') => {\n NFC.wrapperListeners = [];\n return NFCPlug.removeAllListeners(eventName);\n },\n wrapperListeners: [],\n\n async writeNDEF<T extends PayloadType = Uint8Array>(options?: NDEFWriteOptions<T>): Promise<void> {\n const ndefMessage: NDEFWriteOptions<number[]> = {\n records:\n options?.records.map((record) => {\n const payload: number[] | null =\n typeof record.payload === 'string'\n ? Array.from(new TextEncoder().encode(record.payload))\n : Array.isArray(record.payload)\n ? record.payload\n : record.payload instanceof Uint8Array\n ? Array.from(record.payload)\n : null;\n\n if (!payload) throw 'Unsupported payload type';\n\n return {\n type: record.type,\n payload,\n };\n }) ?? [],\n };\n\n await NFCPlug.writeNDEF(ndefMessage);\n },\n};\n\ntype DecodeSpecifier = \"b64\" | \"string\" | \"uint8Array\" | \"numberArray\";\ntype decodedType<T extends DecodeSpecifier> = NDEFMessages<T extends \"b64\" ? string : T extends \"string\" ? string : T extends \"uint8Array\" ? Uint8Array : number[]>\nconst decodeBase64 = (base64Payload: string)=> {\n return atob(base64Payload)\n .split('')\n .map((char) => char.charCodeAt(0));\n}\nconst mapPayloadTo = <T extends DecodeSpecifier>(type: T, data: NDEFMessages): decodedType<T> => {\n return {\n messages: data.messages.map(message => ({\n records: message.records.map(record => ({\n type: record.type,\n payload:\n type === \"b64\"\n ? record.payload\n :type === \"string\"\n ? decodeBase64(record.payload)\n : type === \"uint8Array\"\n ? new Uint8Array(decodeBase64(record.payload))\n : type === \"numberArray\"\n ? Array.from(decodeBase64(record.payload))\n : record.payload\n }))\n }))\n } as decodedType<T>\n}\n\nNFCPlug.addListener(`nfcTag`, data=> {\n const wrappedData: NDEFMessagesTransformable = {\n base64() {\n return mapPayloadTo(\"b64\", data)\n },\n string() {\n return mapPayloadTo(\"string\", data)\n },\n uint8Array() {\n return mapPayloadTo(\"uint8Array\", data)\n },\n numberArray() {\n return mapPayloadTo(\"numberArray\", data)\n }\n }\n\n for(const listener of NFC.wrapperListeners) {\n listener(wrappedData);\n }\n})"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerPlugin } from '@capacitor/core';\n\nimport type {\n NDEFMessagesTransformable,\n NDEFWriteOptions,\n NFCPlugin,\n NFCPluginBasic,\n StartScanOptions,\n PayloadType,\n TagResultListenerFunc,\n NFCError,\n NDEFMessages,\n} from './definitions.js';\n\nconst NFCPlug = registerPlugin<NFCPluginBasic>('NFC', {\n // Explicit .js extension required under node16/nodenext module resolution for emitted ES modules.\n web: () => import('./web.js').then((m) => new m.NFCWeb()),\n});\nexport * from './definitions.js';\nexport const NFC: NFCPlugin = {\n isSupported: NFCPlug.isSupported.bind(NFCPlug),\n startScan: (options?: StartScanOptions) => {\n const normalizedOptions: Record<string, unknown> = {};\n if (options) {\n for (const [key, value] of Object.entries(options)) {\n if (value !== undefined && value !== null) {\n normalizedOptions[key] = value;\n }\n }\n }\n return NFCPlug.startScan(normalizedOptions);\n },\n cancelScan:\n NFCPlug.cancelScan?.bind(NFCPlug) ??\n (async () => {\n /* Android no-op */\n }),\n cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),\n onRead: (func: TagResultListenerFunc) => {\n NFC.wrapperListeners.push(func);\n // Return unsubscribe function\n return () => {\n NFC.wrapperListeners = NFC.wrapperListeners.filter((l: TagResultListenerFunc) => l !== func);\n };\n },\n onWrite: (func: () => void) => {\n let handle: any;\n NFCPlug.addListener(`nfcWriteSuccess`, func).then((h: any) => (handle = h));\n return () => {\n try {\n handle?.remove?.();\n } catch {\n /* empty */\n }\n };\n },\n onError: (errorFn: (error: NFCError) => void) => {\n let handle: any;\n NFCPlug.addListener(`nfcError`, errorFn).then((h: any) => (handle = h));\n return () => {\n try {\n handle?.remove?.();\n } catch {\n /* empty */\n }\n };\n },\n removeAllListeners: (eventName: 'nfcTag' | 'nfcError') => {\n NFC.wrapperListeners = [];\n return NFCPlug.removeAllListeners(eventName);\n },\n wrapperListeners: [],\n\n async writeNDEF<T extends PayloadType = Uint8Array>(options?: NDEFWriteOptions<T>): Promise<void> {\n // Helper encoders for well-known record types (only applied to string payloads)\n const buildTextPayload = (text: string, lang = 'en'): number[] => {\n const langBytes = Array.from(new TextEncoder().encode(lang));\n const textBytes = Array.from(new TextEncoder().encode(text));\n const status = langBytes.length & 0x3f; // UTF-8 encoding, language length (<= 63)\n return [status, ...langBytes, ...textBytes];\n };\n const buildUriPayload = (uri: string, prefixCode = 0x00): number[] => {\n const uriBytes = Array.from(new TextEncoder().encode(uri));\n return [prefixCode, ...uriBytes];\n };\n\n const recordsArray = options?.records ?? [];\n if (recordsArray.length === 0) throw new Error('At least one NDEF record is required');\n\n const isRawMode = options?.rawMode === true;\n\n const ndefMessage: NDEFWriteOptions<number[]> = {\n records: recordsArray.map((record: any) => {\n let payload: number[] | null = null;\n\n if (typeof record.payload === 'string') {\n if (isRawMode) {\n // Raw mode: write string payloads as UTF-8 bytes without any framing\n payload = Array.from(new TextEncoder().encode(record.payload));\n } else {\n // Apply spec-compliant formatting only for Well Known Text (T) & URI (U) types.\n if (record.type === 'T') {\n payload = buildTextPayload(record.payload);\n } else if (record.type === 'U') {\n payload = buildUriPayload(record.payload);\n } else {\n // Generic string: raw UTF-8 bytes (no extra framing)\n payload = Array.from(new TextEncoder().encode(record.payload));\n }\n }\n } else if (Array.isArray(record.payload)) {\n // Assume already raw bytes; do NOT modify\n payload = record.payload as number[];\n } else if (record.payload instanceof Uint8Array) {\n payload = Array.from(record.payload);\n }\n\n if (!payload) throw new Error('Unsupported payload type');\n\n return { type: record.type, payload };\n }),\n };\n\n await NFCPlug.writeNDEF(ndefMessage);\n },\n};\n\n// ----- Payload transformation helpers -----\ntype DecodeSpecifier = 'b64' | 'string' | 'uint8Array' | 'numberArray';\ntype decodedType<T extends DecodeSpecifier> = NDEFMessages<\n T extends 'b64' ? string : T extends 'string' ? string : T extends 'uint8Array' ? Uint8Array : number[]\n>;\n\n// Decode a base64 string into a Uint8Array (browser-safe). Existing code used atob already.\nconst decodeBase64ToBytes = (base64Payload: string): Uint8Array => {\n const bin = atob(base64Payload);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n};\n\n// Parse NFC Forum \"Text\" (Well Known 'T') records according to spec.\nconst decodeTextRecord = (bytes: Uint8Array): string => {\n if (bytes.length === 0) return '';\n const status = bytes[0];\n const isUTF16 = (status & 0x80) !== 0; // Bit 7 indicates encoding\n const langLength = status & 0x3f; // Bits 0-5 language code length\n if (1 + langLength > bytes.length) return ''; // Corrupt\n const textBytes = bytes.slice(1 + langLength);\n try {\n const decoder = new TextDecoder(isUTF16 ? 'utf-16' : 'utf-8');\n return decoder.decode(textBytes);\n } catch {\n // Fallback: naive ASCII\n return Array.from(textBytes)\n .map((b) => String.fromCharCode(b))\n .join('');\n }\n};\n\n// Basic URI prefix table for Well Known 'U' records (optional convenience)\nconst URI_PREFIX: string[] = [\n '',\n 'http://www.',\n 'https://www.',\n 'http://',\n 'https://',\n 'tel:',\n 'mailto:',\n 'ftp://anonymous:anonymous@',\n 'ftp://ftp.',\n 'ftps://',\n 'sftp://',\n 'smb://',\n 'nfs://',\n 'ftp://',\n 'dav://',\n 'news:',\n 'telnet://',\n 'imap:',\n 'rtsp://',\n 'urn:',\n 'pop:',\n 'sip:',\n 'sips:',\n 'tftp:',\n 'btspp://',\n 'btl2cap://',\n 'btgoep://',\n 'tcpobex://',\n 'irdaobex://',\n 'file://',\n 'urn:epc:id:',\n 'urn:epc:tag:',\n 'urn:epc:pat:',\n 'urn:epc:raw:',\n 'urn:epc:',\n 'urn:nfc:',\n];\n\nconst decodeUriRecord = (bytes: Uint8Array): string => {\n if (bytes.length === 0) return '';\n const prefixIndex = bytes[0];\n const prefix = URI_PREFIX[prefixIndex] || '';\n const remainder = bytes.slice(1);\n try {\n return prefix + new TextDecoder('utf-8').decode(remainder);\n } catch {\n return (\n prefix +\n Array.from(remainder)\n .map((b) => String.fromCharCode(b))\n .join('')\n );\n }\n};\n\nconst toStringPayload = (recordType: string, bytes: Uint8Array): string => {\n // Well Known Text\n if (recordType === 'T') return decodeTextRecord(bytes);\n // Well Known URI\n if (recordType === 'U') return decodeUriRecord(bytes);\n // Default: attempt UTF-8 decode\n try {\n return new TextDecoder('utf-8').decode(bytes);\n } catch {\n return Array.from(bytes)\n .map((c) => String.fromCharCode(c))\n .join('');\n }\n};\n\nconst mapPayloadTo = <T extends DecodeSpecifier>(type: T, data: NDEFMessages): decodedType<T> => {\n return {\n messages: data.messages.map((message: any) => ({\n records: message.records.map((record: any) => {\n const bytes = decodeBase64ToBytes(record.payload as unknown as string);\n let payload: any;\n switch (type) {\n case 'b64':\n payload = record.payload; // original base64 string\n break;\n case 'uint8Array':\n payload = bytes;\n break;\n case 'numberArray':\n payload = Array.from(bytes);\n break;\n case 'string':\n payload = toStringPayload(record.type, bytes);\n break;\n default:\n payload = record.payload;\n }\n return { type: record.type, payload };\n }),\n })),\n tagInfo: data.tagInfo, // Include tag information\n } as decodedType<T>;\n};\n\nNFCPlug.addListener(`nfcTag`, (data: any) => {\n const wrappedData: NDEFMessagesTransformable = {\n base64() {\n return mapPayloadTo('b64', data);\n },\n string() {\n return mapPayloadTo('string', data);\n },\n uint8Array() {\n return mapPayloadTo('uint8Array', data);\n },\n numberArray() {\n return mapPayloadTo('numberArray', data);\n },\n };\n\n for (const listener of NFC.wrapperListeners) {\n listener(wrappedData);\n }\n});\n"]}
package/dist/esm/web.d.ts CHANGED
@@ -1,14 +1,11 @@
1
1
  import { WebPlugin } from '@capacitor/core';
2
- import type { NFCPlugin, TagResultListenerFunc } from './definitions';
3
- export declare class NFCWeb extends WebPlugin implements NFCPlugin {
4
- wrapperListeners: never[];
2
+ import type { StartScanOptions } from './definitions.js';
3
+ export declare class NFCWeb extends WebPlugin {
5
4
  isSupported(): Promise<{
6
5
  supported: boolean;
7
6
  }>;
8
- startScan(): Promise<void>;
7
+ startScan(_options?: StartScanOptions): Promise<void>;
8
+ cancelScan(): Promise<void>;
9
9
  cancelWriteAndroid(): Promise<void>;
10
- writeNDEF(): Promise<void>;
11
- onRead(_func: TagResultListenerFunc): Promise<void>;
12
- onWrite(): Promise<void>;
13
- onError(_errorFn: (error: any) => void): Promise<void>;
10
+ writeNDEF(_options?: any): Promise<void>;
14
11
  }
package/dist/esm/web.js CHANGED
@@ -1,31 +1,19 @@
1
1
  import { WebPlugin } from '@capacitor/core';
2
2
  export class NFCWeb extends WebPlugin {
3
- constructor() {
4
- super(...arguments);
5
- this.wrapperListeners = [];
3
+ async isSupported() {
4
+ return { supported: false };
6
5
  }
7
- isSupported() {
8
- return Promise.resolve({ supported: false });
6
+ async startScan(_options) {
7
+ throw new Error('NFC is not supported on web');
9
8
  }
10
- startScan() {
11
- return Promise.reject(new Error('NFC is not supported on web'));
9
+ async cancelScan() {
10
+ throw new Error('NFC is not supported on web');
12
11
  }
13
- cancelWriteAndroid() {
14
- return Promise.reject(new Error('NFC is not supported on web'));
12
+ async cancelWriteAndroid() {
13
+ throw new Error('NFC is not supported on web');
15
14
  }
16
- writeNDEF() {
17
- return Promise.reject(new Error('NFC is not supported on web'));
18
- }
19
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
- onRead(_func) {
21
- return Promise.reject(new Error('NFC is not supported on web'));
22
- }
23
- onWrite() {
24
- return Promise.reject(new Error('NFC is not supported on web'));
25
- }
26
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
27
- onError(_errorFn) {
28
- return Promise.reject(new Error('NFC is not supported on web'));
15
+ async writeNDEF(_options) {
16
+ throw new Error('NFC is not supported on web');
29
17
  }
30
18
  }
31
19
  //# sourceMappingURL=web.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,OAAO,MAAO,SAAQ,SAAS;IAArC;;QACE,qBAAgB,GAAG,EAAE,CAAC;IA+BxB,CAAC;IA7BC,WAAW;QACT,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS;QACP,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,kBAAkB;QAChB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,SAAS;QACP,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAC,KAA4B;QACjC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO;QACL,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,6DAA6D;IAC7D,OAAO,CAAC,QAA8B;QACpC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClE,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type { NFCPlugin, TagResultListenerFunc } from './definitions';\n\nexport class NFCWeb extends WebPlugin implements NFCPlugin {\n wrapperListeners = [];\n \n isSupported(): Promise<{ supported: boolean }> {\n return Promise.resolve({ supported: false });\n }\n\n startScan(): Promise<void> {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n\n cancelWriteAndroid(): Promise<void> {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n\n writeNDEF(): Promise<void> {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onRead(_func: TagResultListenerFunc): Promise<void> {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n\n onWrite(): Promise<void> {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onError(_errorFn: (error: any) => void): Promise<void> {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n}"]}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,OAAO,MAAO,SAAQ,SAAS;IACnC,KAAK,CAAC,WAAW;QACf,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAA2B;QACzC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAc;QAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type { StartScanOptions } from './definitions.js';\n\nexport class NFCWeb extends WebPlugin {\n async isSupported(): Promise<{ supported: boolean }> {\n return { supported: false };\n }\n\n async startScan(_options?: StartScanOptions): Promise<void> {\n throw new Error('NFC is not supported on web');\n }\n\n async cancelScan(): Promise<void> {\n throw new Error('NFC is not supported on web');\n }\n\n async cancelWriteAndroid(): Promise<void> {\n throw new Error('NFC is not supported on web');\n }\n\n async writeNDEF(_options?: any): Promise<void> {\n throw new Error('NFC is not supported on web');\n }\n}\n"]}