datapumps
Version:
Node.js ETL (Extract, Transform, Load) toolkit for easy data import, export or transfer between systems.
98 lines (78 loc) • 2.39 kB
text/coffeescript
EventEmitter = require('events').EventEmitter
Promise = require('bluebird')
Buffer = require('./Buffer')
class Pump extends EventEmitter
: 0
: 1
: 2
: 3
constructor: (options) ->
= Pump.STOPPED
= null
output: new Buffer
from: (buffer = null) ->
return if buffer == null
if == Pump.STARTED
throw new Error 'Cannot change source buffer after pumping has been started'
if buffer instanceof Buffer
= buffer
else
= new Buffer
size: 1000
buffer.on 'data', (data) => .write data
buffer.on 'end', => .seal()
.on 'full', -> buffer.pause()
.on 'release', -> buffer.resume()
.on 'end', => do
@
sourceEnded: ->
.cancel() if
= Pump.SOURCE_ENDED
buffers: (buffers = null) ->
return if buffers == null
if == Pump.STARTED
throw new Error 'Cannot change output buffers after pumping has been started'
= buffers
@
buffer: (name = 'output') ->
throw new Error("No such buffer: #{name}") if ![name]
[name]
start: ->
throw new Error 'Source is not configured' if !
= Pump.STARTED if == Pump.STOPPED
do
@
_pump: ->
return do if == Pump.SOURCE_ENDED
( = .readAsync())
.cancellable()
.then (data) =>
= null
data
.catch(Promise.CancellationError, ->)
.done => do
subscribeForOutputBufferEnds: ->
for name, buffer of
buffer.on 'end', .bind @
do buffer.seal
outputBufferEnded: ->
for name, buffer of
return if !buffer.isEnded()
= Pump.ENDED
'end'
_process: (data) ->
().writeAsync data
process: (fn) ->
throw new Error('Process must be a function') if typeof fn != 'function'
= fn.bind @
@
mixin: (mixins) ->
mixins = if Array.isArray mixins then mixins else [ mixins ]
mixin @ for mixin in mixins
@
isEnded: ->
== Pump.ENDED
createBuffer: (options = {}) ->
new Buffer options
module.exports = Pump