{"version":3,"sources":["../src/emitter.js","../src/nanoresource-cb.js","../src/index.js"],"sourcesContent":["import { EventEmitter } from 'events'\nimport { NanoresourcePromise as Nanoresource } from './index.js'\n\nconst kNanoresource = Symbol('nanoresource')\n\nexport class NanoresourcePromise extends EventEmitter {\n  constructor (opts = {}) {\n    super()\n\n    const _open = opts.open || this._open.bind(this)\n    const _close = opts.close || this._close.bind(this)\n\n    this._emitOpened = null\n    this._emitClosed = null\n\n    this[kNanoresource] = new Nanoresource({\n      open: async () => {\n        this.emit('open')\n        await _open()\n      },\n      close: async () => {\n        this.emit('close')\n        await _close()\n      },\n      reopen: opts.reopen\n    })\n  }\n\n  get opened () {\n    return this[kNanoresource].opened\n  }\n\n  get opening () {\n    return this[kNanoresource].opening\n  }\n\n  get closed () {\n    return this[kNanoresource].closed\n  }\n\n  get closing () {\n    return this[kNanoresource].closing\n  }\n\n  get actives () {\n    return this[kNanoresource].actives\n  }\n\n  /**\n   * @returns {Promise}\n   */\n  async open () {\n    await this[kNanoresource].open()\n    if (!this._emitOpened) {\n      this.emit('opened')\n      this._emitOpened = true\n      this._emitClosed = null\n    }\n  }\n\n  /**\n   * @returns {Promise}\n   */\n  async close (allowActive) {\n    await this[kNanoresource].close(allowActive)\n    if (!this._emitClosed) {\n      this.emit('closed')\n      this._emitClosed = true\n      this._emitOpened = null\n    }\n  }\n\n  /**\n   * @returns {boolean}\n   */\n  active (cb) {\n    return this[kNanoresource].active(cb)\n  }\n\n  /**\n   * @returns {boolean}\n   */\n  inactive (cb, err, value) {\n    return this[kNanoresource].inactive(cb, err, value)\n  }\n\n  /**\n   * @abstract\n   */\n  async _open () {}\n\n  /**\n   * @abstract\n   */\n  async _close () {}\n}\n","/**\n *\n * This code is based on the @mafintosh work.\n * https://github.com/mafintosh/nanoresource\n */\n\nimport nextTick from 'proc-nexttick'\n\nconst preopening = Symbol('opening when closing')\nconst opening = Symbol('opening queue')\nconst preclosing = Symbol('closing when inactive')\nconst closing = Symbol('closing queue')\nconst sync = Symbol('sync')\nconst fastClose = Symbol('fast close')\nconst reopen = Symbol('allow reopen')\nconst init = Symbol('init state')\n\nfunction noop () {}\n\nexport class Nanoresource {\n  constructor (opts) {\n    if (!opts) opts = {}\n    if (opts.open) this._open = opts.open\n    if (opts.close) this._close = opts.close\n\n    this[init]()\n\n    this[reopen] = opts.reopen || false\n    this[preopening] = null\n    this[opening] = null\n    this[preclosing] = null\n    this[closing] = null\n    this[sync] = false\n    this[fastClose] = true\n  }\n\n  [init] () {\n    this.opening = false\n    this.opened = false\n    this.closing = false\n    this.closed = false\n    this.actives = 0\n  }\n\n  _open (cb) {\n    cb(null)\n  }\n\n  _close (cb) {\n    cb(null)\n  }\n\n  open (cb) {\n    if (!cb) cb = noop\n\n    if (this.closing || this.closed) {\n      if (!this[reopen]) {\n        return nextTick(cb, new Error('Resource is closed'))\n      }\n\n      if (this.closing) {\n        if (!this[preopening]) this[preopening] = []\n        this[preopening].push(cb)\n        return\n      }\n\n      this[init]()\n    }\n\n    if (this.opened) return nextTick(cb)\n\n    if (this[opening]) {\n      this[opening].push(cb)\n      return\n    }\n\n    this.opening = true\n    this[opening] = [cb]\n    this[sync] = true\n    this._open(onopen.bind(this))\n    this[sync] = false\n  }\n\n  active (cb) {\n    if ((this[fastClose] && this[preclosing]) || this[closing] || this.closed) {\n      if (cb) nextTick(cb, new Error('Resource is closed'))\n      return false\n    }\n    this.actives++\n    return true\n  }\n\n  inactive (cb, err, val) {\n    if (!--this.actives) {\n      const queue = this[preclosing]\n      if (queue) {\n        this[preclosing] = null\n        while (queue.length) this.close(queue.shift())\n      }\n    }\n\n    if (cb) cb(err, val)\n  }\n\n  close (allowActive, cb) {\n    if (typeof allowActive === 'function') return this.close(false, allowActive)\n    if (!cb) cb = noop\n\n    if (allowActive) this[fastClose] = false\n\n    if (this.closed) return nextTick(cb)\n\n    if (this.actives || this[opening]) {\n      if (!this[preclosing]) this[preclosing] = []\n      this[preclosing].push(cb)\n      return\n    }\n\n    if (!this.opened) {\n      this.closed = true\n      nextTick(cb)\n      return\n    }\n\n    if (this[closing]) {\n      this[closing].push(cb)\n      return\n    }\n\n    this.closing = true\n    this[closing] = [cb]\n    this[sync] = true\n    this._close(onclose.bind(this))\n    this[sync] = false\n  }\n}\n\nfunction onopen (err) {\n  if (this[sync]) return nextTick(onopen.bind(this), err)\n\n  const oqueue = this[opening]\n  this[opening] = null\n  this.opening = false\n  this.opened = !err\n\n  while (oqueue.length) oqueue.shift()(err)\n\n  const cqueue = this[preclosing]\n  if (cqueue && !this.actives) {\n    this[preclosing] = null\n    while (cqueue.length) this.close(cqueue.shift())\n  }\n}\n\nfunction onclose (err) {\n  if (this[sync]) return nextTick(onclose.bind(this), err)\n  const queue = this[closing]\n  this.closing = false\n  this[closing] = null\n  this.closed = !err\n  while (queue.length) queue.shift()(err)\n\n  const cqueue = this[preopening]\n  if (cqueue) {\n    this[preopening] = null\n    while (cqueue.length) this.open(cqueue.shift())\n  }\n}\n","import { Nanoresource } from './nanoresource-cb.js'\n\nfunction callbackPromise () {\n  let callback\n\n  const promise = new Promise((resolve, reject) => {\n    callback = (err, value) => {\n      if (err) reject(err)\n      else resolve(value)\n    }\n  })\n\n  callback.promise = promise\n  return callback\n}\n\nconst kNanoresource = Symbol('nanoresource')\n\nexport class NanoresourcePromise {\n  constructor (opts = {}) {\n    const open = opts.open || this._open.bind(this)\n    const close = opts.close || this._close.bind(this)\n\n    this[kNanoresource] = new Nanoresource({\n      open: (cb) => processPromise(open, cb),\n      close: (cb) => processPromise(close, cb),\n      reopen: opts.reopen\n    })\n  }\n\n  get opened () {\n    return this[kNanoresource].opened\n  }\n\n  get opening () {\n    return this[kNanoresource].opening\n  }\n\n  get closed () {\n    return this[kNanoresource].closed\n  }\n\n  get closing () {\n    return this[kNanoresource].closing\n  }\n\n  get actives () {\n    return this[kNanoresource].actives\n  }\n\n  /**\n   * @returns {Promise}\n   */\n  open () {\n    const callback = callbackPromise()\n    this[kNanoresource].open(callback)\n    return callback.promise\n  }\n\n  /**\n   * @returns {Promise}\n   */\n  close (allowActive = false) {\n    const callback = callbackPromise()\n    this[kNanoresource].close(allowActive, callback)\n    return callback.promise\n  }\n\n  /**\n   * @returns {boolean}\n   */\n  active (cb) {\n    return this[kNanoresource].active(cb)\n  }\n\n  /**\n   * @returns {boolean}\n   */\n  inactive (cb, err, value) {\n    return this[kNanoresource].inactive(cb, err, value)\n  }\n\n  /**\n   * @abstract\n   */\n  async _open () {}\n\n  /**\n   * @abstract\n   */\n  async _close () {}\n}\n\nasync function processPromise (fnPromise, cb) {\n  try {\n    await fnPromise()\n    cb()\n  } catch (err) {\n    cb(err)\n  }\n}\n"],"mappings":"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","names":["NanoresourcePromise","nextTick","kNanoresource","NanoresourcePromise"]}