{"version":3,"file":"vue-serial.mjs","sources":["../src/vue-serial.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\nimport { ref } from 'vue';\nimport type { Ref } from 'vue';\n\n// Default values\nconst default_baudRate = 115200;\nconst default_dataBits = 8;\nconst default_stopBits = 1;\nconst default_parity = \"none\";\nconst default_bufferSize = 255;\nconst default_flowControl = \"none\";\n\n// Ignore localStorage if not available\nconst localStorage = window.localStorage ?? {};\n\n// Declare VueSerial class\nexport default class VueSerial extends EventTarget {\n\n  /**\n   * Event which is triggered when data is received from the open device port.\n   * Call `serial.addEventListener(\"read\", ({ value }) => { ... })` to read incoming data.\n   * @event\n   */\n  static read: string;\n  \n  // Initialize private variables with their default values\n  #private = {\n    port: null as SerialPort|null,\n    reader: null as ReadableStreamDefaultReader<any>|null,\n    itv: null as ReturnType<typeof setTimeout> | null,\n    isPolling: false,\n    isOpen: ref(false),\n    isConnected: ref(false),\n    isClosing: ref(false),\n    usbVendorId: ref(undefined) as Ref<number | undefined>,\n    usbProductId: ref(undefined) as Ref<number | undefined>,\n    baudRate: ref(localStorage.VueSerial_baudRate ?? default_baudRate) as Ref<number>,\n    dataBits: ref(localStorage.VueSerial_dataBits ?? default_dataBits) as Ref<number>,\n    stopBits: ref(localStorage.VueSerial_stopBits ?? default_stopBits) as Ref<number>,\n    parity: ref(localStorage.VueSerial_parity ?? default_parity) as Ref<ParityType>,\n    bufferSize: ref(localStorage.VueSerial_bufferSize ?? default_bufferSize) as Ref<number>,\n    flowControl: ref(localStorage.VueSerial_flowControl ?? default_flowControl) as Ref<FlowControlType>,\n    dataCarrierDetect: ref(false),\n    clearToSend: ref(false),\n    ringIndicator: ref(false),\n    dataSetReady: ref(false),\n    dataTerminalReady: ref(false),\n    requestToSend: ref(false),\n    break: ref(false)\n  }\n\n  // Private asynchronous receiving function\n  async #start_receive () {\n    if(!this.#private.port) return;\n    while (this.#private.port.readable && this.#private.isClosing.value != true) {\n      this.#private.reader = this.#private.port.readable.getReader();\n      try {\n        while (true) {\n          const { value, done } = await this.#private.reader.read();\n          if (done) {\n            this.#private.reader.releaseLock(); // allow the serial port to be closed\n            break;\n          }\n          if(value) {\n            const event: any = new Event(\"read\");\n            event.value = value;\n            this.dispatchEvent(event);\n          }\n        }\n      } catch (error) { console.log(error); } // read error (parity error, device lost, etc.)\n    }\n  }\n\n  // Private port open function\n  async #open () {\n    if(this.#private.port) {\n      const info = this.#private.port.getInfo();\n      this.#private.usbVendorId.value = info.usbVendorId;\n      this.#private.usbProductId.value = info.usbProductId;\n      try {\n        await this.#private.port.open({\n          baudRate: this.#private.baudRate.value,\n          dataBits: this.#private.dataBits.value,\n          stopBits: this.#private.stopBits.value,\n          parity: this.#private.parity.value,\n          bufferSize: this.#private.bufferSize.value,\n          flowControl: this.#private.flowControl.value\n        });\n        // throws here if the serial port is already open in another window\n        this.#private.isOpen.value = true;\n        this.#private.isConnected.value = true;\n        this.#start_receive();\n      } catch (e) {\n        this.#private_reinitialize();\n        throw e;\n      }\n    }\n  }\n\n  // Private reset connection function\n  async #reconnect () {\n    if(!this.#private.port || this.#private.isClosing.value) return; // prevent concurrent close actions\n    this.#private.isClosing.value = true;\n    try {\n      if(this.#private.reader) await this.#private.reader.cancel();\n      if(this.#private.port) await this.#private.port.close();\n      this.#private.isClosing.value = false;\n      await this.#open();\n    } catch (e) {\n      this.#private_reinitialize();\n      this.stopSignalsPolling();\n      console.error(e);\n    }\n  }\n\n  // Private function for updating signals values\n  async #update_signals () {\n    if(!this.#private.port) throw new Error(\"Signals can't be retrieved as the port is closed\");\n    const signals = await this.#private.port.getSignals();\n    if(signals.clearToSend != this.#private.clearToSend.value) this.#private.clearToSend.value = signals.clearToSend;\n    if(signals.dataCarrierDetect != this.#private.dataCarrierDetect.value) this.#private.dataCarrierDetect.value = signals.dataCarrierDetect;\n    if(signals.dataSetReady != this.#private.dataSetReady.value) this.#private.dataSetReady.value = signals.dataSetReady;\n    if(signals.ringIndicator != this.#private.ringIndicator.value) this.#private.ringIndicator.value = signals.ringIndicator;\n    return signals;\n  }\n\n  // Private function for polling incoming signals periodically\n  async #signals_polling () {\n    if(this.#private.port) {\n      if(!this.#private.isPolling) { // cancel if the previous polling has not finished (if polling interval is too low)\n        this.#private.isPolling = true;\n        try {\n          await this.#update_signals();\n        } catch (e) { }\n        this.#private.isPolling = false;\n      }\n    }\n    else this.stopSignalsPolling();\n  }\n\n  // Private function to reinitialize variables after closing the port\n  #private_reinitialize () {\n    this.#private.isOpen.value = false;\n    this.#private.isConnected.value = false;\n    this.#private.isClosing.value = false;\n    this.#private.reader = null;\n    this.#private.port = null;\n    this.#private.dataCarrierDetect.value = false;\n    this.#private.clearToSend.value = false;\n    this.#private.ringIndicator.value = false;\n    this.#private.dataSetReady.value = false;\n    this.#private.dataTerminalReady.value = false;\n    this.#private.requestToSend.value = false;\n    this.#private.break.value = false;\n  }\n  \n  /**\n   * VueSerial instance constructor\n   */\n  constructor () {\n    super(); // initialize EventTarget functionality\n    if(!this.isAvailable) return; // return here if not available\n\n    // close connection on hot-reloading (during development), as the status variables are reset to their default values\n    import.meta?.hot?.on(\"vite:beforeUpdate\", () => this.close());\n\n    // bind event listener for device disconnection\n    navigator.serial?.addEventListener(\"disconnect\", (event) => {\n      if(event.target == this.#private.port) this.#private.isConnected.value = false;\n    });\n  }\n\n  /**\n   * Constant property indicating if the serial feature is available on the client navigator (Web Serial API is implemented and page is served using HTTPS)\n   * @readonly\n   */\n  get isAvailable () { return (navigator.serial && location.protocol == \"https:\"); }\n  set isAvailable (x) { throw new Error(\"isAvailable is readonly\"); }\n\n  /**\n   * Restore defaults settings\n   */\n  restoreDefaults () {\n    // these will also set localStorage values\n    this.baudRate = default_baudRate;\n    this.dataBits = default_dataBits;\n    this.stopBits = default_stopBits;\n    this.parity = default_parity;\n    this.bufferSize = default_bufferSize;\n    this.flowControl = default_flowControl;\n  }\n\n  /**\n   * Ask the user to select the serial port and open it\n   * @param filters - A list of objects containing vendor and product IDs used to search for attached devices.\n   */\n  async connect (filters: SerialPortFilter[] | undefined) {\n    let port = null;\n    // ask the user to select a port\n    try {\n      port = await navigator.serial.requestPort({ filters });\n      // throws here if no serial port was selected by the user\n    } catch (e) { }\n    // open the port with the current defined settings\n    if(port) {\n      if(this.#private.port) await this.close();\n      this.#private.port = port;\n      await this.#open();\n    }\n  }\n\n  /**\n   * Close the current port if open\n   */\n  async close () {\n    if(this.#private.isClosing.value) return; // prevent concurrent close actions\n    this.#private.isClosing.value = true;\n    try {\n      if(this.#private.reader) await this.#private.reader.cancel();\n      if(this.#private.port) {\n        await this.#private.port.close();\n        await this.#private.port.forget();\n      }\n    } catch (e) {\n      throw e;\n    } finally {\n      this.#private_reinitialize();\n      this.stopSignalsPolling();\n    }\n  }\n\n  /**\n   * Send data to the open serial port\n   * @param value - The content to send\n   */\n  async write (value: Iterable<number>) {\n    if(this.#private.port && this.#private.port.writable) {\n      if(typeof value == \"string\") {\n        const encoder = new TextEncoder();\n        value = encoder.encode(value);\n      }\n      const data = Uint8Array.from(value);\n      const writer = this.#private.port.writable.getWriter();\n      await writer.write(data);\n      writer.releaseLock();\n    }\n  }\n\n  /**\n   * Get the DCD, CTS, RI and DSR signals (alternative to use built-in polling)\n   * @returns Object containing \"dataCarrierDetect\", \"clearToSend\", \"ringIndicator\" and \"dataSetReady\" booleans\n   * @note You can also get the same values in serial.dataCarrierDetect, serial.clearToSend, serial.ringIndicator and serial.dataSetReady\n   */\n  async getSignals (): Promise<SerialInputSignals> {\n    return await this.#update_signals();\n  }\n\n  /**\n   * Set the DTR, RTS and break signals\n   * @param signals - object containing either \"dataTerminalReady\", \"requestToSend\" and/or \"break\" booleans\n   * @note You can also set the serial.dataTerminalReady, serial.requestToSend, and serial.break variables if you don't need asynchronous control\n   */\n  async setSignals (signals: SerialOutputSignals) {\n    if(this.#private.port) await this.#private.port.setSignals(signals);\n    if(\"dataTerminalReady\" in signals && !!signals.dataTerminalReady != this.#private.dataTerminalReady.value) this.#private.dataTerminalReady.value = !!signals.dataTerminalReady;\n    if(\"requestToSend\" in signals && !!signals.requestToSend != this.#private.requestToSend.value) this.#private.requestToSend.value = !!signals.requestToSend;\n    if(\"break\" in signals && !!signals.break != this.#private.break.value) this.#private.break.value = !!signals.break;\n  }\n\n  /**\n   * Start listening for signals changes and update the corresponding variables\n   * @param interval_ms - Polling interval in ms (100ms if not specified)\n   */\n  startSignalsPolling (interval_ms: number | null) {\n    if(this.#private.itv) clearInterval(this.#private.itv);\n    this.#private.itv = setInterval(() => this.#signals_polling(), interval_ms ?? 100);\n  }\n\n  /**\n   * Stop listening for signal changes\n   */\n  stopSignalsPolling () {\n    if(this.#private.itv) clearInterval(this.#private.itv);\n    this.#private.itv = null;\n  }\n\n  /**\n   * Tracks the active state of the serial port\n   * @readonly\n   */\n  get isOpen () { return this.#private.isOpen.value; }\n  set isOpen (x) { throw new Error(\"isOpen value is readonly\"); }\n\n  /**\n   * Becomes false if the open device has been disconnected\n   * @readonly\n   */\n  get isConnected () { return this.#private.isConnected.value; }\n  set isConnected (x) { throw new Error(\"isConnected value is readonly\"); }\n\n  /**\n   * Becomes true when the device is currently closing (after the close() function has been called)\n   * @readonly\n   */\n  get isClosing () { return this.#private.isClosing.value; }\n  set isClosing (x) { throw new Error(\"isClosing value is readonly\"); }\n\n  /**\n   * Current port USB vendor ID\n   * @readonly\n   */\n  get usbVendorId () { return this.#private.usbVendorId.value; }\n  set usbVendorId (x) { throw new Error(\"usbVendorId value is readonly\"); }\n\n  /**\n   * Current port USB product ID\n   * @readonly\n   */\n  get usbProductId () { return this.#private.usbProductId.value; }\n  set usbProductId (x) { throw new Error(\"usbProductId value is readonly\"); }\n\n  /**\n   * A positive, non-zero value indicating the baud rate at which serial communication should be established\n   */\n  get baudRate () { return this.#private.baudRate.value; }\n  set baudRate(value: number) {\n    const new_value = Math.floor(Number(value));\n    if(isNaN(new_value) || new_value <= 0) throw new Error(\"baudRate value must be a positive, non-zero value\");\n    if(new_value != this.#private.baudRate.value) {\n      this.#private.baudRate.value = new_value;\n      localStorage.VueSerial_baudRate = new_value;\n      if(this.#private.port) this.#reconnect();\n    }\n  }\n\n  /**\n   * The number of data bits per frame (either 7 or 8)\n   */\n  get dataBits () { return this.#private.dataBits.value; }\n  set dataBits(value) {\n    const new_value = (Math.floor(Number(value)) == 7) ? 7 : 8;\n    if(new_value != this.#private.dataBits.value) {\n      this.#private.dataBits.value = new_value;\n      localStorage.VueSerial_dataBits = new_value;\n      if(this.#private.port) this.#reconnect();\n    }\n  }\n\n  /**\n   * The number of stop bits per frame (either 1 or 2)\n   */\n  get stopBits () { return this.#private.stopBits.value; }\n  set stopBits (value) {\n    const new_value = (Math.floor(Number(value)) == 2) ? 2 : 1;\n    if(new_value != this.#private.stopBits.value) {\n      this.#private.stopBits.value = new_value;\n      localStorage.VueSerial_stopBits = new_value;\n      if(this.#private.port) this.#reconnect();\n    }\n  }\n\n  /**\n   * The parity mode (either \"none\", \"even\" or \"odd\")\n   */\n  get parity () { return this.#private.parity.value; }\n  set parity (value) {\n    const new_value = (value == \"even\") ? \"even\" : ((value == \"odd\") ? \"odd\" : \"none\");\n    if(new_value != this.#private.parity.value) {\n      this.#private.parity.value = new_value;\n      localStorage.VueSerial_parity = new_value;\n      if(this.#private.port) this.#reconnect();\n    }\n  }\n\n  /**\n   * A positive, non-zero value indicating the size of the read and write buffers that should be created.\n   */\n  get bufferSize () { return this.#private.bufferSize.value; }\n  set bufferSize (value) {\n    const new_value = Math.floor(Number(value));\n    if(isNaN(new_value) || new_value <= 0) throw new Error(\"bufferSize value must be a positive, non-zero value\");\n    if(new_value != this.#private.bufferSize.value) {\n      this.#private.bufferSize.value = new_value;\n      localStorage.VueSerial_bufferSize = new_value;\n      if(this.#private.port) this.#reconnect();\n    }\n  }\n\n  /**\n   * The flow control mode (either \"hardware\" or \"none\")\n   */\n  get flowControl () { return this.#private.flowControl.value; }\n  set flowControl (value) {\n    const new_value = (value == \"hardware\" ? \"hardware\" : \"none\");\n    if(new_value != this.#private.flowControl.value) {\n      this.#private.flowControl.value = new_value;\n      localStorage.VueSerial_flowControl = new_value;\n      if(this.#private.port) this.#reconnect();\n    }\n  }\n\n  /**\n   * Data Carrier Detect (DCD) input signal value\n   * @remarks This value must be refreshed manually by calling serial.getSignals() or automatically with serial.startSignalsPolling(...)\n   * @readonly\n   */\n  get dataCarrierDetect () { return this.#private.dataCarrierDetect.value; }\n  set dataCarrierDetect (x) { throw new Error(\"dataCarrierDetect value is readonly\"); }\n\n  /**\n   * Clear To Send (CTS) input signal value\n   * @remarks This value must be refreshed manually by calling serial.getSignals() or automatically with serial.startSignalsPolling(...)\n   * @readonly\n   */\n  get clearToSend () { return this.#private.clearToSend.value; }\n  set clearToSend (x) { throw new Error(\"clearToSend value is readonly\"); }\n\n  /**\n   * Ring Indicator (RI) input signal value\n   * @remarks This value must be refreshed manually by calling serial.getSignals() or automatically with serial.startSignalsPolling(...)\n   * @readonly\n   */\n  get ringIndicator () { return this.#private.ringIndicator.value; }\n  set ringIndicator (x) { throw new Error(\"ringIndicator value is readonly\"); }\n\n  /**\n   * Data Set Ready (DSR) input signal value\n   * @remarks This value must be refreshed manually by calling `serial.getSignals()` or automatically with serial.startSignalsPolling(...)\n   * @readonly\n   */\n  get dataSetReady () { return this.#private.dataSetReady.value; }\n  set dataSetReady (x) { throw new Error(\"dataSetReady value is readonly\"); }\n\n  /**\n   * Data Terminal Ready (DTR) output signal value\n   */\n  get dataTerminalReady () { return this.#private.dataTerminalReady.value; }\n  /**\n   * @remarks This will be set asynchronously. Prefer `await serial.setSignals({ dataTerminalReady: ... })` for precise asynchronous control\n   */\n  set dataTerminalReady (value) {\n    this.#private.dataTerminalReady.value = !!value;\n    if(this.#private.port) this.#private.port.setSignals({ dataTerminalReady: this.#private.dataTerminalReady.value });\n  }\n\n  /**\n   * Request To Send (RTS) output signal value\n   */\n  get requestToSend () { return this.#private.requestToSend.value; }\n  /**\n   * @remarks This will be set asynchronously. Prefer `await serial.setSignals({ requestToSend: ... })` for precise asynchronous control\n   */\n  set requestToSend (value) {\n    this.#private.requestToSend.value = !!value;\n    if(this.#private.port) this.#private.port.setSignals({ requestToSend: this.#private.requestToSend.value });\n  }\n\n  /**\n   * Break output signal value\n   */\n  get break () { return this.#private.break.value; }\n  /**\n   * @remarks This will be set asynchronously. Prefer `await serial.setSignals({ break: ... })` for precise asynchronous control\n   */\n  set break (value) {\n    this.#private.break.value = !!value;\n    if(this.#private.port) this.#private.port.setSignals({ break: this.#private.break.value });\n  }\n\n}"],"names":["default_baudRate","default_dataBits","default_stopBits","default_parity","default_bufferSize","default_flowControl","localStorage","VueSerial","__privateAdd","_start_receive","_open","_reconnect","_update_signals","_signals_polling","_private_reinitialize","_private","ref","_b","_a","_c","event","__privateGet","x","filters","port","__privateMethod","open_fn","e","private_reinitialize_fn","value","data","writer","update_signals_fn","signals","interval_ms","signals_polling_fn","new_value","reconnect_fn","start_receive_fn","done","error","info","__publicField"],"mappings":"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"}