@exxili/capacitor-nfc 0.0.3 → 0.0.9

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.
@@ -1,20 +1,34 @@
1
- import { PluginListenerHandle } from '@capacitor/core';
2
- export interface NFCPlugin {
1
+ import type { PluginListenerHandle } from '@capacitor/core';
2
+ export declare type PayloadType = string | number[] | Uint8Array;
3
+ export interface NFCPluginBasic {
3
4
  /**
4
- * Starts the NFC scanning session.
5
+ * Checks if NFC is supported on the device. Returns true on all iOS devices, and checks for support on Android.
5
6
  */
7
+ isSupported(): Promise<{
8
+ supported: boolean;
9
+ }>;
6
10
  startScan(): Promise<void>;
7
11
  /**
8
12
  * Writes an NDEF message to an NFC tag.
9
13
  * @param options The NDEF message to write.
10
14
  */
11
- writeNDEF(options: NDEFWriteOptions): Promise<void>;
15
+ writeNDEF<T extends PayloadType = number[]>(options: NDEFWriteOptions<T>): Promise<void>;
16
+ /**
17
+ * Cancels writeNDEF on Android (exits "write mode").
18
+ */
19
+ cancelWriteAndroid(): Promise<void>;
12
20
  /**
13
21
  * Adds a listener for NFC tag detection events.
14
22
  * @param eventName The name of the event ('nfcTag').
15
23
  * @param listenerFunc The function to call when an NFC tag is detected.
16
24
  */
17
25
  addListener(eventName: 'nfcTag', listenerFunc: (data: NDEFMessages) => void): Promise<PluginListenerHandle> & PluginListenerHandle;
26
+ /**
27
+ * Adds a listener for NFC tag write events.
28
+ * @param eventName The name of the event ('nfcWriteSuccess').
29
+ * @param listenerFunc The function to call when an NFC tag is written.
30
+ */
31
+ addListener(eventName: 'nfcWriteSuccess', listenerFunc: () => void): Promise<PluginListenerHandle> & PluginListenerHandle;
18
32
  /**
19
33
  * Adds a listener for NFC error events.
20
34
  * @param eventName The name of the event ('nfcError').
@@ -27,13 +41,13 @@ export interface NFCPlugin {
27
41
  */
28
42
  removeAllListeners(eventName: 'nfcTag' | 'nfcError'): Promise<void>;
29
43
  }
30
- export interface NDEFMessages {
31
- messages: NDEFMessage[];
44
+ export interface NDEFMessages<T extends PayloadType = string> {
45
+ messages: NDEFMessage<T>[];
32
46
  }
33
- export interface NDEFMessage {
34
- records: NDEFRecord[];
47
+ export interface NDEFMessage<T extends PayloadType = string> {
48
+ records: NDEFRecord<T>[];
35
49
  }
36
- export interface NDEFRecord {
50
+ export interface NDEFRecord<T extends PayloadType = string> {
37
51
  /**
38
52
  * The type of the record.
39
53
  */
@@ -41,7 +55,7 @@ export interface NDEFRecord {
41
55
  /**
42
56
  * The payload of the record.
43
57
  */
44
- payload: string;
58
+ payload: T;
45
59
  }
46
60
  export interface NFCError {
47
61
  /**
@@ -49,6 +63,20 @@ export interface NFCError {
49
63
  */
50
64
  error: string;
51
65
  }
52
- export interface NDEFWriteOptions {
53
- records: NDEFRecord[];
66
+ export interface NDEFWriteOptions<T extends PayloadType = Uint8Array> {
67
+ records: NDEFRecord<T>[];
68
+ }
69
+ export declare type NDEFMessagesTransformable = {
70
+ base64: () => NDEFMessages;
71
+ uint8Array: () => NDEFMessages<Uint8Array>;
72
+ string: () => NDEFMessages;
73
+ numberArray: () => NDEFMessages<number[]>;
74
+ };
75
+ export declare type TagResultListenerFunc = (data: NDEFMessagesTransformable) => void;
76
+ export interface NFCPlugin extends Omit<NFCPluginBasic, "writeNDEF" | "addListener"> {
77
+ writeNDEF: <T extends PayloadType = Uint8Array>(record?: NDEFWriteOptions<T>) => Promise<void>;
78
+ wrapperListeners: TagResultListenerFunc[];
79
+ onRead: (listenerFunc: TagResultListenerFunc) => void;
80
+ onWrite: (listenerFunc: () => void) => void;
81
+ onError: (listenerFunc: (error: NFCError) => void) => void;
54
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["import { PluginListenerHandle } from '@capacitor/core';\n\nexport interface NFCPlugin {\n /**\n * Starts the NFC scanning session.\n */\n startScan(): Promise<void>;\n\n /**\n * Writes an NDEF message to an NFC tag.\n * @param options The NDEF message to write.\n */\n writeNDEF(options: NDEFWriteOptions): Promise<void>;\n\n /**\n * Adds a listener for NFC tag detection events.\n * @param eventName The name of the event ('nfcTag').\n * @param listenerFunc The function to call when an NFC tag is detected.\n */\n addListener(\n eventName: 'nfcTag',\n listenerFunc: (data: NDEFMessages) => void,\n ): Promise<PluginListenerHandle> & PluginListenerHandle;\n\n /**\n * Adds a listener for NFC error events.\n * @param eventName The name of the event ('nfcError').\n * @param listenerFunc The function to call when an NFC error occurs.\n */\n addListener(\n eventName: 'nfcError',\n listenerFunc: (error: NFCError) => void,\n ): Promise<PluginListenerHandle> & PluginListenerHandle;\n\n /**\n * Removes all listeners for the specified event.\n * @param eventName The name of the event.\n */\n removeAllListeners(eventName: 'nfcTag' | 'nfcError'): Promise<void>;\n}\n\nexport interface NDEFMessages {\n messages: NDEFMessage[];\n}\n\nexport interface NDEFMessage {\n records: NDEFRecord[];\n}\n\nexport interface NDEFRecord {\n /**\n * The type of the record.\n */\n type: string;\n\n /**\n * The payload of the record.\n */\n payload: string;\n}\n\nexport interface NFCError {\n /**\n * The error message.\n */\n error: string;\n}\n\nexport interface NDEFWriteOptions {\n records: NDEFRecord[];\n}\n"]}
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["import type { PluginListenerHandle } from '@capacitor/core';\n\n// Payload from a new NFC scan is a base64 encoded string\nexport type PayloadType = string | number[] | Uint8Array\n\nexport interface NFCPluginBasic {\n /**\n * Checks if NFC is supported on the device. Returns true on all iOS devices, and checks for support on Android.\n */\n isSupported(): Promise<{ supported: boolean }>;\n\n startScan(): Promise<void>;\n\n /**\n * Writes an NDEF message to an NFC tag.\n * @param options The NDEF message to write.\n */\n writeNDEF<T extends PayloadType = number[]>(options: NDEFWriteOptions<T>): Promise<void>;\n\n /**\n * Cancels writeNDEF on Android (exits \"write mode\").\n */\n cancelWriteAndroid(): Promise<void>;\n\n /**\n * Adds a listener for NFC tag detection events.\n * @param eventName The name of the event ('nfcTag').\n * @param listenerFunc The function to call when an NFC tag is detected.\n */\n addListener(\n eventName: 'nfcTag',\n listenerFunc: (data: NDEFMessages) => void,\n ): Promise<PluginListenerHandle> & PluginListenerHandle;\n\n /**\n * Adds a listener for NFC tag write events.\n * @param eventName The name of the event ('nfcWriteSuccess').\n * @param listenerFunc The function to call when an NFC tag is written.\n */\n addListener(\n eventName: 'nfcWriteSuccess',\n listenerFunc: ()=> void,\n ): Promise<PluginListenerHandle> & PluginListenerHandle;\n\n /**\n * Adds a listener for NFC error events.\n * @param eventName The name of the event ('nfcError').\n * @param listenerFunc The function to call when an NFC error occurs.\n */\n addListener(\n eventName: 'nfcError',\n listenerFunc: (error: NFCError) => void,\n ): Promise<PluginListenerHandle> & PluginListenerHandle;\n\n /**\n * Removes all listeners for the specified event.\n * @param eventName The name of the event.\n */\n removeAllListeners(eventName: 'nfcTag' | 'nfcError'): Promise<void>;\n}\n\nexport interface NDEFMessages<T extends PayloadType = string> {\n messages: NDEFMessage<T>[];\n}\n\nexport interface NDEFMessage<T extends PayloadType = string> {\n records: NDEFRecord<T>[];\n}\n\nexport interface NDEFRecord<T extends PayloadType = string> {\n /**\n * The type of the record.\n */\n type: string;\n\n /**\n * The payload of the record.\n */\n payload: T;\n}\n\n\nexport interface NFCError {\n /**\n * The error message.\n */\n error: string;\n}\n\nexport interface NDEFWriteOptions<T extends PayloadType = Uint8Array> {\n records: NDEFRecord<T>[];\n}\n\nexport type NDEFMessagesTransformable = {\n base64: ()=> NDEFMessages;\n uint8Array: ()=> NDEFMessages<Uint8Array>;\n string: ()=> NDEFMessages;\n numberArray: ()=> NDEFMessages<number[]>;\n}\n\nexport type TagResultListenerFunc = (data: NDEFMessagesTransformable) => void\n\nexport interface NFCPlugin extends Omit<NFCPluginBasic, \"writeNDEF\" | \"addListener\"> {\n writeNDEF: <T extends PayloadType = Uint8Array>(record?: NDEFWriteOptions<T>) => Promise<void>;\n wrapperListeners: TagResultListenerFunc[],\n onRead: (listenerFunc: TagResultListenerFunc)=> void,\n onWrite: (listenerFunc: ()=> void) => void,\n onError: (listenerFunc: (error: NFCError)=> void)=> void,\n}"]}
@@ -1,4 +1,3 @@
1
1
  import type { NFCPlugin } from './definitions';
2
- declare const NFC: NFCPlugin;
3
2
  export * from './definitions';
4
- export { NFC };
3
+ export declare const NFC: NFCPlugin;
package/dist/esm/index.js CHANGED
@@ -1,5 +1,84 @@
1
1
  import { registerPlugin } from '@capacitor/core';
2
- const NFC = registerPlugin('NFC');
2
+ const NFCPlug = registerPlugin('NFC', {
3
+ web: () => import('./web').then(m => new m.NFCWeb()),
4
+ });
3
5
  export * from './definitions';
4
- export { NFC };
6
+ export const NFC = {
7
+ isSupported: NFCPlug.isSupported.bind(NFCPlug),
8
+ startScan: NFCPlug.startScan.bind(NFCPlug),
9
+ cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),
10
+ onRead: (func) => NFC.wrapperListeners.push(func),
11
+ onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),
12
+ onError: (errorFn) => {
13
+ NFCPlug.addListener(`nfcError`, errorFn);
14
+ },
15
+ removeAllListeners: (eventName) => {
16
+ NFC.wrapperListeners = [];
17
+ return NFCPlug.removeAllListeners(eventName);
18
+ },
19
+ wrapperListeners: [],
20
+ async writeNDEF(options) {
21
+ var _a;
22
+ 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;
31
+ if (!payload)
32
+ throw 'Unsupported payload type';
33
+ return {
34
+ type: record.type,
35
+ payload,
36
+ };
37
+ })) !== null && _a !== void 0 ? _a : [],
38
+ };
39
+ await NFCPlug.writeNDEF(ndefMessage);
40
+ },
41
+ };
42
+ const decodeBase64 = (base64Payload) => {
43
+ return atob(base64Payload)
44
+ .split('')
45
+ .map((char) => char.charCodeAt(0));
46
+ };
47
+ const mapPayloadTo = (type, data) => {
48
+ 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
+ }))
63
+ };
64
+ };
65
+ NFCPlug.addListener(`nfcTag`, data => {
66
+ const wrappedData = {
67
+ base64() {
68
+ return mapPayloadTo("b64", data);
69
+ },
70
+ string() {
71
+ return mapPayloadTo("string", data);
72
+ },
73
+ uint8Array() {
74
+ return mapPayloadTo("uint8Array", data);
75
+ },
76
+ numberArray() {
77
+ return mapPayloadTo("numberArray", data);
78
+ }
79
+ };
80
+ for (const listener of NFC.wrapperListeners) {
81
+ listener(wrappedData);
82
+ }
83
+ });
5
84
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,GAAG,GAAG,cAAc,CAAY,KAAK,CAAC,CAAC;AAE7C,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\nimport type { NFCPlugin } from './definitions';\n\nconst NFC = registerPlugin<NFCPlugin>('NFC');\n\nexport * from './definitions';\nexport { NFC };\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 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})"]}
@@ -0,0 +1,14 @@
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[];
5
+ isSupported(): Promise<{
6
+ supported: boolean;
7
+ }>;
8
+ startScan(): Promise<void>;
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>;
14
+ }
@@ -0,0 +1,31 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ export class NFCWeb extends WebPlugin {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.wrapperListeners = [];
6
+ }
7
+ isSupported() {
8
+ return Promise.resolve({ supported: false });
9
+ }
10
+ startScan() {
11
+ return Promise.reject(new Error('NFC is not supported on web'));
12
+ }
13
+ cancelWriteAndroid() {
14
+ return Promise.reject(new Error('NFC is not supported on web'));
15
+ }
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'));
29
+ }
30
+ }
31
+ //# sourceMappingURL=web.js.map
@@ -0,0 +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}"]}
@@ -4,7 +4,122 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var core = require('@capacitor/core');
6
6
 
7
- const NFC = core.registerPlugin('NFC');
7
+ const NFCPlug = core.registerPlugin('NFC', {
8
+ web: () => Promise.resolve().then(function () { return web; }).then(m => new m.NFCWeb()),
9
+ });
10
+ const NFC = {
11
+ isSupported: NFCPlug.isSupported.bind(NFCPlug),
12
+ startScan: NFCPlug.startScan.bind(NFCPlug),
13
+ cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),
14
+ onRead: (func) => NFC.wrapperListeners.push(func),
15
+ onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),
16
+ onError: (errorFn) => {
17
+ NFCPlug.addListener(`nfcError`, errorFn);
18
+ },
19
+ removeAllListeners: (eventName) => {
20
+ NFC.wrapperListeners = [];
21
+ return NFCPlug.removeAllListeners(eventName);
22
+ },
23
+ wrapperListeners: [],
24
+ async writeNDEF(options) {
25
+ var _a;
26
+ const ndefMessage = {
27
+ records: (_a = options === null || options === void 0 ? void 0 : options.records.map((record) => {
28
+ const payload = typeof record.payload === 'string'
29
+ ? Array.from(new TextEncoder().encode(record.payload))
30
+ : Array.isArray(record.payload)
31
+ ? record.payload
32
+ : record.payload instanceof Uint8Array
33
+ ? Array.from(record.payload)
34
+ : null;
35
+ if (!payload)
36
+ throw 'Unsupported payload type';
37
+ return {
38
+ type: record.type,
39
+ payload,
40
+ };
41
+ })) !== null && _a !== void 0 ? _a : [],
42
+ };
43
+ await NFCPlug.writeNDEF(ndefMessage);
44
+ },
45
+ };
46
+ const decodeBase64 = (base64Payload) => {
47
+ return atob(base64Payload)
48
+ .split('')
49
+ .map((char) => char.charCodeAt(0));
50
+ };
51
+ const mapPayloadTo = (type, data) => {
52
+ return {
53
+ messages: data.messages.map(message => ({
54
+ records: message.records.map(record => ({
55
+ type: record.type,
56
+ payload: type === "b64"
57
+ ? record.payload
58
+ : type === "string"
59
+ ? decodeBase64(record.payload)
60
+ : type === "uint8Array"
61
+ ? new Uint8Array(decodeBase64(record.payload))
62
+ : type === "numberArray"
63
+ ? Array.from(decodeBase64(record.payload))
64
+ : record.payload
65
+ }))
66
+ }))
67
+ };
68
+ };
69
+ NFCPlug.addListener(`nfcTag`, data => {
70
+ const wrappedData = {
71
+ base64() {
72
+ return mapPayloadTo("b64", data);
73
+ },
74
+ string() {
75
+ return mapPayloadTo("string", data);
76
+ },
77
+ uint8Array() {
78
+ return mapPayloadTo("uint8Array", data);
79
+ },
80
+ numberArray() {
81
+ return mapPayloadTo("numberArray", data);
82
+ }
83
+ };
84
+ for (const listener of NFC.wrapperListeners) {
85
+ listener(wrappedData);
86
+ }
87
+ });
88
+
89
+ class NFCWeb extends core.WebPlugin {
90
+ constructor() {
91
+ super(...arguments);
92
+ this.wrapperListeners = [];
93
+ }
94
+ isSupported() {
95
+ return Promise.resolve({ supported: false });
96
+ }
97
+ startScan() {
98
+ return Promise.reject(new Error('NFC is not supported on web'));
99
+ }
100
+ cancelWriteAndroid() {
101
+ return Promise.reject(new Error('NFC is not supported on web'));
102
+ }
103
+ writeNDEF() {
104
+ return Promise.reject(new Error('NFC is not supported on web'));
105
+ }
106
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
107
+ onRead(_func) {
108
+ return Promise.reject(new Error('NFC is not supported on web'));
109
+ }
110
+ onWrite() {
111
+ return Promise.reject(new Error('NFC is not supported on web'));
112
+ }
113
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
114
+ onError(_errorFn) {
115
+ return Promise.reject(new Error('NFC is not supported on web'));
116
+ }
117
+ }
118
+
119
+ var web = /*#__PURE__*/Object.freeze({
120
+ __proto__: null,
121
+ NFCWeb: NFCWeb
122
+ });
8
123
 
9
124
  exports.NFC = NFC;
10
125
  //# sourceMappingURL=plugin.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst NFC = registerPlugin('NFC');\nexport * from './definitions';\nexport { NFC };\n//# sourceMappingURL=index.js.map"],"names":["registerPlugin"],"mappings":";;;;;;AACK,MAAC,GAAG,GAAGA,mBAAc,CAAC,KAAK;;;;"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst NFCPlug = registerPlugin('NFC', {\n web: () => import('./web').then(m => new m.NFCWeb()),\n});\nexport * from './definitions';\nexport const NFC = {\n isSupported: NFCPlug.isSupported.bind(NFCPlug),\n startScan: NFCPlug.startScan.bind(NFCPlug),\n cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),\n onRead: (func) => NFC.wrapperListeners.push(func),\n onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),\n onError: (errorFn) => {\n NFCPlug.addListener(`nfcError`, errorFn);\n },\n removeAllListeners: (eventName) => {\n NFC.wrapperListeners = [];\n return NFCPlug.removeAllListeners(eventName);\n },\n wrapperListeners: [],\n async writeNDEF(options) {\n var _a;\n const ndefMessage = {\n records: (_a = options === null || options === void 0 ? void 0 : options.records.map((record) => {\n const payload = 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 if (!payload)\n throw 'Unsupported payload type';\n return {\n type: record.type,\n payload,\n };\n })) !== null && _a !== void 0 ? _a : [],\n };\n await NFCPlug.writeNDEF(ndefMessage);\n },\n};\nconst decodeBase64 = (base64Payload) => {\n return atob(base64Payload)\n .split('')\n .map((char) => char.charCodeAt(0));\n};\nconst mapPayloadTo = (type, data) => {\n return {\n messages: data.messages.map(message => ({\n records: message.records.map(record => ({\n type: record.type,\n payload: 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 };\n};\nNFCPlug.addListener(`nfcTag`, data => {\n const wrappedData = {\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 for (const listener of NFC.wrapperListeners) {\n listener(wrappedData);\n }\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class NFCWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.wrapperListeners = [];\n }\n isSupported() {\n return Promise.resolve({ supported: false });\n }\n startScan() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n cancelWriteAndroid() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n writeNDEF() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onRead(_func) {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n onWrite() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onError(_errorFn) {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;;;AACA,MAAM,OAAO,GAAGA,mBAAc,CAAC,KAAK,EAAE;AACtC,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AACxD,CAAC,CAAC,CAAC;AAES,MAAC,GAAG,GAAG;AACnB,IAAI,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;AAClD,IAAI,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9C,IAAI,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;AAChE,IAAI,MAAM,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;AACrD,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC;AACnE,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK;AAC1B,QAAQ,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACjD,KAAK;AACL,IAAI,kBAAkB,EAAE,CAAC,SAAS,KAAK;AACvC,QAAQ,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAClC,QAAQ,OAAO,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrD,KAAK;AACL,IAAI,gBAAgB,EAAE,EAAE;AACxB,IAAI,MAAM,SAAS,CAAC,OAAO,EAAE;AAC7B,QAAQ,IAAI,EAAE,CAAC;AACf,QAAQ,MAAM,WAAW,GAAG;AAC5B,YAAY,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK;AAC7G,gBAAgB,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;AAClE,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1E,sBAAsB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;AACnD,0BAA0B,MAAM,CAAC,OAAO;AACxC,0BAA0B,MAAM,CAAC,OAAO,YAAY,UAAU;AAC9D,8BAA8B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AACxD,8BAA8B,IAAI,CAAC;AACnC,gBAAgB,IAAI,CAAC,OAAO;AAC5B,oBAAoB,MAAM,0BAA0B,CAAC;AACrD,gBAAgB,OAAO;AACvB,oBAAoB,IAAI,EAAE,MAAM,CAAC,IAAI;AACrC,oBAAoB,OAAO;AAC3B,iBAAiB,CAAC;AAClB,aAAa,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE;AACnD,SAAS,CAAC;AACV,QAAQ,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AAC7C,KAAK;AACL,EAAE;AACF,MAAM,YAAY,GAAG,CAAC,aAAa,KAAK;AACxC,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC;AAC9B,SAAS,KAAK,CAAC,EAAE,CAAC;AAClB,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC;AACF,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK;AACrC,IAAI,OAAO;AACX,QAAQ,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,KAAK;AAChD,YAAY,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK;AACpD,gBAAgB,IAAI,EAAE,MAAM,CAAC,IAAI;AACjC,gBAAgB,OAAO,EAAE,IAAI,KAAK,KAAK;AACvC,sBAAsB,MAAM,CAAC,OAAO;AACpC,sBAAsB,IAAI,KAAK,QAAQ;AACvC,0BAA0B,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;AACtD,0BAA0B,IAAI,KAAK,YAAY;AAC/C,8BAA8B,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1E,8BAA8B,IAAI,KAAK,aAAa;AACpD,kCAAkC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1E,kCAAkC,MAAM,CAAC,OAAO;AAChD,aAAa,CAAC,CAAC;AACf,SAAS,CAAC,CAAC;AACX,KAAK,CAAC;AACN,CAAC,CAAC;AACF,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI;AACtC,IAAI,MAAM,WAAW,GAAG;AACxB,QAAQ,MAAM,GAAG;AACjB,YAAY,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC7C,SAAS;AACT,QAAQ,MAAM,GAAG;AACjB,YAAY,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAChD,SAAS;AACT,QAAQ,UAAU,GAAG;AACrB,YAAY,OAAO,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AACpD,SAAS;AACT,QAAQ,WAAW,GAAG;AACtB,YAAY,OAAO,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AACrD,SAAS;AACT,KAAK,CAAC;AACN,IAAI,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,gBAAgB,EAAE;AACjD,QAAQ,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC9B,KAAK;AACL,CAAC,CAAC;;ACjFK,MAAM,MAAM,SAASC,cAAS,CAAC;AACtC,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AAC5B,QAAQ,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AACnC,KAAK;AACL,IAAI,WAAW,GAAG;AAClB,QAAQ,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AACrD,KAAK;AACL,IAAI,SAAS,GAAG;AAChB,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACxE,KAAK;AACL,IAAI,kBAAkB,GAAG;AACzB,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACxE,KAAK;AACL,IAAI,SAAS,GAAG;AAChB,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACxE,KAAK;AACL;AACA,IAAI,MAAM,CAAC,KAAK,EAAE;AAClB,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACxE,KAAK;AACL,IAAI,OAAO,GAAG;AACd,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACxE,KAAK;AACL;AACA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACtB,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACxE,KAAK;AACL;;;;;;;;;"}
