
committed by
GitHub

2 changed files with 3 additions and 108 deletions
@ -1,100 +0,0 @@ |
|||||
/** |
|
||||
* @file stream.js |
|
||||
*/ |
|
||||
/** |
|
||||
* A lightweight readable stream implemention that handles event dispatching. |
|
||||
* |
|
||||
* @class Stream |
|
||||
*/ |
|
||||
export default class Stream { |
|
||||
constructor() { |
|
||||
this.listeners = {}; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Add a listener for a specified event type. |
|
||||
* |
|
||||
* @param {String} type the event name |
|
||||
* @param {Function} listener the callback to be invoked when an event of |
|
||||
* the specified type occurs |
|
||||
*/ |
|
||||
on(type, listener) { |
|
||||
if (!this.listeners[type]) { |
|
||||
this.listeners[type] = []; |
|
||||
} |
|
||||
this.listeners[type].push(listener); |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Remove a listener for a specified event type. |
|
||||
* |
|
||||
* @param {String} type the event name |
|
||||
* @param {Function} listener a function previously registered for this |
|
||||
* type of event through `on` |
|
||||
* @return {Boolean} if we could turn it off or not |
|
||||
*/ |
|
||||
off(type, listener) { |
|
||||
let index; |
|
||||
|
|
||||
if (!this.listeners[type]) { |
|
||||
return false; |
|
||||
} |
|
||||
index = this.listeners[type].indexOf(listener); |
|
||||
this.listeners[type].splice(index, 1); |
|
||||
return index > -1; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Trigger an event of the specified type on this stream. Any additional |
|
||||
* arguments to this function are passed as parameters to event listeners. |
|
||||
* |
|
||||
* @param {String} type the event name |
|
||||
*/ |
|
||||
trigger(type) { |
|
||||
let callbacks; |
|
||||
let i; |
|
||||
let length; |
|
||||
let args; |
|
||||
|
|
||||
callbacks = this.listeners[type]; |
|
||||
if (!callbacks) { |
|
||||
return; |
|
||||
} |
|
||||
// Slicing the arguments on every invocation of this method
|
|
||||
// can add a significant amount of overhead. Avoid the
|
|
||||
// intermediate object creation for the common case of a
|
|
||||
// single callback argument
|
|
||||
if (arguments.length === 2) { |
|
||||
length = callbacks.length; |
|
||||
for (i = 0; i < length; ++i) { |
|
||||
callbacks[i].call(this, arguments[1]); |
|
||||
} |
|
||||
} else { |
|
||||
args = Array.prototype.slice.call(arguments, 1); |
|
||||
length = callbacks.length; |
|
||||
for (i = 0; i < length; ++i) { |
|
||||
callbacks[i].apply(this, args); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Destroys the stream and cleans up. |
|
||||
*/ |
|
||||
dispose() { |
|
||||
this.listeners = {}; |
|
||||
} |
|
||||
/** |
|
||||
* Forwards all `data` events on this stream to the destination stream. The |
|
||||
* destination stream should provide a method `push` to receive the data |
|
||||
* events as they arrive. |
|
||||
* |
|
||||
* @param {Stream} destination the stream that will receive all `data` events |
|
||||
* @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
|
|
||||
*/ |
|
||||
pipe(destination) { |
|
||||
this.on('data', function(data) { |
|
||||
destination.push(data); |
|
||||
}); |
|
||||
} |
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue