Skip to content

Commit

Permalink
Add support for Web NFC API
Browse files Browse the repository at this point in the history
Co-authored-by: zetashift <rskaraya@gmail.com>
Co-authored-by: Arman Bilge <armanbilge@gmail.com>
  • Loading branch information
3 people committed Sep 28, 2023
1 parent 7d0508c commit 1cc5447
Show file tree
Hide file tree
Showing 9 changed files with 316 additions and 0 deletions.
50 changes: 50 additions & 0 deletions api-reports/2_12.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16454,6 +16454,56 @@ MutationRecord[JT] def previousSibling: Node
MutationRecord[JT] def removedNodes: NodeList[Node]
MutationRecord[JT] def target: Node
MutationRecord[JT] def `type`: String
NDEFMessage[JC] var records: FrozenArray[NDEFRecord]
NDEFReader[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
NDEFReader[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
NDEFReader[JC] def dispatchEvent(evt: Event): Boolean
NDEFReader[JC] var onreading: js.Function1[NDEFReadingEvent, Any]
NDEFReader[JC] var onreadingerror: js.Function1[Event, Any]
NDEFReader[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
NDEFReader[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
NDEFReader[JC] def scan(options: NDEFScanOptions?): js.Promise[Unit]
NDEFReader[JC] def write(message: String): js.Promise[Unit]
NDEFReader[JC] def write(message: String, options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.Array[NDEFRecord]): js.Promise[Unit]
NDEFReader[JC] def write(message: js.Array[NDEFRecord], options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.ArrayBuffer): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.ArrayBuffer, options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.DataView): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.DataView, options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.TypedArray[_, _], options: NDEFWriteOptions?): js.Promise[Unit]
NDEFReadingEvent[JT] def bubbles: Boolean
NDEFReadingEvent[JT] def cancelBubble: Boolean
NDEFReadingEvent[JT] def cancelable: Boolean
NDEFReadingEvent[JT] def composed: Boolean
NDEFReadingEvent[JT] def currentTarget: EventTarget
NDEFReadingEvent[JT] def defaultPrevented: Boolean
NDEFReadingEvent[JT] def eventPhase: Int
NDEFReadingEvent[JT] def isTrusted: Boolean
NDEFReadingEvent[JT] var message: NDEFMessage
NDEFReadingEvent[JT] def preventDefault(): Unit
NDEFReadingEvent[JT] var serialNumber: String
NDEFReadingEvent[JT] def stopImmediatePropagation(): Unit
NDEFReadingEvent[JT] def stopPropagation(): Unit
NDEFReadingEvent[JT] def target: EventTarget
NDEFReadingEvent[JT] def timeStamp: Double
NDEFReadingEvent[JT] def `type`: String
NDEFRecord[JC] var data: js.typedarray.DataView
NDEFRecord[JC] var encoding: js.UndefOr[String]
NDEFRecord[JC] var id: js.UndefOr[String]
NDEFRecord[JC] var lang: js.UndefOr[String]
NDEFRecord[JC] var mediaType: js.UndefOr[String]
NDEFRecord[JC] var recordType: String
NDEFRecord[JC] def toRecords(): js.Array[NDEFRecord]
NDEFRecordInit[JT] def data: js.UndefOr[String | js.typedarray.DataView | js.typedarray.ArrayBuffer | js.typedarray.TypedArray[_, _] | js.typedarray.DataView | js.Array[NDEFRecord]]
NDEFRecordInit[JT] def encoding: js.UndefOr[String]
NDEFRecordInit[JT] def id: js.UndefOr[String]
NDEFRecordInit[JT] def lang: js.UndefOr[String]
NDEFRecordInit[JT] def mediaType: js.UndefOr[String]
NDEFRecordInit[JT] def recordType: js.UndefOr[String]
NDEFScanOptions[JT] def signal: js.UndefOr[AbortSignal]
NDEFWriteOptions[JT] def overwrite: Boolean
NDEFWriteOptions[JT] def signal: js.UndefOr[AbortSignal]
NamedNodeMap[JC] @scala.scalajs.js.annotation.JSBracketAccess def apply(index: Int): Attr
NamedNodeMap[JC] def getNamedItem(name: String): Attr
NamedNodeMap[JC] def getNamedItemNS(namespaceURI: String, localName: String): Attr
Expand Down
50 changes: 50 additions & 0 deletions api-reports/2_13.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16454,6 +16454,56 @@ MutationRecord[JT] def previousSibling: Node
MutationRecord[JT] def removedNodes: NodeList[Node]
MutationRecord[JT] def target: Node
MutationRecord[JT] def `type`: String
NDEFMessage[JC] var records: FrozenArray[NDEFRecord]
NDEFReader[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
NDEFReader[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
NDEFReader[JC] def dispatchEvent(evt: Event): Boolean
NDEFReader[JC] var onreading: js.Function1[NDEFReadingEvent, Any]
NDEFReader[JC] var onreadingerror: js.Function1[Event, Any]
NDEFReader[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit
NDEFReader[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit
NDEFReader[JC] def scan(options: NDEFScanOptions?): js.Promise[Unit]
NDEFReader[JC] def write(message: String): js.Promise[Unit]
NDEFReader[JC] def write(message: String, options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.Array[NDEFRecord]): js.Promise[Unit]
NDEFReader[JC] def write(message: js.Array[NDEFRecord], options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.ArrayBuffer): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.ArrayBuffer, options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.DataView): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.DataView, options: NDEFWriteOptions): js.Promise[Unit]
NDEFReader[JC] def write(message: js.typedarray.TypedArray[_, _], options: NDEFWriteOptions?): js.Promise[Unit]
NDEFReadingEvent[JT] def bubbles: Boolean
NDEFReadingEvent[JT] def cancelBubble: Boolean
NDEFReadingEvent[JT] def cancelable: Boolean
NDEFReadingEvent[JT] def composed: Boolean
NDEFReadingEvent[JT] def currentTarget: EventTarget
NDEFReadingEvent[JT] def defaultPrevented: Boolean
NDEFReadingEvent[JT] def eventPhase: Int
NDEFReadingEvent[JT] def isTrusted: Boolean
NDEFReadingEvent[JT] var message: NDEFMessage
NDEFReadingEvent[JT] def preventDefault(): Unit
NDEFReadingEvent[JT] var serialNumber: String
NDEFReadingEvent[JT] def stopImmediatePropagation(): Unit
NDEFReadingEvent[JT] def stopPropagation(): Unit
NDEFReadingEvent[JT] def target: EventTarget
NDEFReadingEvent[JT] def timeStamp: Double
NDEFReadingEvent[JT] def `type`: String
NDEFRecord[JC] var data: js.typedarray.DataView
NDEFRecord[JC] var encoding: js.UndefOr[String]
NDEFRecord[JC] var id: js.UndefOr[String]
NDEFRecord[JC] var lang: js.UndefOr[String]
NDEFRecord[JC] var mediaType: js.UndefOr[String]
NDEFRecord[JC] var recordType: String
NDEFRecord[JC] def toRecords(): js.Array[NDEFRecord]
NDEFRecordInit[JT] def data: js.UndefOr[String | js.typedarray.DataView | js.typedarray.ArrayBuffer | js.typedarray.TypedArray[_, _] | js.typedarray.DataView | js.Array[NDEFRecord]]
NDEFRecordInit[JT] def encoding: js.UndefOr[String]
NDEFRecordInit[JT] def id: js.UndefOr[String]
NDEFRecordInit[JT] def lang: js.UndefOr[String]
NDEFRecordInit[JT] def mediaType: js.UndefOr[String]
NDEFRecordInit[JT] def recordType: js.UndefOr[String]
NDEFScanOptions[JT] def signal: js.UndefOr[AbortSignal]
NDEFWriteOptions[JT] def overwrite: Boolean
NDEFWriteOptions[JT] def signal: js.UndefOr[AbortSignal]
NamedNodeMap[JC] @scala.scalajs.js.annotation.JSBracketAccess def apply(index: Int): Attr
NamedNodeMap[JC] def getNamedItem(name: String): Attr
NamedNodeMap[JC] def getNamedItemNS(namespaceURI: String, localName: String): Attr
Expand Down
19 changes: 19 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NDEFMessage.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.scalajs.dom

import scala.scalajs.js
import scala.scalajs.js.annotation.JSGlobal

/** The [[NDEFMessage]] interface of the Web NFC API represents the content of an NDEF message that has been read from
* or could be written to an NFC tag. An instance is acquired by calling the NDEFMessage() constructor or from the
* NDEFReadingEvent.message property, which is passed to the reading event.
*
* @param records
* The records property of NDEFMessage interface represents a list of NDEFRecords present in the NDEF message.
*/
@js.native
@JSGlobal
class NDEFMessage(recordsAgr: js.Array[NDEFRecordInit]) extends js.Object {

/** Returns the list of NDEF records contained in the message. */
var records: FrozenArray[NDEFRecord] = js.native
}
60 changes: 60 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NDEFReader.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package org.scalajs.dom

import scala.scalajs.js
import scala.scalajs.js.annotation.JSGlobal

/** The [[NDEFReader]] interface of the Web NFC API (https://developer.mozilla.org/en-US/docs/Web/API/Web_NFC_API) is
* used to read from and write data to compatible NFC devices, e.g. NFC tags supporting NDEF, when these devices are
* within the reader's magnetic induction field.
*/
@JSGlobal("NDEFReader")
@js.native
class NDEFReader() extends EventTarget {

/** Activates a reading device and returns a Promise that either resolves when an NFC tag read operation is scheduled
* or rejects if a hardware or permission error is encountered. This method triggers a permission prompt if the "nfc"
* permission has not been previously granted.
*
* @return
* a Promise that resolves immediately after scheduling read operations for the NFC adapter.
*/
def scan(options: NDEFScanOptions = js.native): js.Promise[Unit] = js.native

/** Attempts to write an NDEF message to a tag and returns a Promise that either resolves when a message has been
* written to the tag or rejects if a hardware or permission error is encountered. This method triggers a permission
* prompt if the "nfc" permission has not been previously granted.
*
* @param message
* The message to be written, either a string object or literal, an ArrayBuffer, a TypedArray, a DataView, or an
* array of records. A record has the following members:
* @param options
* An object with the following properties:
*
* @return
* a Promise that either resolves when a message has been written to the tag or rejects if a hardware or permission
* error is encountered.
*/
def write(message: String, options: NDEFWriteOptions): js.Promise[Unit] = js.native
def write(message: js.typedarray.ArrayBuffer, options: NDEFWriteOptions): js.Promise[Unit] = js.native

def write(message: js.typedarray.TypedArray[_, _],
options: NDEFWriteOptions = js.native): js.Promise[Unit] = js.native
def write(message: js.typedarray.DataView, options: NDEFWriteOptions): js.Promise[Unit] = js.native
def write(message: js.Array[NDEFRecord], options: NDEFWriteOptions): js.Promise[Unit] = js.native

def write(message: String): js.Promise[Unit] = js.native
def write(message: js.typedarray.ArrayBuffer): js.Promise[Unit] = js.native
// def write(message:js.typedarray.TypedArray[NDEFRecord, ???]): js.Promise[Unit] = js.native
def write(message: js.typedarray.DataView): js.Promise[Unit] = js.native
def write(message: js.Array[NDEFRecord]): js.Promise[Unit] = js.native

/** The reading event of the NDEFReader interface is fired whenever a new reading is available from compatible NFC
* devices (e.g. NFC tags supporting NDEF) when these devices are within the reader's magnetic induction field.
*/
var onreading: js.Function1[NDEFReadingEvent, Any] = js.native

/** The readingerror event of the NDEFReader interface is fired whenever an error occurs during reading of NFC tags,
* e.g. when tags leave the reader's magnetic induction field.
*/
var onreadingerror: js.Function1[Event, Any] = js.native
}
22 changes: 22 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NDEFReadingEvent.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.scalajs.dom

import scala.scalajs.js

/** The NDEFReadingEvent interface of the Web NFC API represents events dispatched on new NFC readings obtained by
* NDEFReader.
*
* @see
* https://developer.mozilla.org/en-US/docs/Web/API/NDEFReadingEvent
*/
@js.native
trait NDEFReadingEvent extends Event {

/** Returns an NDEFMessage object containing the received message. */
var message: NDEFMessage = js.native

/** Returns the serial number of the device, which is used for anti-collision and identification, or an empty string
* if no serial number is available.
*/
var serialNumber: String = js.native

}
41 changes: 41 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NDEFRecord.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.scalajs.dom

import scala.scalajs.js
import scala.scalajs.js.annotation.JSGlobal

/** The [[NDEFRecord]] interface of the Web NFC API provides data that can be read from, or written to, compatible NFC
* devices, e.g. NFC tags supporting NDEF.
*/
@js.native
@JSGlobal
class NDEFRecord(options: NDEFRecordInit) extends js.Object {

/** Returns the record type of the record. Records must have either a standardized well-known type name such as
* "empty", "text", "url", "smart-poster", "absolute-url", "mime", or "unknown" or else an external type name, which
* consists of a domain name and custom type name separated by a colon (":").
*/
var recordType: String = js.native

/** Returns the MIME type of the record. This value will be null if recordType is not equal to "mime". */
var mediaType: js.UndefOr[String] = js.native

/** Returns the record identifier, which is an absolute or relative URL used to identify the record.
*
* Note: The uniqueness of the identifier is enforced only by the generator of the record.
*/
var id: js.UndefOr[String] = js.native

/** Returns a DataView containing the raw bytes of the record's payload. */
var data: js.typedarray.DataView = js.native

/** Returns the encoding of a textual payload, or null otherwise. */
var encoding: js.UndefOr[String] = js.native

/** Returns the language of a textual payload, or null if one was not supplied. */
var lang: js.UndefOr[String] = js.native

/** Converts [[NDEFRecord.data]] to a sequence of records. This allows parsing the payloads of record types which may
* contain nested records, such as smart poster and external type records.
*/
def toRecords(): js.Array[NDEFRecord] = js.native
}
51 changes: 51 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NDEFRecordInit.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.scalajs.dom

import scala.scalajs.js
import scala.scalajs.js.|

/** @see
* https://developer.mozilla.org/en-US/docs/Web/API/NDEFMessage/NDEFMessage
* @see
* https://developer.mozilla.org/en-US/docs/Web/API/NDEFRecord/NDEFRecord
*/
trait NDEFRecordInit extends js.Object {

/** Contains the data to be transmitted. It can be a string object or literal, an ArrayBuffer, a TypedArray, a
* DataView, or an array of nested records.
*/
def data: js.UndefOr[
String |
js.typedarray.DataView |
js.typedarray.ArrayBuffer |
js.typedarray.TypedArray[_, _] |
js.typedarray.DataView |
js.Array[NDEFRecord]
] = js.undefined

/** A string specifying the record's encoding. */
def encoding: js.UndefOr[String] = js.undefined

/** A developer-defined identifier for the record. */
def id: js.UndefOr[String] = js.undefined

/** A valid language tag according to [RFC 5646: Tags for Identifying Languages (also known as BCP
* 47)](https://datatracker.ietf.org/doc/html/rfc5646).
*/
def lang: js.UndefOr[String] = js.undefined

/** A valid MIME type. */
def mediaType: js.UndefOr[String] = js.undefined

/** A string indicating the type of data stored in data.
*
* It must be one of the following values:
* - "absolute-url" - An absolute URL to the data.
* - "empty" - An empty NDEFRecord.
* - "mime" - A valid MIME type.
* - "smart-poster" - A smart poster as defined by the NDEF-SMARTPOSTER specification.
* - "text" - Text as defined by the NDEF-TEXT specification.
* - "unknown" - The record type is not known.
* - "URL" - A URL as defined by the NDEF-URI specification.
*/
def recordType: js.UndefOr[String] = js.undefined
}
9 changes: 9 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NDEFScanOptions.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.scalajs.dom

import scala.scalajs.js

trait NDEFScanOptions extends js.Object {

/** An AbortSignal that allows the current write operation to be canceled. */
def `signal`: js.UndefOr[AbortSignal] = js.undefined
}
14 changes: 14 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NDEFWriteOptions.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.scalajs.dom

import scala.scalajs.js

/** @see https://developer.mozilla.org/en-US/docs/Web/API/NDEFReader/write */
trait NDEFWriteOptions extends js.Object {

/** A boolean value specifying whether or not existing records should be overwritten, if such exists. */
def `overwrite`: Boolean

/** An AbortSignal that allows the current write operation to be canceled. */
def `signal`: js.UndefOr[AbortSignal] = js.undefined

}

0 comments on commit 1cc5447

Please sign in to comment.