Created
March 28, 2016 14:20
-
-
Save Risto-Stevcev/62881c9b9a60931f1bc9 to your computer and use it in GitHub Desktop.
@motorcycle/http
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.HTTP = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
(function (global, factory) { | |
if (typeof define === "function" && define.amd) { | |
define('@most/hold', ['exports', 'most/lib/source/MulticastSource'], factory); | |
} else if (typeof exports !== "undefined") { | |
factory(exports, require('most/lib/source/MulticastSource')); | |
} else { | |
var mod = { | |
exports: {} | |
}; | |
factory(mod.exports, global.MulticastSource); | |
global.mostHold = mod.exports; | |
} | |
})(this, function (exports, _MulticastSource) { | |
'use strict'; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
var _MulticastSource2 = _interopRequireDefault(_MulticastSource); | |
function _interopRequireDefault(obj) { | |
return obj && obj.__esModule ? obj : { | |
default: obj | |
}; | |
} | |
function _classCallCheck(instance, Constructor) { | |
if (!(instance instanceof Constructor)) { | |
throw new TypeError("Cannot call a class as a function"); | |
} | |
} | |
var _createClass = (function () { | |
function defineProperties(target, props) { | |
for (var i = 0; i < props.length; i++) { | |
var descriptor = props[i]; | |
descriptor.enumerable = descriptor.enumerable || false; | |
descriptor.configurable = true; | |
if ("value" in descriptor) descriptor.writable = true; | |
Object.defineProperty(target, descriptor.key, descriptor); | |
} | |
} | |
return function (Constructor, protoProps, staticProps) { | |
if (protoProps) defineProperties(Constructor.prototype, protoProps); | |
if (staticProps) defineProperties(Constructor, staticProps); | |
return Constructor; | |
}; | |
})(); | |
var hold = function hold(stream) { | |
return new stream.constructor(new _MulticastSource2.default(new Hold(stream.source))); | |
}; | |
var Hold = (function () { | |
function Hold(source) { | |
_classCallCheck(this, Hold); | |
this.source = source; | |
this.time = -Infinity; | |
this.value = void 0; | |
} | |
_createClass(Hold, [{ | |
key: 'run', | |
value: function run(sink, scheduler) { | |
if (sink._hold !== this) { | |
sink._hold = this; | |
sink._holdAdd = sink.add; | |
sink.add = holdAdd; | |
sink._holdEvent = sink.event; | |
sink.event = holdEvent; | |
} | |
return this.source.run(sink, scheduler); | |
} | |
}]); | |
return Hold; | |
})(); | |
function holdAdd(sink) { | |
var len = this._holdAdd(sink); | |
if (this._hold.time >= 0) { | |
sink.event(this._hold.time, this._hold.value); | |
} | |
return len; | |
} | |
function holdEvent(t, x) { | |
if (t >= this._hold.time) { | |
this._hold.time = t; | |
this._hold.value = x; | |
} | |
return this._holdEvent(t, x); | |
} | |
exports.default = hold; | |
}); | |
},{"most/lib/source/MulticastSource":55}],2:[function(require,module,exports){ | |
/** | |
* Expose `Emitter`. | |
*/ | |
module.exports = Emitter; | |
/** | |
* Initialize a new `Emitter`. | |
* | |
* @api public | |
*/ | |
function Emitter(obj) { | |
if (obj) return mixin(obj); | |
}; | |
/** | |
* Mixin the emitter properties. | |
* | |
* @param {Object} obj | |
* @return {Object} | |
* @api private | |
*/ | |
function mixin(obj) { | |
for (var key in Emitter.prototype) { | |
obj[key] = Emitter.prototype[key]; | |
} | |
return obj; | |
} | |
/** | |
* Listen on the given `event` with `fn`. | |
* | |
* @param {String} event | |
* @param {Function} fn | |
* @return {Emitter} | |
* @api public | |
*/ | |
Emitter.prototype.on = | |
Emitter.prototype.addEventListener = function(event, fn){ | |
this._callbacks = this._callbacks || {}; | |
(this._callbacks['$' + event] = this._callbacks['$' + event] || []) | |
.push(fn); | |
return this; | |
}; | |
/** | |
* Adds an `event` listener that will be invoked a single | |
* time then automatically removed. | |
* | |
* @param {String} event | |
* @param {Function} fn | |
* @return {Emitter} | |
* @api public | |
*/ | |
Emitter.prototype.once = function(event, fn){ | |
function on() { | |
this.off(event, on); | |
fn.apply(this, arguments); | |
} | |
on.fn = fn; | |
this.on(event, on); | |
return this; | |
}; | |
/** | |
* Remove the given callback for `event` or all | |
* registered callbacks. | |
* | |
* @param {String} event | |
* @param {Function} fn | |
* @return {Emitter} | |
* @api public | |
*/ | |
Emitter.prototype.off = | |
Emitter.prototype.removeListener = | |
Emitter.prototype.removeAllListeners = | |
Emitter.prototype.removeEventListener = function(event, fn){ | |
this._callbacks = this._callbacks || {}; | |
// all | |
if (0 == arguments.length) { | |
this._callbacks = {}; | |
return this; | |
} | |
// specific event | |
var callbacks = this._callbacks['$' + event]; | |
if (!callbacks) return this; | |
// remove all handlers | |
if (1 == arguments.length) { | |
delete this._callbacks['$' + event]; | |
return this; | |
} | |
// remove specific handler | |
var cb; | |
for (var i = 0; i < callbacks.length; i++) { | |
cb = callbacks[i]; | |
if (cb === fn || cb.fn === fn) { | |
callbacks.splice(i, 1); | |
break; | |
} | |
} | |
return this; | |
}; | |
/** | |
* Emit `event` with the given args. | |
* | |
* @param {String} event | |
* @param {Mixed} ... | |
* @return {Emitter} | |
*/ | |
Emitter.prototype.emit = function(event){ | |
this._callbacks = this._callbacks || {}; | |
var args = [].slice.call(arguments, 1) | |
, callbacks = this._callbacks['$' + event]; | |
if (callbacks) { | |
callbacks = callbacks.slice(0); | |
for (var i = 0, len = callbacks.length; i < len; ++i) { | |
callbacks[i].apply(this, args); | |
} | |
} | |
return this; | |
}; | |
/** | |
* Return array of callbacks for `event`. | |
* | |
* @param {String} event | |
* @return {Array} | |
* @api public | |
*/ | |
Emitter.prototype.listeners = function(event){ | |
this._callbacks = this._callbacks || {}; | |
return this._callbacks['$' + event] || []; | |
}; | |
/** | |
* Check if this emitter has `event` handlers. | |
* | |
* @param {String} event | |
* @return {Boolean} | |
* @api public | |
*/ | |
Emitter.prototype.hasListeners = function(event){ | |
return !! this.listeners(event).length; | |
}; | |
},{}],3:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = LinkedList; | |
/** | |
* Doubly linked list | |
* @constructor | |
*/ | |
function LinkedList() { | |
this.head = null; | |
this.length = 0; | |
} | |
/** | |
* Add a node to the end of the list | |
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to add | |
*/ | |
LinkedList.prototype.add = function(x) { | |
if(this.head !== null) { | |
this.head.prev = x; | |
x.next = this.head; | |
} | |
this.head = x; | |
++this.length; | |
}; | |
/** | |
* Remove the provided node from the list | |
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to remove | |
*/ | |
LinkedList.prototype.remove = function(x) { | |
--this.length; | |
if(x === this.head) { | |
this.head = this.head.next; | |
} | |
if(x.next !== null) { | |
x.next.prev = x.prev; | |
x.next = null; | |
} | |
if(x.prev !== null) { | |
x.prev.next = x.next; | |
x.prev = null; | |
} | |
}; | |
/** | |
* @returns {boolean} true iff there are no nodes in the list | |
*/ | |
LinkedList.prototype.isEmpty = function() { | |
return this.length === 0; | |
}; | |
/** | |
* Dispose all nodes | |
* @returns {Promise} promise that fulfills when all nodes have been disposed, | |
* or rejects if an error occurs while disposing | |
*/ | |
LinkedList.prototype.dispose = function() { | |
if(this.isEmpty()) { | |
return Promise.resolve(); | |
} | |
var promises = []; | |
var x = this.head; | |
this.head = null; | |
this.length = 0; | |
while(x !== null) { | |
promises.push(x.dispose()); | |
x = x.next; | |
} | |
return Promise.all(promises); | |
}; | |
},{}],4:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.isPromise = isPromise; | |
function isPromise(p) { | |
return p !== null && typeof p === 'object' && typeof p.then === 'function'; | |
} | |
},{}],5:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
// Based on https://github.com/petkaantonov/deque | |
module.exports = Queue; | |
function Queue(capPow2) { | |
this._capacity = capPow2||32; | |
this._length = 0; | |
this._head = 0; | |
} | |
Queue.prototype.push = function (x) { | |
var len = this._length; | |
this._checkCapacity(len + 1); | |
var i = (this._head + len) & (this._capacity - 1); | |
this[i] = x; | |
this._length = len + 1; | |
}; | |
Queue.prototype.shift = function () { | |
var head = this._head; | |
var x = this[head]; | |
this[head] = void 0; | |
this._head = (head + 1) & (this._capacity - 1); | |
this._length--; | |
return x; | |
}; | |
Queue.prototype.isEmpty = function() { | |
return this._length === 0; | |
}; | |
Queue.prototype.length = function () { | |
return this._length; | |
}; | |
Queue.prototype._checkCapacity = function (size) { | |
if (this._capacity < size) { | |
this._ensureCapacity(this._capacity << 1); | |
} | |
}; | |
Queue.prototype._ensureCapacity = function (capacity) { | |
var oldCapacity = this._capacity; | |
this._capacity = capacity; | |
var last = this._head + this._length; | |
if (last > oldCapacity) { | |
copy(this, 0, this, oldCapacity, last & (oldCapacity - 1)); | |
} | |
}; | |
function copy(src, srcIndex, dst, dstIndex, len) { | |
for (var j = 0; j < len; ++j) { | |
dst[j + dstIndex] = src[j + srcIndex]; | |
src[j + srcIndex] = void 0; | |
} | |
} | |
},{}],6:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Stream; | |
function Stream(source) { | |
this.source = source; | |
} | |
},{}],7:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.noop = noop; | |
exports.identity = identity; | |
exports.compose = compose; | |
exports.apply = apply; | |
exports.cons = cons; | |
exports.append = append; | |
exports.drop = drop; | |
exports.tail = tail; | |
exports.copy = copy; | |
exports.map = map; | |
exports.reduce = reduce; | |
exports.replace = replace; | |
exports.remove = remove; | |
exports.removeAll = removeAll; | |
exports.findIndex = findIndex; | |
exports.isArrayLike = isArrayLike; | |
function noop() {} | |
function identity(x) { | |
return x; | |
} | |
function compose(f, g) { | |
return function(x) { | |
return f(g(x)); | |
}; | |
} | |
function apply(f, x) { | |
return f(x); | |
} | |
function cons(x, array) { | |
var l = array.length; | |
var a = new Array(l + 1); | |
a[0] = x; | |
for(var i=0; i<l; ++i) { | |
a[i + 1] = array[i]; | |
} | |
return a; | |
} | |
function append(x, a) { | |
var l = a.length; | |
var b = new Array(l+1); | |
for(var i=0; i<l; ++i) { | |
b[i] = a[i]; | |
} | |
b[l] = x; | |
return b; | |
} | |
function drop(n, array) { | |
var l = array.length; | |
if(n >= l) { | |
return []; | |
} | |
l -= n; | |
var a = new Array(l); | |
for(var i=0; i<l; ++i) { | |
a[i] = array[n+i]; | |
} | |
return a; | |
} | |
function tail(array) { | |
return drop(1, array); | |
} | |
function copy(array) { | |
var l = array.length; | |
var a = new Array(l); | |
for(var i=0; i<l; ++i) { | |
a[i] = array[i]; | |
} | |
return a; | |
} | |
function map(f, array) { | |
var l = array.length; | |
var a = new Array(l); | |
for(var i=0; i<l; ++i) { | |
a[i] = f(array[i]); | |
} | |
return a; | |
} | |
function reduce(f, z, array) { | |
var r = z; | |
for(var i=0, l=array.length; i<l; ++i) { | |
r = f(r, array[i], i); | |
} | |
return r; | |
} | |
function replace(x, i, array) { | |
var l = array.length; | |
var a = new Array(l); | |
for(var j=0; j<l; ++j) { | |
a[j] = i === j ? x : array[j]; | |
} | |
return a; | |
} | |
function remove(index, array) { | |
var l = array.length; | |
if(l === 0 || index >= array) { // exit early if index beyond end of array | |
return array; | |
} | |
if(l === 1) { // exit early if index in bounds and length === 1 | |
return []; | |
} | |
return unsafeRemove(index, array, l-1); | |
} | |
function unsafeRemove(index, a, l) { | |
var b = new Array(l); | |
var i; | |
for(i=0; i<index; ++i) { | |
b[i] = a[i]; | |
} | |
for(i=index; i<l; ++i) { | |
b[i] = a[i+1]; | |
} | |
return b; | |
} | |
function removeAll(f, a) { | |
var l = a.length; | |
var b = new Array(l); | |
for(var x, i=0, j=0; i<l; ++i) { | |
x = a[i]; | |
if(!f(x)) { | |
b[j] = x; | |
++j; | |
} | |
} | |
b.length = j; | |
return b; | |
} | |
function findIndex(x, a) { | |
for (var i = 0, l = a.length; i < l; ++i) { | |
if (x === a[i]) { | |
return i; | |
} | |
} | |
return -1; | |
} | |
function isArrayLike(x){ | |
return x != null && typeof x.length === 'number' && typeof x !== 'function'; | |
} | |
},{}],8:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var runSource = require('../runSource'); | |
var cons = require('./build').cons; | |
var noop = require('../base').noop; | |
exports.scan = scan; | |
exports.reduce = reduce; | |
/** | |
* Create a stream containing successive reduce results of applying f to | |
* the previous reduce result and the current stream item. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial initial value | |
* @param {Stream} stream stream to scan | |
* @returns {Stream} new stream containing successive reduce results | |
*/ | |
function scan(f, initial, stream) { | |
return cons(initial, new Stream(new Accumulate(ScanSink, f, initial, stream.source))); | |
} | |
function ScanSink(f, z, sink) { | |
this.f = f; | |
this.value = z; | |
this.sink = sink; | |
} | |
ScanSink.prototype.event = function(t, x) { | |
var f = this.f; | |
this.value = f(this.value, x); | |
this.sink.event(t, this.value); | |
}; | |
ScanSink.prototype.error = Pipe.prototype.error; | |
ScanSink.prototype.end = Pipe.prototype.end; | |
/** | |
* Reduce a stream to produce a single result. Note that reducing an infinite | |
* stream will return a Promise that never fulfills, but that may reject if an error | |
* occurs. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial initial value | |
* @param {Stream} stream to reduce | |
* @returns {Promise} promise for the file result of the reduce | |
*/ | |
function reduce(f, initial, stream) { | |
return runSource.withDefaultScheduler(noop, new Accumulate(AccumulateSink, f, initial, stream.source)); | |
} | |
function Accumulate(SinkType, f, z, source) { | |
this.SinkType = SinkType; | |
this.f = f; | |
this.value = z; | |
this.source = source; | |
} | |
Accumulate.prototype.run = function(sink, scheduler) { | |
return this.source.run(new this.SinkType(this.f, this.value, sink), scheduler); | |
}; | |
function AccumulateSink(f, z, sink) { | |
this.f = f; | |
this.value = z; | |
this.sink = sink; | |
} | |
AccumulateSink.prototype.event = function(t, x) { | |
var f = this.f; | |
this.value = f(this.value, x); | |
this.sink.event(t, this.value); | |
}; | |
AccumulateSink.prototype.error = Pipe.prototype.error; | |
AccumulateSink.prototype.end = function(t) { | |
this.sink.end(t, this.value); | |
}; | |
},{"../Stream":6,"../base":7,"../runSource":43,"../sink/Pipe":52,"./build":10}],9:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var combine = require('./combine').combine; | |
var apply = require('../base').apply; | |
exports.ap = ap; | |
/** | |
* Assume fs is a stream containing functions, and apply the latest function | |
* in fs to the latest value in xs. | |
* fs: --f---------g--------h------> | |
* xs: -a-------b-------c-------d--> | |
* ap(fs, xs): --fa-----fb-gb---gc--hc--hd-> | |
* @param {Stream} fs stream of functions to apply to the latest x | |
* @param {Stream} xs stream of values to which to apply all the latest f | |
* @returns {Stream} stream containing all the applications of fs to xs | |
*/ | |
function ap(fs, xs) { | |
return combine(apply, fs, xs); | |
} | |
},{"../base":7,"./combine":11}],10:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var streamOf = require('../source/core').of; | |
var continueWith = require('./continueWith').continueWith; | |
exports.concat = concat; | |
exports.cycle = cycle; | |
exports.cons = cons; | |
/** | |
* @param {*} x value to prepend | |
* @param {Stream} stream | |
* @returns {Stream} new stream with x prepended | |
*/ | |
function cons(x, stream) { | |
return concat(streamOf(x), stream); | |
} | |
/** | |
* @param {Stream} left | |
* @param {Stream} right | |
* @returns {Stream} new stream containing all events in left followed by all | |
* events in right. This *timeshifts* right to the end of left. | |
*/ | |
function concat(left, right) { | |
return continueWith(function() { | |
return right; | |
}, left); | |
} | |
/** | |
* Tie stream into a circle, creating an infinite stream | |
* @param {Stream} stream | |
* @returns {Stream} new infinite stream | |
*/ | |
function cycle(stream) { | |
return continueWith(function cycleNext() { | |
return cycle(stream); | |
}, stream); | |
} | |
},{"../source/core":57,"./continueWith":13}],11:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var transform = require('./transform'); | |
var core = require('../source/core'); | |
var Pipe = require('../sink/Pipe'); | |
var IndexSink = require('../sink/IndexSink'); | |
var mergeSources = require('./merge').mergeSources; | |
var dispose = require('../disposable/dispose'); | |
var base = require('../base'); | |
var invoke = require('../invoke'); | |
var hasValue = IndexSink.hasValue; | |
//var map = base.map; | |
var tail = base.tail; | |
exports.combineArray = combineArray; | |
exports.combine = combine; | |
/** | |
* Combine latest events from all input streams | |
* @param {function(...events):*} f function to combine most recent events | |
* @returns {Stream} stream containing the result of applying f to the most recent | |
* event of each input stream, whenever a new event arrives on any stream. | |
*/ | |
function combine(f /*, ...streams */) { | |
return combineArray(f, tail(arguments)); | |
} | |
/** | |
* Combine latest events from all input streams | |
* @param {function(...events):*} f function to combine most recent events | |
* @param {[Stream]} streams most recent events | |
* @returns {Stream} stream containing the result of applying f to the most recent | |
* event of each input stream, whenever a new event arrives on any stream. | |
*/ | |
function combineArray(f, streams) { | |
var l = streams.length; | |
return l === 0 ? core.empty() | |
: l === 1 ? transform.map(f, streams[0]) | |
: new Stream(mergeSources(CombineSink, f, streams)); | |
} | |
function CombineSink(disposables, sinks, sink, f) { | |
this.sink = sink; | |
this.disposables = disposables; | |
this.sinks = sinks; | |
this.f = f; | |
this.values = new Array(sinks.length); | |
this.ready = false; | |
this.activeCount = sinks.length; | |
} | |
CombineSink.prototype.error = Pipe.prototype.error; | |
CombineSink.prototype.event = function(t, indexedValue) { | |
if(!this.ready) { | |
this.ready = this.sinks.every(hasValue); | |
} | |
this.values[indexedValue.index] = indexedValue.value; | |
if(this.ready) { | |
this.sink.event(t, invoke(this.f, this.values)); | |
} | |
}; | |
CombineSink.prototype.end = function(t, indexedValue) { | |
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink); | |
if(--this.activeCount === 0) { | |
this.sink.end(t, indexedValue.value); | |
} | |
}; | |
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../invoke":41,"../sink/IndexSink":50,"../sink/Pipe":52,"../source/core":57,"./merge":20,"./transform":31}],12:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently; | |
var map = require('./transform').map; | |
exports.concatMap = concatMap; | |
/** | |
* Map each value in stream to a new stream, and concatenate them all | |
* stream: -a---b---cX | |
* f(a): 1-1-1-1X | |
* f(b): -2-2-2-2X | |
* f(c): -3-3-3-3X | |
* stream.concatMap(f): -1-1-1-1-2-2-2-2-3-3-3-3X | |
* @param {function(x:*):Stream} f function to map each value to a stream | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing all events from each stream returned by f | |
*/ | |
function concatMap(f, stream) { | |
return mergeConcurrently(1, map(f, stream)); | |
} | |
},{"./mergeConcurrently":21,"./transform":31}],13:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var isPromise = require('../Promise').isPromise; | |
exports.continueWith = continueWith; | |
function continueWith(f, stream) { | |
return new Stream(new ContinueWith(f, stream.source)); | |
} | |
function ContinueWith(f, source) { | |
this.f = f; | |
this.source = source; | |
} | |
ContinueWith.prototype.run = function(sink, scheduler) { | |
return new ContinueWithSink(this.f, this.source, sink, scheduler); | |
}; | |
function ContinueWithSink(f, source, sink, scheduler) { | |
this.f = f; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
} | |
ContinueWithSink.prototype.error = Sink.prototype.error; | |
ContinueWithSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.sink.event(t, x); | |
}; | |
ContinueWithSink.prototype.end = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
var result = dispose.tryDispose(t, this.disposable, this.sink); | |
this.disposable = isPromise(result) | |
? dispose.promised(this._thenContinue(result, x)) | |
: this._continue(this.f, x); | |
}; | |
ContinueWithSink.prototype._thenContinue = function(p, x) { | |
var self = this; | |
return p.then(function () { | |
return self._continue(self.f, x); | |
}); | |
}; | |
ContinueWithSink.prototype._continue = function(f, x) { | |
return f(x).source.run(this.sink, this.scheduler); | |
}; | |
ContinueWithSink.prototype.dispose = function() { | |
this.active = false; | |
return this.disposable.dispose(); | |
}; | |
},{"../Promise":4,"../Stream":6,"../disposable/dispose":36,"../sink/Pipe":52}],14:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.delay = delay; | |
/** | |
* @param {Number} delayTime milliseconds to delay each item | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing the same items, but delayed by ms | |
*/ | |
function delay(delayTime, stream) { | |
return delayTime <= 0 ? stream | |
: new Stream(new Delay(delayTime, stream.source)); | |
} | |
function Delay(dt, source) { | |
this.dt = dt; | |
this.source = source; | |
} | |
Delay.prototype.run = function(sink, scheduler) { | |
var delaySink = new DelaySink(this.dt, sink, scheduler); | |
return dispose.all([delaySink, this.source.run(delaySink, scheduler)]); | |
}; | |
function DelaySink(dt, sink, scheduler) { | |
this.dt = dt; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
} | |
DelaySink.prototype.dispose = function() { | |
var self = this; | |
this.scheduler.cancelAll(function(task) { | |
return task.sink === self.sink; | |
}); | |
}; | |
DelaySink.prototype.event = function(t, x) { | |
this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink)); | |
}; | |
DelaySink.prototype.end = function(t, x) { | |
this.scheduler.delay(this.dt, PropagateTask.end(x, this.sink)); | |
}; | |
DelaySink.prototype.error = Sink.prototype.error; | |
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"../sink/Pipe":52}],15:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var ValueSource = require('../source/ValueSource'); | |
var tryDispose = require('../disposable/dispose').tryDispose; | |
var tryEvent = require('../source/tryEvent'); | |
var apply = require('../base').apply; | |
exports.flatMapError = recoverWith; | |
exports.recoverWith = recoverWith; | |
exports.throwError = throwError; | |
/** | |
* If stream encounters an error, recover and continue with items from stream | |
* returned by f. | |
* @param {function(error:*):Stream} f function which returns a new stream | |
* @param {Stream} stream | |
* @returns {Stream} new stream which will recover from an error by calling f | |
*/ | |
function recoverWith(f, stream) { | |
return new Stream(new RecoverWith(f, stream.source)); | |
} | |
/** | |
* Create a stream containing only an error | |
* @param {*} e error value, preferably an Error or Error subtype | |
* @returns {Stream} new stream containing only an error | |
*/ | |
function throwError(e) { | |
return new Stream(new ValueSource(error, e)); | |
} | |
function error(t, e, sink) { | |
sink.error(t, e); | |
} | |
function RecoverWith(f, source) { | |
this.f = f; | |
this.source = source; | |
} | |
RecoverWith.prototype.run = function(sink, scheduler) { | |
return new RecoverWithSink(this.f, this.source, sink, scheduler); | |
}; | |
function RecoverWithSink(f, source, sink, scheduler) { | |
this.f = f; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
this.disposable = source.run(this, scheduler); | |
} | |
RecoverWithSink.prototype.error = function(t, e) { | |
if(!this.active) { | |
return; | |
} | |
// TODO: forward dispose errors | |
tryDispose(t, this.disposable, this); | |
var stream = apply(this.f, e); | |
this.disposable = stream.source.run(this.sink, this.scheduler); | |
}; | |
RecoverWithSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
tryEvent.tryEvent(t, x, this.sink); | |
}; | |
RecoverWithSink.prototype.end = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
tryEvent.tryEnd(t, x, this.sink); | |
}; | |
RecoverWithSink.prototype.dispose = function() { | |
this.active = false; | |
return this.disposable.dispose(); | |
}; | |
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../source/ValueSource":56,"../source/tryEvent":66}],16:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var Filter = require('../fusion/Filter'); | |
exports.filter = filter; | |
exports.skipRepeats = skipRepeats; | |
exports.skipRepeatsWith = skipRepeatsWith; | |
/** | |
* Retain only items matching a predicate | |
* @param {function(x:*):boolean} p filtering predicate called for each item | |
* @param {Stream} stream stream to filter | |
* @returns {Stream} stream containing only items for which predicate returns truthy | |
*/ | |
function filter(p, stream) { | |
return new Stream(Filter.create(p, stream.source)); | |
} | |
/** | |
* Skip repeated events, using === to detect duplicates | |
* @param {Stream} stream stream from which to omit repeated events | |
* @returns {Stream} stream without repeated events | |
*/ | |
function skipRepeats(stream) { | |
return skipRepeatsWith(same, stream); | |
} | |
/** | |
* Skip repeated events using the provided equals function to detect duplicates | |
* @param {function(a:*, b:*):boolean} equals optional function to compare items | |
* @param {Stream} stream stream from which to omit repeated events | |
* @returns {Stream} stream without repeated events | |
*/ | |
function skipRepeatsWith(equals, stream) { | |
return new Stream(new SkipRepeats(equals, stream.source)); | |
} | |
function SkipRepeats(equals, source) { | |
this.equals = equals; | |
this.source = source; | |
} | |
SkipRepeats.prototype.run = function(sink, scheduler) { | |
return this.source.run(new SkipRepeatsSink(this.equals, sink), scheduler); | |
}; | |
function SkipRepeatsSink(equals, sink) { | |
this.equals = equals; | |
this.sink = sink; | |
this.value = void 0; | |
this.init = true; | |
} | |
SkipRepeatsSink.prototype.end = Sink.prototype.end; | |
SkipRepeatsSink.prototype.error = Sink.prototype.error; | |
SkipRepeatsSink.prototype.event = function(t, x) { | |
if(this.init) { | |
this.init = false; | |
this.value = x; | |
this.sink.event(t, x); | |
} else if(!this.equals(this.value, x)) { | |
this.value = x; | |
this.sink.event(t, x); | |
} | |
}; | |
function same(a, b) { | |
return a === b; | |
} | |
},{"../Stream":6,"../fusion/Filter":38,"../sink/Pipe":52}],17:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently; | |
var map = require('./transform').map; | |
exports.flatMap = flatMap; | |
exports.join = join; | |
/** | |
* Map each value in the stream to a new stream, and merge it into the | |
* returned outer stream. Event arrival times are preserved. | |
* @param {function(x:*):Stream} f chaining function, must return a Stream | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing all events from each stream returned by f | |
*/ | |
function flatMap(f, stream) { | |
return join(map(f, stream)); | |
} | |
/** | |
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner | |
* streams to the outer. Event arrival times are preserved. | |
* @param {Stream<Stream<X>>} stream stream of streams | |
* @returns {Stream<X>} new stream containing all events of all inner streams | |
*/ | |
function join(stream) { | |
return mergeConcurrently(Infinity, stream); | |
} | |
},{"./mergeConcurrently":21,"./transform":31}],18:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.throttle = throttle; | |
exports.debounce = debounce; | |
/** | |
* Limit the rate of events by suppressing events that occur too often | |
* @param {Number} period time to suppress events | |
* @param {Stream} stream | |
* @returns {Stream} | |
*/ | |
function throttle(period, stream) { | |
return new Stream(new Throttle(period, stream.source)); | |
} | |
function Throttle(period, source) { | |
this.dt = period; | |
this.source = source; | |
} | |
Throttle.prototype.run = function(sink, scheduler) { | |
return this.source.run(new ThrottleSink(this.dt, sink), scheduler); | |
}; | |
function ThrottleSink(dt, sink) { | |
this.time = 0; | |
this.dt = dt; | |
this.sink = sink; | |
} | |
ThrottleSink.prototype.event = function(t, x) { | |
if(t >= this.time) { | |
this.time = t + this.dt; | |
this.sink.event(t, x); | |
} | |
}; | |
ThrottleSink.prototype.end = Sink.prototype.end; | |
ThrottleSink.prototype.error = Sink.prototype.error; | |
/** | |
* Wait for a burst of events to subside and emit only the last event in the burst | |
* @param {Number} period events occuring more frequently than this | |
* will be suppressed | |
* @param {Stream} stream stream to debounce | |
* @returns {Stream} new debounced stream | |
*/ | |
function debounce(period, stream) { | |
return new Stream(new Debounce(period, stream.source)); | |
} | |
function Debounce(dt, source) { | |
this.dt = dt; | |
this.source = source; | |
} | |
Debounce.prototype.run = function(sink, scheduler) { | |
return new DebounceSink(this.dt, this.source, sink, scheduler); | |
}; | |
function DebounceSink(dt, source, sink, scheduler) { | |
this.dt = dt; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.value = void 0; | |
this.timer = null; | |
var sourceDisposable = source.run(this, scheduler); | |
this.disposable = dispose.all([this, sourceDisposable]); | |
} | |
DebounceSink.prototype.event = function(t, x) { | |
this._clearTimer(); | |
this.value = x; | |
this.timer = this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink)); | |
}; | |
DebounceSink.prototype.end = function(t, x) { | |
if(this._clearTimer()) { | |
this.sink.event(t, this.value); | |
this.value = void 0; | |
} | |
this.sink.end(t, x); | |
}; | |
DebounceSink.prototype.error = function(t, x) { | |
this._clearTimer(); | |
this.sink.error(t, x); | |
}; | |
DebounceSink.prototype.dispose = function() { | |
this._clearTimer(); | |
}; | |
DebounceSink.prototype._clearTimer = function() { | |
if(this.timer === null) { | |
return false; | |
} | |
this.timer.cancel(); | |
this.timer = null; | |
return true; | |
}; | |
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"../sink/Pipe":52}],19:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
exports.loop = loop; | |
/** | |
* Generalized feedback loop. Call a stepper function for each event. The stepper | |
* will be called with 2 params: the current seed and the an event value. It must | |
* return a new { seed, value } pair. The `seed` will be fed back into the next | |
* invocation of stepper, and the `value` will be propagated as the event value. | |
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function | |
* @param {*} seed initial seed value passed to first stepper call | |
* @param {Stream} stream event stream | |
* @returns {Stream} new stream whose values are the `value` field of the objects | |
* returned by the stepper | |
*/ | |
function loop(stepper, seed, stream) { | |
return new Stream(new Loop(stepper, seed, stream.source)); | |
} | |
function Loop(stepper, seed, source) { | |
this.step = stepper; | |
this.seed = seed; | |
this.source = source; | |
} | |
Loop.prototype.run = function(sink, scheduler) { | |
return this.source.run(new LoopSink(this.step, this.seed, sink), scheduler); | |
}; | |
function LoopSink(stepper, seed, sink) { | |
this.step = stepper; | |
this.seed = seed; | |
this.sink = sink; | |
} | |
LoopSink.prototype.error = Pipe.prototype.error; | |
LoopSink.prototype.event = function(t, x) { | |
var result = this.step(this.seed, x); | |
this.seed = result.seed; | |
this.sink.event(t, result.value); | |
}; | |
LoopSink.prototype.end = function(t) { | |
this.sink.end(t, this.seed); | |
}; | |
},{"../Stream":6,"../sink/Pipe":52}],20:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var IndexSink = require('../sink/IndexSink'); | |
var empty = require('../source/core').empty; | |
var dispose = require('../disposable/dispose'); | |
var base = require('../base'); | |
var copy = base.copy; | |
var map = base.map; | |
exports.merge = merge; | |
exports.mergeArray = mergeArray; | |
exports.mergeSources = mergeSources; | |
/** | |
* @returns {Stream} stream containing events from all streams in the argument | |
* list in time order. If two events are simultaneous they will be merged in | |
* arbitrary order. | |
*/ | |
function merge(/*...streams*/) { | |
return mergeArray(copy(arguments)); | |
} | |
/** | |
* @param {Array} streams array of stream to merge | |
* @returns {Stream} stream containing events from all input observables | |
* in time order. If two events are simultaneous they will be merged in | |
* arbitrary order. | |
*/ | |
function mergeArray(streams) { | |
var l = streams.length; | |
return l === 0 ? empty() | |
: l === 1 ? streams[0] | |
: new Stream(mergeSources(MergeSink, void 0, streams)); | |
} | |
function mergeSources(Sink, arg, streams) { | |
return new Merge(Sink, arg, map(getSource, streams)) | |
} | |
function getSource(stream) { | |
return stream.source; | |
} | |
function Merge(Sink, arg, sources) { | |
this.Sink = Sink; | |
this.arg = arg; | |
this.sources = sources; | |
} | |
Merge.prototype.run = function(sink, scheduler) { | |
var l = this.sources.length; | |
var disposables = new Array(l); | |
var sinks = new Array(l); | |
var mergeSink = new this.Sink(disposables, sinks, sink, this.arg); | |
for(var indexSink, i=0; i<l; ++i) { | |
indexSink = sinks[i] = new IndexSink(i, mergeSink); | |
disposables[i] = this.sources[i].run(indexSink, scheduler); | |
} | |
return dispose.all(disposables); | |
}; | |
function MergeSink(disposables, sinks, sink) { | |
this.sink = sink; | |
this.disposables = disposables; | |
this.activeCount = sinks.length; | |
} | |
MergeSink.prototype.error = Pipe.prototype.error; | |
MergeSink.prototype.event = function(t, indexValue) { | |
this.sink.event(t, indexValue.value); | |
}; | |
MergeSink.prototype.end = function(t, indexedValue) { | |
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink); | |
if(--this.activeCount === 0) { | |
this.sink.end(t, indexedValue.value); | |
} | |
}; | |
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../sink/IndexSink":50,"../sink/Pipe":52,"../source/core":57}],21:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var dispose = require('../disposable/dispose'); | |
var LinkedList = require('../LinkedList'); | |
exports.mergeConcurrently = mergeConcurrently; | |
function mergeConcurrently(concurrency, stream) { | |
return new Stream(new MergeConcurrently(concurrency, stream.source)); | |
} | |
function MergeConcurrently(concurrency, source) { | |
this.concurrency = concurrency; | |
this.source = source; | |
} | |
MergeConcurrently.prototype.run = function(sink, scheduler) { | |
return new Outer(this.concurrency, this.source, sink, scheduler); | |
}; | |
function Outer(concurrency, source, sink, scheduler) { | |
this.concurrency = concurrency; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.pending = []; | |
this.current = new LinkedList(); | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
this.active = true; | |
} | |
Outer.prototype.event = function(t, x) { | |
this._addInner(t, x); | |
}; | |
Outer.prototype._addInner = function(t, stream) { | |
if(this.current.length < this.concurrency) { | |
this._startInner(t, stream); | |
} else { | |
this.pending.push(stream); | |
} | |
}; | |
Outer.prototype._startInner = function(t, stream) { | |
var innerSink = new Inner(t, this, this.sink); | |
this.current.add(innerSink); | |
innerSink.disposable = stream.source.run(innerSink, this.scheduler); | |
}; | |
Outer.prototype.end = function(t, x) { | |
this.active = false; | |
this.disposable.dispose(); | |
this._checkEnd(t, x); | |
}; | |
Outer.prototype.error = function(t, e) { | |
this.active = false; | |
this.sink.error(t, e); | |
}; | |
Outer.prototype.dispose = function() { | |
this.active = false; | |
this.pending.length = 0; | |
return Promise.all([this.disposable.dispose(), this.current.dispose()]); | |
}; | |
Outer.prototype._endInner = function(t, x, inner) { | |
this.current.remove(inner); | |
dispose.tryDispose(t, inner, this); | |
if(this.pending.length === 0) { | |
this._checkEnd(t, x); | |
} else { | |
this._startInner(t, this.pending.shift()); | |
} | |
}; | |
Outer.prototype._checkEnd = function(t, x) { | |
if(!this.active && this.current.isEmpty()) { | |
this.sink.end(t, x); | |
} | |
}; | |
function Inner(time, outer, sink) { | |
this.prev = this.next = null; | |
this.time = time; | |
this.outer = outer; | |
this.sink = sink; | |
this.disposable = void 0; | |
} | |
Inner.prototype.event = function(t, x) { | |
this.sink.event(Math.max(t, this.time), x); | |
}; | |
Inner.prototype.end = function(t, x) { | |
this.outer._endInner(Math.max(t, this.time), x, this); | |
}; | |
Inner.prototype.error = function(t, e) { | |
this.outer.error(Math.max(t, this.time), e); | |
}; | |
Inner.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
},{"../LinkedList":3,"../Stream":6,"../disposable/dispose":36}],22:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
/** @contributor Maciej Ligenza */ | |
var Stream = require('../Stream'); | |
var MulticastSource = require('../source/MulticastSource'); | |
exports.multicast = multicast; | |
/** | |
* Transform the stream into a multicast stream, allowing it to be shared | |
* more efficiently by many observers, without causing multiple invocation | |
* of internal machinery. Multicast is idempotent: | |
* stream.multicast() === stream.multicast().multicast() | |
* @param {Stream} stream to ensure is multicast. | |
* @returns {Stream} new stream which will multicast events to all observers. | |
*/ | |
function multicast(stream) { | |
var source = stream.source; | |
return source instanceof MulticastSource ? stream | |
: new Stream(new MulticastSource(source)); | |
} | |
},{"../Stream":6,"../source/MulticastSource":55}],23:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var runSource = require('../runSource'); | |
var noop = require('../base').noop; | |
exports.observe = observe; | |
exports.drain = drain; | |
/** | |
* Observe all the event values in the stream in time order. The | |
* provided function `f` will be called for each event value | |
* @param {function(x:T):*} f function to call with each event value | |
* @param {Stream<T>} stream stream to observe | |
* @return {Promise} promise that fulfills after the stream ends without | |
* an error, or rejects if the stream ends with an error. | |
*/ | |
function observe(f, stream) { | |
return runSource.withDefaultScheduler(f, stream.source); | |
} | |
/** | |
* "Run" a stream by | |
* @param stream | |
* @return {*} | |
*/ | |
function drain(stream) { | |
return runSource.withDefaultScheduler(noop, stream.source); | |
} | |
},{"../base":7,"../runSource":43}],24:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var fatal = require('../fatalError'); | |
exports.fromPromise = fromPromise; | |
exports.awaitPromises = awaitPromises; | |
/** | |
* Create a stream containing only the promise's fulfillment | |
* value at the time it fulfills. | |
* @param {Promise<T>} p promise | |
* @return {Stream<T>} stream containing promise's fulfillment value. | |
* If the promise rejects, the stream will error | |
*/ | |
function fromPromise(p) { | |
return new Stream(new PromiseSource(p)); | |
} | |
function PromiseSource(p) { | |
this.promise = p; | |
} | |
PromiseSource.prototype.run = function(sink, scheduler) { | |
return new PromiseProducer(this.promise, sink, scheduler); | |
}; | |
function PromiseProducer(p, sink, scheduler) { | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
var self = this; | |
Promise.resolve(p).then(function(x) { | |
self._emit(self.scheduler.now(), x); | |
}).catch(function(e) { | |
self._error(self.scheduler.now(), e); | |
}); | |
} | |
PromiseProducer.prototype._emit = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.sink.event(t, x); | |
this.sink.end(t, void 0); | |
}; | |
PromiseProducer.prototype._error = function(t, e) { | |
if(!this.active) { | |
return; | |
} | |
this.sink.error(t, e); | |
}; | |
PromiseProducer.prototype.dispose = function() { | |
this.active = false; | |
}; | |
/** | |
* Turn a Stream<Promise<T>> into Stream<T> by awaiting each promise. | |
* Event order is preserved. | |
* @param {Stream<Promise<T>>} stream | |
* @return {Stream<T>} stream of fulfillment values. The stream will | |
* error if any promise rejects. | |
*/ | |
function awaitPromises(stream) { | |
return new Stream(new Await(stream.source)); | |
} | |
function Await(source) { | |
this.source = source; | |
} | |
Await.prototype.run = function(sink, scheduler) { | |
return this.source.run(new AwaitSink(sink, scheduler), scheduler); | |
}; | |
function AwaitSink(sink, scheduler) { | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.queue = Promise.resolve(); | |
var self = this; | |
// Pre-create closures, to avoid creating them per event | |
this._eventBound = function(x) { | |
self.sink.event(self.scheduler.now(), x); | |
}; | |
this._endBound = function(x) { | |
self.sink.end(self.scheduler.now(), x); | |
}; | |
this._errorBound = function(e) { | |
self.sink.error(self.scheduler.now(), e); | |
}; | |
} | |
AwaitSink.prototype.event = function(t, promise) { | |
var self = this; | |
this.queue = this.queue.then(function() { | |
return self._event(promise); | |
}).catch(this._errorBound); | |
}; | |
AwaitSink.prototype.end = function(t, x) { | |
var self = this; | |
this.queue = this.queue.then(function() { | |
return self._end(x); | |
}).catch(this._errorBound); | |
}; | |
AwaitSink.prototype.error = function(t, e) { | |
var self = this; | |
// Don't resolve error values, propagate directly | |
this.queue = this.queue.then(function() { | |
return self._errorBound(e); | |
}).catch(fatal); | |
}; | |
AwaitSink.prototype._event = function(promise) { | |
return promise.then(this._eventBound); | |
}; | |
AwaitSink.prototype._end = function(x) { | |
return Promise.resolve(x).then(this._endBound); | |
}; | |
},{"../Stream":6,"../fatalError":37}],25:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var base = require('../base'); | |
var invoke = require('../invoke'); | |
exports.sample = sample; | |
exports.sampleWith = sampleWith; | |
exports.sampleArray = sampleArray; | |
/** | |
* When an event arrives on sampler, emit the result of calling f with the latest | |
* values of all streams being sampled | |
* @param {function(...values):*} f function to apply to each set of sampled values | |
* @param {Stream} sampler streams will be sampled whenever an event arrives | |
* on sampler | |
* @returns {Stream} stream of sampled and transformed values | |
*/ | |
function sample(f, sampler /*, ...streams */) { | |
return sampleArray(f, sampler, base.drop(2, arguments)); | |
} | |
/** | |
* When an event arrives on sampler, emit the latest event value from stream. | |
* @param {Stream} sampler stream of events at whose arrival time | |
* stream's latest value will be propagated | |
* @param {Stream} stream stream of values | |
* @returns {Stream} sampled stream of values | |
*/ | |
function sampleWith(sampler, stream) { | |
return new Stream(new Sampler(base.identity, sampler.source, [stream.source])); | |
} | |
function sampleArray(f, sampler, streams) { | |
return new Stream(new Sampler(f, sampler.source, base.map(getSource, streams))); | |
} | |
function getSource(stream) { | |
return stream.source; | |
} | |
function Sampler(f, sampler, sources) { | |
this.f = f; | |
this.sampler = sampler; | |
this.sources = sources; | |
} | |
Sampler.prototype.run = function(sink, scheduler) { | |
var l = this.sources.length; | |
var disposables = new Array(l+1); | |
var sinks = new Array(l); | |
var sampleSink = new SampleSink(this.f, sinks, sink); | |
for(var hold, i=0; i<l; ++i) { | |
hold = sinks[i] = new Hold(sampleSink); | |
disposables[i] = this.sources[i].run(hold, scheduler); | |
} | |
disposables[i] = this.sampler.run(sampleSink, scheduler); | |
return dispose.all(disposables); | |
}; | |
function Hold(sink) { | |
this.sink = sink; | |
this.hasValue = false; | |
} | |
Hold.prototype.event = function(t, x) { | |
this.value = x; | |
this.hasValue = true; | |
this.sink._notify(this); | |
}; | |
Hold.prototype.end = base.noop; | |
Hold.prototype.error = Pipe.prototype.error; | |
function SampleSink(f, sinks, sink) { | |
this.f = f; | |
this.sinks = sinks; | |
this.sink = sink; | |
this.active = false; | |
} | |
SampleSink.prototype._notify = function() { | |
if(!this.active) { | |
this.active = this.sinks.every(hasValue); | |
} | |
}; | |
SampleSink.prototype.event = function(t) { | |
if(this.active) { | |
this.sink.event(t, invoke(this.f, base.map(getValue, this.sinks))); | |
} | |
}; | |
SampleSink.prototype.end = Pipe.prototype.end; | |
SampleSink.prototype.error = Pipe.prototype.error; | |
function hasValue(hold) { | |
return hold.hasValue; | |
} | |
function getValue(hold) { | |
return hold.value; | |
} | |
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../invoke":41,"../sink/Pipe":52}],26:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
var core = require('../source/core'); | |
var dispose = require('../disposable/dispose'); | |
exports.take = take; | |
exports.skip = skip; | |
exports.slice = slice; | |
exports.takeWhile = takeWhile; | |
exports.skipWhile = skipWhile; | |
/** | |
* @param {number} n | |
* @param {Stream} stream | |
* @returns {Stream} new stream containing only up to the first n items from stream | |
*/ | |
function take(n, stream) { | |
return slice(0, n, stream); | |
} | |
/** | |
* @param {number} n | |
* @param {Stream} stream | |
* @returns {Stream} new stream with the first n items removed | |
*/ | |
function skip(n, stream) { | |
return slice(n, Infinity, stream); | |
} | |
/** | |
* Slice a stream by index. Negative start/end indexes are not supported | |
* @param {number} start | |
* @param {number} end | |
* @param {Stream} stream | |
* @returns {Stream} stream containing items where start <= index < end | |
*/ | |
function slice(start, end, stream) { | |
return end <= start ? core.empty() | |
: new Stream(new Slice(start, end, stream.source)); | |
} | |
function Slice(min, max, source) { | |
this.skip = min; | |
this.take = max - min; | |
this.source = source; | |
} | |
Slice.prototype.run = function(sink, scheduler) { | |
return new SliceSink(this.skip, this.take, this.source, sink, scheduler); | |
}; | |
function SliceSink(skip, take, source, sink, scheduler) { | |
this.skip = skip; | |
this.take = take; | |
this.sink = sink; | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
} | |
SliceSink.prototype.end = Sink.prototype.end; | |
SliceSink.prototype.error = Sink.prototype.error; | |
SliceSink.prototype.event = function(t, x) { | |
if(this.skip > 0) { | |
this.skip -= 1; | |
return; | |
} | |
if(this.take === 0) { | |
return; | |
} | |
this.take -= 1; | |
this.sink.event(t, x); | |
if(this.take === 0) { | |
this.dispose(); | |
this.sink.end(t, x); | |
} | |
}; | |
SliceSink.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
function takeWhile(p, stream) { | |
return new Stream(new TakeWhile(p, stream.source)); | |
} | |
function TakeWhile(p, source) { | |
this.p = p; | |
this.source = source; | |
} | |
TakeWhile.prototype.run = function(sink, scheduler) { | |
return new TakeWhileSink(this.p, this.source, sink, scheduler); | |
}; | |
function TakeWhileSink(p, source, sink, scheduler) { | |
this.p = p; | |
this.sink = sink; | |
this.active = true; | |
this.disposable = dispose.once(source.run(this, scheduler)); | |
} | |
TakeWhileSink.prototype.end = Sink.prototype.end; | |
TakeWhileSink.prototype.error = Sink.prototype.error; | |
TakeWhileSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
var p = this.p; | |
this.active = p(x); | |
if(this.active) { | |
this.sink.event(t, x); | |
} else { | |
this.dispose(); | |
this.sink.end(t, x); | |
} | |
}; | |
TakeWhileSink.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
function skipWhile(p, stream) { | |
return new Stream(new SkipWhile(p, stream.source)); | |
} | |
function SkipWhile(p, source) { | |
this.p = p; | |
this.source = source; | |
} | |
SkipWhile.prototype.run = function(sink, scheduler) { | |
return this.source.run(new SkipWhileSink(this.p, sink), scheduler); | |
}; | |
function SkipWhileSink(p, sink) { | |
this.p = p; | |
this.sink = sink; | |
this.skipping = true; | |
} | |
SkipWhileSink.prototype.end = Sink.prototype.end; | |
SkipWhileSink.prototype.error = Sink.prototype.error; | |
SkipWhileSink.prototype.event = function(t, x) { | |
if(this.skipping) { | |
var p = this.p; | |
this.skipping = p(x); | |
if(this.skipping) { | |
return; | |
} | |
} | |
this.sink.event(t, x); | |
}; | |
},{"../Stream":6,"../disposable/dispose":36,"../sink/Pipe":52,"../source/core":57}],27:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var MulticastSource = require('../source/MulticastSource'); | |
var until = require('./timeslice').takeUntil; | |
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently; | |
var map = require('./transform').map; | |
exports.switch = switchLatest; | |
/** | |
* Given a stream of streams, return a new stream that adopts the behavior | |
* of the most recent inner stream. | |
* @param {Stream} stream of streams on which to switch | |
* @returns {Stream} switching stream | |
*/ | |
function switchLatest(stream) { | |
var upstream = new Stream(new MulticastSource(stream.source)); | |
return mergeConcurrently(1, map(untilNext, upstream)); | |
function untilNext(s) { | |
return until(upstream, s); | |
} | |
} | |
},{"../Stream":6,"../source/MulticastSource":55,"./mergeConcurrently":21,"./timeslice":28,"./transform":31}],28:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Pipe = require('../sink/Pipe'); | |
var dispose = require('../disposable/dispose'); | |
var join = require('../combinator/flatMap').join; | |
var noop = require('../base').noop; | |
exports.during = during; | |
exports.takeUntil = takeUntil; | |
exports.skipUntil = skipUntil; | |
function takeUntil(signal, stream) { | |
return new Stream(new Until(signal.source, stream.source)); | |
} | |
function skipUntil(signal, stream) { | |
return new Stream(new Since(signal.source, stream.source)); | |
} | |
function during(timeWindow, stream) { | |
return takeUntil(join(timeWindow), skipUntil(timeWindow, stream)); | |
} | |
function Until(maxSignal, source) { | |
this.maxSignal = maxSignal; | |
this.source = source; | |
} | |
Until.prototype.run = function(sink, scheduler) { | |
var min = new Bound(-Infinity, sink); | |
var max = new UpperBound(this.maxSignal, sink, scheduler); | |
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler); | |
return dispose.all([min, max, disposable]); | |
}; | |
function Since(minSignal, source) { | |
this.minSignal = minSignal; | |
this.source = source; | |
} | |
Since.prototype.run = function(sink, scheduler) { | |
var min = new LowerBound(this.minSignal, sink, scheduler); | |
var max = new Bound(Infinity, sink); | |
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler); | |
return dispose.all([min, max, disposable]); | |
}; | |
function Bound(value, sink) { | |
this.value = value; | |
this.sink = sink; | |
} | |
Bound.prototype.error = Pipe.prototype.error; | |
Bound.prototype.event = noop; | |
Bound.prototype.end = noop; | |
Bound.prototype.dispose = noop; | |
function TimeWindowSink(min, max, sink) { | |
this.min = min; | |
this.max = max; | |
this.sink = sink; | |
} | |
TimeWindowSink.prototype.event = function(t, x) { | |
if(t >= this.min.value && t < this.max.value) { | |
this.sink.event(t, x); | |
} | |
}; | |
TimeWindowSink.prototype.error = Pipe.prototype.error; | |
TimeWindowSink.prototype.end = Pipe.prototype.end; | |
function LowerBound(signal, sink, scheduler) { | |
this.value = Infinity; | |
this.sink = sink; | |
this.disposable = signal.run(this, scheduler); | |
} | |
LowerBound.prototype.event = function(t /*, x */) { | |
if(t < this.value) { | |
this.value = t; | |
} | |
}; | |
LowerBound.prototype.end = noop; | |
LowerBound.prototype.error = Pipe.prototype.error; | |
LowerBound.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
function UpperBound(signal, sink, scheduler) { | |
this.value = Infinity; | |
this.sink = sink; | |
this.disposable = signal.run(this, scheduler); | |
} | |
UpperBound.prototype.event = function(t, x) { | |
if(t < this.value) { | |
this.value = t; | |
this.sink.end(t, x); | |
} | |
}; | |
UpperBound.prototype.end = noop; | |
UpperBound.prototype.error = Pipe.prototype.error; | |
UpperBound.prototype.dispose = function() { | |
return this.disposable.dispose(); | |
}; | |
},{"../Stream":6,"../base":7,"../combinator/flatMap":17,"../disposable/dispose":36,"../sink/Pipe":52}],29:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Sink = require('../sink/Pipe'); | |
exports.timestamp = timestamp; | |
function timestamp(stream) { | |
return new Stream(new Timestamp(stream.source)); | |
} | |
function Timestamp(source) { | |
this.source = source; | |
} | |
Timestamp.prototype.run = function(sink, scheduler) { | |
return this.source.run(new TimestampSink(sink), scheduler); | |
}; | |
function TimestampSink(sink) { | |
this.sink = sink; | |
} | |
TimestampSink.prototype.end = Sink.prototype.end; | |
TimestampSink.prototype.error = Sink.prototype.error; | |
TimestampSink.prototype.event = function(t, x) { | |
this.sink.event(t, { time: t, value: x }); | |
}; | |
},{"../Stream":6,"../sink/Pipe":52}],30:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
exports.transduce = transduce; | |
/** | |
* Transform a stream by passing its events through a transducer. | |
* @param {function} transducer transducer function | |
* @param {Stream} stream stream whose events will be passed through the | |
* transducer | |
* @return {Stream} stream of events transformed by the transducer | |
*/ | |
function transduce(transducer, stream) { | |
return new Stream(new Transduce(transducer, stream.source)); | |
} | |
function Transduce(transducer, source) { | |
this.transducer = transducer; | |
this.source = source; | |
} | |
Transduce.prototype.run = function(sink, scheduler) { | |
var xf = this.transducer(new Transformer(sink)); | |
return this.source.run(new TransduceSink(getTxHandler(xf), sink), scheduler); | |
}; | |
function TransduceSink(adapter, sink) { | |
this.xf = adapter; | |
this.sink = sink; | |
} | |
TransduceSink.prototype.event = function(t, x) { | |
var next = this.xf.step(t, x); | |
return this.xf.isReduced(next) | |
? this.sink.end(t, this.xf.getResult(next)) | |
: next; | |
}; | |
TransduceSink.prototype.end = function(t, x) { | |
return this.xf.result(x); | |
}; | |
TransduceSink.prototype.error = function(t, e) { | |
return this.sink.error(t, e); | |
}; | |
function Transformer(sink) { | |
this.time = -Infinity; | |
this.sink = sink; | |
} | |
Transformer.prototype['@@transducer/init'] = Transformer.prototype.init = function() {}; | |
Transformer.prototype['@@transducer/step'] = Transformer.prototype.step = function(t, x) { | |
if(!isNaN(t)) { | |
this.time = Math.max(t, this.time); | |
} | |
return this.sink.event(this.time, x); | |
}; | |
Transformer.prototype['@@transducer/result'] = Transformer.prototype.result = function(x) { | |
return this.sink.end(this.time, x); | |
}; | |
/** | |
* Given an object supporting the new or legacy transducer protocol, | |
* create an adapter for it. | |
* @param {object} tx transform | |
* @returns {TxAdapter|LegacyTxAdapter} | |
*/ | |
function getTxHandler(tx) { | |
return typeof tx['@@transducer/step'] === 'function' | |
? new TxAdapter(tx) | |
: new LegacyTxAdapter(tx); | |
} | |
/** | |
* Adapter for new official transducer protocol | |
* @param {object} tx transform | |
* @constructor | |
*/ | |
function TxAdapter(tx) { | |
this.tx = tx; | |
} | |
TxAdapter.prototype.step = function(t, x) { | |
return this.tx['@@transducer/step'](t, x); | |
}; | |
TxAdapter.prototype.result = function(x) { | |
return this.tx['@@transducer/result'](x); | |
}; | |
TxAdapter.prototype.isReduced = function(x) { | |
return x != null && x['@@transducer/reduced']; | |
}; | |
TxAdapter.prototype.getResult = function(x) { | |
return x['@@transducer/value']; | |
}; | |
/** | |
* Adapter for older transducer protocol | |
* @param {object} tx transform | |
* @constructor | |
*/ | |
function LegacyTxAdapter(tx) { | |
this.tx = tx; | |
} | |
LegacyTxAdapter.prototype.step = function(t, x) { | |
return this.tx.step(t, x); | |
}; | |
LegacyTxAdapter.prototype.result = function(x) { | |
return this.tx.result(x); | |
}; | |
LegacyTxAdapter.prototype.isReduced = function(x) { | |
return x != null && x.__transducers_reduced__; | |
}; | |
LegacyTxAdapter.prototype.getResult = function(x) { | |
return x.value; | |
}; | |
},{"../Stream":6}],31:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var Map = require('../fusion/Map'); | |
exports.map = map; | |
exports.constant = constant; | |
exports.tap = tap; | |
/** | |
* Transform each value in the stream by applying f to each | |
* @param {function(*):*} f mapping function | |
* @param {Stream} stream stream to map | |
* @returns {Stream} stream containing items transformed by f | |
*/ | |
function map(f, stream) { | |
return new Stream(Map.create(f, stream.source)); | |
} | |
/** | |
* Replace each value in the stream with x | |
* @param {*} x | |
* @param {Stream} stream | |
* @returns {Stream} stream containing items replaced with x | |
*/ | |
function constant(x, stream) { | |
return map(function() { | |
return x; | |
}, stream); | |
} | |
/** | |
* Perform a side effect for each item in the stream | |
* @param {function(x:*):*} f side effect to execute for each item. The | |
* return value will be discarded. | |
* @param {Stream} stream stream to tap | |
* @returns {Stream} new stream containing the same items as this stream | |
*/ | |
function tap(f, stream) { | |
return map(function(x) { | |
f(x); | |
return x; | |
}, stream); | |
} | |
},{"../Stream":6,"../fusion/Map":40}],32:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var transform = require('./transform'); | |
var core = require('../source/core'); | |
var Sink = require('../sink/Pipe'); | |
var IndexSink = require('../sink/IndexSink'); | |
var dispose = require('../disposable/dispose'); | |
var base = require('../base'); | |
var invoke = require('../invoke'); | |
var Queue = require('../Queue'); | |
var map = base.map; | |
var tail = base.tail; | |
exports.zip = zip; | |
exports.zipArray = zipArray; | |
/** | |
* Combine streams pairwise (or tuple-wise) by index by applying f to values | |
* at corresponding indices. The returned stream ends when any of the input | |
* streams ends. | |
* @param {function} f function to combine values | |
* @returns {Stream} new stream with items at corresponding indices combined | |
* using f | |
*/ | |
function zip(f /*,...streams */) { | |
return zipArray(f, tail(arguments)); | |
} | |
/** | |
* Combine streams pairwise (or tuple-wise) by index by applying f to values | |
* at corresponding indices. The returned stream ends when any of the input | |
* streams ends. | |
* @param {function} f function to combine values | |
* @param {[Stream]} streams streams to zip using f | |
* @returns {Stream} new stream with items at corresponding indices combined | |
* using f | |
*/ | |
function zipArray(f, streams) { | |
return streams.length === 0 ? core.empty() | |
: streams.length === 1 ? transform.map(f, streams[0]) | |
: new Stream(new Zip(f, map(getSource, streams))); | |
} | |
function getSource(stream) { | |
return stream.source; | |
} | |
function Zip(f, sources) { | |
this.f = f; | |
this.sources = sources; | |
} | |
Zip.prototype.run = function(sink, scheduler) { | |
var l = this.sources.length; | |
var disposables = new Array(l); | |
var sinks = new Array(l); | |
var buffers = new Array(l); | |
var zipSink = new ZipSink(this.f, buffers, sinks, sink); | |
for(var indexSink, i=0; i<l; ++i) { | |
buffers[i] = new Queue(); | |
indexSink = sinks[i] = new IndexSink(i, zipSink); | |
disposables[i] = this.sources[i].run(indexSink, scheduler); | |
} | |
return dispose.all(disposables); | |
}; | |
function ZipSink(f, buffers, sinks, sink) { | |
this.f = f; | |
this.sinks = sinks; | |
this.sink = sink; | |
this.buffers = buffers; | |
} | |
ZipSink.prototype.event = function(t, indexedValue) { | |
var buffers = this.buffers; | |
var buffer = buffers[indexedValue.index]; | |
buffer.push(indexedValue.value); | |
if(buffer.length() === 1) { | |
if(!ready(this.buffers)) { | |
return; | |
} | |
emitZipped(this.f, t, buffers, this.sink); | |
if (ended(this.buffers, this.sinks)) { | |
this.sink.end(t, void 0); | |
} | |
} | |
}; | |
ZipSink.prototype.end = function(t, indexedValue) { | |
var buffer = this.buffers[indexedValue.index]; | |
if(buffer.isEmpty()) { | |
this.sink.end(t, indexedValue.value); | |
} | |
}; | |
ZipSink.prototype.error = Sink.prototype.error; | |
function emitZipped (f, t, buffers, sink) { | |
sink.event(t, invoke(f, map(head, buffers))); | |
} | |
function head(buffer) { | |
return buffer.shift(); | |
} | |
function ended(buffers, sinks) { | |
for(var i=0, l=buffers.length; i<l; ++i) { | |
if(buffers[i].isEmpty() && !sinks[i].active) { | |
return true; | |
} | |
} | |
return false; | |
} | |
function ready(buffers) { | |
for(var i=0, l=buffers.length; i<l; ++i) { | |
if(buffers[i].isEmpty()) { | |
return false; | |
} | |
} | |
return true; | |
} | |
},{"../Queue":5,"../Stream":6,"../base":7,"../disposable/dispose":36,"../invoke":41,"../sink/IndexSink":50,"../sink/Pipe":52,"../source/core":57,"./transform":31}],33:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = defer; | |
function defer(task) { | |
return Promise.resolve(task).then(runTask); | |
} | |
function runTask(task) { | |
try { | |
return task.run(); | |
} catch(e) { | |
return task.error(e); | |
} | |
} | |
},{}],34:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Disposable; | |
/** | |
* Create a new Disposable which will dispose its underlying resource. | |
* @param {function} dispose function | |
* @param {*?} data any data to be passed to disposer function | |
* @constructor | |
*/ | |
function Disposable(dispose, data) { | |
this._dispose = dispose; | |
this._data = data; | |
} | |
Disposable.prototype.dispose = function() { | |
return this._dispose(this._data); | |
}; | |
},{}],35:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = SettableDisposable; | |
function SettableDisposable() { | |
this.disposable = void 0; | |
this.disposed = false; | |
this._resolve = void 0; | |
var self = this; | |
this.result = new Promise(function(resolve) { | |
self._resolve = resolve; | |
}); | |
} | |
SettableDisposable.prototype.setDisposable = function(disposable) { | |
if(this.disposable !== void 0) { | |
throw new Error('setDisposable called more than once'); | |
} | |
this.disposable = disposable; | |
if(this.disposed) { | |
this._resolve(disposable.dispose()); | |
} | |
}; | |
SettableDisposable.prototype.dispose = function() { | |
if(this.disposed) { | |
return this.result; | |
} | |
this.disposed = true; | |
if(this.disposable !== void 0) { | |
this.result = this.disposable.dispose(); | |
} | |
return this.result; | |
}; | |
},{}],36:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Disposable = require('./Disposable'); | |
var SettableDisposable = require('./SettableDisposable'); | |
var isPromise = require('../Promise').isPromise; | |
var base = require('../base'); | |
var map = base.map; | |
var identity = base.identity; | |
exports.tryDispose = tryDispose; | |
exports.create = create; | |
exports.once = once; | |
exports.empty = empty; | |
exports.all = all; | |
exports.settable = settable; | |
exports.promised = promised; | |
/** | |
* Call disposable.dispose. If it returns a promise, catch promise | |
* error and forward it through the provided sink. | |
* @param {number} t time | |
* @param {{dispose: function}} disposable | |
* @param {{error: function}} sink | |
* @return {*} result of disposable.dispose | |
*/ | |
function tryDispose(t, disposable, sink) { | |
var result = disposeSafely(disposable); | |
return isPromise(result) | |
? result.catch(function (e) { | |
sink.error(t, e); | |
}) | |
: result; | |
} | |
/** | |
* Create a new Disposable which will dispose its underlying resource | |
* at most once. | |
* @param {function} dispose function | |
* @param {*?} data any data to be passed to disposer function | |
* @return {Disposable} | |
*/ | |
function create(dispose, data) { | |
return once(new Disposable(dispose, data)); | |
} | |
/** | |
* Create a noop disposable. Can be used to satisfy a Disposable | |
* requirement when no actual resource needs to be disposed. | |
* @return {Disposable|exports|module.exports} | |
*/ | |
function empty() { | |
return new Disposable(identity, void 0); | |
} | |
/** | |
* Create a disposable that will dispose all input disposables in parallel. | |
* @param {Array<Disposable>} disposables | |
* @return {Disposable} | |
*/ | |
function all(disposables) { | |
return create(disposeAll, disposables); | |
} | |
function disposeAll(disposables) { | |
return Promise.all(map(disposeSafely, disposables)); | |
} | |
function disposeSafely(disposable) { | |
try { | |
return disposable.dispose(); | |
} catch(e) { | |
return Promise.reject(e); | |
} | |
} | |
/** | |
* Create a disposable from a promise for another disposable | |
* @param {Promise<Disposable>} disposablePromise | |
* @return {Disposable} | |
*/ | |
function promised(disposablePromise) { | |
return create(disposePromise, disposablePromise); | |
} | |
function disposePromise(disposablePromise) { | |
return disposablePromise.then(disposeOne); | |
} | |
function disposeOne(disposable) { | |
return disposable.dispose(); | |
} | |
/** | |
* Create a disposable proxy that allows its underlying disposable to | |
* be set later. | |
* @return {SettableDisposable} | |
*/ | |
function settable() { | |
return new SettableDisposable(); | |
} | |
/** | |
* Wrap an existing disposable (which may not already have been once()d) | |
* so that it will only dispose its underlying resource at most once. | |
* @param {{ dispose: function() }} disposable | |
* @return {Disposable} wrapped disposable | |
*/ | |
function once(disposable) { | |
return new Disposable(disposeMemoized, memoized(disposable)); | |
} | |
function disposeMemoized(memoized) { | |
if(!memoized.disposed) { | |
memoized.disposed = true; | |
memoized.value = disposeSafely(memoized.disposable); | |
memoized.disposable = void 0; | |
} | |
return memoized.value; | |
} | |
function memoized(disposable) { | |
return { disposed: false, disposable: disposable, value: void 0 }; | |
} | |
},{"../Promise":4,"../base":7,"./Disposable":34,"./SettableDisposable":35}],37:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = fatalError; | |
function fatalError (e) { | |
setTimeout(function() { | |
throw e; | |
}, 0); | |
} | |
},{}],38:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Pipe = require('../sink/Pipe'); | |
module.exports = Filter; | |
function Filter(p, source) { | |
this.p = p; | |
this.source = source; | |
} | |
/** | |
* Create a filtered source, fusing adjacent filter.filter if possible | |
* @param {function(x:*):boolean} p filtering predicate | |
* @param {{run:function}} source source to filter | |
* @returns {Filter} filtered source | |
*/ | |
Filter.create = function createFilter(p, source) { | |
if (source instanceof Filter) { | |
return new Filter(and(source.p, p), source.source); | |
} | |
return new Filter(p, source); | |
}; | |
Filter.prototype.run = function(sink, scheduler) { | |
return this.source.run(new FilterSink(this.p, sink), scheduler); | |
}; | |
function FilterSink(p, sink) { | |
this.p = p; | |
this.sink = sink; | |
} | |
FilterSink.prototype.end = Pipe.prototype.end; | |
FilterSink.prototype.error = Pipe.prototype.error; | |
FilterSink.prototype.event = function(t, x) { | |
var p = this.p; | |
p(x) && this.sink.event(t, x); | |
}; | |
function and(p, q) { | |
return function(x) { | |
return p(x) && q(x); | |
}; | |
} | |
},{"../sink/Pipe":52}],39:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Pipe = require('../sink/Pipe'); | |
module.exports = FilterMap; | |
function FilterMap(p, f, source) { | |
this.p = p; | |
this.f = f; | |
this.source = source; | |
} | |
FilterMap.prototype.run = function(sink, scheduler) { | |
return this.source.run(new FilterMapSink(this.p, this.f, sink), scheduler); | |
}; | |
function FilterMapSink(p, f, sink) { | |
this.p = p; | |
this.f = f; | |
this.sink = sink; | |
} | |
FilterMapSink.prototype.event = function(t, x) { | |
var f = this.f; | |
var p = this.p; | |
p(x) && this.sink.event(t, f(x)); | |
}; | |
FilterMapSink.prototype.end = Pipe.prototype.end; | |
FilterMapSink.prototype.error = Pipe.prototype.error; | |
},{"../sink/Pipe":52}],40:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Pipe = require('../sink/Pipe'); | |
var Filter = require('./Filter'); | |
var FilterMap = require('./FilterMap'); | |
var base = require('../base'); | |
module.exports = Map; | |
function Map(f, source) { | |
this.f = f; | |
this.source = source; | |
} | |
/** | |
* Create a mapped source, fusing adjacent map.map, filter.map, | |
* and filter.map.map if possible | |
* @param {function(*):*} f mapping function | |
* @param {{run:function}} source source to map | |
* @returns {Map|FilterMap} mapped source, possibly fused | |
*/ | |
Map.create = function createMap(f, source) { | |
if(source instanceof Map) { | |
return new Map(base.compose(f, source.f), source.source); | |
} | |
if(source instanceof Filter) { | |
return new FilterMap(source.p, f, source.source); | |
} | |
if(source instanceof FilterMap) { | |
return new FilterMap(source.p, base.compose(f, source.f), source.source); | |
} | |
return new Map(f, source); | |
}; | |
Map.prototype.run = function(sink, scheduler) { | |
return this.source.run(new MapSink(this.f, sink), scheduler); | |
}; | |
function MapSink(f, sink) { | |
this.f = f; | |
this.sink = sink; | |
} | |
MapSink.prototype.end = Pipe.prototype.end; | |
MapSink.prototype.error = Pipe.prototype.error; | |
MapSink.prototype.event = function(t, x) { | |
var f = this.f; | |
this.sink.event(t, f(x)); | |
}; | |
},{"../base":7,"../sink/Pipe":52,"./Filter":38,"./FilterMap":39}],41:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = invoke; | |
function invoke(f, args) { | |
/*eslint complexity: [2,7]*/ | |
switch(args.length) { | |
case 0: return f(); | |
case 1: return f(args[0]); | |
case 2: return f(args[0], args[1]); | |
case 3: return f(args[0], args[1], args[2]); | |
case 4: return f(args[0], args[1], args[2], args[3]); | |
case 5: return f(args[0], args[1], args[2], args[3], args[4]); | |
default: | |
return f.apply(void 0, args); | |
} | |
} | |
},{}],42:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.isIterable = isIterable; | |
exports.getIterator = getIterator; | |
exports.makeIterable = makeIterable; | |
/*global Set, Symbol*/ | |
var iteratorSymbol; | |
// Firefox ships a partial implementation using the name @@iterator. | |
// https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 | |
if (typeof Set === 'function' && typeof new Set()['@@iterator'] === 'function') { | |
iteratorSymbol = '@@iterator'; | |
} else { | |
iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator || | |
'_es6shim_iterator_'; | |
} | |
function isIterable(o) { | |
return typeof o[iteratorSymbol] === 'function'; | |
} | |
function getIterator(o) { | |
return o[iteratorSymbol](); | |
} | |
function makeIterable(f, o) { | |
o[iteratorSymbol] = f; | |
return o; | |
} | |
},{}],43:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Observer = require('./sink/Observer'); | |
var dispose = require('./disposable/dispose'); | |
var defaultScheduler = require('./scheduler/defaultScheduler'); | |
exports.withDefaultScheduler = withDefaultScheduler; | |
exports.withScheduler = withScheduler; | |
function withDefaultScheduler(f, source) { | |
return withScheduler(f, source, defaultScheduler); | |
} | |
function withScheduler(f, source, scheduler) { | |
return new Promise(function (resolve, reject) { | |
runSource(f, source, scheduler, resolve, reject); | |
}); | |
} | |
function runSource(f, source, scheduler, resolve, reject) { | |
var disposable = dispose.settable(); | |
var observer = new Observer(f, resolve, reject, disposable); | |
disposable.setDisposable(source.run(observer, scheduler)); | |
} | |
},{"./disposable/dispose":36,"./scheduler/defaultScheduler":46,"./sink/Observer":51}],44:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var fatal = require('../fatalError'); | |
module.exports = PropagateTask; | |
function PropagateTask(run, value, sink) { | |
this._run = run; | |
this.value = value; | |
this.sink = sink; | |
this.active = true; | |
} | |
PropagateTask.event = function(value, sink) { | |
return new PropagateTask(emit, value, sink); | |
}; | |
PropagateTask.end = function(value, sink) { | |
return new PropagateTask(end, value, sink); | |
}; | |
PropagateTask.error = function(value, sink) { | |
return new PropagateTask(error, value, sink); | |
}; | |
PropagateTask.prototype.dispose = function() { | |
this.active = false; | |
}; | |
PropagateTask.prototype.run = function(t) { | |
if(!this.active) { | |
return; | |
} | |
this._run(t, this.value, this.sink); | |
}; | |
PropagateTask.prototype.error = function(t, e) { | |
if(!this.active) { | |
return fatal(e); | |
} | |
this.sink.error(t, e); | |
}; | |
function error(t, e, sink) { | |
sink.error(t, e); | |
} | |
function emit(t, x, sink) { | |
sink.event(t, x); | |
} | |
function end(t, x, sink) { | |
sink.end(t, x); | |
} | |
},{"../fatalError":37}],45:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var base = require('./../base'); | |
module.exports = Scheduler; | |
function ScheduledTask(delay, period, task, scheduler) { | |
this.time = delay; | |
this.period = period; | |
this.task = task; | |
this.scheduler = scheduler; | |
this.active = true; | |
} | |
ScheduledTask.prototype.run = function() { | |
return this.task.run(this.time); | |
}; | |
ScheduledTask.prototype.error = function(e) { | |
return this.task.error(this.time, e); | |
}; | |
ScheduledTask.prototype.cancel = function() { | |
this.scheduler.cancel(this); | |
return this.task.dispose(); | |
}; | |
function runTask(task) { | |
try { | |
return task.run(); | |
} catch(e) { | |
return task.error(e); | |
} | |
} | |
function Scheduler(timer) { | |
this.timer = timer; | |
this._timer = null; | |
this._nextArrival = 0; | |
this._tasks = []; | |
var self = this; | |
this._runReadyTasksBound = function() { | |
self._runReadyTasks(self.now()); | |
}; | |
} | |
Scheduler.prototype.now = function() { | |
return this.timer.now(); | |
}; | |
Scheduler.prototype.asap = function(task) { | |
return this.schedule(0, -1, task); | |
}; | |
Scheduler.prototype.delay = function(delay, task) { | |
return this.schedule(delay, -1, task); | |
}; | |
Scheduler.prototype.periodic = function(period, task) { | |
return this.schedule(0, period, task); | |
}; | |
Scheduler.prototype.schedule = function(delay, period, task) { | |
var now = this.now(); | |
var st = new ScheduledTask(now + Math.max(0, delay), period, task, this); | |
insertByTime(st, this._tasks); | |
this._scheduleNextRun(now); | |
return st; | |
}; | |
Scheduler.prototype.cancel = function(task) { | |
task.active = false; | |
var i = binarySearch(task.time, this._tasks); | |
if(i >= 0 && i < this._tasks.length) { | |
var at = base.findIndex(task, this._tasks[i].events); | |
this._tasks[i].events.splice(at, 1); | |
this._reschedule(); | |
} | |
}; | |
Scheduler.prototype.cancelAll = function(f) { | |
this._tasks = base.removeAll(f, this._tasks); | |
this._reschedule(); | |
}; | |
Scheduler.prototype._reschedule = function() { | |
if(this._tasks.length === 0) { | |
this._unschedule(); | |
} else { | |
this._scheduleNextRun(this.now()); | |
} | |
}; | |
Scheduler.prototype._unschedule = function() { | |
this.timer.clearTimer(this._timer); | |
this._timer = null; | |
}; | |
Scheduler.prototype._scheduleNextRun = function(now) { | |
if(this._tasks.length === 0) { | |
return; | |
} | |
var nextArrival = this._tasks[0].time; | |
if(this._timer === null) { | |
this._scheduleNextArrival(nextArrival, now); | |
} else if(nextArrival < this._nextArrival) { | |
this._unschedule(); | |
this._scheduleNextArrival(nextArrival, now); | |
} | |
}; | |
Scheduler.prototype._scheduleNextArrival = function(nextArrival, now) { | |
this._nextArrival = nextArrival; | |
var delay = Math.max(0, nextArrival - now); | |
this._timer = this.timer.setTimer(this._runReadyTasksBound, delay); | |
}; | |
Scheduler.prototype._runReadyTasks = function(now) { | |
this._timer = null; | |
this._tasks = this._findAndRunTasks(now); | |
this._scheduleNextRun(this.now()); | |
}; | |
Scheduler.prototype._findAndRunTasks = function(now) { | |
var tasks = this._tasks; | |
var l = tasks.length; | |
var i = 0; | |
while(i < l && tasks[i].time <= now) { | |
++i; | |
} | |
this._tasks = tasks.slice(i); | |
// Run all ready tasks | |
for (var j = 0; j < i; ++j) { | |
this._tasks = runTasks(tasks[j], this._tasks); | |
} | |
return this._tasks; | |
}; | |
function runTasks(timeslot, tasks) { | |
var events = timeslot.events; | |
for(var i=0; i<events.length; ++i) { | |
var task = events[i]; | |
if(task.active) { | |
runTask(task); | |
// Reschedule periodic repeating tasks | |
// Check active again, since a task may have canceled itself | |
if(task.period >= 0) { | |
task.time = task.time + task.period; | |
insertByTime(task, tasks); | |
} | |
} | |
} | |
return tasks; | |
} | |
function insertByTime(task, timeslots) { | |
var l = timeslots.length; | |
if(l === 0) { | |
timeslots.push(newTimeslot(task.time, [task])); | |
return; | |
} | |
var i = binarySearch(task.time, timeslots); | |
if(i >= l) { | |
timeslots.push(newTimeslot(task.time, [task])); | |
} else if(task.time === timeslots[i].time) { | |
timeslots[i].events.push(task); | |
} else { | |
timeslots.splice(i, 0, newTimeslot(task.time, [task])); | |
} | |
} | |
function binarySearch(t, sortedArray) { | |
var lo = 0; | |
var hi = sortedArray.length; | |
var mid, y; | |
while (lo < hi) { | |
mid = Math.floor((lo + hi) / 2); | |
y = sortedArray[mid]; | |
if (t === y.time) { | |
return mid; | |
} else if (t < y.time) { | |
hi = mid; | |
} else { | |
lo = mid + 1; | |
} | |
} | |
return hi; | |
} | |
function newTimeslot(t, events) { | |
return { time: t, events: events }; | |
} | |
},{"./../base":7}],46:[function(require,module,exports){ | |
(function (process){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Scheduler = require('./Scheduler'); | |
var setTimeoutTimer = require('./timeoutTimer'); | |
var nodeTimer = require('./nodeTimer'); | |
var isNode = typeof process === 'object' | |
&& typeof process.nextTick === 'function'; | |
module.exports = new Scheduler(isNode ? nodeTimer : setTimeoutTimer); | |
}).call(this,require('_process')) | |
},{"./Scheduler":45,"./nodeTimer":47,"./timeoutTimer":48,"_process":69}],47:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var defer = require('../defer'); | |
/*global setTimeout, clearTimeout*/ | |
function Task(f) { | |
this.f = f; | |
this.active = true; | |
} | |
Task.prototype.run = function() { | |
if(!this.active) { | |
return; | |
} | |
var f = this.f; | |
return f(); | |
}; | |
Task.prototype.error = function(e) { | |
throw e; | |
}; | |
Task.prototype.cancel = function() { | |
this.active = false; | |
}; | |
function runAsTask(f) { | |
var task = new Task(f); | |
defer(task); | |
return task; | |
} | |
module.exports = { | |
now: Date.now, | |
setTimer: function(f, dt) { | |
return dt <= 0 ? runAsTask(f) : setTimeout(f, dt); | |
}, | |
clearTimer: function(t) { | |
return t instanceof Task ? t.cancel() : clearTimeout(t); | |
} | |
}; | |
},{"../defer":33}],48:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
/*global setTimeout, clearTimeout*/ | |
module.exports = { | |
now: Date.now, | |
setTimer: function(f, dt) { | |
return setTimeout(f, dt); | |
}, | |
clearTimer: function(t) { | |
return clearTimeout(t); | |
} | |
}; | |
},{}],49:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var defer = require('../defer'); | |
module.exports = DeferredSink; | |
function DeferredSink(sink) { | |
this.sink = sink; | |
this.events = []; | |
this.length = 0; | |
this.active = true; | |
} | |
DeferredSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
if(this.length === 0) { | |
defer(new PropagateAllTask(this)); | |
} | |
this.events[this.length++] = { time: t, value: x }; | |
}; | |
DeferredSink.prototype.error = function(t, e) { | |
this.active = false; | |
defer(new ErrorTask(t, e, this.sink)); | |
}; | |
DeferredSink.prototype.end = function(t, x) { | |
this.active = false; | |
defer(new EndTask(t, x, this.sink)); | |
}; | |
function PropagateAllTask(deferred) { | |
this.deferred = deferred; | |
} | |
PropagateAllTask.prototype.run = function() { | |
var p = this.deferred; | |
var events = p.events; | |
var sink = p.sink; | |
var event; | |
for(var i = 0, l = p.length; i<l; ++i) { | |
event = events[i]; | |
sink.event(event.time, event.value); | |
events[i] = void 0; | |
} | |
p.length = 0; | |
}; | |
PropagateAllTask.prototype.error = function(e) { | |
this.deferred.error(0, e); | |
}; | |
function EndTask(t, x, sink) { | |
this.time = t; | |
this.value = x; | |
this.sink = sink; | |
} | |
EndTask.prototype.run = function() { | |
this.sink.end(this.time, this.value); | |
}; | |
EndTask.prototype.error = function(e) { | |
this.sink.error(this.time, e); | |
}; | |
function ErrorTask(t, e, sink) { | |
this.time = t; | |
this.value = e; | |
this.sink = sink; | |
} | |
ErrorTask.prototype.run = function() { | |
this.sink.error(this.time, this.value); | |
}; | |
ErrorTask.prototype.error = function(e) { | |
throw e; | |
}; | |
},{"../defer":33}],50:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Sink = require('./Pipe'); | |
module.exports = IndexSink; | |
IndexSink.hasValue = hasValue; | |
function hasValue(indexSink) { | |
return indexSink.hasValue; | |
} | |
function IndexSink(i, sink) { | |
this.index = i; | |
this.sink = sink; | |
this.active = true; | |
this.hasValue = false; | |
this.value = void 0; | |
} | |
IndexSink.prototype.event = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.value = x; | |
this.hasValue = true; | |
this.sink.event(t, this); | |
}; | |
IndexSink.prototype.end = function(t, x) { | |
if(!this.active) { | |
return; | |
} | |
this.active = false; | |
this.sink.end(t, { index: this.index, value: x }); | |
}; | |
IndexSink.prototype.error = Sink.prototype.error; | |
},{"./Pipe":52}],51:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Observer; | |
/** | |
* Sink that accepts functions to apply to each event, and to end, and error | |
* signals. | |
* @constructor | |
*/ | |
function Observer(event, end, error, disposable) { | |
this._event = event; | |
this._end = end; | |
this._error = error; | |
this._disposable = disposable; | |
this.active = true; | |
} | |
Observer.prototype.event = function(t, x) { | |
if (!this.active) { | |
return; | |
} | |
this._event(x); | |
}; | |
Observer.prototype.end = function(t, x) { | |
if (!this.active) { | |
return; | |
} | |
this.active = false; | |
disposeThen(this._end, this._error, this._disposable, x); | |
}; | |
Observer.prototype.error = function(t, e) { | |
this.active = false; | |
disposeThen(this._error, this._error, this._disposable, e); | |
}; | |
function disposeThen(end, error, disposable, x) { | |
Promise.resolve(disposable.dispose()).then(function () { | |
end(x); | |
}, error); | |
} | |
},{}],52:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
module.exports = Pipe; | |
/** | |
* A sink mixin that simply forwards event, end, and error to | |
* another sink. | |
* @param sink | |
* @constructor | |
*/ | |
function Pipe(sink) { | |
this.sink = sink; | |
} | |
Pipe.prototype.event = function(t, x) { | |
return this.sink.event(t, x); | |
}; | |
Pipe.prototype.end = function(t, x) { | |
return this.sink.end(t, x); | |
}; | |
Pipe.prototype.error = function(t, e) { | |
return this.sink.error(t, e); | |
}; | |
},{}],53:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var DeferredSink = require('../sink/DeferredSink'); | |
var dispose = require('../disposable/dispose'); | |
var tryEvent = require('./tryEvent'); | |
module.exports = EventEmitterSource; | |
function EventEmitterSource(event, source) { | |
this.event = event; | |
this.source = source; | |
} | |
EventEmitterSource.prototype.run = function(sink, scheduler) { | |
// NOTE: Because EventEmitter allows events in the same call stack as | |
// a listener is added, use a DeferredSink to buffer events | |
// until the stack clears, then propagate. This maintains most.js's | |
// invariant that no event will be delivered in the same call stack | |
// as an observer begins observing. | |
var dsink = new DeferredSink(sink); | |
function addEventVariadic(a) { | |
var l = arguments.length; | |
if(l > 1) { | |
var arr = new Array(l); | |
for(var i=0; i<l; ++i) { | |
arr[i] = arguments[i]; | |
} | |
tryEvent.tryEvent(scheduler.now(), arr, dsink); | |
} else { | |
tryEvent.tryEvent(scheduler.now(), a, dsink); | |
} | |
} | |
this.source.addListener(this.event, addEventVariadic); | |
return dispose.create(disposeEventEmitter, { target: this, addEvent: addEventVariadic }); | |
}; | |
function disposeEventEmitter(info) { | |
var target = info.target; | |
target.source.removeListener(target.event, info.addEvent); | |
} | |
},{"../disposable/dispose":36,"../sink/DeferredSink":49,"./tryEvent":66}],54:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var dispose = require('../disposable/dispose'); | |
var tryEvent = require('./tryEvent'); | |
module.exports = EventTargetSource; | |
function EventTargetSource(event, source, capture) { | |
this.event = event; | |
this.source = source; | |
this.capture = capture; | |
} | |
EventTargetSource.prototype.run = function(sink, scheduler) { | |
function addEvent(e) { | |
tryEvent.tryEvent(scheduler.now(), e, sink); | |
} | |
this.source.addEventListener(this.event, addEvent, this.capture); | |
return dispose.create(disposeEventTarget, | |
{ target: this, addEvent: addEvent }); | |
}; | |
function disposeEventTarget(info) { | |
var target = info.target; | |
target.source.removeEventListener(target.event, info.addEvent, target.capture); | |
} | |
},{"../disposable/dispose":36,"./tryEvent":66}],55:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var base = require('../base'); | |
module.exports = MulticastSource; | |
function MulticastSource(source) { | |
this.source = source; | |
this.sinks = []; | |
this._disposable = void 0; | |
} | |
MulticastSource.prototype.run = function(sink, scheduler) { | |
var n = this.add(sink); | |
if(n === 1) { | |
this._disposable = this.source.run(this, scheduler); | |
} | |
return new MulticastDisposable(this, sink); | |
}; | |
MulticastSource.prototype._dispose = function() { | |
var disposable = this._disposable; | |
this._disposable = void 0; | |
return Promise.resolve(disposable).then(dispose); | |
}; | |
function dispose(disposable) { | |
if(disposable === void 0) { | |
return; | |
} | |
return disposable.dispose(); | |
} | |
function MulticastDisposable(source, sink) { | |
this.source = source; | |
this.sink = sink; | |
} | |
MulticastDisposable.prototype.dispose = function() { | |
var s = this.source; | |
var remaining = s.remove(this.sink); | |
return remaining === 0 && s._dispose(); | |
}; | |
MulticastSource.prototype.add = function(sink) { | |
this.sinks = base.append(sink, this.sinks); | |
return this.sinks.length; | |
}; | |
MulticastSource.prototype.remove = function(sink) { | |
this.sinks = base.remove(base.findIndex(sink, this.sinks), this.sinks); | |
return this.sinks.length; | |
}; | |
MulticastSource.prototype.event = function(t, x) { | |
var s = this.sinks; | |
if(s.length === 1) { | |
s[0].event(t, x); | |
return; | |
} | |
for(var i=0; i<s.length; ++i) { | |
s[i].event(t, x); | |
} | |
}; | |
MulticastSource.prototype.end = function(t, x) { | |
var s = this.sinks; | |
if(s.length === 1) { | |
s[0].end(t, x); | |
return; | |
} | |
for(var i=0; i<s.length; ++i) { | |
s[i].end(t, x); | |
} | |
}; | |
MulticastSource.prototype.error = function(t, e) { | |
var s = this.sinks; | |
if(s.length === 1) { | |
s[0].error(t, e); | |
return; | |
} | |
for (var i=0; i<s.length; ++i) { | |
s[i].error(t, e); | |
} | |
}; | |
},{"../base":7}],56:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
module.exports = ValueSource; | |
function ValueSource(emit, x) { | |
this.emit = emit; | |
this.value = x; | |
} | |
ValueSource.prototype.run = function(sink, scheduler) { | |
return new ValueProducer(this.emit, this.value, sink, scheduler); | |
}; | |
function ValueProducer(emit, x, sink, scheduler) { | |
this.task = new PropagateTask(emit, x, sink); | |
scheduler.asap(this.task); | |
} | |
ValueProducer.prototype.dispose = function() { | |
return this.task.dispose(); | |
}; | |
},{"../scheduler/PropagateTask":44}],57:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var ValueSource = require('../source/ValueSource'); | |
var dispose = require('../disposable/dispose'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.of = streamOf; | |
exports.empty = empty; | |
exports.never = never; | |
/** | |
* Stream containing only x | |
* @param {*} x | |
* @returns {Stream} | |
*/ | |
function streamOf(x) { | |
return new Stream(new ValueSource(emit, x)); | |
} | |
function emit(t, x, sink) { | |
sink.event(0, x); | |
sink.end(0, void 0); | |
} | |
/** | |
* Stream containing no events and ends immediately | |
* @returns {Stream} | |
*/ | |
function empty() { | |
return EMPTY; | |
} | |
function EmptySource() {} | |
EmptySource.prototype.run = function(sink, scheduler) { | |
var task = PropagateTask.end(void 0, sink); | |
scheduler.asap(task); | |
return dispose.create(disposeEmpty, task); | |
}; | |
function disposeEmpty(task) { | |
return task.dispose(); | |
} | |
var EMPTY = new Stream(new EmptySource()); | |
/** | |
* Stream containing no events and never ends | |
* @returns {Stream} | |
*/ | |
function never() { | |
return NEVER; | |
} | |
function NeverSource() {} | |
NeverSource.prototype.run = function() { | |
return dispose.empty(); | |
}; | |
var NEVER = new Stream(new NeverSource()); | |
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"../source/ValueSource":56}],58:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var MulticastSource = require('./MulticastSource'); | |
var DeferredSink = require('../sink/DeferredSink'); | |
var tryEvent = require('./tryEvent'); | |
exports.create = create; | |
function create(run) { | |
return new Stream(new MulticastSource(new SubscriberSource(run))); | |
} | |
function SubscriberSource(subscribe) { | |
this._subscribe = subscribe; | |
} | |
SubscriberSource.prototype.run = function(sink, scheduler) { | |
return new Subscription(new DeferredSink(sink), scheduler, this._subscribe); | |
}; | |
function Subscription(sink, scheduler, subscribe) { | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
this._unsubscribe = this._init(subscribe); | |
} | |
Subscription.prototype._init = function(subscribe) { | |
var s = this; | |
try { | |
return subscribe(add, end, error); | |
} catch(e) { | |
error(e); | |
} | |
function add(x) { | |
s._add(x); | |
} | |
function end(x) { | |
s._end(x); | |
} | |
function error(e) { | |
s._error(e); | |
} | |
}; | |
Subscription.prototype._add = function(x) { | |
if(!this.active) { | |
return; | |
} | |
tryEvent.tryEvent(this.scheduler.now(), x, this.sink); | |
}; | |
Subscription.prototype._end = function(x) { | |
if(!this.active) { | |
return; | |
} | |
this.active = false; | |
tryEvent.tryEnd(this.scheduler.now(), x, this.sink); | |
}; | |
Subscription.prototype._error = function(x) { | |
this.active = false; | |
this.sink.error(this.scheduler.now(), x); | |
}; | |
Subscription.prototype.dispose = function() { | |
this.active = false; | |
if(typeof this._unsubscribe === 'function') { | |
return this._unsubscribe.call(void 0); | |
} | |
}; | |
},{"../Stream":6,"../sink/DeferredSink":49,"./MulticastSource":55,"./tryEvent":66}],59:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var fromArray = require('./fromArray').fromArray; | |
var isIterable = require('../iterable').isIterable; | |
var fromIterable = require('./fromIterable').fromIterable; | |
var isArrayLike = require('../base').isArrayLike; | |
exports.from = from; | |
function from(a) { | |
if(Array.isArray(a) || isArrayLike(a)) { | |
return fromArray(a); | |
} | |
if(isIterable(a)) { | |
return fromIterable(a); | |
} | |
throw new TypeError('not iterable: ' + a); | |
} | |
},{"../base":7,"../iterable":42,"./fromArray":60,"./fromIterable":62}],60:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.fromArray = fromArray; | |
function fromArray (a) { | |
return new Stream(new ArraySource(a)); | |
} | |
function ArraySource(a) { | |
this.array = a; | |
} | |
ArraySource.prototype.run = function(sink, scheduler) { | |
return new ArrayProducer(this.array, sink, scheduler); | |
}; | |
function ArrayProducer(array, sink, scheduler) { | |
this.scheduler = scheduler; | |
this.task = new PropagateTask(runProducer, array, sink); | |
scheduler.asap(this.task); | |
} | |
ArrayProducer.prototype.dispose = function() { | |
return this.task.dispose(); | |
}; | |
function runProducer(t, array, sink) { | |
produce(this, array, sink); | |
} | |
function produce(task, array, sink) { | |
for(var i=0, l=array.length; i<l && task.active; ++i) { | |
sink.event(0, array[i]); | |
} | |
task.active && end(); | |
function end() { | |
sink.end(0); | |
} | |
} | |
},{"../Stream":6,"../scheduler/PropagateTask":44}],61:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var MulticastSource = require('./MulticastSource'); | |
var EventTargetSource = require('./EventTargetSource'); | |
var EventEmitterSource = require('./EventEmitterSource'); | |
exports.fromEvent = fromEvent; | |
/** | |
* Create a stream from an EventTarget, such as a DOM Node, or EventEmitter. | |
* @param {String} event event type name, e.g. 'click' | |
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter | |
* @param {boolean?} useCapture for DOM events, whether to use | |
* capturing--passed as 3rd parameter to addEventListener. | |
* @returns {Stream} stream containing all events of the specified type | |
* from the source. | |
*/ | |
function fromEvent(event, source /*, useCapture = false */) { | |
var s; | |
if(typeof source.addEventListener === 'function' && typeof source.removeEventListener === 'function') { | |
var capture = arguments.length > 2 && !!arguments[2]; | |
s = new MulticastSource(new EventTargetSource(event, source, capture)); | |
} else if(typeof source.addListener === 'function' && typeof source.removeListener === 'function') { | |
s = new EventEmitterSource(event, source); | |
} else { | |
throw new Error('source must support addEventListener/removeEventListener or addListener/removeListener'); | |
} | |
return new Stream(s); | |
} | |
},{"../Stream":6,"./EventEmitterSource":53,"./EventTargetSource":54,"./MulticastSource":55}],62:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var getIterator = require('../iterable').getIterator; | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.fromIterable = fromIterable; | |
function fromIterable(iterable) { | |
return new Stream(new IterableSource(iterable)); | |
} | |
function IterableSource(iterable) { | |
this.iterable = iterable; | |
} | |
IterableSource.prototype.run = function(sink, scheduler) { | |
return new IteratorProducer(getIterator(this.iterable), sink, scheduler); | |
}; | |
function IteratorProducer(iterator, sink, scheduler) { | |
this.scheduler = scheduler; | |
this.iterator = iterator; | |
this.task = new PropagateTask(runProducer, this, sink); | |
scheduler.asap(this.task); | |
} | |
IteratorProducer.prototype.dispose = function() { | |
return this.task.dispose(); | |
}; | |
function runProducer(t, producer, sink) { | |
var x = producer.iterator.next(); | |
if(x.done) { | |
sink.end(t, x.value); | |
} else { | |
sink.event(t, x.value); | |
} | |
producer.scheduler.asap(producer.task); | |
} | |
},{"../Stream":6,"../iterable":42,"../scheduler/PropagateTask":44}],63:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2014 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var base = require('../base'); | |
exports.generate = generate; | |
/** | |
* Compute a stream using an *async* generator, which yields promises | |
* to control event times. | |
* @param f | |
* @returns {Stream} | |
*/ | |
function generate(f /*, ...args */) { | |
return new Stream(new GenerateSource(f, base.tail(arguments))); | |
} | |
function GenerateSource(f, args) { | |
this.f = f; | |
this.args = args; | |
} | |
GenerateSource.prototype.run = function(sink, scheduler) { | |
return new Generate(this.f.apply(void 0, this.args), sink, scheduler); | |
}; | |
function Generate(iterator, sink, scheduler) { | |
this.iterator = iterator; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
var self = this; | |
function err(e) { | |
self.sink.error(self.scheduler.now(), e); | |
} | |
Promise.resolve(this).then(next).catch(err); | |
} | |
function next(generate, x) { | |
return generate.active ? handle(generate, generate.iterator.next(x)) : x; | |
} | |
function handle(generate, result) { | |
if (result.done) { | |
return generate.sink.end(generate.scheduler.now(), result.value); | |
} | |
return Promise.resolve(result.value).then(function (x) { | |
return emit(generate, x); | |
}, function(e) { | |
return error(generate, e); | |
}); | |
} | |
function emit(generate, x) { | |
generate.sink.event(generate.scheduler.now(), x); | |
return next(generate, x); | |
} | |
function error(generate, e) { | |
return handle(generate, generate.iterator.throw(e)); | |
} | |
Generate.prototype.dispose = function() { | |
this.active = false; | |
}; | |
},{"../Stream":6,"../base":7}],64:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
exports.iterate = iterate; | |
/** | |
* Compute a stream by iteratively calling f to produce values | |
* Event times may be controlled by returning a Promise from f | |
* @param {function(x:*):*|Promise<*>} f | |
* @param {*} x initial value | |
* @returns {Stream} | |
*/ | |
function iterate(f, x) { | |
return new Stream(new IterateSource(f, x)); | |
} | |
function IterateSource(f, x) { | |
this.f = f; | |
this.value = x; | |
} | |
IterateSource.prototype.run = function(sink, scheduler) { | |
return new Iterate(this.f, this.value, sink, scheduler); | |
}; | |
function Iterate(f, initial, sink, scheduler) { | |
this.f = f; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
var x = initial; | |
var self = this; | |
function err(e) { | |
self.sink.error(self.scheduler.now(), e); | |
} | |
function start(iterate) { | |
return stepIterate(iterate, x); | |
} | |
Promise.resolve(this).then(start).catch(err); | |
} | |
Iterate.prototype.dispose = function() { | |
this.active = false; | |
}; | |
function stepIterate(iterate, x) { | |
iterate.sink.event(iterate.scheduler.now(), x); | |
if(!iterate.active) { | |
return x; | |
} | |
var f = iterate.f; | |
return Promise.resolve(f(x)).then(function(y) { | |
return continueIterate(iterate, y); | |
}); | |
} | |
function continueIterate(iterate, x) { | |
return !iterate.active ? iterate.value : stepIterate(iterate, x); | |
} | |
},{"../Stream":6}],65:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
var dispose = require('../disposable/dispose'); | |
var MulticastSource = require('./MulticastSource'); | |
var PropagateTask = require('../scheduler/PropagateTask'); | |
exports.periodic = periodic; | |
/** | |
* Create a stream that emits the current time periodically | |
* @param {Number} period periodicity of events in millis | |
* @param {*) value value to emit each period | |
* @returns {Stream} new stream that emits the current time every period | |
*/ | |
function periodic(period, value) { | |
return new Stream(new MulticastSource(new Periodic(period, value))); | |
} | |
function Periodic(period, value) { | |
this.period = period; | |
this.value = value; | |
} | |
Periodic.prototype.run = function(sink, scheduler) { | |
var task = scheduler.periodic(this.period, new PropagateTask(emit, this.value, sink)); | |
return dispose.create(cancelTask, task); | |
}; | |
function cancelTask(task) { | |
task.cancel(); | |
} | |
function emit(t, x, sink) { | |
sink.event(t, x); | |
} | |
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"./MulticastSource":55}],66:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
exports.tryEvent = tryEvent; | |
exports.tryEnd = tryEnd; | |
function tryEvent(t, x, sink) { | |
try { | |
sink.event(t, x); | |
} catch(e) { | |
sink.error(t, e); | |
} | |
} | |
function tryEnd(t, x, sink) { | |
try { | |
sink.end(t, x); | |
} catch(e) { | |
sink.error(t, e); | |
} | |
} | |
},{}],67:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('../Stream'); | |
exports.unfold = unfold; | |
/** | |
* Compute a stream by unfolding tuples of future values from a seed value | |
* Event times may be controlled by returning a Promise from f | |
* @param {function(seed:*):{value:*, seed:*, done:boolean}|Promise<{value:*, seed:*, done:boolean}>} f unfolding function accepts | |
* a seed and returns a new tuple with a value, new seed, and boolean done flag. | |
* If tuple.done is true, the stream will end. | |
* @param {*} seed seed value | |
* @returns {Stream} stream containing all value of all tuples produced by the | |
* unfolding function. | |
*/ | |
function unfold(f, seed) { | |
return new Stream(new UnfoldSource(f, seed)); | |
} | |
function UnfoldSource(f, seed) { | |
this.f = f; | |
this.value = seed; | |
} | |
UnfoldSource.prototype.run = function(sink, scheduler) { | |
return new Unfold(this.f, this.value, sink, scheduler); | |
}; | |
function Unfold(f, x, sink, scheduler) { | |
this.f = f; | |
this.sink = sink; | |
this.scheduler = scheduler; | |
this.active = true; | |
var self = this; | |
function err(e) { | |
self.sink.error(self.scheduler.now(), e); | |
} | |
function start(unfold) { | |
return stepUnfold(unfold, x); | |
} | |
Promise.resolve(this).then(start).catch(err); | |
} | |
Unfold.prototype.dispose = function() { | |
this.active = false; | |
}; | |
function stepUnfold(unfold, x) { | |
var f = unfold.f; | |
return Promise.resolve(f(x)).then(function(tuple) { | |
return continueUnfold(unfold, tuple); | |
}); | |
} | |
function continueUnfold(unfold, tuple) { | |
if(tuple.done) { | |
unfold.sink.end(unfold.scheduler.now(), tuple.value); | |
return tuple.value; | |
} | |
unfold.sink.event(unfold.scheduler.now(), tuple.value); | |
if(!unfold.active) { | |
return tuple.value; | |
} | |
return stepUnfold(unfold, tuple.seed); | |
} | |
},{"../Stream":6}],68:[function(require,module,exports){ | |
/** @license MIT License (c) copyright 2010-2016 original author or authors */ | |
/** @author Brian Cavalier */ | |
/** @author John Hann */ | |
var Stream = require('./lib/Stream'); | |
var base = require('./lib/base'); | |
var core = require('./lib/source/core'); | |
var from = require('./lib/source/from').from; | |
var periodic = require('./lib/source/periodic').periodic; | |
/** | |
* Core stream type | |
* @type {Stream} | |
*/ | |
exports.Stream = Stream; | |
// Add of and empty to constructor for fantasy-land compat | |
exports.of = Stream.of = core.of; | |
exports.just = core.of; // easier ES6 import alias | |
exports.empty = Stream.empty = core.empty; | |
exports.never = core.never; | |
exports.from = from; | |
exports.periodic = periodic; | |
//----------------------------------------------------------------------- | |
// Creating | |
var create = require('./lib/source/create'); | |
/** | |
* Create a stream by imperatively pushing events. | |
* @param {function(add:function(x), end:function(e)):function} run function | |
* that will receive 2 functions as arguments, the first to add new values to the | |
* stream and the second to end the stream. It may *return* a function that | |
* will be called once all consumers have stopped observing the stream. | |
* @returns {Stream} stream containing all events added by run before end | |
*/ | |
exports.create = create.create; | |
//----------------------------------------------------------------------- | |
// Adapting other sources | |
var events = require('./lib/source/fromEvent'); | |
/** | |
* Create a stream of events from the supplied EventTarget or EventEmitter | |
* @param {String} event event name | |
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter. The source | |
* must support either addEventListener/removeEventListener (w3c EventTarget: | |
* http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget), | |
* or addListener/removeListener (node EventEmitter: http://nodejs.org/api/events.html) | |
* @returns {Stream} stream of events of the specified type from the source | |
*/ | |
exports.fromEvent = events.fromEvent; | |
//----------------------------------------------------------------------- | |
// Observing | |
var observe = require('./lib/combinator/observe'); | |
exports.observe = observe.observe; | |
exports.forEach = observe.observe; | |
exports.drain = observe.drain; | |
/** | |
* Process all the events in the stream | |
* @returns {Promise} promise that fulfills when the stream ends, or rejects | |
* if the stream fails with an unhandled error. | |
*/ | |
Stream.prototype.observe = Stream.prototype.forEach = function(f) { | |
return observe.observe(f, this); | |
}; | |
/** | |
* Consume all events in the stream, without providing a function to process each. | |
* This causes a stream to become active and begin emitting events, and is useful | |
* in cases where all processing has been setup upstream via other combinators, and | |
* there is no need to process the terminal events. | |
* @returns {Promise} promise that fulfills when the stream ends, or rejects | |
* if the stream fails with an unhandled error. | |
*/ | |
Stream.prototype.drain = function() { | |
return observe.drain(this); | |
}; | |
//------------------------------------------------------- | |
var loop = require('./lib/combinator/loop').loop; | |
exports.loop = loop; | |
/** | |
* Generalized feedback loop. Call a stepper function for each event. The stepper | |
* will be called with 2 params: the current seed and the an event value. It must | |
* return a new { seed, value } pair. The `seed` will be fed back into the next | |
* invocation of stepper, and the `value` will be propagated as the event value. | |
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function | |
* @param {*} seed initial seed value passed to first stepper call | |
* @returns {Stream} new stream whose values are the `value` field of the objects | |
* returned by the stepper | |
*/ | |
Stream.prototype.loop = function(stepper, seed) { | |
return loop(stepper, seed, this); | |
}; | |
//------------------------------------------------------- | |
var accumulate = require('./lib/combinator/accumulate'); | |
exports.scan = accumulate.scan; | |
exports.reduce = accumulate.reduce; | |
/** | |
* Create a stream containing successive reduce results of applying f to | |
* the previous reduce result and the current stream item. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial initial value | |
* @returns {Stream} new stream containing successive reduce results | |
*/ | |
Stream.prototype.scan = function(f, initial) { | |
return accumulate.scan(f, initial, this); | |
}; | |
/** | |
* Reduce the stream to produce a single result. Note that reducing an infinite | |
* stream will return a Promise that never fulfills, but that may reject if an error | |
* occurs. | |
* @param {function(result:*, x:*):*} f reducer function | |
* @param {*} initial optional initial value | |
* @returns {Promise} promise for the file result of the reduce | |
*/ | |
Stream.prototype.reduce = function(f, initial) { | |
return accumulate.reduce(f, initial, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Building and extending | |
var unfold = require('./lib/source/unfold'); | |
var iterate = require('./lib/source/iterate'); | |
var generate = require('./lib/source/generate'); | |
var build = require('./lib/combinator/build'); | |
exports.unfold = unfold.unfold; | |
exports.iterate = iterate.iterate; | |
exports.generate = generate.generate; | |
exports.cycle = build.cycle; | |
exports.concat = build.concat; | |
exports.startWith = build.cons; | |
/** | |
* Tie this stream into a circle, thus creating an infinite stream | |
* @returns {Stream} new infinite stream | |
*/ | |
Stream.prototype.cycle = function() { | |
return build.cycle(this); | |
}; | |
/** | |
* @param {Stream} tail | |
* @returns {Stream} new stream containing all items in this followed by | |
* all items in tail | |
*/ | |
Stream.prototype.concat = function(tail) { | |
return build.concat(this, tail); | |
}; | |
/** | |
* @param {*} x value to prepend | |
* @returns {Stream} a new stream with x prepended | |
*/ | |
Stream.prototype.startWith = function(x) { | |
return build.cons(x, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Transforming | |
var transform = require('./lib/combinator/transform'); | |
var applicative = require('./lib/combinator/applicative'); | |
exports.map = transform.map; | |
exports.constant = transform.constant; | |
exports.tap = transform.tap; | |
exports.ap = applicative.ap; | |
/** | |
* Transform each value in the stream by applying f to each | |
* @param {function(*):*} f mapping function | |
* @returns {Stream} stream containing items transformed by f | |
*/ | |
Stream.prototype.map = function(f) { | |
return transform.map(f, this); | |
}; | |
/** | |
* Assume this stream contains functions, and apply each function to each item | |
* in the provided stream. This generates, in effect, a cross product. | |
* @param {Stream} xs stream of items to which | |
* @returns {Stream} stream containing the cross product of items | |
*/ | |
Stream.prototype.ap = function(xs) { | |
return applicative.ap(this, xs); | |
}; | |
/** | |
* Replace each value in the stream with x | |
* @param {*} x | |
* @returns {Stream} stream containing items replaced with x | |
*/ | |
Stream.prototype.constant = function(x) { | |
return transform.constant(x, this); | |
}; | |
/** | |
* Perform a side effect for each item in the stream | |
* @param {function(x:*):*} f side effect to execute for each item. The | |
* return value will be discarded. | |
* @returns {Stream} new stream containing the same items as this stream | |
*/ | |
Stream.prototype.tap = function(f) { | |
return transform.tap(f, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Transducer support | |
var transduce = require('./lib/combinator/transduce'); | |
exports.transduce = transduce.transduce; | |
/** | |
* Transform this stream by passing its events through a transducer. | |
* @param {function} transducer transducer function | |
* @return {Stream} stream of events transformed by the transducer | |
*/ | |
Stream.prototype.transduce = function(transducer) { | |
return transduce.transduce(transducer, this); | |
}; | |
//----------------------------------------------------------------------- | |
// FlatMapping | |
var flatMap = require('./lib/combinator/flatMap'); | |
exports.flatMap = exports.chain = flatMap.flatMap; | |
exports.join = flatMap.join; | |
/** | |
* Map each value in the stream to a new stream, and merge it into the | |
* returned outer stream. Event arrival times are preserved. | |
* @param {function(x:*):Stream} f chaining function, must return a Stream | |
* @returns {Stream} new stream containing all events from each stream returned by f | |
*/ | |
Stream.prototype.flatMap = Stream.prototype.chain = function(f) { | |
return flatMap.flatMap(f, this); | |
}; | |
/** | |
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner | |
* streams to the outer. Event arrival times are preserved. | |
* @returns {Stream<X>} new stream containing all events of all inner streams | |
*/ | |
Stream.prototype.join = function() { | |
return flatMap.join(this); | |
}; | |
var continueWith = require('./lib/combinator/continueWith').continueWith; | |
exports.continueWith = continueWith; | |
exports.flatMapEnd = continueWith; | |
/** | |
* Map the end event to a new stream, and begin emitting its values. | |
* @param {function(x:*):Stream} f function that receives the end event value, | |
* and *must* return a new Stream to continue with. | |
* @returns {Stream} new stream that emits all events from the original stream, | |
* followed by all events from the stream returned by f. | |
*/ | |
Stream.prototype.continueWith = Stream.prototype.flatMapEnd = function(f) { | |
return continueWith(f, this); | |
}; | |
var concatMap = require('./lib/combinator/concatMap').concatMap; | |
exports.concatMap = concatMap; | |
Stream.prototype.concatMap = function(f) { | |
return concatMap(f, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Concurrent merging | |
var mergeConcurrently = require('./lib/combinator/mergeConcurrently'); | |
exports.mergeConcurrently = mergeConcurrently.mergeConcurrently; | |
/** | |
* Flatten a Stream<Stream<X>> to Stream<X> by merging inner | |
* streams to the outer, limiting the number of inner streams that may | |
* be active concurrently. | |
* @param {number} concurrency at most this many inner streams will be | |
* allowed to be active concurrently. | |
* @return {Stream<X>} new stream containing all events of all inner | |
* streams, with limited concurrency. | |
*/ | |
Stream.prototype.mergeConcurrently = function(concurrency) { | |
return mergeConcurrently.mergeConcurrently(concurrency, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Merging | |
var merge = require('./lib/combinator/merge'); | |
exports.merge = merge.merge; | |
exports.mergeArray = merge.mergeArray; | |
/** | |
* Merge this stream and all the provided streams | |
* @returns {Stream} stream containing items from this stream and s in time | |
* order. If two events are simultaneous they will be merged in | |
* arbitrary order. | |
*/ | |
Stream.prototype.merge = function(/*...streams*/) { | |
return merge.mergeArray(base.cons(this, arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Combining | |
var combine = require('./lib/combinator/combine'); | |
exports.combine = combine.combine; | |
exports.combineArray = combine.combineArray; | |
/** | |
* Combine latest events from all input streams | |
* @param {function(...events):*} f function to combine most recent events | |
* @returns {Stream} stream containing the result of applying f to the most recent | |
* event of each input stream, whenever a new event arrives on any stream. | |
*/ | |
Stream.prototype.combine = function(f /*, ...streams*/) { | |
return combine.combineArray(f, base.replace(this, 0, arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Sampling | |
var sample = require('./lib/combinator/sample'); | |
exports.sample = sample.sample; | |
exports.sampleWith = sample.sampleWith; | |
/** | |
* When an event arrives on sampler, emit the latest event value from stream. | |
* @param {Stream} sampler stream of events at whose arrival time | |
* signal's latest value will be propagated | |
* @returns {Stream} sampled stream of values | |
*/ | |
Stream.prototype.sampleWith = function(sampler) { | |
return sample.sampleWith(sampler, this); | |
}; | |
/** | |
* When an event arrives on this stream, emit the result of calling f with the latest | |
* values of all streams being sampled | |
* @param {function(...values):*} f function to apply to each set of sampled values | |
* @returns {Stream} stream of sampled and transformed values | |
*/ | |
Stream.prototype.sample = function(f /* ...streams */) { | |
return sample.sampleArray(f, this, base.tail(arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Zipping | |
var zip = require('./lib/combinator/zip'); | |
exports.zip = zip.zip; | |
/** | |
* Pair-wise combine items with those in s. Given 2 streams: | |
* [1,2,3] zipWith f [4,5,6] -> [f(1,4),f(2,5),f(3,6)] | |
* Note: zip causes fast streams to buffer and wait for slow streams. | |
* @param {function(a:Stream, b:Stream, ...):*} f function to combine items | |
* @returns {Stream} new stream containing pairs | |
*/ | |
Stream.prototype.zip = function(f /*, ...streams*/) { | |
return zip.zipArray(f, base.replace(this, 0, arguments)); | |
}; | |
//----------------------------------------------------------------------- | |
// Switching | |
var switchLatest = require('./lib/combinator/switch').switch; | |
exports.switch = switchLatest; | |
exports.switchLatest = switchLatest; | |
/** | |
* Given a stream of streams, return a new stream that adopts the behavior | |
* of the most recent inner stream. | |
* @returns {Stream} switching stream | |
*/ | |
Stream.prototype.switch = Stream.prototype.switchLatest = function() { | |
return switchLatest(this); | |
}; | |
//----------------------------------------------------------------------- | |
// Filtering | |
var filter = require('./lib/combinator/filter'); | |
exports.filter = filter.filter; | |
exports.skipRepeats = exports.distinct = filter.skipRepeats; | |
exports.skipRepeatsWith = exports.distinctBy = filter.skipRepeatsWith; | |
/** | |
* Retain only items matching a predicate | |
* stream: -12345678- | |
* filter(x => x % 2 === 0, stream): --2-4-6-8- | |
* @param {function(x:*):boolean} p filtering predicate called for each item | |
* @returns {Stream} stream containing only items for which predicate returns truthy | |
*/ | |
Stream.prototype.filter = function(p) { | |
return filter.filter(p, this); | |
}; | |
/** | |
* Skip repeated events, using === to compare items | |
* stream: -abbcd- | |
* distinct(stream): -ab-cd- | |
* @returns {Stream} stream with no repeated events | |
*/ | |
Stream.prototype.skipRepeats = function() { | |
return filter.skipRepeats(this); | |
}; | |
/** | |
* Skip repeated events, using supplied equals function to compare items | |
* @param {function(a:*, b:*):boolean} equals function to compare items | |
* @returns {Stream} stream with no repeated events | |
*/ | |
Stream.prototype.skipRepeatsWith = function(equals) { | |
return filter.skipRepeatsWith(equals, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Slicing | |
var slice = require('./lib/combinator/slice'); | |
exports.take = slice.take; | |
exports.skip = slice.skip; | |
exports.slice = slice.slice; | |
exports.takeWhile = slice.takeWhile; | |
exports.skipWhile = slice.skipWhile; | |
/** | |
* stream: -abcd- | |
* take(2, stream): -ab| | |
* @param {Number} n take up to this many events | |
* @returns {Stream} stream containing at most the first n items from this stream | |
*/ | |
Stream.prototype.take = function(n) { | |
return slice.take(n, this); | |
}; | |
/** | |
* stream: -abcd-> | |
* skip(2, stream): ---cd-> | |
* @param {Number} n skip this many events | |
* @returns {Stream} stream not containing the first n events | |
*/ | |
Stream.prototype.skip = function(n) { | |
return slice.skip(n, this); | |
}; | |
/** | |
* Slice a stream by event index. Equivalent to, but more efficient than | |
* stream.take(end).skip(start); | |
* NOTE: Negative start and end are not supported | |
* @param {Number} start skip all events before the start index | |
* @param {Number} end allow all events from the start index to the end index | |
* @returns {Stream} stream containing items where start <= index < end | |
*/ | |
Stream.prototype.slice = function(start, end) { | |
return slice.slice(start, end, this); | |
}; | |
/** | |
* stream: -123451234-> | |
* takeWhile(x => x < 5, stream): -1234| | |
* @param {function(x:*):boolean} p predicate | |
* @returns {Stream} stream containing items up to, but not including, the | |
* first item for which p returns falsy. | |
*/ | |
Stream.prototype.takeWhile = function(p) { | |
return slice.takeWhile(p, this); | |
}; | |
/** | |
* stream: -123451234-> | |
* skipWhile(x => x < 5, stream): -----51234-> | |
* @param {function(x:*):boolean} p predicate | |
* @returns {Stream} stream containing items following *and including* the | |
* first item for which p returns falsy. | |
*/ | |
Stream.prototype.skipWhile = function(p) { | |
return slice.skipWhile(p, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Time slicing | |
var timeslice = require('./lib/combinator/timeslice'); | |
exports.until = exports.takeUntil = timeslice.takeUntil; | |
exports.since = exports.skipUntil = timeslice.skipUntil; | |
exports.during = timeslice.during; | |
/** | |
* stream: -a-b-c-d-e-f-g-> | |
* signal: -------x | |
* takeUntil(signal, stream): -a-b-c-| | |
* @param {Stream} signal retain only events in stream before the first | |
* event in signal | |
* @returns {Stream} new stream containing only events that occur before | |
* the first event in signal. | |
*/ | |
Stream.prototype.until = Stream.prototype.takeUntil = function(signal) { | |
return timeslice.takeUntil(signal, this); | |
}; | |
/** | |
* stream: -a-b-c-d-e-f-g-> | |
* signal: -------x | |
* takeUntil(signal, stream): -------d-e-f-g-> | |
* @param {Stream} signal retain only events in stream at or after the first | |
* event in signal | |
* @returns {Stream} new stream containing only events that occur after | |
* the first event in signal. | |
*/ | |
Stream.prototype.since = Stream.prototype.skipUntil = function(signal) { | |
return timeslice.skipUntil(signal, this); | |
}; | |
/** | |
* stream: -a-b-c-d-e-f-g-> | |
* timeWindow: -----s | |
* s: -----t | |
* stream.during(timeWindow): -----c-d-e-| | |
* @param {Stream<Stream>} timeWindow a stream whose first event (s) represents | |
* the window start time. That event (s) is itself a stream whose first event (t) | |
* represents the window end time | |
* @returns {Stream} new stream containing only events within the provided timespan | |
*/ | |
Stream.prototype.during = function(timeWindow) { | |
return timeslice.during(timeWindow, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Delaying | |
var delay = require('./lib/combinator/delay').delay; | |
exports.delay = delay; | |
/** | |
* @param {Number} delayTime milliseconds to delay each item | |
* @returns {Stream} new stream containing the same items, but delayed by ms | |
*/ | |
Stream.prototype.delay = function(delayTime) { | |
return delay(delayTime, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Getting event timestamp | |
var timestamp = require('./lib/combinator/timestamp').timestamp; | |
exports.timestamp = timestamp; | |
/** | |
* Expose event timestamps into the stream. Turns a Stream<X> into | |
* Stream<{time:t, value:X}> | |
* @returns {Stream<{time:number, value:*}>} | |
*/ | |
Stream.prototype.timestamp = function() { | |
return timestamp(this); | |
}; | |
//----------------------------------------------------------------------- | |
// Rate limiting | |
var limit = require('./lib/combinator/limit'); | |
exports.throttle = limit.throttle; | |
exports.debounce = limit.debounce; | |
/** | |
* Limit the rate of events | |
* stream: abcd----abcd---- | |
* throttle(2, stream): a-c-----a-c----- | |
* @param {Number} period time to suppress events | |
* @returns {Stream} new stream that skips events for throttle period | |
*/ | |
Stream.prototype.throttle = function(period) { | |
return limit.throttle(period, this); | |
}; | |
/** | |
* Wait for a burst of events to subside and emit only the last event in the burst | |
* stream: abcd----abcd---- | |
* debounce(2, stream): -----d-------d-- | |
* @param {Number} period events occuring more frequently than this | |
* on the provided scheduler will be suppressed | |
* @returns {Stream} new debounced stream | |
*/ | |
Stream.prototype.debounce = function(period) { | |
return limit.debounce(period, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Awaiting Promises | |
var promises = require('./lib/combinator/promises'); | |
exports.fromPromise = promises.fromPromise; | |
exports.await = promises.awaitPromises; | |
/** | |
* Await promises, turning a Stream<Promise<X>> into Stream<X>. Preserves | |
* event order, but timeshifts events based on promise resolution time. | |
* @returns {Stream<X>} stream containing non-promise values | |
*/ | |
Stream.prototype.await = function() { | |
return promises.awaitPromises(this); | |
}; | |
//----------------------------------------------------------------------- | |
// Error handling | |
var errors = require('./lib/combinator/errors'); | |
exports.recoverWith = errors.flatMapError; | |
exports.flatMapError = errors.flatMapError; | |
exports.throwError = errors.throwError; | |
/** | |
* If this stream encounters an error, recover and continue with items from stream | |
* returned by f. | |
* stream: -a-b-c-X- | |
* f(X): d-e-f-g- | |
* flatMapError(f, stream): -a-b-c-d-e-f-g- | |
* @param {function(error:*):Stream} f function which returns a new stream | |
* @returns {Stream} new stream which will recover from an error by calling f | |
*/ | |
Stream.prototype.recoverWith = Stream.prototype.flatMapError = function(f) { | |
return errors.flatMapError(f, this); | |
}; | |
//----------------------------------------------------------------------- | |
// Multicasting | |
var multicast = require('./lib/combinator/multicast').multicast; | |
exports.multicast = multicast; | |
/** | |
* Transform the stream into multicast stream. That means that many subscribers | |
* to the stream will not cause multiple invocations of the internal machinery. | |
* @returns {Stream} new stream which will multicast events to all observers. | |
*/ | |
Stream.prototype.multicast = function() { | |
return multicast(this); | |
}; | |
},{"./lib/Stream":6,"./lib/base":7,"./lib/combinator/accumulate":8,"./lib/combinator/applicative":9,"./lib/combinator/build":10,"./lib/combinator/combine":11,"./lib/combinator/concatMap":12,"./lib/combinator/continueWith":13,"./lib/combinator/delay":14,"./lib/combinator/errors":15,"./lib/combinator/filter":16,"./lib/combinator/flatMap":17,"./lib/combinator/limit":18,"./lib/combinator/loop":19,"./lib/combinator/merge":20,"./lib/combinator/mergeConcurrently":21,"./lib/combinator/multicast":22,"./lib/combinator/observe":23,"./lib/combinator/promises":24,"./lib/combinator/sample":25,"./lib/combinator/slice":26,"./lib/combinator/switch":27,"./lib/combinator/timeslice":28,"./lib/combinator/timestamp":29,"./lib/combinator/transduce":30,"./lib/combinator/transform":31,"./lib/combinator/zip":32,"./lib/source/core":57,"./lib/source/create":58,"./lib/source/from":59,"./lib/source/fromEvent":61,"./lib/source/generate":63,"./lib/source/iterate":64,"./lib/source/periodic":65,"./lib/source/unfold":67}],69:[function(require,module,exports){ | |
// shim for using process in browser | |
var process = module.exports = {}; | |
var queue = []; | |
var draining = false; | |
var currentQueue; | |
var queueIndex = -1; | |
function cleanUpNextTick() { | |
draining = false; | |
if (currentQueue.length) { | |
queue = currentQueue.concat(queue); | |
} else { | |
queueIndex = -1; | |
} | |
if (queue.length) { | |
drainQueue(); | |
} | |
} | |
function drainQueue() { | |
if (draining) { | |
return; | |
} | |
var timeout = setTimeout(cleanUpNextTick); | |
draining = true; | |
var len = queue.length; | |
while(len) { | |
currentQueue = queue; | |
queue = []; | |
while (++queueIndex < len) { | |
if (currentQueue) { | |
currentQueue[queueIndex].run(); | |
} | |
} | |
queueIndex = -1; | |
len = queue.length; | |
} | |
currentQueue = null; | |
draining = false; | |
clearTimeout(timeout); | |
} | |
process.nextTick = function (fun) { | |
var args = new Array(arguments.length - 1); | |
if (arguments.length > 1) { | |
for (var i = 1; i < arguments.length; i++) { | |
args[i - 1] = arguments[i]; | |
} | |
} | |
queue.push(new Item(fun, args)); | |
if (queue.length === 1 && !draining) { | |
setTimeout(drainQueue, 0); | |
} | |
}; | |
// v8 likes predictible objects | |
function Item(fun, array) { | |
this.fun = fun; | |
this.array = array; | |
} | |
Item.prototype.run = function () { | |
this.fun.apply(null, this.array); | |
}; | |
process.title = 'browser'; | |
process.browser = true; | |
process.env = {}; | |
process.argv = []; | |
process.version = ''; // empty string to avoid regexp issues | |
process.versions = {}; | |
function noop() {} | |
process.on = noop; | |
process.addListener = noop; | |
process.once = noop; | |
process.off = noop; | |
process.removeListener = noop; | |
process.removeAllListeners = noop; | |
process.emit = noop; | |
process.binding = function (name) { | |
throw new Error('process.binding is not supported'); | |
}; | |
process.cwd = function () { return '/' }; | |
process.chdir = function (dir) { | |
throw new Error('process.chdir is not supported'); | |
}; | |
process.umask = function() { return 0; }; | |
},{}],70:[function(require,module,exports){ | |
/** | |
* Reduce `arr` with `fn`. | |
* | |
* @param {Array} arr | |
* @param {Function} fn | |
* @param {Mixed} initial | |
* | |
* TODO: combatible error handling? | |
*/ | |
module.exports = function(arr, fn, initial){ | |
var idx = 0; | |
var len = arr.length; | |
var curr = arguments.length == 3 | |
? initial | |
: arr[idx++]; | |
while (idx < len) { | |
curr = fn.call(null, curr, arr[idx], ++idx, arr); | |
} | |
return curr; | |
}; | |
},{}],71:[function(require,module,exports){ | |
/** | |
* Module dependencies. | |
*/ | |
var Emitter = require('emitter'); | |
var reduce = require('reduce'); | |
/** | |
* Root reference for iframes. | |
*/ | |
var root; | |
if (typeof window !== 'undefined') { // Browser window | |
root = window; | |
} else if (typeof self !== 'undefined') { // Web Worker | |
root = self; | |
} else { // Other environments | |
root = this; | |
} | |
/** | |
* Noop. | |
*/ | |
function noop(){}; | |
/** | |
* Check if `obj` is a host object, | |
* we don't want to serialize these :) | |
* | |
* TODO: future proof, move to compoent land | |
* | |
* @param {Object} obj | |
* @return {Boolean} | |
* @api private | |
*/ | |
function isHost(obj) { | |
var str = {}.toString.call(obj); | |
switch (str) { | |
case '[object File]': | |
case '[object Blob]': | |
case '[object FormData]': | |
return true; | |
default: | |
return false; | |
} | |
} | |
/** | |
* Determine XHR. | |
*/ | |
request.getXHR = function () { | |
if (root.XMLHttpRequest | |
&& (!root.location || 'file:' != root.location.protocol | |
|| !root.ActiveXObject)) { | |
return new XMLHttpRequest; | |
} else { | |
try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {} | |
try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {} | |
try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {} | |
try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {} | |
} | |
return false; | |
}; | |
/** | |
* Removes leading and trailing whitespace, added to support IE. | |
* | |
* @param {String} s | |
* @return {String} | |
* @api private | |
*/ | |
var trim = ''.trim | |
? function(s) { return s.trim(); } | |
: function(s) { return s.replace(/(^\s*|\s*$)/g, ''); }; | |
/** | |
* Check if `obj` is an object. | |
* | |
* @param {Object} obj | |
* @return {Boolean} | |
* @api private | |
*/ | |
function isObject(obj) { | |
return obj === Object(obj); | |
} | |
/** | |
* Serialize the given `obj`. | |
* | |
* @param {Object} obj | |
* @return {String} | |
* @api private | |
*/ | |
function serialize(obj) { | |
if (!isObject(obj)) return obj; | |
var pairs = []; | |
for (var key in obj) { | |
if (null != obj[key]) { | |
pushEncodedKeyValuePair(pairs, key, obj[key]); | |
} | |
} | |
return pairs.join('&'); | |
} | |
/** | |
* Helps 'serialize' with serializing arrays. | |
* Mutates the pairs array. | |
* | |
* @param {Array} pairs | |
* @param {String} key | |
* @param {Mixed} val | |
*/ | |
function pushEncodedKeyValuePair(pairs, key, val) { | |
if (Array.isArray(val)) { | |
return val.forEach(function(v) { | |
pushEncodedKeyValuePair(pairs, key, v); | |
}); | |
} | |
pairs.push(encodeURIComponent(key) | |
+ '=' + encodeURIComponent(val)); | |
} | |
/** | |
* Expose serialization method. | |
*/ | |
request.serializeObject = serialize; | |
/** | |
* Parse the given x-www-form-urlencoded `str`. | |
* | |
* @param {String} str | |
* @return {Object} | |
* @api private | |
*/ | |
function parseString(str) { | |
var obj = {}; | |
var pairs = str.split('&'); | |
var parts; | |
var pair; | |
for (var i = 0, len = pairs.length; i < len; ++i) { | |
pair = pairs[i]; | |
parts = pair.split('='); | |
obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]); | |
} | |
return obj; | |
} | |
/** | |
* Expose parser. | |
*/ | |
request.parseString = parseString; | |
/** | |
* Default MIME type map. | |
* | |
* superagent.types.xml = 'application/xml'; | |
* | |
*/ | |
request.types = { | |
html: 'text/html', | |
json: 'application/json', | |
xml: 'application/xml', | |
urlencoded: 'application/x-www-form-urlencoded', | |
'form': 'application/x-www-form-urlencoded', | |
'form-data': 'application/x-www-form-urlencoded' | |
}; | |
/** | |
* Default serialization map. | |
* | |
* superagent.serialize['application/xml'] = function(obj){ | |
* return 'generated xml here'; | |
* }; | |
* | |
*/ | |
request.serialize = { | |
'application/x-www-form-urlencoded': serialize, | |
'application/json': JSON.stringify | |
}; | |
/** | |
* Default parsers. | |
* | |
* superagent.parse['application/xml'] = function(str){ | |
* return { object parsed from str }; | |
* }; | |
* | |
*/ | |
request.parse = { | |
'application/x-www-form-urlencoded': parseString, | |
'application/json': JSON.parse | |
}; | |
/** | |
* Parse the given header `str` into | |
* an object containing the mapped fields. | |
* | |
* @param {String} str | |
* @return {Object} | |
* @api private | |
*/ | |
function parseHeader(str) { | |
var lines = str.split(/\r?\n/); | |
var fields = {}; | |
var index; | |
var line; | |
var field; | |
var val; | |
lines.pop(); // trailing CRLF | |
for (var i = 0, len = lines.length; i < len; ++i) { | |
line = lines[i]; | |
index = line.indexOf(':'); | |
field = line.slice(0, index).toLowerCase(); | |
val = trim(line.slice(index + 1)); | |
fields[field] = val; | |
} | |
return fields; | |
} | |
/** | |
* Check if `mime` is json or has +json structured syntax suffix. | |
* | |
* @param {String} mime | |
* @return {Boolean} | |
* @api private | |
*/ | |
function isJSON(mime) { | |
return /[\/+]json\b/.test(mime); | |
} | |
/** | |
* Return the mime type for the given `str`. | |
* | |
* @param {String} str | |
* @return {String} | |
* @api private | |
*/ | |
function type(str){ | |
return str.split(/ *; */).shift(); | |
}; | |
/** | |
* Return header field parameters. | |
* | |
* @param {String} str | |
* @return {Object} | |
* @api private | |
*/ | |
function params(str){ | |
return reduce(str.split(/ *; */), function(obj, str){ | |
var parts = str.split(/ *= */) | |
, key = parts.shift() | |
, val = parts.shift(); | |
if (key && val) obj[key] = val; | |
return obj; | |
}, {}); | |
}; | |
/** | |
* Initialize a new `Response` with the given `xhr`. | |
* | |
* - set flags (.ok, .error, etc) | |
* - parse header | |
* | |
* Examples: | |
* | |
* Aliasing `superagent` as `request` is nice: | |
* | |
* request = superagent; | |
* | |
* We can use the promise-like API, or pass callbacks: | |
* | |
* request.get('/').end(function(res){}); | |
* request.get('/', function(res){}); | |
* | |
* Sending data can be chained: | |
* | |
* request | |
* .post('/user') | |
* .send({ name: 'tj' }) | |
* .end(function(res){}); | |
* | |
* Or passed to `.send()`: | |
* | |
* request | |
* .post('/user') | |
* .send({ name: 'tj' }, function(res){}); | |
* | |
* Or passed to `.post()`: | |
* | |
* request | |
* .post('/user', { name: 'tj' }) | |
* .end(function(res){}); | |
* | |
* Or further reduced to a single call for simple cases: | |
* | |
* request | |
* .post('/user', { name: 'tj' }, function(res){}); | |
* | |
* @param {XMLHTTPRequest} xhr | |
* @param {Object} options | |
* @api private | |
*/ | |
function Response(req, options) { | |
options = options || {}; | |
this.req = req; | |
this.xhr = this.req.xhr; | |
// responseText is accessible only if responseType is '' or 'text' and on older browsers | |
this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined') | |
? this.xhr.responseText | |
: null; | |
this.statusText = this.req.xhr.statusText; | |
this.setStatusProperties(this.xhr.status); | |
this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders()); | |
// getAllResponseHeaders sometimes falsely returns "" for CORS requests, but | |
// getResponseHeader still works. so we get content-type even if getting | |
// other headers fails. | |
this.header['content-type'] = this.xhr.getResponseHeader('content-type'); | |
this.setHeaderProperties(this.header); | |
this.body = this.req.method != 'HEAD' | |
? this.parseBody(this.text ? this.text : this.xhr.response) | |
: null; | |
} | |
/** | |
* Get case-insensitive `field` value. | |
* | |
* @param {String} field | |
* @return {String} | |
* @api public | |
*/ | |
Response.prototype.get = function(field){ | |
return this.header[field.toLowerCase()]; | |
}; | |
/** | |
* Set header related properties: | |
* | |
* - `.type` the content type without params | |
* | |
* A response of "Content-Type: text/plain; charset=utf-8" | |
* will provide you with a `.type` of "text/plain". | |
* | |
* @param {Object} header | |
* @api private | |
*/ | |
Response.prototype.setHeaderProperties = function(header){ | |
// content-type | |
var ct = this.header['content-type'] || ''; | |
this.type = type(ct); | |
// params | |
var obj = params(ct); | |
for (var key in obj) this[key] = obj[key]; | |
}; | |
/** | |
* Parse the given body `str`. | |
* | |
* Used for auto-parsing of bodies. Parsers | |
* are defined on the `superagent.parse` object. | |
* | |
* @param {String} str | |
* @return {Mixed} | |
* @api private | |
*/ | |
Response.prototype.parseBody = function(str){ | |
var parse = request.parse[this.type]; | |
return parse && str && (str.length || str instanceof Object) | |
? parse(str) | |
: null; | |
}; | |
/** | |
* Set flags such as `.ok` based on `status`. | |
* | |
* For example a 2xx response will give you a `.ok` of __true__ | |
* whereas 5xx will be __false__ and `.error` will be __true__. The | |
* `.clientError` and `.serverError` are also available to be more | |
* specific, and `.statusType` is the class of error ranging from 1..5 | |
* sometimes useful for mapping respond colors etc. | |
* | |
* "sugar" properties are also defined for common cases. Currently providing: | |
* | |
* - .noContent | |
* - .badRequest | |
* - .unauthorized | |
* - .notAcceptable | |
* - .notFound | |
* | |
* @param {Number} status | |
* @api private | |
*/ | |
Response.prototype.setStatusProperties = function(status){ | |
// handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request | |
if (status === 1223) { | |
status = 204; | |
} | |
var type = status / 100 | 0; | |
// status / class | |
this.status = this.statusCode = status; | |
this.statusType = type; | |
// basics | |
this.info = 1 == type; | |
this.ok = 2 == type; | |
this.clientError = 4 == type; | |
this.serverError = 5 == type; | |
this.error = (4 == type || 5 == type) | |
? this.toError() | |
: false; | |
// sugar | |
this.accepted = 202 == status; | |
this.noContent = 204 == status; | |
this.badRequest = 400 == status; | |
this.unauthorized = 401 == status; | |
this.notAcceptable = 406 == status; | |
this.notFound = 404 == status; | |
this.forbidden = 403 == status; | |
}; | |
/** | |
* Return an `Error` representative of this response. | |
* | |
* @return {Error} | |
* @api public | |
*/ | |
Response.prototype.toError = function(){ | |
var req = this.req; | |
var method = req.method; | |
var url = req.url; | |
var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')'; | |
var err = new Error(msg); | |
err.status = this.status; | |
err.method = method; | |
err.url = url; | |
return err; | |
}; | |
/** | |
* Expose `Response`. | |
*/ | |
request.Response = Response; | |
/** | |
* Initialize a new `Request` with the given `method` and `url`. | |
* | |
* @param {String} method | |
* @param {String} url | |
* @api public | |
*/ | |
function Request(method, url) { | |
var self = this; | |
Emitter.call(this); | |
this._query = this._query || []; | |
this.method = method; | |
this.url = url; | |
this.header = {}; | |
this._header = {}; | |
this.on('end', function(){ | |
var err = null; | |
var res = null; | |
try { | |
res = new Response(self); | |
} catch(e) { | |
err = new Error('Parser is unable to parse the response'); | |
err.parse = true; | |
err.original = e; | |
// issue #675: return the raw response if the response parsing fails | |
err.rawResponse = self.xhr && self.xhr.responseText ? self.xhr.responseText : null; | |
return self.callback(err); | |
} | |
self.emit('response', res); | |
if (err) { | |
return self.callback(err, res); | |
} | |
if (res.status >= 200 && res.status < 300) { | |
return self.callback(err, res); | |
} | |
var new_err = new Error(res.statusText || 'Unsuccessful HTTP response'); | |
new_err.original = err; | |
new_err.response = res; | |
new_err.status = res.status; | |
self.callback(new_err, res); | |
}); | |
} | |
/** | |
* Mixin `Emitter`. | |
*/ | |
Emitter(Request.prototype); | |
/** | |
* Allow for extension | |
*/ | |
Request.prototype.use = function(fn) { | |
fn(this); | |
return this; | |
} | |
/** | |
* Set timeout to `ms`. | |
* | |
* @param {Number} ms | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.timeout = function(ms){ | |
this._timeout = ms; | |
return this; | |
}; | |
/** | |
* Clear previous timeout. | |
* | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.clearTimeout = function(){ | |
this._timeout = 0; | |
clearTimeout(this._timer); | |
return this; | |
}; | |
/** | |
* Abort the request, and clear potential timeout. | |
* | |
* @return {Request} | |
* @api public | |
*/ | |
Request.prototype.abort = function(){ | |
if (this.aborted) return; | |
this.aborted = true; | |
this.xhr.abort(); | |
this.clearTimeout(); | |
this.emit('abort'); | |
return this; | |
}; | |
/** | |
* Set header `field` to `val`, or multiple fields with one object. | |
* | |
* Examples: | |
* | |
* req.get('/') | |
* .set('Accept', 'application/json') | |
* .set('X-API-Key', 'foobar') | |
* .end(callback); | |
* | |
* req.get('/') | |
* .set({ Accept: 'application/json', 'X-API-Key': 'foobar' }) | |
* .end(callback); | |
* | |
* @param {String|Object} field | |
* @param {String} val | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.set = function(field, val){ | |
if (isObject(field)) { | |
for (var key in field) { | |
this.set(key, field[key]); | |
} | |
return this; | |
} | |
this._header[field.toLowerCase()] = val; | |
this.header[field] = val; | |
return this; | |
}; | |
/** | |
* Remove header `field`. | |
* | |
* Example: | |
* | |
* req.get('/') | |
* .unset('User-Agent') | |
* .end(callback); | |
* | |
* @param {String} field | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.unset = function(field){ | |
delete this._header[field.toLowerCase()]; | |
delete this.header[field]; | |
return this; | |
}; | |
/** | |
* Get case-insensitive header `field` value. | |
* | |
* @param {String} field | |
* @return {String} | |
* @api private | |
*/ | |
Request.prototype.getHeader = function(field){ | |
return this._header[field.toLowerCase()]; | |
}; | |
/** | |
* Set Content-Type to `type`, mapping values from `request.types`. | |
* | |
* Examples: | |
* | |
* superagent.types.xml = 'application/xml'; | |
* | |
* request.post('/') | |
* .type('xml') | |
* .send(xmlstring) | |
* .end(callback); | |
* | |
* request.post('/') | |
* .type('application/xml') | |
* .send(xmlstring) | |
* .end(callback); | |
* | |
* @param {String} type | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.type = function(type){ | |
this.set('Content-Type', request.types[type] || type); | |
return this; | |
}; | |
/** | |
* Force given parser | |
* | |
* Sets the body parser no matter type. | |
* | |
* @param {Function} | |
* @api public | |
*/ | |
Request.prototype.parse = function(fn){ | |
this._parser = fn; | |
return this; | |
}; | |
/** | |
* Set Accept to `type`, mapping values from `request.types`. | |
* | |
* Examples: | |
* | |
* superagent.types.json = 'application/json'; | |
* | |
* request.get('/agent') | |
* .accept('json') | |
* .end(callback); | |
* | |
* request.get('/agent') | |
* .accept('application/json') | |
* .end(callback); | |
* | |
* @param {String} accept | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.accept = function(type){ | |
this.set('Accept', request.types[type] || type); | |
return this; | |
}; | |
/** | |
* Set Authorization field value with `user` and `pass`. | |
* | |
* @param {String} user | |
* @param {String} pass | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.auth = function(user, pass){ | |
var str = btoa(user + ':' + pass); | |
this.set('Authorization', 'Basic ' + str); | |
return this; | |
}; | |
/** | |
* Add query-string `val`. | |
* | |
* Examples: | |
* | |
* request.get('/shoes') | |
* .query('size=10') | |
* .query({ color: 'blue' }) | |
* | |
* @param {Object|String} val | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.query = function(val){ | |
if ('string' != typeof val) val = serialize(val); | |
if (val) this._query.push(val); | |
return this; | |
}; | |
/** | |
* Write the field `name` and `val` for "multipart/form-data" | |
* request bodies. | |
* | |
* ``` js | |
* request.post('/upload') | |
* .field('foo', 'bar') | |
* .end(callback); | |
* ``` | |
* | |
* @param {String} name | |
* @param {String|Blob|File} val | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.field = function(name, val){ | |
if (!this._formData) this._formData = new root.FormData(); | |
this._formData.append(name, val); | |
return this; | |
}; | |
/** | |
* Queue the given `file` as an attachment to the specified `field`, | |
* with optional `filename`. | |
* | |
* ``` js | |
* request.post('/upload') | |
* .attach(new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"})) | |
* .end(callback); | |
* ``` | |
* | |
* @param {String} field | |
* @param {Blob|File} file | |
* @param {String} filename | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.attach = function(field, file, filename){ | |
if (!this._formData) this._formData = new root.FormData(); | |
this._formData.append(field, file, filename || file.name); | |
return this; | |
}; | |
/** | |
* Send `data` as the request body, defaulting the `.type()` to "json" when | |
* an object is given. | |
* | |
* Examples: | |
* | |
* // manual json | |
* request.post('/user') | |
* .type('json') | |
* .send('{"name":"tj"}') | |
* .end(callback) | |
* | |
* // auto json | |
* request.post('/user') | |
* .send({ name: 'tj' }) | |
* .end(callback) | |
* | |
* // manual x-www-form-urlencoded | |
* request.post('/user') | |
* .type('form') | |
* .send('name=tj') | |
* .end(callback) | |
* | |
* // auto x-www-form-urlencoded | |
* request.post('/user') | |
* .type('form') | |
* .send({ name: 'tj' }) | |
* .end(callback) | |
* | |
* // defaults to x-www-form-urlencoded | |
* request.post('/user') | |
* .send('name=tobi') | |
* .send('species=ferret') | |
* .end(callback) | |
* | |
* @param {String|Object} data | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.send = function(data){ | |
var obj = isObject(data); | |
var type = this.getHeader('Content-Type'); | |
// merge | |
if (obj && isObject(this._data)) { | |
for (var key in data) { | |
this._data[key] = data[key]; | |
} | |
} else if ('string' == typeof data) { | |
if (!type) this.type('form'); | |
type = this.getHeader('Content-Type'); | |
if ('application/x-www-form-urlencoded' == type) { | |
this._data = this._data | |
? this._data + '&' + data | |
: data; | |
} else { | |
this._data = (this._data || '') + data; | |
} | |
} else { | |
this._data = data; | |
} | |
if (!obj || isHost(data)) return this; | |
if (!type) this.type('json'); | |
return this; | |
}; | |
/** | |
* Invoke the callback with `err` and `res` | |
* and handle arity check. | |
* | |
* @param {Error} err | |
* @param {Response} res | |
* @api private | |
*/ | |
Request.prototype.callback = function(err, res){ | |
var fn = this._callback; | |
this.clearTimeout(); | |
fn(err, res); | |
}; | |
/** | |
* Invoke callback with x-domain error. | |
* | |
* @api private | |
*/ | |
Request.prototype.crossDomainError = function(){ | |
var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.'); | |
err.crossDomain = true; | |
err.status = this.status; | |
err.method = this.method; | |
err.url = this.url; | |
this.callback(err); | |
}; | |
/** | |
* Invoke callback with timeout error. | |
* | |
* @api private | |
*/ | |
Request.prototype.timeoutError = function(){ | |
var timeout = this._timeout; | |
var err = new Error('timeout of ' + timeout + 'ms exceeded'); | |
err.timeout = timeout; | |
this.callback(err); | |
}; | |
/** | |
* Enable transmission of cookies with x-domain requests. | |
* | |
* Note that for this to work the origin must not be | |
* using "Access-Control-Allow-Origin" with a wildcard, | |
* and also must set "Access-Control-Allow-Credentials" | |
* to "true". | |
* | |
* @api public | |
*/ | |
Request.prototype.withCredentials = function(){ | |
this._withCredentials = true; | |
return this; | |
}; | |
/** | |
* Initiate request, invoking callback `fn(res)` | |
* with an instanceof `Response`. | |
* | |
* @param {Function} fn | |
* @return {Request} for chaining | |
* @api public | |
*/ | |
Request.prototype.end = function(fn){ | |
var self = this; | |
var xhr = this.xhr = request.getXHR(); | |
var query = this._query.join('&'); | |
var timeout = this._timeout; | |
var data = this._formData || this._data; | |
// store callback | |
this._callback = fn || noop; | |
// state change | |
xhr.onreadystatechange = function(){ | |
if (4 != xhr.readyState) return; | |
// In IE9, reads to any property (e.g. status) off of an aborted XHR will | |
// result in the error "Could not complete the operation due to error c00c023f" | |
var status; | |
try { status = xhr.status } catch(e) { status = 0; } | |
if (0 == status) { | |
if (self.timedout) return self.timeoutError(); | |
if (self.aborted) return; | |
return self.crossDomainError(); | |
} | |
self.emit('end'); | |
}; | |
// progress | |
var handleProgress = function(e){ | |
if (e.total > 0) { | |
e.percent = e.loaded / e.total * 100; | |
} | |
e.direction = 'download'; | |
self.emit('progress', e); | |
}; | |
if (this.hasListeners('progress')) { | |
xhr.onprogress = handleProgress; | |
} | |
try { | |
if (xhr.upload && this.hasListeners('progress')) { | |
xhr.upload.onprogress = handleProgress; | |
} | |
} catch(e) { | |
// Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist. | |
// Reported here: | |
// https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context | |
} | |
// timeout | |
if (timeout && !this._timer) { | |
this._timer = setTimeout(function(){ | |
self.timedout = true; | |
self.abort(); | |
}, timeout); | |
} | |
// querystring | |
if (query) { | |
query = request.serializeObject(query); | |
this.url += ~this.url.indexOf('?') | |
? '&' + query | |
: '?' + query; | |
} | |
// initiate request | |
xhr.open(this.method, this.url, true); | |
// CORS | |
if (this._withCredentials) xhr.withCredentials = true; | |
// body | |
if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !isHost(data)) { | |
// serialize stuff | |
var contentType = this.getHeader('Content-Type'); | |
var serialize = this._parser || request.serialize[contentType ? contentType.split(';')[0] : '']; | |
if (!serialize && isJSON(contentType)) serialize = request.serialize['application/json']; | |
if (serialize) data = serialize(data); | |
} | |
// set header fields | |
for (var field in this.header) { | |
if (null == this.header[field]) continue; | |
xhr.setRequestHeader(field, this.header[field]); | |
} | |
// send stuff | |
this.emit('request', this); | |
// IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing) | |
// We need null here if data is undefined | |
xhr.send(typeof data !== 'undefined' ? data : null); | |
return this; | |
}; | |
/** | |
* Faux promise support | |
* | |
* @param {Function} fulfill | |
* @param {Function} reject | |
* @return {Request} | |
*/ | |
Request.prototype.then = function (fulfill, reject) { | |
return this.end(function(err, res) { | |
err ? reject(err) : fulfill(res); | |
}); | |
} | |
/** | |
* Expose `Request`. | |
*/ | |
request.Request = Request; | |
/** | |
* Issue a request: | |
* | |
* Examples: | |
* | |
* request('GET', '/users').end(callback) | |
* request('/users').end(callback) | |
* request('/users', callback) | |
* | |
* @param {String} method | |
* @param {String|Function} url or callback | |
* @return {Request} | |
* @api public | |
*/ | |
function request(method, url) { | |
// callback | |
if ('function' == typeof url) { | |
return new Request('GET', method).end(url); | |
} | |
// url first | |
if (1 == arguments.length) { | |
return new Request('GET', method); | |
} | |
return new Request(method, url); | |
} | |
/** | |
* GET `url` with optional callback `fn(res)`. | |
* | |
* @param {String} url | |
* @param {Mixed|Function} data or fn | |
* @param {Function} fn | |
* @return {Request} | |
* @api public | |
*/ | |
request.get = function(url, data, fn){ | |
var req = request('GET', url); | |
if ('function' == typeof data) fn = data, data = null; | |
if (data) req.query(data); | |
if (fn) req.end(fn); | |
return req; | |
}; | |
/** | |
* HEAD `url` with optional callback `fn(res)`. | |
* | |
* @param {String} url | |
* @param {Mixed|Function} data or fn | |
* @param {Function} fn | |
* @return {Request} | |
* @api public | |
*/ | |
request.head = function(url, data, fn){ | |
var req = request('HEAD', url); | |
if ('function' == typeof data) fn = data, data = null; | |
if (data) req.send(data); | |
if (fn) req.end(fn); | |
return req; | |
}; | |
/** | |
* DELETE `url` with optional callback `fn(res)`. | |
* | |
* @param {String} url | |
* @param {Function} fn | |
* @return {Request} | |
* @api public | |
*/ | |
function del(url, fn){ | |
var req = request('DELETE', url); | |
if (fn) req.end(fn); | |
return req; | |
}; | |
request['del'] = del; | |
request['delete'] = del; | |
/** | |
* PATCH `url` with optional `data` and callback `fn(res)`. | |
* | |
* @param {String} url | |
* @param {Mixed} data | |
* @param {Function} fn | |
* @return {Request} | |
* @api public | |
*/ | |
request.patch = function(url, data, fn){ | |
var req = request('PATCH', url); | |
if ('function' == typeof data) fn = data, data = null; | |
if (data) req.send(data); | |
if (fn) req.end(fn); | |
return req; | |
}; | |
/** | |
* POST `url` with optional `data` and callback `fn(res)`. | |
* | |
* @param {String} url | |
* @param {Mixed} data | |
* @param {Function} fn | |
* @return {Request} | |
* @api public | |
*/ | |
request.post = function(url, data, fn){ | |
var req = request('POST', url); | |
if ('function' == typeof data) fn = data, data = null; | |
if (data) req.send(data); | |
if (fn) req.end(fn); | |
return req; | |
}; | |
/** | |
* PUT `url` with optional `data` and callback `fn(res)`. | |
* | |
* @param {String} url | |
* @param {Mixed|Function} data or fn | |
* @param {Function} fn | |
* @return {Request} | |
* @api public | |
*/ | |
request.put = function(url, data, fn){ | |
var req = request('PUT', url); | |
if ('function' == typeof data) fn = data, data = null; | |
if (data) req.send(data); | |
if (fn) req.end(fn); | |
return req; | |
}; | |
/** | |
* Expose `request`. | |
*/ | |
module.exports = request; | |
},{"emitter":2,"reduce":70}],"@motorcycle/http":[function(require,module,exports){ | |
'use strict'; | |
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
exports.makeHTTPDriver = exports.createResponse$ = exports.urlToSuperagent = exports.optionsToSuperagent = undefined; | |
var _most = require('most'); | |
var _most2 = _interopRequireDefault(_most); | |
var _hold = require('@most/hold'); | |
var _hold2 = _interopRequireDefault(_hold); | |
var _superagent = require('superagent'); | |
var _superagent2 = _interopRequireDefault(_superagent); | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
var notNull = function notNull(arg) { | |
return arg !== null; | |
}; | |
var typeOf = function typeOf(type, arg) { | |
return (typeof arg === 'undefined' ? 'undefined' : _typeof(arg)) === type; | |
}; | |
var is = { | |
notNull: notNull, | |
typeOf: typeOf | |
}; | |
var optionsToSuperagent = function optionsToSuperagent(_ref) { | |
var // eslint-disable-line | |
// ESLint doesn't like function complexity | |
url = _ref.url; | |
var _ref$send = _ref.send; | |
var send = _ref$send === undefined ? null : _ref$send; | |
var _ref$accept = _ref.accept; | |
var accept = _ref$accept === undefined ? null : _ref$accept; | |
var _ref$query = _ref.query; | |
var query = _ref$query === undefined ? null : _ref$query; | |
var _ref$user = _ref.user; | |
var user = _ref$user === undefined ? null : _ref$user; | |
var _ref$password = _ref.password; | |
var password = _ref$password === undefined ? null : _ref$password; | |
var _ref$field = _ref.field; | |
var field = _ref$field === undefined ? null : _ref$field; | |
var _ref$attach = _ref.attach; | |
var attach = _ref$attach === undefined ? null : _ref$attach; | |
var _ref$withCredentials = _ref.withCredentials; | |
var // if valid, should be an array | |
withCredentials = _ref$withCredentials === undefined ? false : _ref$withCredentials; | |
var _ref$headers = _ref.headers; | |
var headers = _ref$headers === undefined ? {} : _ref$headers; | |
var _ref$redirects = _ref.redirects; | |
var redirects = _ref$redirects === undefined ? 5 : _ref$redirects; | |
var _ref$type = _ref.type; | |
var type = _ref$type === undefined ? 'json' : _ref$type; | |
var _ref$method = _ref.method; | |
var method = _ref$method === undefined ? 'get' : _ref$method; | |
if (typeof url !== 'string') { | |
throw new Error('Please provide a `url` property in the request ' + 'options.'); | |
} | |
var lowerCaseMethod = method.toLowerCase(); | |
var sanitizedMethod = lowerCaseMethod === 'delete' ? 'del' : lowerCaseMethod; | |
var request = _superagent2.default[sanitizedMethod](url); | |
request = is.typeOf('function', request.redirects) ? request.redirects(redirects) : request; | |
request = request.type(type); | |
request = is.notNull(send) ? request.send(send) : request; | |
request = is.notNull(accept) ? request.accept(accept) : request; | |
request = is.notNull(query) ? request.query(query) : request; | |
request = withCredentials ? request.withCredentials() : request; | |
request = is.notNull(user) && is.notNull(password) ? request.auth(user, password) : request; | |
for (var key in headers) { | |
if (headers.hasOwnProperty(key)) { | |
request = request.set(key, headers[key]); | |
} | |
} | |
for (var key in field) { | |
if (field.hasOwnProperty(key)) { | |
request = request.field(key, field[key]); | |
} | |
} | |
if (is.notNull(attach)) { | |
for (var i = attach.length - 1; i >= 0; i--) { | |
var a = attach[i]; | |
request = request.attach(a.name, a.path, a.filename); | |
} | |
} | |
return request; | |
}; | |
var urlToSuperagent = function urlToSuperagent(url) { | |
return _superagent2.default.get(url); | |
}; | |
var createResponse$ = function createResponse$(reqOptions) { | |
return _most2.default.create(function (add, end, error) { | |
var request = is.typeOf('string', reqOptions) ? urlToSuperagent(reqOptions) : request; | |
request = is.typeOf('object', reqOptions) ? optionsToSuperagent(reqOptions) : request; | |
if (!request) { | |
error(new Error('Observable of requests given to HTTP ' + 'Driver must emit either URL strings or objects with parameters.')); | |
return function () {}; // noop | |
} | |
try { | |
request.end(function (err, res) { | |
if (err) { | |
error(err); | |
} else { | |
add(res); | |
end(); | |
} | |
}); | |
} catch (err) { | |
error(err); | |
} | |
return function onDispose() { | |
request.abort(); | |
}; | |
}); | |
}; | |
var isolateSource = function isolateSource(response$$, scope) { | |
return response$$.filter(function (res$) { | |
return Array.isArray(res$.request._namespace) && res$.request._namespace.indexOf(scope) !== -1; | |
}); | |
}; | |
var isolateSink = function isolateSink(request$, scope) { | |
return request$.map(function (req) { | |
if (typeof req === 'string') { | |
return { url: req, _namespace: [scope] }; | |
} | |
req._namespace = req._namespace || []; | |
req._namespace.push(scope); | |
return req; | |
}); | |
}; | |
var makeHTTPDriver = function makeHTTPDriver() { | |
var _ref2 = arguments.length <= 0 || arguments[0] === undefined ? { eager: false } : arguments[0]; | |
var _ref2$eager = _ref2.eager; | |
var eager = _ref2$eager === undefined ? false : _ref2$eager; | |
return function (request$) { | |
var _response$$ = request$.map(function (reqOptions) { | |
var response$ = createResponse$(reqOptions); | |
if (eager || reqOptions.eager) { | |
response$ = (0, _hold2.default)(response$); | |
response$.drain(); | |
} | |
response$.request = reqOptions; | |
return response$; | |
}); | |
_response$$.drain(); | |
var response$$ = (0, _hold2.default)(_response$$); | |
response$$.isolateSink = isolateSink; | |
response$$.isolateSource = isolateSource; | |
return response$$; | |
}; | |
}; | |
exports.optionsToSuperagent = optionsToSuperagent; | |
exports.urlToSuperagent = urlToSuperagent; | |
exports.createResponse$ = createResponse$; | |
exports.makeHTTPDriver = makeHTTPDriver; | |
},{"@most/hold":1,"most":68,"superagent":71}]},{},[])("@motorcycle/http") | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment