aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/local-message-stream.js
blob: 821e51046d517c6399a5e138a7f77fae88640268 (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
49
50
51
52
53
54
55
56
const Duplex = require('readable-stream').Duplex
const inherits = require('util').inherits

module.exports = LocalMessageDuplexStream

inherits(LocalMessageDuplexStream, Duplex)

function LocalMessageDuplexStream (opts) {
  Duplex.call(this, {
    objectMode: true,
  })

  // this._origin = opts.origin
  this._name = opts.name
  this._target = opts.target

  // console.log('LocalMessageDuplexStream ('+this._name+') - initialized...')
  window.addEventListener('message', this._onMessage.bind(this), false)
}

// private

LocalMessageDuplexStream.prototype._onMessage = function (event) {
  var msg = event.data
  // console.log('LocalMessageDuplexStream ('+this._name+') - heard message...', event)
  // validate message
  if (event.origin !== location.origin) return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (event.origin !== location.origin) ')
  if (typeof msg !== 'object') return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (typeof msg !== "object") ')
  if (msg.target !== this._name) return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (msg.target !== this._name) ', msg.target, this._name)
  if (!msg.data) return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (!msg.data) ')
  // console.log('LocalMessageDuplexStream ('+this._name+') - accepted', msg.data)
  // forward message
  try {
    this.push(msg.data)
  } catch (err) {
    this.emit('error', err)
  }
}

// stream plumbing

LocalMessageDuplexStream.prototype._read = noop

LocalMessageDuplexStream.prototype._write = function (data, encoding, cb) {
  // console.log('LocalMessageDuplexStream ('+this._name+') - sending message...')
  var message = {
    target: this._target,
    data: data,
  }
  window.postMessage(message, location.origin)
  cb()
}

// util

function noop () {}