| 'use strict' |
| module.exports = inflight |
| |
| let Bluebird |
| try { |
| Bluebird = require('bluebird') |
| } catch (_) { |
| Bluebird = Promise |
| } |
| |
| const active = {} |
| inflight.active = active |
| function inflight (unique, doFly) { |
| return Bluebird.all([unique, doFly]).then(function (args) { |
| const unique = args[0] |
| const doFly = args[1] |
| if (Array.isArray(unique)) { |
| return Bluebird.all(unique).then(function (uniqueArr) { |
| return _inflight(uniqueArr.join(''), doFly) |
| }) |
| } else { |
| return _inflight(unique, doFly) |
| } |
| }) |
| |
| function _inflight (unique, doFly) { |
| if (!active[unique]) { |
| active[unique] = (new Bluebird(function (resolve) { |
| return resolve(doFly()) |
| })) |
| active[unique].then(cleanup, cleanup) |
| function cleanup() { delete active[unique] } |
| } |
| return active[unique] |
| } |
| } |