aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/obj-multiplex.js
blob: 0034febe06cc418267cf4f945dfd7a7de17fd63a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const through = require('through2')

module.exports = ObjectMultiplex

function ObjectMultiplex (opts) {
  opts = opts || {}
  // create multiplexer
  const mx = through.obj(function (chunk, enc, cb) {
    const name = chunk.name
    const data = chunk.data
    if (!name) {
      console.warn(`ObjectMultiplex - Malformed chunk without name "${chunk}"`)
      return cb()
    }
    const substream = mx.streams[name]
    if (!substream) {
      console.warn(`ObjectMultiplex - orphaned data for stream "${name}"`)
    } else {
      if (substream.push) substream.push(data)
    }
    return cb()
  })
  mx.streams = {}
  // create substreams
  mx.createStream = function (name) {
    const substream = mx.streams[name] = through.obj(function (chunk, enc, cb) {
      mx.push({
        name: name,
        data: chunk,
      })
      return cb()
    })
    mx.on('end', function () {
      return substream.emit('end')
    })
    if (opts.error) {
      mx.on('error', function () {
        return substream.emit('error')
      })
    }
    return substream
  }
  // ignore streams (dont display orphaned data warning)
  mx.ignoreStream = function (name) {
    mx.streams[name] = true
  }
  return mx
}