interface Navigator {
};
dictionary NFCMessage {
    sequence records;
    USVString           url;
};

typedef (DOMString or unrestricted double or ArrayBuffer or Dictionary) NFCRecordData;

dictionary NFCRecord {
    NFCRecordType recordType;
    USVString     mediaType;
    NFCRecordData data;
};

enum NFCRecordType {
    "empty",
    "text",
    "url",
    "json",
    "opaque"
};

partial interface Navigator {
    readonly attribute NFC nfc;
};

typedef (DOMString or ArrayBuffer or NFCMessage) NFCPushMessage;

interface NFC {
    Promise push(NFCPushMessage message, optional NFCPushOptions options);
    Promise cancelPush(optional NFCPushTarget target = "any");
    Promise watch(MessageCallback callback,
                        optional NFCWatchOptions options);
    Promise cancelWatch(optional long id);
};

callback MessageCallback = void (NFCMessage message);

dictionary NFCPushOptions {
    NFCPushTarget       target = "any";
    unrestricted double timeout = Infinity;
    boolean             ignoreRead = true;
};

enum NFCPushTarget {
    "tag",
    "peer",
    "any"
};

dictionary NFCWatchOptions {
    USVString      url = "";
    NFCRecordType? recordType;
    USVString      mediaType = "";
    NFCWatchMode   mode = "web-nfc-only";
};

enum NFCWatchMode {
    "web-nfc-only",
    "any"
};