package/dist/plugin.js CHANGED
@@ -1,13 +1,128 @@
1
1
  var capacitorNFC = (function (exports, core) {
2
- 'use strict';
2
+ 'use strict';
3
3
 
4
- const NFC = core.registerPlugin('NFC');
4
+ const NFCPlug = core.registerPlugin('NFC', {
5
+ web: () => Promise.resolve().then(function () { return web; }).then(m => new m.NFCWeb()),
6
+ });
7
+ const NFC = {
8
+ isSupported: NFCPlug.isSupported.bind(NFCPlug),
9
+ startScan: NFCPlug.startScan.bind(NFCPlug),
10
+ cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),
11
+ onRead: (func) => NFC.wrapperListeners.push(func),
12
+ onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),
13
+ onError: (errorFn) => {
14
+ NFCPlug.addListener(`nfcError`, errorFn);
15
+ },
16
+ removeAllListeners: (eventName) => {
17
+ NFC.wrapperListeners = [];
18
+ return NFCPlug.removeAllListeners(eventName);
19
+ },
20
+ wrapperListeners: [],
21
+ async writeNDEF(options) {
22
+ var _a;
23
+ const ndefMessage = {
24
+ records: (_a = options === null || options === void 0 ? void 0 : options.records.map((record) => {
25
+ const payload = typeof record.payload === 'string'
26
+ ? Array.from(new TextEncoder().encode(record.payload))
27
+ : Array.isArray(record.payload)
28
+ ? record.payload
29
+ : record.payload instanceof Uint8Array
30
+ ? Array.from(record.payload)
31
+ : null;
32
+ if (!payload)
33
+ throw 'Unsupported payload type';
34
+ return {
35
+ type: record.type,
36
+ payload,
37
+ };
38
+ })) !== null && _a !== void 0 ? _a : [],
39
+ };
40
+ await NFCPlug.writeNDEF(ndefMessage);
41
+ },
42
+ };
43
+ const decodeBase64 = (base64Payload) => {
44
+ return atob(base64Payload)
45
+ .split('')
46
+ .map((char) => char.charCodeAt(0));
47
+ };
48
+ const mapPayloadTo = (type, data) => {
49
+ return {
50
+ messages: data.messages.map(message => ({
51
+ records: message.records.map(record => ({
52
+ type: record.type,
53
+ payload: type === "b64"
54
+ ? record.payload
55
+ : type === "string"
56
+ ? decodeBase64(record.payload)
57
+ : type === "uint8Array"
58
+ ? new Uint8Array(decodeBase64(record.payload))
59
+ : type === "numberArray"
60
+ ? Array.from(decodeBase64(record.payload))
61
+ : record.payload
62
+ }))
63
+ }))
64
+ };
65
+ };
66
+ NFCPlug.addListener(`nfcTag`, data => {
67
+ const wrappedData = {
68
+ base64() {
69
+ return mapPayloadTo("b64", data);
70
+ },
71
+ string() {
72
+ return mapPayloadTo("string", data);
73
+ },
74
+ uint8Array() {
75
+ return mapPayloadTo("uint8Array", data);
76
+ },
77
+ numberArray() {
78
+ return mapPayloadTo("numberArray", data);
79
+ }
80
+ };
81
+ for (const listener of NFC.wrapperListeners) {
82
+ listener(wrappedData);
83
+ }
84
+ });
5
85
 
6
- exports.NFC = NFC;
86
+ class NFCWeb extends core.WebPlugin {
87
+ constructor() {
88
+ super(...arguments);
89
+ this.wrapperListeners = [];
90
+ }
91
+ isSupported() {
92
+ return Promise.resolve({ supported: false });
93
+ }
94
+ startScan() {
95
+ return Promise.reject(new Error('NFC is not supported on web'));
96
+ }
97
+ cancelWriteAndroid() {
98
+ return Promise.reject(new Error('NFC is not supported on web'));
99
+ }
100
+ writeNDEF() {
101
+ return Promise.reject(new Error('NFC is not supported on web'));
102
+ }
103
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
104
+ onRead(_func) {
105
+ return Promise.reject(new Error('NFC is not supported on web'));
106
+ }
107
+ onWrite() {
108
+ return Promise.reject(new Error('NFC is not supported on web'));
109
+ }
110
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
111
+ onError(_errorFn) {
112
+ return Promise.reject(new Error('NFC is not supported on web'));
113
+ }
114
+ }
7
115
 
8
- Object.defineProperty(exports, '__esModule', { value: true });
116
+ var web = /*#__PURE__*/Object.freeze({
117
+ __proto__: null,
118
+ NFCWeb: NFCWeb
119
+ });
9
120
 
10
- return exports;
121
+ exports.NFC = NFC;
122
+
123
+ Object.defineProperty(exports, '__esModule', { value: true });
124
+
125
+ return exports;
11
126
 
12
127
  })({}, capacitorExports);
13
128
  //# sourceMappingURL=plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["esm/index.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst NFC = registerPlugin('NFC');\nexport * from './definitions';\nexport { NFC };\n//# sourceMappingURL=index.js.map"],"names":["registerPlugin"],"mappings":";;;AACK,OAAC,GAAG,GAAGA,mBAAc,CAAC,KAAK;;;;;;;;;;;;"}
1
+ {"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst NFCPlug = registerPlugin('NFC', {\n web: () => import('./web').then(m => new m.NFCWeb()),\n});\nexport * from './definitions';\nexport const NFC = {\n isSupported: NFCPlug.isSupported.bind(NFCPlug),\n startScan: NFCPlug.startScan.bind(NFCPlug),\n cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),\n onRead: (func) => NFC.wrapperListeners.push(func),\n onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),\n onError: (errorFn) => {\n NFCPlug.addListener(`nfcError`, errorFn);\n },\n removeAllListeners: (eventName) => {\n NFC.wrapperListeners = [];\n return NFCPlug.removeAllListeners(eventName);\n },\n wrapperListeners: [],\n async writeNDEF(options) {\n var _a;\n const ndefMessage = {\n records: (_a = options === null || options === void 0 ? void 0 : options.records.map((record) => {\n const payload = 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 if (!payload)\n throw 'Unsupported payload type';\n return {\n type: record.type,\n payload,\n };\n })) !== null && _a !== void 0 ? _a : [],\n };\n await NFCPlug.writeNDEF(ndefMessage);\n },\n};\nconst decodeBase64 = (base64Payload) => {\n return atob(base64Payload)\n .split('')\n .map((char) => char.charCodeAt(0));\n};\nconst mapPayloadTo = (type, data) => {\n return {\n messages: data.messages.map(message => ({\n records: message.records.map(record => ({\n type: record.type,\n payload: 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 };\n};\nNFCPlug.addListener(`nfcTag`, data => {\n const wrappedData = {\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 for (const listener of NFC.wrapperListeners) {\n listener(wrappedData);\n }\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class NFCWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.wrapperListeners = [];\n }\n isSupported() {\n return Promise.resolve({ supported: false });\n }\n startScan() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n cancelWriteAndroid() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n writeNDEF() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onRead(_func) {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n onWrite() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onError(_errorFn) {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
@@ -7,6 +7,8 @@ public class NFCPlugin: CAPPlugin, CAPBridgedPlugin {
7
7
  public let identifier = "NFCPlugin"
8
8
  public let jsName = "NFC"
9
9
  public let pluginMethods: [CAPPluginMethod] = [
10
+ CAPPluginMethod(name: "isSupported", returnType: CAPPluginReturnPromise),
11
+ CAPPluginMethod(name: "cancelWriteAndroid", returnType: CAPPluginReturnPromise),
10
12
  CAPPluginMethod(name: "startScan", returnType: CAPPluginReturnPromise),
11
13
  CAPPluginMethod(name: "writeNDEF", returnType: CAPPluginReturnPromise)
12
14
  ]
@@ -14,6 +16,14 @@ public class NFCPlugin: CAPPlugin, CAPBridgedPlugin {
14
16
  private let reader = NFCReader()
15
17
  private let writer = NFCWriter()
16
18
 
19
+ @objc func isSupported(_ call: CAPPluginCall) {
20
+ call.resolve(["supported": NFCNDEFReaderSession.readingAvailable])
21
+ }
22
+
23
+ @objc func cancelWriteAndroid(_ call: CAPPluginCall) {
24
+ call.reject("Function not implemented for iOS")
25
+ }
26
+
17
27
  @objc func startScan(_ call: CAPPluginCall) {
18
28
  print("startScan called")
19
29
  reader.onNDEFMessageReceived = { messages in
@@ -22,10 +32,11 @@ public class NFCPlugin: CAPPlugin, CAPBridgedPlugin {
22
32
  var records = [[String: Any]]()
23
33
  for record in message.records {
24
34
  let recordType = String(data: record.type, encoding: .utf8) ?? ""
25
- let payload = String(data: record.payload, encoding: .utf8) ?? ""
35
+ let payloadData = record.payload.base64EncodedString()
36
+
26
37
  records.append([
27
38
  "type": recordType,
28
- "payload": payload
39
+ "payload": payloadData
29
40
  ])
30
41
  }
31
42
  ndefMessages.append([
@@ -58,11 +69,23 @@ public class NFCPlugin: CAPPlugin, CAPBridgedPlugin {
58
69
  var ndefRecords = [NFCNDEFPayload]()
59
70
  for recordData in recordsData {
60
71
  guard let type = recordData["type"] as? String,
61
- let payload = recordData["payload"] as? String,
62
- let typeData = type.data(using: .utf8),
63
- let payloadData = payload.data(using: .utf8) else {
72
+ let payload = recordData["payload"] as? [NSNumber],
73
+ let typeData = type.data(using: .utf8)
74
+ else {
75
+ print("Skipping record due to missing or invalid record")
64
76
  continue
65
77
  }
78
+
79
+ guard let payloadArray = payload as [NSNumber]? else {
80
+ print("Skipping record due to missing or invalid 'payload' (expected array of numbers)")
81
+ continue
82
+ }
83
+
84
+ var payloadBytes = [UInt8]()
85
+ for number in payloadArray {
86
+ payloadBytes.append(number.uint8Value)
87
+ }
88
+ let payloadData = Data(payloadBytes)
66
89
 
67
90
  let ndefRecord = NFCNDEFPayload(
68
91
  format: .nfcWellKnown,
@@ -80,6 +80,7 @@ import CoreNFC
80
80
  }
81
81
 
82
82
  if let message = message {
83
+ print("NDEF message read: \(message)")
83
84
  statusMessage = "Found 1 NDEF message."
84
85
  session.alertMessage = statusMessage
85
86
  session.invalidate()